diff --git a/cmd/boom-debug/main.go b/cmd/boom-debug/main.go new file mode 100644 index 000000000..e69de29bb diff --git a/go.mod b/go.mod index cbb1dc914..4bc3aa6af 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/afiskon/promtail-client v0.0.0-20190305142237-506f3f921e9c github.com/aws/aws-sdk-go v1.40.45 github.com/caos/oidc v1.0.0 - github.com/cloudflare/cloudflare-go v0.23.0 + github.com/cloudflare/cloudflare-go v0.28.0 github.com/cloudscale-ch/cloudscale-go-sdk v1.7.1 github.com/getsentry/sentry-go v0.11.0 github.com/ghodss/yaml v1.0.0 diff --git a/go.sum b/go.sum index f115c0f6c..9fa1c8a34 100644 --- a/go.sum +++ b/go.sum @@ -122,8 +122,8 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.23.0 h1:ePPZC8wLgtwz5itvgnDFFPPEku0G1a2tVKl5D69k3ac= -github.com/cloudflare/cloudflare-go v0.23.0/go.mod h1:sPWL/lIC6biLEdyGZwBQ1rGQKF1FhM7N60fuNiFdYTI= +github.com/cloudflare/cloudflare-go v0.28.0 h1:KeQUizmDATYI9j+imMG1lJ1EMl7upcsKanSvNYHpNuc= +github.com/cloudflare/cloudflare-go v0.28.0/go.mod h1:sPWL/lIC6biLEdyGZwBQ1rGQKF1FhM7N60fuNiFdYTI= github.com/cloudscale-ch/cloudscale-go-sdk v1.7.1 h1:DC+0N1zX1Bb1RvBp3tHHYy1mQ3pGyHUP+BGxRUs59YQ= github.com/cloudscale-ch/cloudscale-go-sdk v1.7.1/go.mod h1:FhOTOCgKAVvRRMQc1mC0D7xK/3zYnmcZBWFXNkacvMc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -149,6 +149,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -195,6 +196,8 @@ github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= @@ -211,12 +214,20 @@ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclK github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.2.0 h1:YPBLG/3UK1we1ohRkncLjaXWLW+HKp5QNM/jTli2JgI= +github.com/go-git/go-git/v5 v5.2.0 h1:YPBLG/3UK1we1ohRkncLjaXWLW+HKp5QNM/jTli2JgI= +github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs= github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -229,6 +240,7 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= @@ -282,6 +294,7 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -303,6 +316,7 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -390,6 +404,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= @@ -414,6 +429,7 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -454,6 +470,7 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/landoop/tableprinter v0.0.0-20200805134727-ea32388e35c1 h1:xUwSaTDYl+Ib5OoFxWJnqYFG9N31++qfeNXzTZ1cc8o= @@ -483,6 +500,8 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= @@ -524,6 +543,8 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -534,11 +555,14 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= @@ -568,6 +592,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -579,12 +604,14 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -620,6 +647,7 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= @@ -634,6 +662,7 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -674,6 +703,7 @@ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDf github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -713,6 +743,7 @@ go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -733,6 +764,7 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= @@ -770,6 +802,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= @@ -806,9 +839,11 @@ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -876,9 +911,11 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -898,8 +935,10 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -940,6 +979,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -974,6 +1014,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1060,6 +1101,7 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1089,6 +1131,7 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1155,6 +1198,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= @@ -1166,6 +1211,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -1203,9 +1249,11 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1230,8 +1278,11 @@ k8s.io/component-base v0.22.2 h1:vNIvE0AIrLhjX8drH0BgCNJcR4QZxMXcJzBsDplDx9M= k8s.io/component-base v0.22.2/go.mod h1:5Br2QhI9OTe79p+TzPe9JKNQYvEKbq9rTJDWllunGug= k8s.io/component-helpers v0.22.2/go.mod h1:+N61JAR9aKYSWbnLA88YcFr9K/6ISYvRNybX7QW7Rs8= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= diff --git a/internal/ctrlcrd/networking/networking.go b/internal/ctrlcrd/networking/networking.go index eb1af59cd..6fb036b5d 100644 --- a/internal/ctrlcrd/networking/networking.go +++ b/internal/ctrlcrd/networking/networking.go @@ -2,7 +2,9 @@ package networking import ( "context" + "errors" "fmt" + "github.com/caos/orbos/internal/operator/networking/kinds/networking/legacycf/config" "github.com/caos/orbos/internal/api/networking" v1 "github.com/caos/orbos/internal/api/networking/v1" @@ -39,8 +41,13 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl. return res, err } - query, _, _, _, _, err := orbnw.AdaptFunc(ctx, &r.Version, false)(internalMonitor, desired, &tree.Tree{}) + query, _, _, _, _, err := orbnw.AdaptFunc(ctx, "", &r.Version, false)(internalMonitor, desired, &tree.Tree{}) if err != nil { + + if errors.Is(err, config.ErrNoLBID) { + return res, fmt.Errorf("crd mode doesn't support specifying a loadbalancer yet") + } + return res, err } diff --git a/internal/ctrlgitops/networking.go b/internal/ctrlgitops/networking.go index ea79262a2..3e1171fbb 100644 --- a/internal/ctrlgitops/networking.go +++ b/internal/ctrlgitops/networking.go @@ -33,7 +33,7 @@ func Networking(ctx context.Context, monitor mntr.Monitor, orbConfigPath string, return err } - takeoff := networking.Takeoff(monitor, gitClient, orb.AdaptFunc(ctx, binaryVersion, true), k8sClient) + takeoff := networking.Takeoff(monitor, gitClient, orb.AdaptFunc(ctx, orbConfig.URL, binaryVersion, true), k8sClient) go func() { defer func() { monitor.RecoverPanic(recover()) }() diff --git a/internal/operator/boom/application/applications/grafana/admin/admin.go b/internal/operator/boom/application/applications/grafana/admin/admin.go new file mode 100644 index 000000000..e69de29bb diff --git a/internal/operator/networking/kinds/networking/legacycf/adapt.go b/internal/operator/networking/kinds/networking/legacycf/adapt.go index 72048a51b..8a1f2652a 100644 --- a/internal/operator/networking/kinds/networking/legacycf/adapt.go +++ b/internal/operator/networking/kinds/networking/legacycf/adapt.go @@ -18,6 +18,7 @@ import ( func AdaptFunc( ctx context.Context, namespace string, + id string, operatorLabels *labels.Operator, ) opcore.AdaptFunc { return func( @@ -53,7 +54,7 @@ func AdaptFunc( return nil, nil, nil, nil, false, err } - internalSpec, current := desiredKind.Spec.Internal(namespace, apiLabels) + internalSpec, current := desiredKind.Spec.Internal(id, namespace, apiLabels) legacyQuerier, legacyDestroyer, readyCertificate, err := adaptFunc(ctx, monitor, internalSpec) if err != nil { diff --git a/internal/operator/networking/kinds/networking/legacycf/app/app.go b/internal/operator/networking/kinds/networking/legacycf/app/app.go index 5c37fac3f..654d128a1 100644 --- a/internal/operator/networking/kinds/networking/legacycf/app/app.go +++ b/internal/operator/networking/kinds/networking/legacycf/app/app.go @@ -18,8 +18,8 @@ type App struct { internalPrefix string } -func New(user string, key string, userServiceKey string, groups map[string][]string, internalPrefix string) (*App, error) { - api, err := cloudflare.New(user, key, userServiceKey) +func New(ctx context.Context, accountName string, user string, key string, userServiceKey string, groups map[string][]string, internalPrefix string) (*App, error) { + api, err := cloudflare.New(ctx, accountName, user, key, userServiceKey) if err != nil { return nil, err } @@ -39,10 +39,95 @@ func (a *App) AddInternalPrefix(desc string) string { return strings.Join([]string{a.internalPrefix, desc}, " ") } -func (a *App) Ensure(ctx context.Context, k8sClient kubernetes.ClientInt, namespace string, domain string, subdomains []*config.Subdomain, rules []*config.Rule, originCALabels *labels.Name) error { +type additionalInfos struct { + name string + subdomain string + clusterID string + region string +} + +func (a *App) Ensure( + ctx context.Context, + id string, + k8sClient kubernetes.ClientInt, + namespace string, + domain string, + subdomains []*config.Subdomain, + rules []*config.Rule, + originCALabels *labels.Name, + lbs []*config.LoadBalancer, +) error { firewallRulesInt := make([]*cloudflare.FirewallRule, 0) filtersInt := make([]*cloudflare.Filter, 0) recordsInt := make([]*cloudflare.DNSRecord, 0) + poolsInt := make([]*cloudflare.LoadBalancerPool, 0) + lbsInt := make([]*cloudflare.LoadBalancer, 0) + lbsAdditionalInt := make([]*additionalInfos, 0) + + if lbs != nil { + for _, lb := range lbs { + for name, ip := range lb.Pool { + originsInt := []*cloudflare.LoadBalancerOrigin{{ + Name: name, + Address: ip, + Enabled: true, + }} + poolsInt = append(poolsInt, &cloudflare.LoadBalancerPool{ + Name: getPoolName(lb.Subdomain, domain, lb.Region, lb.ClusterID), + Description: id, + Enabled: true, + Origins: originsInt, + }) + } + } + } + + destroyPools, err := a.EnsureLoadBalancerPools(ctx, id, poolsInt) + if err != nil { + return err + } + + if lbs != nil { + for _, lb := range lbs { + //ids get filled in the EnsureLoadBalancerPools-function + poolNames := []string{} + if poolsInt != nil { + for _, poolInt := range poolsInt { + if poolInt.Name == getPoolName(lb.Subdomain, domain, lb.Region, lb.ClusterID) { + poolNames = append(poolNames, poolInt.ID) + } + } + } + + enabled := lb.Enabled + lbsInt = append(lbsInt, &cloudflare.LoadBalancer{ + Name: config.GetLBName(lb.Subdomain, domain), + DefaultPools: poolNames, + //the first pool is fallback pool for now + FallbackPool: poolNames[0], + Enabled: &enabled, + Proxied: true, + SteeringPolicy: "random", + }) + lbsAdditionalInt = append(lbsAdditionalInt, &additionalInfos{ + name: config.GetLBName(lb.Subdomain, domain), + clusterID: lb.ClusterID, + region: lb.Region, + subdomain: lb.Subdomain, + }) + } + } + + if err := a.EnsureLoadBalancers(ctx, id, domain, lbsInt, lbsAdditionalInt); err != nil { + return err + } + + //pools have to be deleted after the reference in the lbs is deleted + if destroyPools() != nil { + if err := destroyPools(); err != nil { + return err + } + } for _, record := range subdomains { @@ -69,7 +154,7 @@ func (a *App) Ensure(ctx context.Context, k8sClient kubernetes.ClientInt, namesp }) } - err := a.EnsureDNSRecords(ctx, domain, recordsInt) + err = a.EnsureDNSRecords(ctx, domain, recordsInt) if err != nil { return err } diff --git a/internal/operator/networking/kinds/networking/legacycf/app/loadbalancers.go b/internal/operator/networking/kinds/networking/legacycf/app/loadbalancers.go new file mode 100644 index 000000000..cb5796d92 --- /dev/null +++ b/internal/operator/networking/kinds/networking/legacycf/app/loadbalancers.go @@ -0,0 +1,237 @@ +package app + +import ( + "context" + "github.com/caos/orbos/internal/operator/networking/kinds/networking/legacycf/cloudflare" +) + +func (a *App) EnsureLoadBalancers( + ctx context.Context, + id string, + domain string, + lbs []*cloudflare.LoadBalancer, + lbsAdditional []*additionalInfos, +) error { + currentLbs, err := a.cloudflare.ListLoadBalancers(ctx, domain) + if err != nil { + return err + } + + //only try to manage lbs which have pools in them managed by this operator + filteredCurrentLbs := make([]*cloudflare.LoadBalancer, 0) + for _, currentLb := range currentLbs { + filteredPool := filterSameID(ctx, a.cloudflare, currentLb.DefaultPools, id) + if filteredPool != nil && len(filteredPool) > 0 { + filteredCurrentLbs = append(filteredCurrentLbs, currentLb) + } + } + + deleteLbs, updateLbs := getLoadBalancerToDelete(ctx, a.cloudflare, id, filteredCurrentLbs, lbs) + if deleteLbs != nil && len(deleteLbs) > 0 { + for _, lb := range deleteLbs { + if err := a.cloudflare.DeleteLoadBalancer(ctx, domain, lb); err != nil { + return err + } + } + } + + createLbs := getLoadBalancerToCreate(currentLbs, lbs) + if createLbs != nil && len(createLbs) > 0 { + for _, lb := range createLbs { + _, err := a.cloudflare.CreateLoadBalancer(ctx, domain, lb) + if err != nil { + return err + } + } + } + + updateLbs = append(updateLbs, getLoadBalancerToUpdate(ctx, a.cloudflare, id, domain, currentLbs, lbs, lbsAdditional)...) + if updateLbs != nil && len(updateLbs) > 0 { + for _, lb := range updateLbs { + _, err := a.cloudflare.UpdateLoadBalancer(ctx, domain, lb) + if err != nil { + return err + } + } + } + + return nil +} + +func getLoadBalancerToDelete( + ctx context.Context, + cf *cloudflare.Cloudflare, + id string, + currentLbs []*cloudflare.LoadBalancer, + lbs []*cloudflare.LoadBalancer, +) ( + []string, + []*cloudflare.LoadBalancer, +) { + deleteLbs := make([]string, 0) + updateLbs := make([]*cloudflare.LoadBalancer, 0) + + for _, currentLb := range currentLbs { + found := false + if lbs != nil { + for _, lb := range lbs { + if currentLb.Name == lb.Name { + found = true + break + } + } + } + + hasPoolWithOtherID := hasPoolsWithOtherID(ctx, cf, id, currentLb) + //delete lbs with no pools managed by another operator + if !found && !hasPoolWithOtherID { + deleteLbs = append(deleteLbs, currentLb.ID) + //otherwise just delete the pool and let the lb stand + } else if !found && hasPoolWithOtherID { + updateLb := currentLb + updateLb.DefaultPools = filterNotSameID(ctx, cf, currentLb.DefaultPools, id) + updateLb.FallbackPool = updateLb.DefaultPools[0] + + updateLbs = append(updateLbs, updateLb) + } + } + + return deleteLbs, updateLbs +} + +func getLoadBalancerToCreate(currentLbs []*cloudflare.LoadBalancer, lbs []*cloudflare.LoadBalancer) []*cloudflare.LoadBalancer { + createLbs := make([]*cloudflare.LoadBalancer, 0) + + if lbs == nil { + return createLbs + } + + for _, lb := range lbs { + found := false + for _, currentLb := range currentLbs { + if currentLb.Name == lb.Name { + found = true + break + } + } + if !found { + createLbs = append(createLbs, lb) + } + } + + return createLbs +} + +func getLoadBalancerToUpdate( + ctx context.Context, + cf *cloudflare.Cloudflare, + id, + domain string, + currentLbs []*cloudflare.LoadBalancer, + lbs []*cloudflare.LoadBalancer, + infos []*additionalInfos, +) []*cloudflare.LoadBalancer { + updateLbs := make([]*cloudflare.LoadBalancer, 0) + + if lbs == nil { + return updateLbs + } + + for _, lb := range lbs { + additional := &additionalInfos{} + for _, add := range infos { + if add.name == lb.Name { + additional = add + } + } + poolName := getPoolName(additional.subdomain, domain, additional.region, additional.clusterID) + + for _, currentLb := range currentLbs { + if currentLb.Name == lb.Name { + containedRegion := false + containedDefault := false + for _, currentPool := range currentLb.DefaultPools { + if currentPool == poolName { + containedDefault = true + break + } + } + + regionPoolsLoop: + for currentRegion, currentPools := range currentLb.RegionPools { + if currentRegion == additional.region { + for _, currentPool := range currentPools { + if currentPool == poolName { + containedRegion = true + break regionPoolsLoop + } + } + } + } + + //only update the lb if a pool has to be added + if containedDefault && containedRegion { + continue + } + + lb.ID = currentLb.ID + // add already entered pools for update + //all pools which are maintained by operators with other ids + lb.DefaultPools = append(lb.DefaultPools, filterNotSameID(ctx, cf, currentLb.DefaultPools, id)...) + + // combine the defined region pools for update + for currentRegion, currentPools := range currentLb.RegionPools { + regionSlice, found := lb.RegionPools[currentRegion] + if found { + lb.DefaultPools = append(lb.DefaultPools, filterNotSameID(ctx, cf, currentLb.DefaultPools, id)...) + + regionSlice = append(regionSlice, currentPools...) + } else { + defPool := []string{} + defPool = append(defPool, filterNotSameID(ctx, cf, currentPools, id)...) + lb.RegionPools[currentRegion] = defPool + } + } + updateLbs = append(updateLbs, lb) + } + } + } + + return updateLbs +} + +func hasPoolsWithOtherID(ctx context.Context, cf *cloudflare.Cloudflare, id string, lb *cloudflare.LoadBalancer) bool { + filteredPools := filterNotSameID(ctx, cf, lb.DefaultPools, id) + if filteredPools != nil && len(filteredPools) > 0 { + return true + } + return false +} + +func filterSameID(ctx context.Context, cf *cloudflare.Cloudflare, pools []string, id string) []string { + ret := make([]string, 0) + for _, poolID := range pools { + poolDet, err := cf.GetLoadBalancerPoolDetails(ctx, poolID) + if err != nil { + return nil + } + if poolDet.Description == id { + ret = append(ret, poolID) + } + } + return ret +} + +func filterNotSameID(ctx context.Context, cf *cloudflare.Cloudflare, pools []string, id string) []string { + ret := make([]string, 0) + for _, poolID := range pools { + poolDet, err := cf.GetLoadBalancerPoolDetails(ctx, poolID) + if err != nil { + return nil + } + if poolDet.Description != id { + ret = append(ret, poolID) + } + } + return ret +} diff --git a/internal/operator/networking/kinds/networking/legacycf/app/pools.go b/internal/operator/networking/kinds/networking/legacycf/app/pools.go new file mode 100644 index 000000000..6f2d2b0ed --- /dev/null +++ b/internal/operator/networking/kinds/networking/legacycf/app/pools.go @@ -0,0 +1,124 @@ +package app + +import ( + "context" + "github.com/caos/orbos/internal/operator/networking/kinds/networking/legacycf/cloudflare" + "reflect" + "strings" +) + +func getPoolName(subdomain, domain, region, clusterID string) string { + return strings.Join([]string{clusterID, region, subdomain, strings.ReplaceAll(domain, ".", "-")}, "-") +} + +func (a *App) EnsureLoadBalancerPools(ctx context.Context, id string, pools []*cloudflare.LoadBalancerPool) (func() error, error) { + destroy := func() error { + return nil + } + currentPools, err := a.cloudflare.ListLoadBalancerPools(ctx) + if err != nil { + return nil, err + } + + filteredCurrentPools := make([]*cloudflare.LoadBalancerPool, 0) + for _, currentPool := range currentPools { + if currentPool.Description == id { + filteredCurrentPools = append(filteredCurrentPools, currentPool) + } + } + + deletePools := getLoadBalancerPoolsToDelete(filteredCurrentPools, pools) + if deletePools != nil && len(deletePools) > 0 { + destroy = func() error { + for _, pool := range deletePools { + if err := a.cloudflare.DeleteLoadBalancerPools(ctx, pool); err != nil { + return err + } + } + return nil + } + } + + createPools := getLoadBalancerPoolsToCreate(currentPools, pools) + if createPools != nil && len(createPools) > 0 { + for _, pool := range createPools { + created, err := a.cloudflare.CreateLoadBalancerPools(ctx, pool) + if err != nil { + return nil, err + } + pool.ID = created.ID + } + } + + updatePools := getLoadBalancerPoolsToUpdate(currentPools, pools) + if updatePools != nil && len(updatePools) > 0 { + for _, pool := range updatePools { + updated, err := a.cloudflare.UpdateLoadBalancerPools(ctx, pool) + if err != nil { + return nil, err + } + pool.ID = updated.ID + } + } + + return destroy, nil +} + +func getLoadBalancerPoolsToDelete(currentPools []*cloudflare.LoadBalancerPool, pools []*cloudflare.LoadBalancerPool) []string { + deletePools := make([]string, 0) + for _, currentPool := range currentPools { + found := false + if pools != nil { + for _, pool := range pools { + if currentPool.Name == pool.Name { + found = true + } + } + } + + if !found { + deletePools = append(deletePools, currentPool.ID) + } + } + + return deletePools +} + +func getLoadBalancerPoolsToCreate(currentPools []*cloudflare.LoadBalancerPool, pools []*cloudflare.LoadBalancerPool) []*cloudflare.LoadBalancerPool { + createPools := make([]*cloudflare.LoadBalancerPool, 0) + + if pools != nil { + for _, pool := range pools { + found := false + for _, currentPool := range currentPools { + if currentPool.Name == pool.Name { + found = true + break + } + } + if found == false { + createPools = append(createPools, pool) + } + } + } + + return createPools +} + +func getLoadBalancerPoolsToUpdate(currentPools []*cloudflare.LoadBalancerPool, pools []*cloudflare.LoadBalancerPool) []*cloudflare.LoadBalancerPool { + updatePools := make([]*cloudflare.LoadBalancerPool, 0) + + if pools != nil { + for _, pool := range pools { + for _, currentPool := range currentPools { + if currentPool.Name == pool.Name && + !reflect.DeepEqual(currentPool, pool) { + pool.ID = currentPool.ID + updatePools = append(updatePools, pool) + } + } + } + } + + return updatePools +} diff --git a/internal/operator/networking/kinds/networking/legacycf/cloudflare/cloudflare.go b/internal/operator/networking/kinds/networking/legacycf/cloudflare/cloudflare.go index d6de59953..7d98836b8 100644 --- a/internal/operator/networking/kinds/networking/legacycf/cloudflare/cloudflare.go +++ b/internal/operator/networking/kinds/networking/legacycf/cloudflare/cloudflare.go @@ -1,6 +1,8 @@ package cloudflare import ( + "context" + "errors" "github.com/cloudflare/cloudflare-go" ) @@ -13,13 +15,29 @@ type Cloudflare struct { api *cloudflare.API } -func New(user string, key string, userServiceKey string) (*Cloudflare, error) { +func New(ctx context.Context, accountName string, user string, key string, userServiceKey string) (*Cloudflare, error) { api, err := cloudflare.New(key, user) if err != nil { return nil, err } api.APIUserServiceKey = userServiceKey + if accountName != "" { + accounts, _, err := api.Accounts(ctx, cloudflare.PaginationOptions{}) + if err != nil { + return nil, err + } + found := false + for _, account := range accounts { + if account.Name == accountName { + found = true + api.AccountID = account.ID + } + } + if !found { + return nil, errors.New("no account with given name found") + } + } return &Cloudflare{ api: api, diff --git a/internal/operator/networking/kinds/networking/legacycf/cloudflare/loadbalancer.go b/internal/operator/networking/kinds/networking/legacycf/cloudflare/loadbalancer.go new file mode 100644 index 000000000..615ef4041 --- /dev/null +++ b/internal/operator/networking/kinds/networking/legacycf/cloudflare/loadbalancer.go @@ -0,0 +1,157 @@ +package cloudflare + +import ( + "context" + "github.com/cloudflare/cloudflare-go" + "time" +) + +type LoadBalancer struct { + ID string `json:"id,omitempty"` + CreatedOn *time.Time `json:"created_on,omitempty"` + ModifiedOn *time.Time `json:"modified_on,omitempty"` + Description string `json:"description"` + Name string `json:"name"` + TTL int `json:"ttl,omitempty"` + FallbackPool string `json:"fallback_pool"` + DefaultPools []string `json:"default_pools"` + RegionPools map[string][]string `json:"region_pools"` + PopPools map[string][]string `json:"pop_pools"` + Proxied bool `json:"proxied"` + Enabled *bool `json:"enabled,omitempty"` + Persistence string `json:"session_affinity,omitempty"` + PersistenceTTL int `json:"session_affinity_ttl,omitempty"` + SessionAffinityAttributes *SessionAffinityAttributes `json:"session_affinity_attributes,omitempty"` + + // SteeringPolicy controls pool selection logic. + // "off" select pools in DefaultPools order + // "geo" select pools based on RegionPools/PopPools + // "dynamic_latency" select pools based on RTT (requires health checks) + // "random" selects pools in a random order + // "" maps to "geo" if RegionPools or PopPools have entries otherwise "off" + SteeringPolicy string `json:"steering_policy,omitempty"` +} + +// SessionAffinityAttributes represents the fields used to set attributes in a load balancer session affinity cookie. +type SessionAffinityAttributes struct { + SameSite string `json:"samesite,omitempty"` + Secure string `json:"secure,omitempty"` +} + +func (c *Cloudflare) CreateLoadBalancer(ctx context.Context, domain string, lb *LoadBalancer) (*LoadBalancer, error) { + id, err := c.api.ZoneIDByName(domain) + if err != nil { + return nil, err + } + + createdLb, err := c.api.CreateLoadBalancer(ctx, id, internalLbToLb(lb)) + + if err != nil { + return nil, err + } + + return lbToInternalLb(createdLb), err +} + +func (c *Cloudflare) UpdateLoadBalancer(ctx context.Context, domain string, lb *LoadBalancer) (*LoadBalancer, error) { + id, err := c.api.ZoneIDByName(domain) + if err != nil { + return nil, err + } + + updated, err := c.api.ModifyLoadBalancer(ctx, id, internalLbToLb(lb)) + if err != nil { + return nil, err + } + + return lbToInternalLb(updated), err +} + +func (c *Cloudflare) DeleteLoadBalancer(ctx context.Context, domain string, lbID string) error { + id, err := c.api.ZoneIDByName(domain) + if err != nil { + return err + } + + return c.api.DeleteLoadBalancer(ctx, id, lbID) +} + +func (c *Cloudflare) ListLoadBalancers(ctx context.Context, domain string) ([]*LoadBalancer, error) { + id, err := c.api.ZoneIDByName(domain) + if err != nil { + return nil, err + } + + lbs, err := c.api.ListLoadBalancers(ctx, id) + if err != nil { + return nil, err + } + return lbsToInternalLbs(lbs), nil +} + +func lbsToInternalLbs(lbs []cloudflare.LoadBalancer) []*LoadBalancer { + ret := make([]*LoadBalancer, 0) + for _, lb := range lbs { + ret = append(ret, lbToInternalLb(lb)) + } + return ret +} + +func lbToInternalLb(lb cloudflare.LoadBalancer) *LoadBalancer { + return &LoadBalancer{ + ID: lb.ID, + CreatedOn: lb.CreatedOn, + ModifiedOn: lb.ModifiedOn, + Description: lb.Description, + Name: lb.Name, + TTL: lb.TTL, + FallbackPool: lb.FallbackPool, + DefaultPools: lb.DefaultPools, + RegionPools: lb.RegionPools, + PopPools: lb.PopPools, + Proxied: lb.Proxied, + Enabled: lb.Enabled, + Persistence: lb.Persistence, + PersistenceTTL: lb.PersistenceTTL, + SessionAffinityAttributes: saaToInternalSaa(lb.SessionAffinityAttributes), + SteeringPolicy: lb.SteeringPolicy, + } +} + +func saaToInternalSaa(saa *cloudflare.SessionAffinityAttributes) *SessionAffinityAttributes { + return &SessionAffinityAttributes{ + SameSite: saa.SameSite, + Secure: saa.Secure, + } +} + +func internalLbToLb(lb *LoadBalancer) cloudflare.LoadBalancer { + return cloudflare.LoadBalancer{ + ID: lb.ID, + CreatedOn: lb.CreatedOn, + ModifiedOn: lb.ModifiedOn, + Description: lb.Description, + Name: lb.Name, + TTL: lb.TTL, + FallbackPool: lb.FallbackPool, + DefaultPools: lb.DefaultPools, + RegionPools: lb.RegionPools, + PopPools: lb.PopPools, + Proxied: lb.Proxied, + Enabled: lb.Enabled, + Persistence: lb.Persistence, + PersistenceTTL: lb.PersistenceTTL, + SessionAffinityAttributes: internalSaaToSaa(lb.SessionAffinityAttributes), + SteeringPolicy: lb.SteeringPolicy, + } +} + +func internalSaaToSaa(saa *SessionAffinityAttributes) *cloudflare.SessionAffinityAttributes { + if saa == nil { + return nil + } + return &cloudflare.SessionAffinityAttributes{ + SameSite: saa.SameSite, + Secure: saa.Secure, + } +} diff --git a/internal/operator/networking/kinds/networking/legacycf/cloudflare/pool.go b/internal/operator/networking/kinds/networking/legacycf/cloudflare/pool.go new file mode 100644 index 000000000..247651a91 --- /dev/null +++ b/internal/operator/networking/kinds/networking/legacycf/cloudflare/pool.go @@ -0,0 +1,138 @@ +package cloudflare + +import ( + "context" + "github.com/cloudflare/cloudflare-go" + "time" +) + +type LoadBalancerPool struct { + ID string `json:"id,omitempty"` + CreatedOn *time.Time `json:"created_on,omitempty"` + ModifiedOn *time.Time `json:"modified_on,omitempty"` + Description string `json:"description"` + Name string `json:"name"` + Enabled bool `json:"enabled"` + MinimumOrigins int `json:"minimum_origins,omitempty"` + Monitor string `json:"monitor,omitempty"` + Origins []*LoadBalancerOrigin `json:"origins"` + NotificationEmail string `json:"notification_email,omitempty"` + + // CheckRegions defines the geographic region(s) from where to run health-checks from - e.g. "WNAM", "WEU", "SAF", "SAM". + // Providing a null/empty value means "all regions", which may not be available to all plan types. + CheckRegions []string `json:"check_regions"` +} + +type LoadBalancerOrigin struct { + Name string `json:"name"` + Address string `json:"address"` + Enabled bool `json:"enabled"` + Weight float64 `json:"weight"` +} + +func (c *Cloudflare) GetLoadBalancerPoolDetails(ctx context.Context, ID string) (*LoadBalancerPool, error) { + pool, err := c.api.LoadBalancerPoolDetails(ctx, ID) + + if err != nil { + return nil, err + } + + return poolToInternalPool(pool), err +} + +func (c *Cloudflare) CreateLoadBalancerPools(ctx context.Context, pool *LoadBalancerPool) (*LoadBalancerPool, error) { + createdPool, err := c.api.CreateLoadBalancerPool(ctx, internalPoolToPool(pool)) + + if err != nil { + return nil, err + } + + return poolToInternalPool(createdPool), err +} + +func (c *Cloudflare) UpdateLoadBalancerPools(ctx context.Context, pool *LoadBalancerPool) (*LoadBalancerPool, error) { + updatedPool, err := c.api.ModifyLoadBalancerPool(ctx, internalPoolToPool(pool)) + if err != nil { + return nil, err + } + + return poolToInternalPool(updatedPool), err +} + +func (c *Cloudflare) DeleteLoadBalancerPools(ctx context.Context, poolID string) error { + return c.api.DeleteLoadBalancerPool(ctx, poolID) +} + +func (c *Cloudflare) ListLoadBalancerPools(ctx context.Context) ([]*LoadBalancerPool, error) { + pools, err := c.api.ListLoadBalancerPools(ctx) + if err != nil { + return nil, err + } + return poolsToInternalPools(pools), nil +} + +func poolsToInternalPools(pools []cloudflare.LoadBalancerPool) []*LoadBalancerPool { + retPools := make([]*LoadBalancerPool, 0) + for _, pool := range pools { + retPools = append(retPools, poolToInternalPool(pool)) + } + return retPools +} + +func poolToInternalPool(pool cloudflare.LoadBalancerPool) *LoadBalancerPool { + return &LoadBalancerPool{ + ID: pool.ID, + CreatedOn: pool.CreatedOn, + ModifiedOn: pool.ModifiedOn, + Description: pool.Description, + Name: pool.Name, + Enabled: pool.Enabled, + MinimumOrigins: pool.MinimumOrigins, + Monitor: pool.Monitor, + Origins: originsToInternalOrigins(pool.Origins), + NotificationEmail: pool.NotificationEmail, + CheckRegions: pool.CheckRegions, + } +} + +func originsToInternalOrigins(origins []cloudflare.LoadBalancerOrigin) []*LoadBalancerOrigin { + internalOrigins := make([]*LoadBalancerOrigin, 0) + for _, origin := range origins { + internalOrigins = append(internalOrigins, &LoadBalancerOrigin{ + Name: origin.Name, + Address: origin.Address, + Enabled: origin.Enabled, + Weight: origin.Weight, + }) + } + return internalOrigins +} + +func internalPoolToPool(pool *LoadBalancerPool) cloudflare.LoadBalancerPool { + return cloudflare.LoadBalancerPool{ + ID: pool.ID, + CreatedOn: pool.CreatedOn, + ModifiedOn: pool.ModifiedOn, + Description: pool.Description, + Name: pool.Name, + Enabled: pool.Enabled, + MinimumOrigins: pool.MinimumOrigins, + Monitor: pool.Monitor, + Origins: internalOriginsToOrigins(pool.Origins), + NotificationEmail: pool.NotificationEmail, + CheckRegions: pool.CheckRegions, + } +} + +func internalOriginsToOrigins(internalOrigins []*LoadBalancerOrigin) []cloudflare.LoadBalancerOrigin { + origins := make([]cloudflare.LoadBalancerOrigin, 0) + for _, origin := range internalOrigins { + origins = append(origins, cloudflare.LoadBalancerOrigin{ + Name: origin.Name, + Address: origin.Address, + Enabled: origin.Enabled, + Weight: origin.Weight, + }) + } + return origins +} diff --git a/internal/operator/networking/kinds/networking/legacycf/config/external.go b/internal/operator/networking/kinds/networking/legacycf/config/external.go index 1b260524c..c3595d01b 100644 --- a/internal/operator/networking/kinds/networking/legacycf/config/external.go +++ b/internal/operator/networking/kinds/networking/legacycf/config/external.go @@ -3,33 +3,33 @@ package config import ( "errors" "fmt" - "net" + "strings" "github.com/caos/orbos/mntr" "github.com/caos/orbos/pkg/secret" - core2 "github.com/caos/orbos/internal/operator/core" + opcore "github.com/caos/orbos/internal/operator/core" "github.com/caos/orbos/internal/operator/networking/kinds/networking/core" "github.com/caos/orbos/pkg/labels" ) type ExternalConfig struct { + AccountName string `yaml:"accountName"` Verbose bool Domain string - IP string Rules []*Rule - Groups []*Group `yaml:"groups"` - Credentials *Credentials `yaml:"credentials"` - Prefix string `yaml:"prefix"` - AdditionalDNS []*Subdomain `yaml:"additionalSubdomains,omitempty"` + Groups []*Group `yaml:"groups"` + Credentials *Credentials `yaml:"credentials"` + Prefix string `yaml:"prefix"` + AdditionalDNS []*Subdomain `yaml:"additionalSubdomains,omitempty"` + LoadBalancers []*LoadBalancer `yaml:"loadBalancers,omitempty"` } func (i *ExternalConfig) IsZero() bool { if (i.Credentials == nil || i.Credentials.IsZero()) && !i.Verbose && i.Domain == "" && - i.IP == "" && i.Groups == nil && i.Prefix == "" && i.Rules == nil && @@ -39,9 +39,11 @@ func (i *ExternalConfig) IsZero() bool { return false } -func (e *ExternalConfig) Internal(namespace string, apiLabels *labels.API) (*InternalConfig, *current) { +func (e *ExternalConfig) Internal(id, namespace string, apiLabels *labels.API) (*InternalConfig, *current) { dom, curr := e.internalDomain() return &InternalConfig{ + AccountName: e.AccountName, + ID: id, Domains: []*InternalDomain{dom}, Groups: e.Groups, Credentials: e.Credentials, @@ -52,6 +54,9 @@ func (e *ExternalConfig) Internal(namespace string, apiLabels *labels.API) (*Int }, curr } +var ErrNoLBID = errors.New("no loadbalancer identifier provided") +var ErrDoubleLBID = errors.New("loadbalancer identifier doublicate") + func (e *ExternalConfig) Validate() (err error) { defer func() { err = mntr.ToUserError(err) @@ -60,14 +65,29 @@ func (e *ExternalConfig) Validate() (err error) { return errors.New("domain not found") } if e.Domain == "" { - return errors.New("no domain configured") + return errors.New("No domain configured") } - if net.ParseIP(e.IP) == nil { - return fmt.Errorf("%s is not a valid ip address", e.IP) + + identifiers := []string{} + for _, loadbalancer := range e.LoadBalancers { + if loadbalancer == nil { + continue + } + + if loadbalancer.Subdomain == "" { + return ErrNoLBID + } + + for _, id := range identifiers { + if id == loadbalancer.Subdomain { + return ErrDoubleLBID + } + } + identifiers = append(identifiers, loadbalancer.Subdomain) } + return nil } - func (e *ExternalConfig) ValidateSecrets() (err error) { defer func() { @@ -91,22 +111,34 @@ func (e *ExternalConfig) ValidateSecrets() (err error) { } func (e *ExternalConfig) internalDomain() (*InternalDomain, *current) { - - // TODO: Remove - subdomains := []*Subdomain{ - subdomain("accounts", e.IP), - subdomain("api", e.IP), - subdomain("console", e.IP), - subdomain("issuer", e.IP), - } + subdomains := []*Subdomain{} for _, sd := range e.AdditionalDNS { subdomains = append(subdomains, sd) } + lbs := make([]*LoadBalancer, 0) + if e.LoadBalancers != nil { + for _, lb := range e.LoadBalancers { + pool := map[string]string{} + for k, v := range lb.Pool { + pool[k] = v + } + + lbs = append(lbs, &LoadBalancer{ + Subdomain: lb.Subdomain, + ClusterID: lb.ClusterID, + Region: lb.Region, + Enabled: lb.Enabled, + Pool: pool, + }) + } + } + return &InternalDomain{ - Domain: e.Domain, - Subdomains: subdomains, - Rules: e.Rules, + Domain: e.Domain, + Subdomains: subdomains, + Rules: e.Rules, + LoadBalancers: lbs, }, ¤t{ domain: e.Domain, @@ -117,14 +149,17 @@ func (e *ExternalConfig) internalDomain() (*InternalDomain, *current) { tlsCertName: "tls-cert-wildcard", } } +func GetLBName(subdomain, domain string) string { + return strings.Join([]string{subdomain, domain}, ".") +} -func subdomain(subdomain string, ip string) *Subdomain { +func subdomain(subdomain string, target string, ty string) *Subdomain { return &Subdomain{ Subdomain: subdomain, - IP: ip, + IP: target, Proxied: boolPtr(true), TTL: 0, - Type: "A", + Type: ty, } } @@ -137,7 +172,7 @@ type current struct { apiSubdomain string `yaml:"-"` accountsSubdomain string `yaml:"-"` tlsCertName string `yaml:"-"` - ReadyCertificate core2.EnsureFunc + ReadyCertificate opcore.EnsureFunc } func (c *current) GetDomain() string { @@ -155,7 +190,7 @@ func (c *current) GetAPISubDomain() string { func (c *current) GetAccountsSubDomain() string { return c.accountsSubdomain } -func (c *current) GetReadyCertificate() core2.EnsureFunc { +func (c *current) GetReadyCertificate() opcore.EnsureFunc { return c.ReadyCertificate } func (c *current) GetTlsCertName() string { diff --git a/internal/operator/networking/kinds/networking/legacycf/config/internal.go b/internal/operator/networking/kinds/networking/legacycf/config/internal.go index 47519a290..07c81b83d 100644 --- a/internal/operator/networking/kinds/networking/legacycf/config/internal.go +++ b/internal/operator/networking/kinds/networking/legacycf/config/internal.go @@ -6,6 +6,8 @@ import ( ) type InternalConfig struct { + AccountName string + ID string Domains []*InternalDomain `yaml:"domains"` Groups []*Group `yaml:"groups"` Credentials *Credentials @@ -39,10 +41,19 @@ type Group struct { } type InternalDomain struct { - Domain string `yaml:"domain"` - Origin *Origin `yaml:"origin"` - Subdomains []*Subdomain `yaml:"subdomains"` - Rules []*Rule `yaml:"rules"` + Domain string `yaml:"domain"` + Origin *Origin `yaml:"origin"` + Subdomains []*Subdomain `yaml:"subdomains"` + Rules []*Rule `yaml:"rules"` + LoadBalancers []*LoadBalancer `yaml:"loadbalancers"` +} + +type LoadBalancer struct { + Subdomain string `yaml:"subdomain"` + ClusterID string `yaml:"clusterid"` + Region string `yaml:"region"` + Enabled bool `yaml:"enabled"` + Pool map[string]string `yaml:"pool"` } type Origin struct { diff --git a/internal/operator/networking/kinds/networking/legacycf/legacyadapter.go b/internal/operator/networking/kinds/networking/legacycf/legacyadapter.go index 0e216b4ce..be648f774 100644 --- a/internal/operator/networking/kinds/networking/legacycf/legacyadapter.go +++ b/internal/operator/networking/kinds/networking/legacycf/legacyadapter.go @@ -47,14 +47,24 @@ func adaptFunc( return err } - apps, err := app.New(user, apiKey, userServiceKey, groups, cfg.Prefix) + apps, err := app.New(ctx, cfg.AccountName, user, apiKey, userServiceKey, groups, cfg.Prefix) if err != nil { return err } caSecretLabels := labels.MustForName(labels.MustForComponent(cfg.Labels, "cloudflare"), cfg.OriginCASecretName) for _, domain := range cfg.Domains { - err = apps.Ensure(ctx, k8sClient, cfg.Namespace, domain.Domain, domain.Subdomains, domain.Rules, caSecretLabels) + err = apps.Ensure( + ctx, + cfg.ID, + k8sClient, + cfg.Namespace, + domain.Domain, + domain.Subdomains, + domain.Rules, + caSecretLabels, + domain.LoadBalancers, + ) if err != nil { return err } diff --git a/internal/operator/networking/kinds/networking/networking.go b/internal/operator/networking/kinds/networking/networking.go index cc5ae527b..1e0e70a03 100644 --- a/internal/operator/networking/kinds/networking/networking.go +++ b/internal/operator/networking/kinds/networking/networking.go @@ -15,6 +15,7 @@ import ( func GetQueryAndDestroyFuncs( ctx context.Context, monitor mntr.Monitor, + ID string, operatorLabels *labels.Operator, desiredTree *tree.Tree, currentTree *tree.Tree, @@ -29,7 +30,7 @@ func GetQueryAndDestroyFuncs( ) { switch desiredTree.Common.Kind { case "networking.caos.ch/LegacyCloudflare": - return legacycf.AdaptFunc(ctx, namespace, operatorLabels)(monitor, desiredTree, currentTree) + return legacycf.AdaptFunc(ctx, namespace, ID, operatorLabels)(monitor, desiredTree, currentTree) default: return nil, nil, nil, nil, false, fmt.Errorf("unknown networking kind %s", desiredTree.Common.Kind) } diff --git a/internal/operator/networking/kinds/orb/adapt.go b/internal/operator/networking/kinds/orb/adapt.go index fa3f6ee45..13fba7c41 100644 --- a/internal/operator/networking/kinds/orb/adapt.go +++ b/internal/operator/networking/kinds/orb/adapt.go @@ -17,7 +17,7 @@ func OperatorSelector() *labels.Selector { return labels.OpenOperatorSelector("ORBOS", "networking.caos.ch") } -func AdaptFunc(ctx context.Context, binaryVersion *string, gitops bool) core.AdaptFunc { +func AdaptFunc(ctx context.Context, ID string, binaryVersion *string, gitops bool) core.AdaptFunc { namespaceStr := "caos-zitadel" return func( @@ -52,7 +52,7 @@ func AdaptFunc(ctx context.Context, binaryVersion *string, gitops bool) core.Ada operatorLabels := mustDatabaseOperator(binaryVersion) networkingCurrent := &tree.Tree{} - queryNW, destroyNW, secrets, existing, migrate, err := networking.GetQueryAndDestroyFuncs(ctx, orbMonitor, operatorLabels, desiredKind.Networking, networkingCurrent, namespaceStr) + queryNW, destroyNW, secrets, existing, migrate, err := networking.GetQueryAndDestroyFuncs(ctx, orbMonitor, ID, operatorLabels, desiredKind.Networking, networkingCurrent, namespaceStr) if err != nil { return nil, nil, nil, nil, false, err } diff --git a/internal/secret/operators/operators.go b/internal/secret/operators/operators.go index 6f2a0ae6a..10a14c887 100644 --- a/internal/secret/operators/operators.go +++ b/internal/secret/operators/operators.go @@ -1,6 +1,7 @@ package operators import ( + "context" "errors" "fmt" "strings" @@ -123,7 +124,7 @@ func getAllSecrets( allExisting, func() (*tree.Tree, error) { return nwcrd.ReadCRD(k8sClient) }, func(t *tree.Tree) (map[string]*secret.Secret, map[string]*secret.Existing, bool, error) { - _, _, nwSecrets, nwExisting, migrate, err := nwOrb.AdaptFunc(nil, nil, false)(monitor, t, nil) + _, _, nwSecrets, nwExisting, migrate, err := nwOrb.AdaptFunc(context.Background(), "", nil, false)(monitor, t, nil) return nwSecrets, nwExisting, migrate, err }, ); err != nil { diff --git a/pkg/cfg/configure.go b/pkg/cfg/configure.go index ede96af5c..6479522ee 100644 --- a/pkg/cfg/configure.go +++ b/pkg/cfg/configure.go @@ -134,7 +134,7 @@ func ORBOSConfigurers( return nil, nil, err } - _, _, _, _, _, err = nwOrb.AdaptFunc(ctx, nil, true)(monitor, desired, &tree.Tree{}) + _, _, _, _, _, err = nwOrb.AdaptFunc(ctx, "", nil, true)(monitor, desired, &tree.Tree{}) return desired, desired.Parsed, err }, ),