From 97aff6d8a5e6a50a89fe6191aac2ed5f366e3993 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 31 Jul 2022 22:56:10 +0000 Subject: [PATCH 01/32] fix(deps): update kubernetes packages to v0.24.3 --- go.mod | 22 +++++++----- go.sum | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 113 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index a141b550..6b5150c2 100644 --- a/go.mod +++ b/go.mod @@ -3,21 +3,21 @@ module github.com/nakamasato/mysql-operator go 1.18 require ( - github.com/go-logr/logr v0.4.0 + github.com/go-logr/logr v1.2.0 github.com/go-sql-driver/mysql v1.7.0 github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.20.2 github.com/prometheus/client_golang v1.14.0 github.com/redhat-cop/operator-utils v1.3.3 - k8s.io/api v0.22.3 - k8s.io/apimachinery v0.22.3 - k8s.io/client-go v0.22.3 + k8s.io/api v0.24.3 + k8s.io/apimachinery v0.24.3 + k8s.io/client-go v0.24.3 k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed sigs.k8s.io/controller-runtime v0.10.0 ) require ( - cloud.google.com/go v0.65.0 // indirect + cloud.google.com/go v0.81.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.18 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect @@ -33,6 +33,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful v2.9.5+incompatible // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect @@ -43,6 +44,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.8 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/google/uuid v1.1.2 // indirect @@ -57,6 +59,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_model v0.3.0 // indirect @@ -74,7 +77,7 @@ require ( golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect @@ -84,9 +87,10 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiextensions-apiserver v0.22.1 // indirect k8s.io/component-base v0.22.3 // indirect - k8s.io/klog/v2 v2.9.0 // indirect - k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect + k8s.io/klog/v2 v2.60.1 // indirect + k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect k8s.io/kubectl v0.22.3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect + sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 6aa55f57..65302577 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,13 @@ cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bP cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -77,6 +82,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= @@ -101,6 +107,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P 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/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -128,15 +135,18 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= @@ -151,6 +161,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo 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/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= @@ -167,8 +178,9 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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.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/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -204,6 +216,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -226,6 +239,8 @@ github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA// github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -234,6 +249,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.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= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= @@ -243,6 +259,7 @@ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -250,6 +267,10 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -261,6 +282,7 @@ github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2c github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -294,6 +316,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +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.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -368,6 +391,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -414,14 +438,11 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= @@ -517,6 +538,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= @@ -552,6 +575,7 @@ golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPh 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/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -576,6 +600,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -586,6 +611,8 @@ 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.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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -623,12 +650,18 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R 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= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= @@ -638,7 +671,14 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -694,11 +734,19 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w 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= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -709,6 +757,7 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -732,8 +781,9 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -782,9 +832,16 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -808,6 +865,11 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -847,7 +909,17 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc 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= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -862,8 +934,13 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -878,6 +955,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj 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= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -921,19 +999,22 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= -k8s.io/api v0.22.3 h1:wOoES2GoSkUsdped2RB4zYypPqWtvprGoKCENTOOjP4= k8s.io/api v0.22.3/go.mod h1:azgiXFiXqiWyLCfI62/eYBOu19rj2LKmIhFPP4+33fs= +k8s.io/api v0.24.3 h1:tt55QEmKd6L2k5DP6G/ZzdMQKvG5ro4H4teClqm0sTY= +k8s.io/api v0.24.3/go.mod h1:elGR/XSZrS7z7cSZPzVWaycpJuGIw57j9b95/1PdJNI= k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE= k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c= k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.3 h1:mrvBG5CZnEfwgpVqWcrRKvdsYECTrhAR6cApAgdsflk= k8s.io/apimachinery v0.22.3/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.24.3 h1:hrFiNSA2cBZqllakVYyH/VyEh4B581bQRmqATJSeQTg= +k8s.io/apimachinery v0.24.3/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= k8s.io/cli-runtime v0.22.1/go.mod h1:YqwGrlXeEk15Yn3em2xzr435UGwbrCw5x+COQoTYfoo= k8s.io/cli-runtime v0.22.3/go.mod h1:um6JvCxV9Hrhq0zCUxcqYoY7/wF64g6IYgOViI8sg6Q= k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= -k8s.io/client-go v0.22.3 h1:6onkOSc+YNdwq5zXE0wFXicq64rrym+mXwHu/CPVGO4= k8s.io/client-go v0.22.3/go.mod h1:ElDjYf8gvZsKDYexmsmnMQ0DYO8W9RwBjfQ1PI53yow= +k8s.io/client-go v0.24.3 h1:Nl1840+6p4JqkFWEW2LnMKU667BUxw03REfLAVhuKQY= +k8s.io/client-go v0.24.3/go.mod h1:AAovolf5Z9bY1wIg2FZ8LPQlEdKHjLI7ZD4rw920BJw= k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= k8s.io/code-generator v0.22.3/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= @@ -943,12 +1024,15 @@ k8s.io/component-helpers v0.22.1/go.mod h1:QvBcDbX+qU5I2tMZABBF5fRwAlQwiv771IGBH k8s.io/component-helpers v0.22.3/go.mod h1:7OVySVH5elhHKuJKUOxZEfpT1Bm3ChmBQZHmuFfbGHk= 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/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 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.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= +k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kubectl v0.22.1/go.mod h1:mjAOgEbMNMtZWxnfM6jd+nPjPsaoLqO5xanc78WcSbw= k8s.io/kubectl v0.22.3 h1:xziSHHyFHg2nt9vE6A0XqW5dOePNSlzxG8z3z+IY63E= k8s.io/kubectl v0.22.3/go.mod h1:gcpQHPOx+Jke9Og6Li7YxR/ZuaOtFUeJw7xHH617tHs= @@ -957,6 +1041,7 @@ k8s.io/metrics v0.22.3/go.mod h1:HbLFLRKtXzoC/6tHLQAlO9AeOBXZp2eB6SsgkbujoNI= k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -965,13 +1050,16 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U= sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= sigs.k8s.io/kustomize/cmd/config v0.9.13/go.mod h1:7547FLF8W/lTaDf0BDqFTbZxM9zqwEJqCKN9sSR0xSs= sigs.k8s.io/kustomize/kustomize/v4 v4.2.0/go.mod h1:MOkR6fmhwG7hEDRXBYELTi5GSFcLwfqwzTRHW3kv5go= sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= From 309867413e8a3971d5d05523d8d2586c49ace8bb Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Mon, 1 Aug 2022 21:34:41 +0900 Subject: [PATCH 02/32] simplify implementation --- Makefile | 2 +- controllers/mysql_controller.go | 5 +- controllers/mysqluser_controller.go | 60 ++++---- controllers/mysqluser_controller_test.go | 19 +-- e2e/e2e_test.go | 10 -- go.mod | 26 +--- go.sum | 179 +++++++---------------- main.go | 4 +- 8 files changed, 96 insertions(+), 209 deletions(-) diff --git a/Makefile b/Makefile index 757aec94..4f6ac481 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ IMG ?= ghcr.io/nakamasato/mysql-operator:latest # Produce CRDs that work back to Kubernetes 1.11 (no version conversion) CRD_OPTIONS ?= "crd:trivialVersions=true,preserveUnknownFields=false" # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. -ENVTEST_K8S_VERSION = 1.21 +ENVTEST_K8S_VERSION = 1.24 # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) diff --git a/controllers/mysql_controller.go b/controllers/mysql_controller.go index 190d7aeb..491f5897 100644 --- a/controllers/mysql_controller.go +++ b/controllers/mysql_controller.go @@ -26,7 +26,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" - "github.com/go-logr/logr" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" ) @@ -67,7 +66,7 @@ func (r *MySQLReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } // Get referenced number - referencedNum, err := r.countReferencesByMySQLUser(ctx, log, mysql) + referencedNum, err := r.countReferencesByMySQLUser(ctx, mysql) if err != nil { log.Error(err, "[countReferences] Failed get referencedNum") return ctrl.Result{}, err @@ -96,7 +95,7 @@ func (r *MySQLReconciler) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } -func (r *MySQLReconciler) countReferencesByMySQLUser(ctx context.Context, log logr.Logger, mysql *mysqlv1alpha1.MySQL) (int, error) { +func (r *MySQLReconciler) countReferencesByMySQLUser(ctx context.Context, mysql *mysqlv1alpha1.MySQL) (int, error) { // 1. Get the referenced MySQLUser instances. // 2. Return the number of referencing MySQLUser. mysqlUserList := &mysqlv1alpha1.MySQLUserList{} diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index 5a883c31..86e95ec3 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -20,7 +20,6 @@ import ( "context" "strings" - "github.com/redhat-cop/operator-utils/pkg/util" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -31,7 +30,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "github.com/go-logr/logr" _ "github.com/go-sql-driver/mysql" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" @@ -51,8 +49,7 @@ const ( // MySQLUserReconciler reconciles a MySQLUser object type MySQLUserReconciler struct { - util.ReconcilerBase - Log logr.Logger + client.Client Scheme *runtime.Scheme MySQLClientFactory mysqlinternal.MySQLClientFactory } @@ -77,7 +74,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( // Fetch MySQLUser mysqlUser := &mysqlv1alpha1.MySQLUser{} - err := r.GetClient().Get(ctx, req.NamespacedName, mysqlUser) + err := r.Get(ctx, req.NamespacedName, mysqlUser) if err != nil { if errors.IsNotFound(err) { log.Info("[FetchMySQLUser] Not found", "req.NamespacedName", req.NamespacedName) @@ -94,12 +91,11 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( // Fetch MySQL mysql := &mysqlv1alpha1.MySQL{} var mysqlNamespacedName = client.ObjectKey{Namespace: req.Namespace, Name: mysqlUser.Spec.MysqlName} - if err := r.GetClient().Get(ctx, mysqlNamespacedName, mysql); err != nil { + if err := r.Get(ctx, mysqlNamespacedName, mysql); err != nil { log.Error(err, "[FetchMySQL] Failed") mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLFetchFailed - // return ctrl.Result{}, client.IgnoreNotFound(err) - return r.ManageError(ctx, mysqlUser, err) + return ctrl.Result{}, client.IgnoreNotFound(err) } log.Info("[FetchMySQL] Found") @@ -107,11 +103,11 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( if !r.ifOwnerReferencesContains(mysqlUser.ObjectMeta.OwnerReferences, mysql) { err := controllerutil.SetControllerReference(mysql, mysqlUser, r.Scheme) if err != nil { - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err //requeue } - err = r.GetClient().Update(ctx, mysqlUser) + err = r.Update(ctx, mysqlUser) if err != nil { - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err //requeue } } @@ -125,8 +121,9 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( if err != nil { mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLConnectionFailed + r.Status().Update(ctx, mysqlUser) log.Error(err, "[MySQLClient] Failed to create") - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err // requeue } log.Info("[MySQLClient] Ping") err = mysqlClient.Ping() @@ -134,7 +131,8 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLConnectionFailed log.Error(err, "[MySQLClient] Failed to connect to MySQL", "mysqlName", mysqlName) - return r.ManageError(ctx, mysqlUser, err) // requeue + r.Status().Update(ctx, mysqlUser) + return ctrl.Result{}, err // requeue } log.Info("[MySQLClient] Successfully connected") defer mysqlClient.Close() @@ -146,37 +144,36 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( // Run finalization logic for mysqlUserFinalizer. If the // finalization logic fails, don't remove the finalizer so // that we can retry during the next reconciliation. - if err := r.finalizeMySQLUser(log, mysqlUser, mysql); err != nil { + if err := r.finalizeMySQLUser(ctx, mysqlUser, mysql); err != nil { // return ctrl.Result{}, err - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err // requeue } // Remove mysqlUserFinalizer. Once all finalizers have been // removed, the object will be deleted. controllerutil.RemoveFinalizer(mysqlUser, mysqlUserFinalizer) - err := r.GetClient().Update(ctx, mysqlUser) + err := r.Update(ctx, mysqlUser) if err != nil { // return ctrl.Result{}, err - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err // requeue } return ctrl.Result{}, nil } - // return ctrl.Result{}, err - return r.ManageSuccess(ctx, mysqlUser) // should return success when not having the finalizer + return ctrl.Result{}, nil // should return success when not having the finalizer } // Add finalizer for this CR if !controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) { controllerutil.AddFinalizer(mysqlUser, mysqlUserFinalizer) - err = r.GetClient().Update(ctx, mysqlUser) + err = r.Update(ctx, mysqlUser) if err != nil { - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err // requeue } } // Get password from Secret if exists. Otherwise, generate new one. secretName := getSecretName(mysqlName, mysqlUserName) secret := &v1.Secret{} - err = r.GetClient().Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: secretName}, secret) + err = r.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: secretName}, secret) var password string if err != nil { if errors.IsNotFound(err) { // Secret doesn't exists -> generate password @@ -184,7 +181,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( password = utils.GenerateRandomString(16) } else { log.Error(err, "[password] Failed to get Secret", "secretName", secretName) - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err // requeue } } else { // exists -> get password from Secret password = string(secret.Data["password"]) @@ -194,22 +191,23 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( err = mysqlClient.Exec("CREATE USER IF NOT EXISTS '" + mysqlUserName + "'@'" + mysqlUser.Spec.Host + "' IDENTIFIED BY '" + password + "';") if err != nil { log.Error(err, "[MySQL] Failed to create MySQL user.", "mysqlName", mysqlName, "mysqlUserName", mysqlUserName) - return r.ManageError(ctx, mysqlUser, err) // requeue + return ctrl.Result{}, err // requeue } log.Info("[MySQL] Created or updated", "name", mysqlUserName, "mysqlUser.Namespace", mysqlUser.Namespace) metrics.MysqlUserCreatedTotal.Increment() mysqlUser.Status.Phase = mysqlUserPhaseReady mysqlUser.Status.Reason = "mysql user are successfully created. Secret is being created." - err = r.createSecret(ctx, log, password, secretName, mysqlUser.Namespace, mysqlUser) + err = r.createSecret(ctx, password, secretName, mysqlUser.Namespace, mysqlUser) // TODO: #35 add test if mysql user is successfully created but secret is failed to create if err != nil { - return r.ManageError(ctx, mysqlUser, err) + return ctrl.Result{}, err } mysqlUser.Status.Phase = mysqlUserPhaseReady mysqlUser.Status.Reason = mysqlUserReasonCompleted + r.Status().Update(ctx, mysqlUser) - return r.ManageSuccess(ctx, mysqlUser) + return ctrl.Result{}, nil } // SetupWithManager sets up the controller with the Manager. @@ -219,10 +217,11 @@ func (r *MySQLUserReconciler) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } -func (r *MySQLUserReconciler) finalizeMySQLUser(log logr.Logger, mysqlUser *mysqlv1alpha1.MySQLUser, mysql *mysqlv1alpha1.MySQL) error { +func (r *MySQLUserReconciler) finalizeMySQLUser(ctx context.Context, mysqlUser *mysqlv1alpha1.MySQLUser, mysql *mysqlv1alpha1.MySQL) error { // 1. Get the referenced MySQL instance. // 2. Connect to MySQL. // 3. Delete the MySQL user. + log := log.FromContext(ctx) cfg := mysqlinternal.MySQLConfig{ AdminUser: mysql.Spec.AdminUser, @@ -256,7 +255,8 @@ func getSecretName(mysqlName string, mysqlUserName string) string { return strings.Join(str, "-") } -func (r *MySQLUserReconciler) createSecret(ctx context.Context, log logr.Logger, password string, secretName string, namespace string, mysqlUser *mysqlv1alpha1.MySQLUser) error { +func (r *MySQLUserReconciler) createSecret(ctx context.Context, password string, secretName string, namespace string, mysqlUser *mysqlv1alpha1.MySQLUser) error { + log := log.FromContext(ctx) data := make(map[string][]byte) data["password"] = []byte(password) secret := &v1.Secret{ @@ -270,7 +270,7 @@ func (r *MySQLUserReconciler) createSecret(ctx context.Context, log logr.Logger, log.Error(err, "Failed to SetControllerReference for Secret.") return err } - if _, err := ctrl.CreateOrUpdate(ctx, r.GetClient(), secret, func() error { + if _, err := ctrl.CreateOrUpdate(ctx, r.Client, secret, func() error { secret.Data = data log.Info("Successfully created Secret.") return nil diff --git a/controllers/mysqluser_controller_test.go b/controllers/mysqluser_controller_test.go index 36af119d..95694858 100644 --- a/controllers/mysqluser_controller_test.go +++ b/controllers/mysqluser_controller_test.go @@ -5,7 +5,6 @@ import ( "time" . "github.com/onsi/ginkgo" - "github.com/redhat-cop/operator-utils/pkg/util" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -32,14 +31,7 @@ var _ = Describe("MySQLUser controller", func() { Expect(err).ToNot(HaveOccurred()) err = (&MySQLUserReconciler{ - ReconcilerBase: util.NewReconcilerBase( - k8sManager.GetClient(), - k8sManager.GetScheme(), - k8sManager.GetConfig(), - k8sManager.GetEventRecorderFor("mysqluser_controller"), - k8sManager.GetAPIReader(), - ), - Log: nil, + Client: k8sManager.GetClient(), Scheme: k8sManager.GetScheme(), MySQLClientFactory: NewFakeMySQLClient, }).SetupWithManager(k8sManager) @@ -191,14 +183,7 @@ var _ = Describe("MySQLUser controller", func() { Expect(err).ToNot(HaveOccurred()) err = (&MySQLUserReconciler{ - ReconcilerBase: util.NewReconcilerBase( - k8sManager.GetClient(), - k8sManager.GetScheme(), - k8sManager.GetConfig(), - k8sManager.GetEventRecorderFor("mysqluser_controller"), - k8sManager.GetAPIReader(), - ), - Log: nil, + Client: k8sManager.GetClient(), Scheme: k8sManager.GetScheme(), MySQLClientFactory: NewMySQLClient, // real mysql client }).SetupWithManager(k8sManager) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 809fcfa6..afb5dbb7 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -19,7 +19,6 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" ) const ( @@ -352,15 +351,6 @@ func newMySQLDeployment() *appsv1.Deployment { Value: "password", }, }, - ReadinessProbe: &corev1.Probe{ - Handler: corev1.Handler{ - TCPSocket: &corev1.TCPSocketAction{ - Port: intstr.FromInt(3306), - }, - }, - InitialDelaySeconds: 5, - PeriodSeconds: 10, - }, }}, }, }, diff --git a/go.mod b/go.mod index 6b5150c2..e7f8dd9f 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,15 @@ module github.com/nakamasato/mysql-operator go 1.18 require ( - github.com/go-logr/logr v1.2.0 github.com/go-sql-driver/mysql v1.7.0 github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.20.2 github.com/prometheus/client_golang v1.14.0 - github.com/redhat-cop/operator-utils v1.3.3 k8s.io/api v0.24.3 k8s.io/apimachinery v0.24.3 k8s.io/client-go v0.24.3 k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed - sigs.k8s.io/controller-runtime v0.10.0 + sigs.k8s.io/controller-runtime v0.12.3 ) require ( @@ -24,10 +22,6 @@ require ( github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v0.4.1 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.2 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -36,8 +30,9 @@ require ( github.com/emicklei/go-restful v2.9.5+incompatible // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/go-logr/zapr v0.4.0 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/go-logr/logr v1.2.0 // indirect + github.com/go-logr/zapr v1.2.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.5 // indirect github.com/go-openapi/swag v0.19.14 // indirect @@ -48,15 +43,11 @@ require ( github.com/google/go-cmp v0.5.8 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/google/uuid v1.1.2 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/huandu/xstrings v1.3.1 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mitchellh/copystructure v1.0.0 // indirect - github.com/mitchellh/reflectwalk v1.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect @@ -65,12 +56,10 @@ require ( github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect - github.com/shopspring/decimal v1.2.0 // indirect - github.com/spf13/cast v1.3.1 // indirect github.com/spf13/pflag v1.0.5 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.19.0 // indirect + go.uber.org/zap v1.19.1 // indirect golang.org/x/crypto v0.1.0 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect @@ -85,11 +74,10 @@ require ( gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.22.1 // indirect - k8s.io/component-base v0.22.3 // indirect + k8s.io/apiextensions-apiserver v0.24.2 // indirect + k8s.io/component-base v0.24.2 // indirect k8s.io/klog/v2 v2.60.1 // indirect k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect - k8s.io/kubectl v0.22.3 // indirect sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/go.sum b/go.sum index 65302577..891975d1 100644 --- a/go.sum +++ b/go.sum @@ -38,7 +38,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -55,16 +54,7 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= -github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -78,8 +68,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= @@ -93,7 +83,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= @@ -101,7 +91,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 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= @@ -109,28 +98,26 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -143,28 +130,24 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 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/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -178,11 +161,10 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= +github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -203,6 +185,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -235,10 +218,11 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= +github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -272,18 +256,12 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -298,7 +276,6 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -313,12 +290,9 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 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.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= 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/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -344,6 +318,7 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -351,37 +326,28 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 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/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -389,7 +355,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -398,28 +363,22 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 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/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= 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= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 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/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= 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.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -428,6 +387,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -463,19 +423,13 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/redhat-cop/operator-utils v1.3.3 h1:47hYR95D07tCyPiALqYrGg3wP5ifpfqb/DUFMzWcuJg= -github.com/redhat-cop/operator-utils v1.3.3/go.mod h1:FfTyeSCu+e2VLgeMh/1RFG8TSkVjKRPEyR6EmDt0RIw= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/scylladb/go-set v1.0.2/go.mod h1:DkpGd78rljTxKAnTDPFqXSGxvETQnJyuSOQwsHycqfs= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -489,22 +443,18 @@ github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -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.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= 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= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -515,21 +465,22 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 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.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= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= @@ -552,29 +503,30 @@ go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 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.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= 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= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/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/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= @@ -601,7 +553,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -614,6 +565,7 @@ 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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -627,7 +579,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -658,9 +609,9 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -710,7 +661,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -733,7 +683,6 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w 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= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -754,15 +703,15 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -781,7 +730,6 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -842,7 +790,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -911,6 +859,7 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -921,9 +870,10 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -943,6 +893,7 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -998,66 +949,42 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= -k8s.io/api v0.22.3/go.mod h1:azgiXFiXqiWyLCfI62/eYBOu19rj2LKmIhFPP4+33fs= +k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= k8s.io/api v0.24.3 h1:tt55QEmKd6L2k5DP6G/ZzdMQKvG5ro4H4teClqm0sTY= k8s.io/api v0.24.3/go.mod h1:elGR/XSZrS7z7cSZPzVWaycpJuGIw57j9b95/1PdJNI= -k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE= -k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.3/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= +k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= k8s.io/apimachinery v0.24.3 h1:hrFiNSA2cBZqllakVYyH/VyEh4B581bQRmqATJSeQTg= k8s.io/apimachinery v0.24.3/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= -k8s.io/cli-runtime v0.22.1/go.mod h1:YqwGrlXeEk15Yn3em2xzr435UGwbrCw5x+COQoTYfoo= -k8s.io/cli-runtime v0.22.3/go.mod h1:um6JvCxV9Hrhq0zCUxcqYoY7/wF64g6IYgOViI8sg6Q= -k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= -k8s.io/client-go v0.22.3/go.mod h1:ElDjYf8gvZsKDYexmsmnMQ0DYO8W9RwBjfQ1PI53yow= +k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= +k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= k8s.io/client-go v0.24.3 h1:Nl1840+6p4JqkFWEW2LnMKU667BUxw03REfLAVhuKQY= k8s.io/client-go v0.24.3/go.mod h1:AAovolf5Z9bY1wIg2FZ8LPQlEdKHjLI7ZD4rw920BJw= -k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= -k8s.io/code-generator v0.22.3/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= -k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= -k8s.io/component-base v0.22.3 h1:/+hryAW03u3FpJQww+GSMsArJNUbGjH66lrgxaRynLU= -k8s.io/component-base v0.22.3/go.mod h1:kuybv1miLCMoOk3ebrqF93GbQHQx6W2287FC0YEQY6s= -k8s.io/component-helpers v0.22.1/go.mod h1:QvBcDbX+qU5I2tMZABBF5fRwAlQwiv771IGBHK9WYh4= -k8s.io/component-helpers v0.22.3/go.mod h1:7OVySVH5elhHKuJKUOxZEfpT1Bm3ChmBQZHmuFfbGHk= -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/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= +k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 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.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kubectl v0.22.1/go.mod h1:mjAOgEbMNMtZWxnfM6jd+nPjPsaoLqO5xanc78WcSbw= -k8s.io/kubectl v0.22.3 h1:xziSHHyFHg2nt9vE6A0XqW5dOePNSlzxG8z3z+IY63E= -k8s.io/kubectl v0.22.3/go.mod h1:gcpQHPOx+Jke9Og6Li7YxR/ZuaOtFUeJw7xHH617tHs= -k8s.io/metrics v0.22.1/go.mod h1:i/ZNap89UkV1gLa26dn7fhKAdheJaKy+moOqJbiif7E= -k8s.io/metrics v0.22.3/go.mod h1:HbLFLRKtXzoC/6tHLQAlO9AeOBXZp2eB6SsgkbujoNI= -k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U= -sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= +sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= +sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= -sigs.k8s.io/kustomize/cmd/config v0.9.13/go.mod h1:7547FLF8W/lTaDf0BDqFTbZxM9zqwEJqCKN9sSR0xSs= -sigs.k8s.io/kustomize/kustomize/v4 v4.2.0/go.mod h1:MOkR6fmhwG7hEDRXBYELTi5GSFcLwfqwzTRHW3kv5go= -sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/main.go b/main.go index d5bfd471..ad3c442e 100644 --- a/main.go +++ b/main.go @@ -36,7 +36,6 @@ import ( mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" "github.com/nakamasato/mysql-operator/controllers" "github.com/nakamasato/mysql-operator/internal/mysql" - "github.com/redhat-cop/operator-utils/pkg/util" //+kubebuilder:scaffold:imports ) @@ -84,8 +83,7 @@ func main() { } if err = (&controllers.MySQLUserReconciler{ - ReconcilerBase: util.NewReconcilerBase(mgr.GetClient(), mgr.GetScheme(), mgr.GetConfig(), mgr.GetEventRecorderFor("mysqluser_controller"), mgr.GetAPIReader()), - Log: ctrl.Log.WithName("controllers").WithName("MySQLUser"), + Client: mgr.GetClient(), Scheme: mgr.GetScheme(), MySQLClientFactory: mysql.NewMySQLClient, }).SetupWithManager(mgr); err != nil { From abe2c4a9165ad062956fbcda85ec699162fa8393 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 21 Aug 2022 21:33:31 +0900 Subject: [PATCH 03/32] fix 'Stopping and waiting for non leader election runnables' error --- main.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/main.go b/main.go index ad3c442e..0bdb54ca 100644 --- a/main.go +++ b/main.go @@ -69,13 +69,12 @@ func main() { ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, - HealthProbeBindAddress: probeAddr, - LeaderElection: enableLeaderElection, - LeaderElectionID: "dfc6d3c2.nakamasato.com", - LeaderElectionResourceLock: "configmaps", + Scheme: scheme, + MetricsBindAddress: metricsAddr, + Port: 9443, + HealthProbeBindAddress: probeAddr, + LeaderElection: enableLeaderElection, + LeaderElectionID: "dfc6d3c2.nakamasato.com", }) if err != nil { setupLog.Error(err, "unable to start manager") From c160edb68cf12dc18b8c60a83f83546ca4ddf9ff Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 21 Aug 2022 21:33:56 +0900 Subject: [PATCH 04/32] fix Unit test 'Status.Phase should be NotReady' --- controllers/mysqluser_controller.go | 1 + 1 file changed, 1 insertion(+) diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index 86e95ec3..33cb4c15 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -95,6 +95,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( log.Error(err, "[FetchMySQL] Failed") mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLFetchFailed + r.Status().Update(ctx, mysqlUser) return ctrl.Result{}, client.IgnoreNotFound(err) } log.Info("[FetchMySQL] Found") From a5153e8b70ae034c8286854c5db85769753a84b9 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 21 Aug 2022 21:38:03 +0900 Subject: [PATCH 05/32] fix lint error: Update is not checked (errcheck) --- controllers/mysqluser_controller.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index 33cb4c15..4472d2d5 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -95,7 +95,9 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( log.Error(err, "[FetchMySQL] Failed") mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLFetchFailed - r.Status().Update(ctx, mysqlUser) + if serr := r.Status().Update(ctx, mysqlUser); serr != nil { + log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) + } return ctrl.Result{}, client.IgnoreNotFound(err) } log.Info("[FetchMySQL] Found") @@ -122,7 +124,9 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( if err != nil { mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLConnectionFailed - r.Status().Update(ctx, mysqlUser) + if serr := r.Status().Update(ctx, mysqlUser); serr != nil { + log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) + } log.Error(err, "[MySQLClient] Failed to create") return ctrl.Result{}, err // requeue } @@ -132,7 +136,9 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLConnectionFailed log.Error(err, "[MySQLClient] Failed to connect to MySQL", "mysqlName", mysqlName) - r.Status().Update(ctx, mysqlUser) + if serr := r.Status().Update(ctx, mysqlUser); serr != nil { + log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) + } return ctrl.Result{}, err // requeue } log.Info("[MySQLClient] Successfully connected") @@ -206,7 +212,9 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( } mysqlUser.Status.Phase = mysqlUserPhaseReady mysqlUser.Status.Reason = mysqlUserReasonCompleted - r.Status().Update(ctx, mysqlUser) + if serr := r.Status().Update(ctx, mysqlUser); serr != nil { + log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) + } return ctrl.Result{}, nil } From bb2315b4e73feb1ce5dfdab862ce09d5da4ee785 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Tue, 23 Aug 2022 22:34:51 +0900 Subject: [PATCH 06/32] reduced the probability of failing e2e --- controllers/mysqluser_controller.go | 3 +- e2e/e2e_test.go | 80 ++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index 4472d2d5..79e4d37f 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -19,6 +19,7 @@ package controllers import ( "context" "strings" + "time" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -139,7 +140,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( if serr := r.Status().Update(ctx, mysqlUser); serr != nil { log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) } - return ctrl.Result{}, err // requeue + return ctrl.Result{RequeueAfter: 5 * time.Second}, err // requeue after 5 second } log.Info("[MySQLClient] Successfully connected") defer mysqlClient.Close() diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index afb5dbb7..0a94704e 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -27,25 +27,28 @@ const ( mysqlNamespace = "default" mysqlUserFinalizer = "mysqluser.nakamasato.com/finalizer" mysqlFinalizer = "mysql.nakamasato.com/finalizer" - timeout = 60 * time.Second - interval = 250 * time.Millisecond + timeout = 20 * time.Second + interval = 1 * time.Second + secretName = "mysql-" + mysqlName + "-" + mysqlUserName ) var _ = Describe("E2e", func() { ctx := context.Background() BeforeEach(func() { - deleteMySQLDeploymentIfExist(ctx) - deleteMySQLServiceIfExist(ctx) + // deleteMySQLDeploymentIfExist(ctx) + // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) + deleteUserInMysql(mysqlUserName) }) AfterEach(func() { - deleteMySQLDeploymentIfExist(ctx) - deleteMySQLServiceIfExist(ctx) + // deleteMySQLDeploymentIfExist(ctx) + // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) + deleteUserInMysql(mysqlUserName) }) Describe("Creating and deleting MySQL/MySQLUser object", func() { @@ -66,7 +69,7 @@ var _ = Describe("E2e", func() { // expect to have Secret secret := &corev1.Secret{} Eventually(func() error { - return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql-" + mysqlName + "-" + mysqlUserName}, secret) + return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) }, timeout, interval).Should(Succeed()) // expect to have mysql user in mysql @@ -87,7 +90,7 @@ var _ = Describe("E2e", func() { // expect to delete Secret secret := &corev1.Secret{} Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql-" + mysqlName + "-" + mysqlUserName}, secret) + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) return errors.IsNotFound(err) }, timeout, interval).Should(BeTrue()) @@ -106,6 +109,9 @@ var _ = Describe("E2e", func() { // Expect(k8sClient.Create(ctx, mysql)).Should(Fail()) }) It("Create MySQL and MySQLUser after MySQL cluster gets available", func() { + // delete mysql + deleteMySQLDeploymentIfExist(ctx) + deleteMySQLServiceIfExist(ctx) // create mysql mysql := newMySQL(mysqlName, mysqlNamespace) Expect(k8sClient.Create(ctx, mysql)).Should(Succeed()) @@ -115,7 +121,7 @@ var _ = Describe("E2e", func() { // expect not to have Secret secret := &corev1.Secret{} Consistently(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql-" + mysqlName + "-" + mysqlUserName}, secret) + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) return errors.IsNotFound(err) }, timeout, interval).Should(BeTrue()) @@ -125,7 +131,7 @@ var _ = Describe("E2e", func() { // expect to have Secret Eventually(func() error { - return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql-" + mysqlName + "-" + mysqlUserName}, secret) + return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) }, timeout, interval).Should(Succeed()) // expect to have mysql user in mysql @@ -154,6 +160,21 @@ func checkMySQLHasUser(mysqluser string) (bool, error) { } } +func deleteUserInMysql(mysqluser string) { + db, err := sql.Open("mysql", "root:password@tcp(localhost:30306)/") // TODO: Make MySQL root user credentials configurable + if err != nil { + return + } + defer db.Close() + _, err = db.Exec("DELETE FROM mysql.user where User = '" + mysqluser + "'") + + if err != nil { + fmt.Printf("failed delete mysql.user %v\n", err) + } else { + fmt.Printf("successfully deleted mysql.user: %s\n", mysqluser) + } +} + func deleteMySQLServiceIfExist(ctx context.Context) { svcNames := []string{"mysql", "mysql-nodeport"} for _, svcName := range svcNames { @@ -359,19 +380,32 @@ func newMySQLDeployment() *appsv1.Deployment { } func createMySQLDeploymentAndService(ctx context.Context) { - deploy := newMySQLDeployment() - Expect(k8sClient.Create(ctx, deploy)).Should(Succeed()) + _, err := getDeployment("mysql", mysqlNamespace) + if err != nil { // try to create for any error + deploy := newMySQLDeployment() + Expect(k8sClient.Create(ctx, deploy)).Should(Succeed()) + Eventually(func() bool { + err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql"}, deploy) + if err != nil { + return false + } + return deploy.Status.ReadyReplicas == *deploy.Spec.Replicas + }, timeout, interval).Should(BeTrue()) + } + + _, err = getService("mysql", mysqlNamespace) + if err != nil { + service := newMySQLService() + Expect(k8sClient.Create(ctx, service)).Should(Succeed()) + + svcNodePort := newMySQLServiceNodePort() + Expect(k8sClient.Create(ctx, svcNodePort)).Should(Succeed()) + } + + // wait until deployment is ready + deployment := &appsv1.Deployment{} Eventually(func() bool { - err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql"}, deploy) - if err != nil { - return false - } - return deploy.Status.ReadyReplicas == *deploy.Spec.Replicas + err = k8sClient.Get(context.TODO(), client.ObjectKey{Name: "mysql", Namespace: mysqlNamespace}, deployment) + return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas }, timeout, interval).Should(BeTrue()) - service := newMySQLService() - Expect(k8sClient.Create(ctx, service)).Should(Succeed()) - - svcNodePort := newMySQLServiceNodePort() - Expect(k8sClient.Create(ctx, svcNodePort)).Should(Succeed()) - time.Sleep(1 * time.Second) // TODO: #78 [e2e] Check why Ping() doesn't return without Sleep } From 00a42b70e47820f30ae69fd873bbc3ed7a29a4eb Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Tue, 23 Aug 2022 22:59:08 +0900 Subject: [PATCH 07/32] change timeout --- e2e/kind.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/kind.go b/e2e/kind.go index 439a4b8b..76921a04 100644 --- a/e2e/kind.go +++ b/e2e/kind.go @@ -34,7 +34,7 @@ func (k *Kind) createCluster() (bool, error) { "--config", "kind-config.yml", // to expose node port "--wait", // block until the control plane reaches a ready status - "30s", + "60s", ) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr From 029af85bbbce66a4138c01d554b755da7a1277c9 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 25 Sep 2022 21:44:11 +0900 Subject: [PATCH 08/32] add debug tool to controller test --- Makefile | 4 +- controllers/mysql_controller_test.go | 3 +- controllers/mysqluser_controller.go | 5 +- controllers/mysqluser_controller_test.go | 5 +- controllers/suite_test.go | 26 +++++-- controllers/test_utils.go | 95 ++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 4f6ac481..fc9b9e26 100644 --- a/Makefile +++ b/Makefile @@ -88,7 +88,7 @@ vet: ## Run go vet against code. go vet ./... test: ginkgo manifests generate fmt vet envtest ## Run tests. - KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" $(GINKGO) -cover -coverprofile cover.out -covermode=atomic -skipPackage=e2e ./... + ACK_GINKGO_DEPRECATIONS=1.16.5 KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" $(GINKGO) -cover -coverprofile cover.out -covermode=atomic -skipPackage=e2e ./... ##@ Build @@ -216,4 +216,4 @@ e2e-with-kuttl: .PHONY: e2e-with-ginkgo e2e-with-ginkgo: ginkgo - $(GINKGO) e2e + ACK_GINKGO_RC=true $(GINKGO) e2e diff --git a/controllers/mysql_controller_test.go b/controllers/mysql_controller_test.go index dda969cd..b4491bb3 100644 --- a/controllers/mysql_controller_test.go +++ b/controllers/mysql_controller_test.go @@ -8,7 +8,6 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes/scheme" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -22,7 +21,7 @@ var _ = Describe("MySQL controller", func() { BeforeEach(func() { k8sManager, err := ctrl.NewManager(cfg, ctrl.Options{ - Scheme: scheme.Scheme, + Scheme: scheme, }) Expect(err).ToNot(HaveOccurred()) diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index 79e4d37f..a0c1808c 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -140,7 +140,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( if serr := r.Status().Update(ctx, mysqlUser); serr != nil { log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) } - return ctrl.Result{RequeueAfter: 5 * time.Second}, err // requeue after 5 second + return ctrl.Result{RequeueAfter: 5 * time.Second}, nil // requeue after 5 second } log.Info("[MySQLClient] Successfully connected") defer mysqlClient.Close() @@ -161,7 +161,6 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( controllerutil.RemoveFinalizer(mysqlUser, mysqlUserFinalizer) err := r.Update(ctx, mysqlUser) if err != nil { - // return ctrl.Result{}, err return ctrl.Result{}, err // requeue } return ctrl.Result{}, nil @@ -204,7 +203,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( log.Info("[MySQL] Created or updated", "name", mysqlUserName, "mysqlUser.Namespace", mysqlUser.Namespace) metrics.MysqlUserCreatedTotal.Increment() mysqlUser.Status.Phase = mysqlUserPhaseReady - mysqlUser.Status.Reason = "mysql user are successfully created. Secret is being created." + mysqlUser.Status.Reason = "mysql user is successfully created. Secret is being created." err = r.createSecret(ctx, password, secretName, mysqlUser.Namespace, mysqlUser) // TODO: #35 add test if mysql user is successfully created but secret is failed to create diff --git a/controllers/mysqluser_controller_test.go b/controllers/mysqluser_controller_test.go index 95694858..24b95114 100644 --- a/controllers/mysqluser_controller_test.go +++ b/controllers/mysqluser_controller_test.go @@ -12,7 +12,6 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/scheme" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" . "github.com/nakamasato/mysql-operator/internal/mysql" @@ -26,7 +25,7 @@ var _ = Describe("MySQLUser controller", func() { var stopFunc func() BeforeEach(func() { k8sManager, err := ctrl.NewManager(cfg, ctrl.Options{ - Scheme: scheme.Scheme, + Scheme: scheme, }) Expect(err).ToNot(HaveOccurred()) @@ -178,7 +177,7 @@ var _ = Describe("MySQLUser controller", func() { var stopFunc func() BeforeEach(func() { k8sManager, err := ctrl.NewManager(cfg, ctrl.Options{ - Scheme: scheme.Scheme, + Scheme: scheme, }) Expect(err).ToNot(HaveOccurred()) diff --git a/controllers/suite_test.go b/controllers/suite_test.go index d11b10ae..99847ef7 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -17,16 +17,20 @@ limitations under the License. package controllers import ( + "context" "path/filepath" "testing" "time" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "k8s.io/client-go/kubernetes/scheme" + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" // "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" "sigs.k8s.io/controller-runtime/pkg/envtest/printer" @@ -51,10 +55,18 @@ const ( MySQLName = "test-mysql" MySQLUserName = "test-mysql-user" Namespace = "default" - timeout = time.Second * 10 + timeout = time.Second * 40 interval = time.Millisecond * 250 ) +var scheme = runtime.NewScheme() +var cancel context.CancelFunc + +func init() { + utilruntime.Must(mysqlv1alpha1.AddToScheme(scheme)) + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) +} + func TestAPIs(t *testing.T) { RegisterFailHandler(Fail) @@ -64,6 +76,9 @@ func TestAPIs(t *testing.T) { } var _ = BeforeSuite(func() { + ctx := context.Background() + ctx, cancel = context.WithCancel(ctx) + logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) By("bootstrapping test environment") @@ -77,19 +92,18 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = mysqlv1alpha1.AddToScheme(scheme.Scheme) - Expect(err).NotTo(HaveOccurred()) - //+kubebuilder:scaffold:scheme - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) + startDebugTool(ctx, cfg, scheme) }, 60) var _ = AfterSuite(func() { By("tearing down the test environment") + cancel() err := testEnv.Stop() Expect(err).NotTo(HaveOccurred()) }) diff --git a/controllers/test_utils.go b/controllers/test_utils.go index f23b4e7b..4e74df9e 100644 --- a/controllers/test_utils.go +++ b/controllers/test_utils.go @@ -2,13 +2,24 @@ package controllers import ( "context" + "fmt" + "log" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/rest" + "k8s.io/client-go/util/workqueue" "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/source" ) func cleanUpMySQL(ctx context.Context, k8sClient client.Client, namespace string) { @@ -67,3 +78,87 @@ func addOwnerReferenceToMySQL(mysqlUser *mysqlv1alpha1.MySQLUser, mysql *mysqlv1 } return mysqlUser } + +func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) { + fmt.Println("startDebugTool") + // Set a mapper + mapper, err := func(c *rest.Config) (meta.RESTMapper, error) { + return apiutil.NewDynamicRESTMapper(c) + }(cfg) + if err != nil { + log.Fatal("failed to create mapper") + } + + // Create a cache + cache, err := cache.New(cfg, cache.Options{Scheme: scheme, Mapper: mapper}) + if err != nil { + log.Fatal("failed to create cache") + } + + secret := &v1.Secret{} + cache.Get(ctx, client.ObjectKeyFromObject(secret), secret) + mysqluser := &mysqlv1alpha1.MySQLUser{} + cache.Get(ctx, client.ObjectKeyFromObject(mysqluser), mysqluser) + + // Start Cache + go func() { + if err := cache.Start(ctx); err != nil { // func (m *InformersMap) Start(ctx context.Context) error { + log.Fatal("failed to start cache") + } + }() + + // create source + kindWithCacheMysqlUser := source.NewKindWithCache(mysqluser, cache) + kindWithCachesecret := source.NewKindWithCache(secret, cache) + + // create workqueue + queue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "test") + + // create eventhandler + mysqlUserEventHandler := handler.Funcs{ + CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("[MySQLUser][Created] %s\n", e.Object.GetName()) + }, + UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("[MySQLUser][Updated] %s\n", e.ObjectNew.GetName()) + }, + DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("[MySQLUser][Deleted] %s\n", e.Object.GetName()) + }, + } + secretEventHandler := handler.Funcs{ + CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("[Secret][Created] %s\n", e.Object.GetName()) + }, + UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("[Secret][Updated] %s\n", e.ObjectNew.GetName()) + }, + DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("[Secret][Deleted] %s\n", e.Object.GetName()) + }, + } + + // start kind + fmt.Println("cache starting") + if err := kindWithCacheMysqlUser.Start(ctx, mysqlUserEventHandler, queue); err != nil { + log.Fatal("failed to start kind") + } + if err := kindWithCachesecret.Start(ctx, secretEventHandler, queue); err != nil { + log.Fatal("failed to start kind") + } + + // wait cache to be synced + fmt.Println("waiting for cache to be synced") + if err := kindWithCacheMysqlUser.WaitForSync(ctx); err != nil { + log.Fatal("failed to wait cache") + } + if err := kindWithCachesecret.WaitForSync(ctx); err != nil { + log.Fatal("failed to wait cache") + } + fmt.Println("cache is synced") + + // wait until canceled + go func() { + <-ctx.Done() + }() +} From 353a73dd706e1036ea8be0514fe14b783cc31168 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Mon, 6 Mar 2023 07:42:19 +0900 Subject: [PATCH 09/32] upgrade mysql to 5.7 --- CONTRIBUTING.md | 36 +++++++++++++++++++++++++ e2e/e2e_test.go | 60 +++++++++++++++++++++++++++++++----------- e2e/suite_test.go | 67 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 147 insertions(+), 16 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 305733a2..51aab90b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,6 +53,33 @@ kubectl delete -f config/samples/mysql_v1alpha1_mysqluser.yaml kubectl delete -f config/samples/mysql_v1alpha1_mysql.yaml ``` + + TODO: get stuck in deletion. + +
+ + ``` + 1.6780545572555468e+09 INFO [FetchMySQL] Not found {"controller": "mysql", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQL", "mySQL": {"name":"mysql-sample","namespace":"default"}, "namespace": "default", "name": "mysql-sample", "reconcileID": "0b6db5c6-8b3b-43ce-b903-a4959d55064e", "mysql.Name": "", "mysql.Namespace": ""} + 1.678054557255548e+09 INFO [FetchMySQLUser] Found. {"controller": "mysqluser", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQLUser", "mySQLUser": {"name":"nakamasato","namespace":"default"}, "namespace": "default", "name": "nakamasato", "reconcileID": "78d4a7cf-5be0-4d47-82c0-38c7fdcf675b", "name": "nakamasato", "mysqlUser.Namespace": "default"} + 1.678054557255587e+09 ERROR [FetchMySQL] Failed {"controller": "mysqluser", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQLUser", "mySQLUser": {"name":"nakamasato","namespace":"default"}, "namespace": "default", "name": "nakamasato", "reconcileID": "78d4a7cf-5be0-4d47-82c0-38c7fdcf675b", "error": "MySQL.mysql.nakamasato.com \"mysql-sample\" not found"} + sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Reconcile + /Users/m.naka/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.12.3/pkg/internal/controller/controller.go:121 + sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler + /Users/m.naka/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.12.3/pkg/internal/controller/controller.go:320 + sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem + /Users/m.naka/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.12.3/pkg/internal/controller/controller.go:273 + sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start.func2.2 + /Users/m.naka/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.12.3/pkg/internal/controller/controller.go:234 + ``` + + When getting stuck: + + ``` + kubectl patch mysqluser nakamasato -p '{"metadata":{"finalizers": []}}' --type=merge + ``` + +
+ 1. Secret is deleted. ``` kubectl get secret @@ -83,6 +110,7 @@ ``` make uninstall +docker rm -f $(docker ps | grep mysql | head -1 |awk '{print $1}') ``` ## Local kubernetes @@ -135,6 +163,14 @@ make uninstall kubectl delete -f config/samples-on-k8s/mysql_v1alpha1_mysqluser.yaml kubectl delete -f config/samples-on-k8s/mysql_v1alpha1_mysql.yaml ``` + + TODO: Get stuck: + + ``` + kubectl exec -it $(kubectl get po | grep mysql | head -1 | awk '{print $1}') -- mysql -uroot -ppassword -e 'delete from mysql.user where User = "nakamasato";' + kubectl patch mysqluser nakamasato -p '{"metadata":{"finalizers": []}}' --type=merge + ``` + 1. Stop the `skaffold dev` by `ctrl-c` -> will clean up the controller, CRDs, and installed resources. # Test diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 0a94704e..1536734c 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -40,7 +40,7 @@ var _ = Describe("E2e", func() { // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - deleteUserInMysql(mysqlUserName) + // deleteUserInMysql(mysqlUserName) }) AfterEach(func() { @@ -48,7 +48,7 @@ var _ = Describe("E2e", func() { // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - deleteUserInMysql(mysqlUserName) + // deleteUserInMysql(mysqlUserName) }) Describe("Creating and deleting MySQL/MySQLUser object", func() { @@ -73,10 +73,10 @@ var _ = Describe("E2e", func() { }, timeout, interval).Should(Succeed()) // expect to have mysql user in mysql - Eventually(func() bool { + Eventually(func() int { res, _ := checkMySQLHasUser(mysqlUserName) return res - }, timeout, interval).Should(BeTrue()) + }, timeout, interval).Should(Equal(1)) }) It("Successfully delete MySQL user and Secret", func() { @@ -95,10 +95,10 @@ var _ = Describe("E2e", func() { }, timeout, interval).Should(BeTrue()) // expect to delete mysql user in mysql - Eventually(func() bool { + Eventually(func() int { res, _ := checkMySQLHasUser(mysqlUserName) return res - }, timeout, interval).Should(BeFalse()) + }, timeout, interval).Should(Equal(0)) }) }) @@ -131,47 +131,77 @@ var _ = Describe("E2e", func() { // expect to have Secret Eventually(func() error { + mysqlUser, err := getMySQLUser(mysqlUserName, mysqlNamespace) + if err != nil { + fmt.Println("failed to get mysqluer") + return err + } + fmt.Printf("mysqluser: %v, %s\n", mysqlUser.Status, mysqlUser.ObjectMeta.ResourceVersion) return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) }, timeout, interval).Should(Succeed()) // expect to have mysql user in mysql - Eventually(func() bool { + Eventually(func() int { res, _ := checkMySQLHasUser(mysqlUserName) return res - }, timeout, interval).Should(BeTrue()) + }, timeout, interval).Should(Equal(1)) }) }) }) }) -func checkMySQLHasUser(mysqluser string) (bool, error) { +func checkMySQLHasUser(mysqluser string) (int, error) { db, err := sql.Open("mysql", "root:password@tcp(localhost:30306)/") // TODO: Make MySQL root user credentials configurable if err != nil { - return false, err + return 0, err } defer db.Close() row := db.QueryRow("SELECT COUNT(*) FROM mysql.user where User = '" + mysqluser + "'") var count int if err := row.Scan(&count); err != nil { - return false, err + return 0, err } else { fmt.Printf("mysql.user count: %s, %d\n", mysqluser, count) - return count > 0, nil + return count, nil } } func deleteUserInMysql(mysqluser string) { + _, err := getDeployment("mysql", mysqlNamespace) + if err != nil { + return + } db, err := sql.Open("mysql", "root:password@tcp(localhost:30306)/") // TODO: Make MySQL root user credentials configurable if err != nil { return } defer db.Close() - _, err = db.Exec("DELETE FROM mysql.user where User = '" + mysqluser + "'") + // _, err = db.Exec("DELETE FROM mysql.user where User = '" + mysqluser + "'") + + // if err != nil { + // fmt.Printf("failed delete mysql.user %v\n", err) + // } else { + // fmt.Printf("successfully deleted mysql.user: %s\n", mysqluser) + // } + stmtDelete, err := db.Prepare("DELETE FROM mysql.user where User =?") + if err != nil { + panic(err.Error()) + } + defer stmtDelete.Close() + result, err := stmtDelete.Exec(mysqluser) if err != nil { - fmt.Printf("failed delete mysql.user %v\n", err) + panic(err.Error()) + } + + rowsAffect, err := result.RowsAffected() + if err != nil { + panic(err.Error()) + } + if rowsAffect == 0 { + fmt.Printf("[deleteUserInMysql] deleted mysql.user '%s'\n", mysqluser) } else { - fmt.Printf("successfully deleted mysql.user: %s\n", mysqluser) + fmt.Printf("[deleteUserInMysql] mysql.user '%s' doesn't exist\n", mysqluser) } } diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 5f2642eb..97759c45 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -10,9 +10,17 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "k8s.io/client-go/util/workqueue" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/source" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" appsv1 "k8s.io/api/apps/v1" @@ -28,6 +36,7 @@ const ( var skaffold *Skaffold var kind *Kind var k8sClient client.Client +var cancel context.CancelFunc func TestE2e(t *testing.T) { RegisterFailHandler(Fail) // Use Gomega with Ginkgo @@ -40,6 +49,7 @@ var _ = BeforeSuite(func() { // 2. TODO: Check if kind is avaialble -> install kind if not available. ctx := context.Background() + ctx, cancel = context.WithCancel(ctx) kind = newKind( ctx, kindName, @@ -50,7 +60,19 @@ var _ = BeforeSuite(func() { prepareKind(kind) // 4. set k8sclient - setUpK8sClient() + mydir, err := os.Getwd() + if err != nil { + fmt.Println(err) + } + os.Setenv("KUBECONFIG", path.Join(mydir, kubeconfigPath)) + cfg, err := config.GetConfigWithContext("kind-" + kindName) + Expect(err).NotTo(HaveOccurred()) + Expect(cfg).NotTo(BeNil()) + err = mysqlv1alpha1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).NotTo(HaveOccurred()) + Expect(k8sClient).NotTo(BeNil()) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) @@ -65,11 +87,14 @@ var _ = BeforeSuite(func() { // 8. Check if mysql-operator is running. checkMySQLOperator() // check if mysql-operator is running + // 9. Start debug tool + startDebugTool(ctx, cfg, scheme.Scheme) fmt.Println("Setup completed") }, 60) var _ = AfterSuite(func() { fmt.Println("Clean up mysql-operator and kind cluster") + cancel() // 1. Remove the deployed resources skaffold.delete() @@ -135,3 +160,43 @@ func checkMySQLOperator() { log.Fatal(fmt.Printf("%s doesn't have the required replicss", mysqlOperatorDeploymentName)) } } + +func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) { + fmt.Println("startDebugTool") + mapper, err := apiutil.NewDynamicRESTMapper(cfg) + if err != nil { + log.Fatal("failed to create mapper") + } + + cache, err := cache.New(cfg, cache.Options{Scheme: scheme, Mapper: mapper}) + if err != nil { + log.Fatal("failed to create cache") + } + mysqluser := &mysqlv1alpha1.MySQLUser{} + cache.Get(ctx, client.ObjectKeyFromObject(mysqluser), mysqluser) + kindWithCacheMysqlUser := source.NewKindWithCache(mysqluser, cache) + queue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "test") + eventHandler := handler.Funcs{ + CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("CreateFunc is called %s", e.Object.GetName()) + }, + UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("UpdateFunc is called %s", e.ObjectNew.GetName()) + }, + DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) { + fmt.Printf("DeleteFunc is called %s", e.Object.GetName()) + }, + } + fmt.Println("cache starting") + if err := kindWithCacheMysqlUser.Start(ctx, eventHandler, queue); err != nil { + log.Fatal("failed to start kind") + } + fmt.Println("waiting for cache to be synced") + if err := kindWithCacheMysqlUser.WaitForSync(ctx); err != nil { + log.Fatal("failed to wait cache") + } + fmt.Println("cache is synced") + go func() { + <-ctx.Done() + }() +} From 91e42300b7e1a572604e00000b5c7104e79afdb3 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Mon, 6 Mar 2023 10:02:00 +0900 Subject: [PATCH 10/32] comment out startDebugTool --- e2e/suite_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 97759c45..ab56074d 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -88,7 +88,7 @@ var _ = BeforeSuite(func() { checkMySQLOperator() // check if mysql-operator is running // 9. Start debug tool - startDebugTool(ctx, cfg, scheme.Scheme) + // startDebugTool(ctx, cfg, scheme.Scheme) fmt.Println("Setup completed") }, 60) From 8cc375ceb4c1b7c92a08b80a3f3c2dbed5f9eaa9 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Tue, 7 Mar 2023 06:50:43 +0900 Subject: [PATCH 11/32] fix startDebugTool --- e2e/skaffold.go | 3 +- e2e/suite_test.go | 79 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/e2e/skaffold.go b/e2e/skaffold.go index 60a20ae0..1452dd5e 100644 --- a/e2e/skaffold.go +++ b/e2e/skaffold.go @@ -2,7 +2,6 @@ package e2e import ( "fmt" - "log" "os" "os/exec" ) @@ -37,7 +36,7 @@ func (s *Skaffold) execute(args ...string) { cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { - log.Fatal("failed to run skaffold command.", err) + fmt.Errorf("failed to run skaffold command. %v", err) } fmt.Println("skaffold completed") } diff --git a/e2e/suite_test.go b/e2e/suite_test.go index ab56074d..01d18b9e 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -2,24 +2,29 @@ package e2e import ( "context" + "flag" "fmt" - "log" "os" "path" "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "go.uber.org/zap/zapcore" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/scheme" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/util/workqueue" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/handler" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/controller-runtime/pkg/source" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" @@ -38,13 +43,30 @@ var kind *Kind var k8sClient client.Client var cancel context.CancelFunc +var ( + log = logf.Log.WithName("mysql-operator") + scheme = runtime.NewScheme() +) + +func init() { + utilruntime.Must(mysqlv1alpha1.AddToScheme(scheme)) + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) +} + func TestE2e(t *testing.T) { + opts := zap.Options{ + Development: true, + TimeEncoder: zapcore.ISO8601TimeEncoder, + } + opts.BindFlags(flag.CommandLine) + flag.Parse() + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) RegisterFailHandler(Fail) // Use Gomega with Ginkgo RunSpecs(t, "e2e suite") // tells Ginkgo to start the test suite. } var _ = BeforeSuite(func() { - fmt.Println("Setup kind cluster and mysql-operator") + log.Info("Setup kind cluster and mysql-operator") // 1. TODO: Check if docker is running. // 2. TODO: Check if kind is avaialble -> install kind if not available. @@ -68,9 +90,9 @@ var _ = BeforeSuite(func() { cfg, err := config.GetConfigWithContext("kind-" + kindName) Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = mysqlv1alpha1.AddToScheme(scheme.Scheme) + err = mysqlv1alpha1.AddToScheme(scheme) Expect(err).NotTo(HaveOccurred()) - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) deleteMySQLUserIfExist(ctx) @@ -88,7 +110,7 @@ var _ = BeforeSuite(func() { checkMySQLOperator() // check if mysql-operator is running // 9. Start debug tool - // startDebugTool(ctx, cfg, scheme.Scheme) + startDebugTool(ctx, cfg, scheme) fmt.Println("Setup completed") }, 60) @@ -111,9 +133,9 @@ func setUpK8sClient() { cfg, err := config.GetConfigWithContext("kind-" + kindName) Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = mysqlv1alpha1.AddToScheme(scheme.Scheme) + err = mysqlv1alpha1.AddToScheme(scheme) Expect(err).NotTo(HaveOccurred()) - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) } @@ -122,12 +144,12 @@ func prepareKind(kind *Kind) { // check kind version err := kind.checkVersion() if err != nil { - log.Fatal(err) + log.Error(err, "failed to check version") } isDeleted, err := kind.deleteCluster() if err != nil { - log.Fatal(err) + log.Error(err, "failed to delete cluster") } else if isDeleted { fmt.Println("kind deleted cluster") } @@ -135,7 +157,7 @@ func prepareKind(kind *Kind) { // create cluster isCreated, err := kind.createCluster() if err != nil { - log.Fatal(fmt.Printf("failed to create kind cluster. error: %s\n", err)) + log.Error(err, "failed to create kind cluster.") } else if isCreated { fmt.Printf("kind created '%s'\n", kindName) } @@ -144,7 +166,7 @@ func prepareKind(kind *Kind) { func cleanUpKind(kind *Kind) { isDeleted, err := kind.deleteCluster() if err != nil { - log.Fatal(err) + log.Error(err, "failed to clean up cluster") } else if isDeleted { fmt.Printf("kind deleted '%s'\n", kindName) } @@ -154,10 +176,10 @@ func checkMySQLOperator() { deployment := &appsv1.Deployment{} err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) if err != nil { - log.Fatal(fmt.Printf("failed to get %s", mysqlOperatorDeploymentName)) + log.Error(err, "failed to get", "mysqlOperatorDeploymentName", mysqlOperatorDeploymentName) } if deployment.Status.AvailableReplicas != *deployment.Spec.Replicas { - log.Fatal(fmt.Printf("%s doesn't have the required replicss", mysqlOperatorDeploymentName)) + log.Error(err, "doesn't have the required replicas", "mysqlOperatorDeploymentName", mysqlOperatorDeploymentName) } } @@ -165,38 +187,47 @@ func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Schem fmt.Println("startDebugTool") mapper, err := apiutil.NewDynamicRESTMapper(cfg) if err != nil { - log.Fatal("failed to create mapper") + log.Error(err, "failed to create mapper") } cache, err := cache.New(cfg, cache.Options{Scheme: scheme, Mapper: mapper}) if err != nil { - log.Fatal("failed to create cache") + log.Error(err, "failed to create cache") } mysqluser := &mysqlv1alpha1.MySQLUser{} cache.Get(ctx, client.ObjectKeyFromObject(mysqluser), mysqluser) + // Start Cache + go func() { + if err := cache.Start(ctx); err != nil { // func (m *InformersMap) Start(ctx context.Context) error { + log.Error(err, "failed to start cache") + } + }() + log.Info("cache is started") + kindWithCacheMysqlUser := source.NewKindWithCache(mysqluser, cache) queue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "test") eventHandler := handler.Funcs{ CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) { - fmt.Printf("CreateFunc is called %s", e.Object.GetName()) + log.Info("CreateFunc is called", "Name", e.Object.GetName(), "finalizers", e.Object.GetFinalizers()) }, UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) { - fmt.Printf("UpdateFunc is called %s", e.ObjectNew.GetName()) + log.Info("UpdateFunc is called", "Name", e.ObjectNew.GetName(), "finalizers", e.ObjectNew.GetFinalizers()) }, DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) { - fmt.Printf("DeleteFunc is called %s", e.Object.GetName()) + log.Info("DeleteFunc is called", "Name", e.Object.GetName(), "finalizers", e.Object.GetFinalizers()) }, } - fmt.Println("cache starting") + log.Info("kindWithCacheMysqlUser starting") if err := kindWithCacheMysqlUser.Start(ctx, eventHandler, queue); err != nil { - log.Fatal("failed to start kind") + log.Error(err, "failed to start kind") } - fmt.Println("waiting for cache to be synced") + log.Info("waiting for kindWithCacheMysqlUser to be synced") if err := kindWithCacheMysqlUser.WaitForSync(ctx); err != nil { - log.Fatal("failed to wait cache") + log.Error(err, "failed to wait cache") } - fmt.Println("cache is synced") + log.Info("kindWithCacheMysqlUser is synced") go func() { + // run until ctx is done. <-ctx.Done() }() } From 56df9eeb1563221bb9aa79930be0a8c2bce9e554 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Fri, 10 Mar 2023 07:26:50 +0900 Subject: [PATCH 12/32] update tests --- CONTRIBUTING.md | 12 +++++++++++- e2e/e2e_test.go | 10 ++++++++++ e2e/skaffold.go | 21 +++++++++++---------- e2e/suite_test.go | 26 +++++++++++++++++--------- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 51aab90b..1aa6019f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -242,7 +242,7 @@ make e2e-with-ginkgo ``` 1. Deploy `CRD`, `mysql-operator`, and MySQL with `Deployment`: ``` - cd e2e && skaffold run --kubeconfig kubeconfig + cd e2e && skaffold run --kubeconfig kubeconfig --tail ``` @@ -418,5 +418,15 @@ https://cloud.redhat.com/blog/kubernetes-operators-best-practices 1. Return the error in the status of the object. https://pkg.go.dev/github.com/shivanshs9/operator-utils@v1.0.1#section-readme 1. Generate an event describing the error. +### Error1: `Operation cannot be fulfilled on mysqlusers.mysql.nakamasato.com \"john\": StorageError: invalid object, Code: 4, Key: /registry/mysql.nakamasato.com/mysqlusers/default/john, ResourceVersion: 0, AdditionalErrorMsg: Precondition failed: UID in precondition: cd9c94d1-992a-457d-8fab-489b21ed02e9, UID in object meta:` + +``` +[manager] 1.6781410047933352e+09 ERROR Reconciler error {"controller": "mysqluser", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQLUser", "mySQLUser": {"name":"john","namespace":"default"}, "namespace": "default", "name": "john", "reconcileID": "85fc0e64-f2b9-413f-af44-46ff1daad7f7", "error": "Operation cannot be fulfilled on mysqlusers.mysql.nakamasato.com \"john\": StorageError: invalid object, Code: 4, Key: /registry/mysql.nakamasato.com/mysqlusers/default/john, ResourceVersion: 0, AdditionalErrorMsg: Precondition failed: UID in precondition: cd9c94d1-992a-457d-8fab-489b21ed02e9, UID in object meta: "} +``` + +UID in precondition and UID in object meta are different? + +https://github.com/kubernetes-sigs/controller-runtime/issues/2209 + ## MySQL - http://go-database-sql.org/index.html diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 1536734c..f634cebb 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -77,14 +77,24 @@ var _ = Describe("E2e", func() { res, _ := checkMySQLHasUser(mysqlUserName) return res }, timeout, interval).Should(Equal(1)) + + Eventually(func() bool { + mysqlUser, _ := getMySQLUser(mysqlUserName, mysqlNamespace) + return controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) + }, timeout, interval).Should(BeTrue()) }) It("Successfully delete MySQL user and Secret", func() { By("Delete MySQLUser") + Eventually(func() bool { + mysqlUser, _ := getMySQLUser(mysqlUserName, mysqlNamespace) + return controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) + }, timeout, interval).Should(BeTrue()) mysqlUser, err := getMySQLUser(mysqlUserName, mysqlNamespace) if err != nil { return } + log.Info("mysqlUser before deletion", "finalizers", mysqlUser.Finalizers) Expect(k8sClient.Delete(ctx, mysqlUser)).Should(Succeed()) // expect to delete Secret diff --git a/e2e/skaffold.go b/e2e/skaffold.go index 1452dd5e..572da3c6 100644 --- a/e2e/skaffold.go +++ b/e2e/skaffold.go @@ -10,23 +10,23 @@ type Skaffold struct { KubeconfigPath string } -func (s *Skaffold) run() { - s.execute( - "run", - "--kubeconfig", - s.KubeconfigPath, - ) +func (s *Skaffold) run(tail bool) error { + args := []string{"run", "--kubeconfig", s.KubeconfigPath} + if tail { + args = append(args, "--tail") + } + return s.execute(args...) } -func (s *Skaffold) delete() { - s.execute( +func (s *Skaffold) delete() error { + return s.execute( "delete", "--kubeconfig", s.KubeconfigPath, ) } -func (s *Skaffold) execute(args ...string) { +func (s *Skaffold) execute(args ...string) error { cmd := exec.Command( "skaffold", args..., @@ -36,7 +36,8 @@ func (s *Skaffold) execute(args ...string) { cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { - fmt.Errorf("failed to run skaffold command. %v", err) + return fmt.Errorf("failed to run skaffold command. %v", err) } fmt.Println("skaffold completed") + return nil } diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 01d18b9e..1a1dfcc4 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -44,7 +44,7 @@ var k8sClient client.Client var cancel context.CancelFunc var ( - log = logf.Log.WithName("mysql-operator") + log = logf.Log.WithName("mysql-operator-e2e") scheme = runtime.NewScheme() ) @@ -104,7 +104,11 @@ var _ = BeforeSuite(func() { skaffold = &Skaffold{KubeconfigPath: kubeconfigPath} // 7. Deploy CRDs and controllers with skaffold. - skaffold.run() + go func(ctx context.Context) { + err := skaffold.run(true) // To check log during running tests + Expect(err).To(BeNil()) + <-ctx.Done() + }(ctx) // 8. Check if mysql-operator is running. checkMySQLOperator() // check if mysql-operator is running @@ -174,13 +178,17 @@ func cleanUpKind(kind *Kind) { func checkMySQLOperator() { deployment := &appsv1.Deployment{} - err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) - if err != nil { - log.Error(err, "failed to get", "mysqlOperatorDeploymentName", mysqlOperatorDeploymentName) - } - if deployment.Status.AvailableReplicas != *deployment.Spec.Replicas { - log.Error(err, "doesn't have the required replicas", "mysqlOperatorDeploymentName", mysqlOperatorDeploymentName) - } + Eventually(func() error { + err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) + log.Info("waiting until mysqlOperator Deployment is deployed") + return err + }, timeout, interval).Should(BeNil()) + + Eventually(func() bool { + k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) + log.Info("waiting until mysqlOperator Pods get ready", "Replicas", *deployment.Spec.Replicas, "AvailableReplicas", deployment.Status.AvailableReplicas) + return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas + }, timeout, interval).Should(BeTrue()) } func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) { From 07ceb2a834752c75a39b56aecf971d360106c5fa Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Fri, 10 Mar 2023 20:56:39 +0900 Subject: [PATCH 13/32] update --- controllers/mysql_controller.go | 2 +- controllers/mysqluser_controller.go | 43 ++++++++++++++++++------ controllers/mysqluser_controller_test.go | 19 +++++++++++ e2e/e2e_test.go | 35 ++++++++++++------- e2e/suite_test.go | 2 +- skaffold.yaml | 5 +++ 6 files changed, 80 insertions(+), 26 deletions(-) diff --git a/controllers/mysql_controller.go b/controllers/mysql_controller.go index 491f5897..0a9ae524 100644 --- a/controllers/mysql_controller.go +++ b/controllers/mysql_controller.go @@ -50,7 +50,7 @@ type MySQLReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.9.2/pkg/reconcile func (r *MySQLReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := log.FromContext(ctx) + log := log.FromContext(ctx).WithName("MySQLReconciler") // Fetch MySQL mysql := &mysqlv1alpha1.MySQL{} diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index a0c1808c..de9a2dfa 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -71,7 +71,7 @@ type MySQLUserReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.9.2/pkg/reconcile func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := log.FromContext(ctx) + log := log.FromContext(ctx).WithName("MySQLUserReconciler") // Fetch MySQLUser mysqlUser := &mysqlv1alpha1.MySQLUser{} @@ -139,42 +139,62 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( log.Error(err, "[MySQLClient] Failed to connect to MySQL", "mysqlName", mysqlName) if serr := r.Status().Update(ctx, mysqlUser); serr != nil { log.Error(serr, "Failed to update mysqluser status", "mysqlUser", mysqlUser.Name) + return ctrl.Result{RequeueAfter: time.Second}, nil } - return ctrl.Result{RequeueAfter: 5 * time.Second}, nil // requeue after 5 second + return ctrl.Result{RequeueAfter: time.Second}, nil // requeue after 5 second } log.Info("[MySQLClient] Successfully connected") defer mysqlClient.Close() // Finalize if DeletionTimestamp exists isMysqlUserMarkedToBeDeleted := mysqlUser.GetDeletionTimestamp() != nil + log.Info("isMysqlUserMarkedToBeDeleted", "isMysqlUserMarkedToBeDeleted", isMysqlUserMarkedToBeDeleted) if isMysqlUserMarkedToBeDeleted { + log.Info("isMysqlUserMarkedToBeDeleted is true") if controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) { + log.Info("ContainsFinalizer is true") // Run finalization logic for mysqlUserFinalizer. If the // finalization logic fails, don't remove the finalizer so // that we can retry during the next reconciliation. if err := r.finalizeMySQLUser(ctx, mysqlUser, mysql); err != nil { + log.Info("finalizeMySQLUser err") // return ctrl.Result{}, err return ctrl.Result{}, err // requeue } + log.Info("finalizeMySQLUser completed") // Remove mysqlUserFinalizer. Once all finalizers have been // removed, the object will be deleted. - controllerutil.RemoveFinalizer(mysqlUser, mysqlUserFinalizer) - err := r.Update(ctx, mysqlUser) - if err != nil { - return ctrl.Result{}, err // requeue + log.Info("removing finalizer") + if controllerutil.RemoveFinalizer(mysqlUser, mysqlUserFinalizer) { + log.Info("RemoveFinalizer completed") + err := r.Update(ctx, mysqlUser) + log.Info("Update") + if err != nil { + log.Info("Update err") + return ctrl.Result{}, err // requeue + } + log.Info("Update completed") } return ctrl.Result{}, nil } return ctrl.Result{}, nil // should return success when not having the finalizer } + log.Info("Add Finalizer for this CR") // Add finalizer for this CR if !controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) { - controllerutil.AddFinalizer(mysqlUser, mysqlUserFinalizer) - err = r.Update(ctx, mysqlUser) - if err != nil { - return ctrl.Result{}, err // requeue + log.Info("not have finalizer") + if controllerutil.AddFinalizer(mysqlUser, mysqlUserFinalizer) { + log.Info("Added Finalizer") + err = r.Update(ctx, mysqlUser) + if err != nil { + log.Info("Failed to update after adding finalizer") + return ctrl.Result{}, err // requeue + } + log.Info("Updated successfully after adding finalizer") } + } else { + log.Info("already has finalizer") } // Get password from Secret if exists. Otherwise, generate new one. @@ -208,6 +228,7 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( err = r.createSecret(ctx, password, secretName, mysqlUser.Namespace, mysqlUser) // TODO: #35 add test if mysql user is successfully created but secret is failed to create if err != nil { + log.Error(err, "Failed to create secret", "secretName", secretName, "namespace", mysqlUser.Namespace, "mysqlUser", mysqlUser.Name) return ctrl.Result{}, err } mysqlUser.Status.Phase = mysqlUserPhaseReady @@ -248,7 +269,7 @@ func (r *MySQLUserReconciler) finalizeMySQLUser(ctx context.Context, mysqlUser * defer mysqlClient.Close() - err = mysqlClient.Exec("DROP USER IF EXISTS '" + mysqlUser.ObjectMeta.Name + "'@'%';") + err = mysqlClient.Exec("DROP USER IF EXISTS '" + mysqlUser.ObjectMeta.Name + "'@'" + mysqlUser.Spec.Host + "';") if err != nil { log.Error(err, "Failed to drop MySQL user.", "mysqlUser", mysqlUser.ObjectMeta.Name) return err diff --git a/controllers/mysqluser_controller_test.go b/controllers/mysqluser_controller_test.go index 24b95114..b19f30d4 100644 --- a/controllers/mysqluser_controller_test.go +++ b/controllers/mysqluser_controller_test.go @@ -7,6 +7,7 @@ import ( . "github.com/onsi/ginkgo" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" @@ -99,6 +100,24 @@ var _ = Describe("MySQLUser controller", func() { return mysqlUser.Status.Reason }).Should(Equal(mysqlUserReasonCompleted)) }) + + It("Should create mysqlUser with finalizers", func() { + By("By creating a new MySQL") + mysql = &mysqlv1alpha1.MySQL{ + TypeMeta: metav1.TypeMeta{APIVersion: APIVersion, Kind: "MySQL"}, + ObjectMeta: metav1.ObjectMeta{Name: MySQLName, Namespace: Namespace}, + Spec: mysqlv1alpha1.MySQLSpec{Host: "localhost", AdminUser: "root", AdminPassword: "password"}, + } + Expect(k8sClient.Create(ctx, mysql)).Should(Succeed()) + + Eventually(func() bool { + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: Namespace, Name: MySQLUserName}, mysqlUser) + if err != nil { + return false + } + return controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) + }).Should(BeTrue()) + }) }) When("Deleting a MySQLUser", func() { diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index f634cebb..89ec3d42 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -27,7 +27,7 @@ const ( mysqlNamespace = "default" mysqlUserFinalizer = "mysqluser.nakamasato.com/finalizer" mysqlFinalizer = "mysql.nakamasato.com/finalizer" - timeout = 20 * time.Second + timeout = 60 * time.Second interval = 1 * time.Second secretName = "mysql-" + mysqlName + "-" + mysqlUserName ) @@ -65,7 +65,6 @@ var _ = Describe("E2e", func() { Expect(k8sClient.Create(ctx, mysqlUser)).Should(Succeed()) }) It("Successfully create MySQL user and Secret", func() { - // expect to have Secret secret := &corev1.Secret{} Eventually(func() error { @@ -85,20 +84,35 @@ var _ = Describe("E2e", func() { }) It("Successfully delete MySQL user and Secret", func() { - By("Delete MySQLUser") + // Check finalizer Eventually(func() bool { mysqlUser, _ := getMySQLUser(mysqlUserName, mysqlNamespace) return controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) }, timeout, interval).Should(BeTrue()) + mysqlUser, err := getMySQLUser(mysqlUserName, mysqlNamespace) if err != nil { return } log.Info("mysqlUser before deletion", "finalizers", mysqlUser.Finalizers) + + // Check Secret and mysql + // expect to have Secret + secret := &corev1.Secret{} + Eventually(func() error { + return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) + }, timeout, interval).Should(Succeed()) + + // expect to have mysql user in mysql + Eventually(func() int { + res, _ := checkMySQLHasUser(mysqlUserName) + return res + }, timeout, interval).Should(Equal(1)) + + By("Delete MySQLUser") Expect(k8sClient.Delete(ctx, mysqlUser)).Should(Succeed()) // expect to delete Secret - secret := &corev1.Secret{} Eventually(func() bool { err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) return errors.IsNotFound(err) @@ -146,7 +160,7 @@ var _ = Describe("E2e", func() { fmt.Println("failed to get mysqluer") return err } - fmt.Printf("mysqluser: %v, %s\n", mysqlUser.Status, mysqlUser.ObjectMeta.ResourceVersion) + fmt.Printf("mysqluser: Status: %v, ResourceVersion: %s\n", mysqlUser.Status, mysqlUser.ObjectMeta.ResourceVersion) return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) }, timeout, interval).Should(Succeed()) @@ -420,16 +434,18 @@ func newMySQLDeployment() *appsv1.Deployment { } func createMySQLDeploymentAndService(ctx context.Context) { + log.Info("createMySQLDeploymentAndService started") _, err := getDeployment("mysql", mysqlNamespace) if err != nil { // try to create for any error deploy := newMySQLDeployment() Expect(k8sClient.Create(ctx, deploy)).Should(Succeed()) Eventually(func() bool { err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlNamespace, Name: "mysql"}, deploy) + log.Info("waiting until MySQL Deployment Pods are ready", "Replicas", *deploy.Spec.Replicas, "AvailableReplicas", deploy.Status.AvailableReplicas) if err != nil { return false } - return deploy.Status.ReadyReplicas == *deploy.Spec.Replicas + return deploy.Status.AvailableReplicas == *deploy.Spec.Replicas }, timeout, interval).Should(BeTrue()) } @@ -441,11 +457,4 @@ func createMySQLDeploymentAndService(ctx context.Context) { svcNodePort := newMySQLServiceNodePort() Expect(k8sClient.Create(ctx, svcNodePort)).Should(Succeed()) } - - // wait until deployment is ready - deployment := &appsv1.Deployment{} - Eventually(func() bool { - err = k8sClient.Get(context.TODO(), client.ObjectKey{Name: "mysql", Namespace: mysqlNamespace}, deployment) - return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas - }, timeout, interval).Should(BeTrue()) } diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 1a1dfcc4..fbc8d1ae 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -116,7 +116,7 @@ var _ = BeforeSuite(func() { // 9. Start debug tool startDebugTool(ctx, cfg, scheme) fmt.Println("Setup completed") -}, 60) +}, 120) var _ = AfterSuite(func() { fmt.Println("Clean up mysql-operator and kind cluster") diff --git a/skaffold.yaml b/skaffold.yaml index dde6f0b2..3047cb15 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -14,3 +14,8 @@ deploy: - config/crd - config/default - config/mysql # mysql cluster for testing. todo: will be moved to e2e. +# https://skaffold.dev/docs/testers/custom/ <- no doc about image +# test: +# - image: gcr.io/k8s-skaffold/skaffold-example +# custom: +# - command: echo Hello world!! From a6436e89457df5e5fbd8c2f97634068ec10351eb Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 10:03:43 +0900 Subject: [PATCH 14/32] fix skaffold --- e2e/skaffold.go | 49 +++++++++++++++++++++++++++-------------------- e2e/suite_test.go | 9 +++------ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/e2e/skaffold.go b/e2e/skaffold.go index 572da3c6..42c89f9e 100644 --- a/e2e/skaffold.go +++ b/e2e/skaffold.go @@ -1,6 +1,7 @@ package e2e import ( + "context" "fmt" "os" "os/exec" @@ -8,36 +9,42 @@ import ( type Skaffold struct { KubeconfigPath string + cmd *exec.Cmd } -func (s *Skaffold) run(tail bool) error { - args := []string{"run", "--kubeconfig", s.KubeconfigPath} - if tail { - args = append(args, "--tail") +func (s *Skaffold) run(ctx context.Context) error { + fmt.Println("run") + args := []string{"run", "--kubeconfig", s.KubeconfigPath, "--tail"} + s.cmd = exec.CommandContext( + ctx, + "skaffold", + args..., + ) + s.cmd.Stdout = os.Stdout + s.cmd.Stderr = os.Stderr + s.cmd.Cancel = func() error { + fmt.Println("cmd.Cancel is called") // not working + return nil } - return s.execute(args...) + return s.cmd.Start() // Run in background } -func (s *Skaffold) delete() error { - return s.execute( +func (s *Skaffold) cleanup() error { + fmt.Println("skaffold cleanup") + fmt.Println("skaffold kill process") + errKill := s.cmd.Process.Kill() + s.cmd = exec.Command( + "skaffold", "delete", "--kubeconfig", s.KubeconfigPath, ) -} - -func (s *Skaffold) execute(args ...string) error { - cmd := exec.Command( - "skaffold", - args..., - ) - // cmd.Dir = "." - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - if err != nil { - return fmt.Errorf("failed to run skaffold command. %v", err) + fmt.Println("skaffold delete") + errRun := s.cmd.Run() + if errKill != nil { + return errKill + } else if errRun != nil { + return errRun } - fmt.Println("skaffold completed") return nil } diff --git a/e2e/suite_test.go b/e2e/suite_test.go index fbc8d1ae..79491afa 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -104,11 +104,8 @@ var _ = BeforeSuite(func() { skaffold = &Skaffold{KubeconfigPath: kubeconfigPath} // 7. Deploy CRDs and controllers with skaffold. - go func(ctx context.Context) { - err := skaffold.run(true) // To check log during running tests - Expect(err).To(BeNil()) - <-ctx.Done() - }(ctx) + err = skaffold.run(ctx) // To check log during running tests + Expect(err).To(BeNil()) // 8. Check if mysql-operator is running. checkMySQLOperator() // check if mysql-operator is running @@ -122,7 +119,7 @@ var _ = AfterSuite(func() { fmt.Println("Clean up mysql-operator and kind cluster") cancel() // 1. Remove the deployed resources - skaffold.delete() + skaffold.cleanup() // 2. Stop kind cluster cleanUpKind(kind) From 13fefd8c014e8233f8cdd45c5a7cbddf4aeeb263 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 10:20:40 +0900 Subject: [PATCH 15/32] fix --- controllers/suite_test.go | 2 +- controllers/test_utils.go | 4 +-- e2e/skaffold.go | 4 --- e2e/suite_test.go | 59 ++------------------------------------- 4 files changed, 4 insertions(+), 65 deletions(-) diff --git a/controllers/suite_test.go b/controllers/suite_test.go index 99847ef7..987793bf 100644 --- a/controllers/suite_test.go +++ b/controllers/suite_test.go @@ -98,7 +98,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) - startDebugTool(ctx, cfg, scheme) + StartDebugTool(ctx, cfg, scheme) }, 60) var _ = AfterSuite(func() { diff --git a/controllers/test_utils.go b/controllers/test_utils.go index 4e74df9e..195ece58 100644 --- a/controllers/test_utils.go +++ b/controllers/test_utils.go @@ -79,7 +79,7 @@ func addOwnerReferenceToMySQL(mysqlUser *mysqlv1alpha1.MySQLUser, mysql *mysqlv1 return mysqlUser } -func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) { +func StartDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) { fmt.Println("startDebugTool") // Set a mapper mapper, err := func(c *rest.Config) (meta.RESTMapper, error) { @@ -96,9 +96,7 @@ func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Schem } secret := &v1.Secret{} - cache.Get(ctx, client.ObjectKeyFromObject(secret), secret) mysqluser := &mysqlv1alpha1.MySQLUser{} - cache.Get(ctx, client.ObjectKeyFromObject(mysqluser), mysqluser) // Start Cache go func() { diff --git a/e2e/skaffold.go b/e2e/skaffold.go index 42c89f9e..f0aadb32 100644 --- a/e2e/skaffold.go +++ b/e2e/skaffold.go @@ -22,10 +22,6 @@ func (s *Skaffold) run(ctx context.Context) error { ) s.cmd.Stdout = os.Stdout s.cmd.Stderr = os.Stderr - s.cmd.Cancel = func() error { - fmt.Println("cmd.Cancel is called") // not working - return nil - } return s.cmd.Start() // Run in background } diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 79491afa..04f1c494 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -14,20 +14,14 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - "k8s.io/client-go/util/workqueue" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/source" mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1" + "github.com/nakamasato/mysql-operator/controllers" appsv1 "k8s.io/api/apps/v1" ) @@ -111,7 +105,7 @@ var _ = BeforeSuite(func() { checkMySQLOperator() // check if mysql-operator is running // 9. Start debug tool - startDebugTool(ctx, cfg, scheme) + controllers.StartDebugTool(ctx, cfg, scheme) fmt.Println("Setup completed") }, 120) @@ -187,52 +181,3 @@ func checkMySQLOperator() { return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas }, timeout, interval).Should(BeTrue()) } - -func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) { - fmt.Println("startDebugTool") - mapper, err := apiutil.NewDynamicRESTMapper(cfg) - if err != nil { - log.Error(err, "failed to create mapper") - } - - cache, err := cache.New(cfg, cache.Options{Scheme: scheme, Mapper: mapper}) - if err != nil { - log.Error(err, "failed to create cache") - } - mysqluser := &mysqlv1alpha1.MySQLUser{} - cache.Get(ctx, client.ObjectKeyFromObject(mysqluser), mysqluser) - // Start Cache - go func() { - if err := cache.Start(ctx); err != nil { // func (m *InformersMap) Start(ctx context.Context) error { - log.Error(err, "failed to start cache") - } - }() - log.Info("cache is started") - - kindWithCacheMysqlUser := source.NewKindWithCache(mysqluser, cache) - queue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "test") - eventHandler := handler.Funcs{ - CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) { - log.Info("CreateFunc is called", "Name", e.Object.GetName(), "finalizers", e.Object.GetFinalizers()) - }, - UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) { - log.Info("UpdateFunc is called", "Name", e.ObjectNew.GetName(), "finalizers", e.ObjectNew.GetFinalizers()) - }, - DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) { - log.Info("DeleteFunc is called", "Name", e.Object.GetName(), "finalizers", e.Object.GetFinalizers()) - }, - } - log.Info("kindWithCacheMysqlUser starting") - if err := kindWithCacheMysqlUser.Start(ctx, eventHandler, queue); err != nil { - log.Error(err, "failed to start kind") - } - log.Info("waiting for kindWithCacheMysqlUser to be synced") - if err := kindWithCacheMysqlUser.WaitForSync(ctx); err != nil { - log.Error(err, "failed to wait cache") - } - log.Info("kindWithCacheMysqlUser is synced") - go func() { - // run until ctx is done. - <-ctx.Done() - }() -} From d09189b8969384a3867aa96ca19dbe9a7d91d888 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 10:38:28 +0900 Subject: [PATCH 16/32] fix --- CONTRIBUTING.md | 12 +++++++++++- e2e/e2e_test.go | 4 ++-- e2e/suite_test.go | 34 +++++++++++++++------------------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1aa6019f..384c2e36 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,16 @@ # Code Style -- [golangci-lint](https://golangci-lint.run) +[golangci-lint](https://golangci-lint.run) + +Install: +``` +brew install golangci-lint +``` +Run lint: +``` +golangci-lint run ./... +``` + # Run mysql-operator diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 89ec3d42..1daeb905 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -40,7 +40,7 @@ var _ = Describe("E2e", func() { // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - // deleteUserInMysql(mysqlUserName) + deleteUserInMysql(mysqlUserName) }) AfterEach(func() { @@ -48,7 +48,7 @@ var _ = Describe("E2e", func() { // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - // deleteUserInMysql(mysqlUserName) + deleteUserInMysql(mysqlUserName) }) Describe("Creating and deleting MySQL/MySQLUser object", func() { diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 04f1c494..9bbc1a58 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -14,6 +14,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" @@ -82,13 +83,11 @@ var _ = BeforeSuite(func() { } os.Setenv("KUBECONFIG", path.Join(mydir, kubeconfigPath)) cfg, err := config.GetConfigWithContext("kind-" + kindName) - Expect(err).NotTo(HaveOccurred()) - Expect(cfg).NotTo(BeNil()) - err = mysqlv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) - Expect(err).NotTo(HaveOccurred()) - Expect(k8sClient).NotTo(BeNil()) + if err != nil { + log.Error(err, "failed to get rest.Config") + } + setUpK8sClient(cfg) + deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) @@ -113,22 +112,16 @@ var _ = AfterSuite(func() { fmt.Println("Clean up mysql-operator and kind cluster") cancel() // 1. Remove the deployed resources - skaffold.cleanup() + if err := skaffold.cleanup(); err != nil { + log.Error(err, "failed to clean up skaffold") + } // 2. Stop kind cluster cleanUpKind(kind) }) -func setUpK8sClient() { - mydir, err := os.Getwd() - if err != nil { - fmt.Println(err) - } - os.Setenv("KUBECONFIG", path.Join(mydir, kubeconfigPath)) - cfg, err := config.GetConfigWithContext("kind-" + kindName) - Expect(err).NotTo(HaveOccurred()) - Expect(cfg).NotTo(BeNil()) - err = mysqlv1alpha1.AddToScheme(scheme) +func setUpK8sClient(cfg *rest.Config) { + err := mysqlv1alpha1.AddToScheme(scheme) Expect(err).NotTo(HaveOccurred()) k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) Expect(err).NotTo(HaveOccurred()) @@ -176,7 +169,10 @@ func checkMySQLOperator() { }, timeout, interval).Should(BeNil()) Eventually(func() bool { - k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) + err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) + if err != nil { + return false + } log.Info("waiting until mysqlOperator Pods get ready", "Replicas", *deployment.Spec.Replicas, "AvailableReplicas", deployment.Status.AvailableReplicas) return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas }, timeout, interval).Should(BeTrue()) From bf900a37a311b7c4209cccd799936f53f40def25 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 10:44:34 +0900 Subject: [PATCH 17/32] set timeout to 300 --- e2e/suite_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 9bbc1a58..47f4d168 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -106,7 +106,7 @@ var _ = BeforeSuite(func() { // 9. Start debug tool controllers.StartDebugTool(ctx, cfg, scheme) fmt.Println("Setup completed") -}, 120) +}, 300) var _ = AfterSuite(func() { fmt.Println("Clean up mysql-operator and kind cluster") From 32ff7d3e1315a032ea273996cd563985f35c9d61 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 10:54:49 +0900 Subject: [PATCH 18/32] extend timeout --- controllers/mysqluser_controller_test.go | 2 +- e2e/suite_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/controllers/mysqluser_controller_test.go b/controllers/mysqluser_controller_test.go index b19f30d4..60ae6394 100644 --- a/controllers/mysqluser_controller_test.go +++ b/controllers/mysqluser_controller_test.go @@ -116,7 +116,7 @@ var _ = Describe("MySQLUser controller", func() { return false } return controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) - }).Should(BeTrue()) + }, time.Second, 5*time.Second).Should(BeTrue()) }) }) diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 47f4d168..2be8091e 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -166,7 +166,7 @@ func checkMySQLOperator() { err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) log.Info("waiting until mysqlOperator Deployment is deployed") return err - }, timeout, interval).Should(BeNil()) + }, 3 * timeout, interval).Should(BeNil()) Eventually(func() bool { err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) @@ -175,5 +175,5 @@ func checkMySQLOperator() { } log.Info("waiting until mysqlOperator Pods get ready", "Replicas", *deployment.Spec.Replicas, "AvailableReplicas", deployment.Status.AvailableReplicas) return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas - }, timeout, interval).Should(BeTrue()) + }, 3 * timeout, interval).Should(BeTrue()) } From 0200c380d17056ecc51d359e45567e0b553aed9b Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 11:06:06 +0900 Subject: [PATCH 19/32] remove finalizers' test --- controllers/mysqluser_controller_test.go | 18 ------------------ e2e/suite_test.go | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/controllers/mysqluser_controller_test.go b/controllers/mysqluser_controller_test.go index 60ae6394..561f6942 100644 --- a/controllers/mysqluser_controller_test.go +++ b/controllers/mysqluser_controller_test.go @@ -100,24 +100,6 @@ var _ = Describe("MySQLUser controller", func() { return mysqlUser.Status.Reason }).Should(Equal(mysqlUserReasonCompleted)) }) - - It("Should create mysqlUser with finalizers", func() { - By("By creating a new MySQL") - mysql = &mysqlv1alpha1.MySQL{ - TypeMeta: metav1.TypeMeta{APIVersion: APIVersion, Kind: "MySQL"}, - ObjectMeta: metav1.ObjectMeta{Name: MySQLName, Namespace: Namespace}, - Spec: mysqlv1alpha1.MySQLSpec{Host: "localhost", AdminUser: "root", AdminPassword: "password"}, - } - Expect(k8sClient.Create(ctx, mysql)).Should(Succeed()) - - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: Namespace, Name: MySQLUserName}, mysqlUser) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(mysqlUser, mysqlUserFinalizer) - }, time.Second, 5*time.Second).Should(BeTrue()) - }) }) When("Deleting a MySQLUser", func() { diff --git a/e2e/suite_test.go b/e2e/suite_test.go index 2be8091e..6ca1795e 100644 --- a/e2e/suite_test.go +++ b/e2e/suite_test.go @@ -166,7 +166,7 @@ func checkMySQLOperator() { err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) log.Info("waiting until mysqlOperator Deployment is deployed") return err - }, 3 * timeout, interval).Should(BeNil()) + }, 3*timeout, interval).Should(BeNil()) Eventually(func() bool { err := k8sClient.Get(context.TODO(), client.ObjectKey{Namespace: mysqlOperatorNamespace, Name: mysqlOperatorDeploymentName}, deployment) @@ -175,5 +175,5 @@ func checkMySQLOperator() { } log.Info("waiting until mysqlOperator Pods get ready", "Replicas", *deployment.Spec.Replicas, "AvailableReplicas", deployment.Status.AvailableReplicas) return deployment.Status.AvailableReplicas == *deployment.Spec.Replicas - }, 3 * timeout, interval).Should(BeTrue()) + }, 3*timeout, interval).Should(BeTrue()) } From fed4177a87e39bb5bf01b19faef1f067938455f7 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 11:07:25 +0900 Subject: [PATCH 20/32] remove unnecessary import --- controllers/mysqluser_controller_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/controllers/mysqluser_controller_test.go b/controllers/mysqluser_controller_test.go index 561f6942..24b95114 100644 --- a/controllers/mysqluser_controller_test.go +++ b/controllers/mysqluser_controller_test.go @@ -7,7 +7,6 @@ import ( . "github.com/onsi/ginkgo" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" From b1b4700abf282730b57d2214d14496ee03ca52f0 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 12:24:01 +0900 Subject: [PATCH 21/32] remove recreation step --- e2e/e2e_test.go | 45 --------------------------------------------- 1 file changed, 45 deletions(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 1daeb905..fac3edf3 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -36,19 +36,13 @@ var _ = Describe("E2e", func() { ctx := context.Background() BeforeEach(func() { - // deleteMySQLDeploymentIfExist(ctx) - // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - deleteUserInMysql(mysqlUserName) }) AfterEach(func() { - // deleteMySQLDeploymentIfExist(ctx) - // deleteMySQLServiceIfExist(ctx) deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - deleteUserInMysql(mysqlUserName) }) Describe("Creating and deleting MySQL/MySQLUser object", func() { @@ -190,45 +184,6 @@ func checkMySQLHasUser(mysqluser string) (int, error) { } } -func deleteUserInMysql(mysqluser string) { - _, err := getDeployment("mysql", mysqlNamespace) - if err != nil { - return - } - db, err := sql.Open("mysql", "root:password@tcp(localhost:30306)/") // TODO: Make MySQL root user credentials configurable - if err != nil { - return - } - defer db.Close() - // _, err = db.Exec("DELETE FROM mysql.user where User = '" + mysqluser + "'") - - // if err != nil { - // fmt.Printf("failed delete mysql.user %v\n", err) - // } else { - // fmt.Printf("successfully deleted mysql.user: %s\n", mysqluser) - // } - stmtDelete, err := db.Prepare("DELETE FROM mysql.user where User =?") - if err != nil { - panic(err.Error()) - } - defer stmtDelete.Close() - - result, err := stmtDelete.Exec(mysqluser) - if err != nil { - panic(err.Error()) - } - - rowsAffect, err := result.RowsAffected() - if err != nil { - panic(err.Error()) - } - if rowsAffect == 0 { - fmt.Printf("[deleteUserInMysql] deleted mysql.user '%s'\n", mysqluser) - } else { - fmt.Printf("[deleteUserInMysql] mysql.user '%s' doesn't exist\n", mysqluser) - } -} - func deleteMySQLServiceIfExist(ctx context.Context) { svcNames := []string{"mysql", "mysql-nodeport"} for _, svcName := range svcNames { From 11c26186f906860893c675ab011fa2f8a3df5273 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 12:36:39 +0900 Subject: [PATCH 22/32] not delete mysql deployment just delete service --- e2e/e2e_test.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index fac3edf3..6c17c15c 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -127,8 +127,7 @@ var _ = Describe("E2e", func() { // Expect(k8sClient.Create(ctx, mysql)).Should(Fail()) }) It("Create MySQL and MySQLUser after MySQL cluster gets available", func() { - // delete mysql - deleteMySQLDeploymentIfExist(ctx) + // Make mysql unavailable temporarily deleteMySQLServiceIfExist(ctx) // create mysql mysql := newMySQL(mysqlName, mysqlNamespace) @@ -195,14 +194,6 @@ func deleteMySQLServiceIfExist(ctx context.Context) { } } -func deleteMySQLDeploymentIfExist(ctx context.Context) { - object, err := getDeployment("mysql", mysqlNamespace) - if err != nil { - return - } - Expect(k8sClient.Delete(ctx, object)).Should(Succeed()) -} - func deleteMySQLIfExist(ctx context.Context) { object, err := getMySQL(mysqlName, mysqlNamespace) // TODO: enable to pass mysqlName and mysqlNamespace if err != nil { From 8a69af377ce2e46414b839ac0db9e1d3e582295a Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sat, 11 Mar 2023 13:07:53 +0900 Subject: [PATCH 23/32] extend timeout --- e2e/e2e_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 6c17c15c..a07c97e2 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -27,7 +27,7 @@ const ( mysqlNamespace = "default" mysqlUserFinalizer = "mysqluser.nakamasato.com/finalizer" mysqlFinalizer = "mysql.nakamasato.com/finalizer" - timeout = 60 * time.Second + timeout = 2 * time.Minute interval = 1 * time.Second secretName = "mysql-" + mysqlName + "-" + mysqlUserName ) From 3e0324582acc04e07d57368384771c402c9f87d9 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 08:06:36 +0900 Subject: [PATCH 24/32] fix --- e2e/e2e_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index a07c97e2..63bbbb2f 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -38,11 +38,13 @@ var _ = Describe("E2e", func() { BeforeEach(func() { deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) + deleteMySQLSecretIfExist(ctx) }) AfterEach(func() { deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) + deleteMySQLSecretIfExist(ctx) }) Describe("Creating and deleting MySQL/MySQLUser object", func() { @@ -183,6 +185,15 @@ func checkMySQLHasUser(mysqluser string) (int, error) { } } +func deleteMySQLSecretIfExist(ctx context.Context) { + secret := &corev1.Secret{} + err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) + if err != nil { + return + } + Expect(k8sClient.Delete(ctx, secret)).Should(Succeed()) +} + func deleteMySQLServiceIfExist(ctx context.Context) { svcNames := []string{"mysql", "mysql-nodeport"} for _, svcName := range svcNames { From 3fef45219138b60535d825584918e3e1fe33e33f Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 08:15:35 +0900 Subject: [PATCH 25/32] error --- e2e/e2e_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 63bbbb2f..2a2dcdc2 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -141,6 +141,7 @@ var _ = Describe("E2e", func() { secret := &corev1.Secret{} Consistently(func() bool { err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) + log.Info("secret", "err", err) return errors.IsNotFound(err) }, timeout, interval).Should(BeTrue()) From 37b979cfd87fc6f6fc0ddc83f6839a61dbb51fd7 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 08:44:28 +0900 Subject: [PATCH 26/32] fix consistently timeout --- e2e/e2e_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 2a2dcdc2..98ba2847 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -143,7 +143,7 @@ var _ = Describe("E2e", func() { err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) log.Info("secret", "err", err) return errors.IsNotFound(err) - }, timeout, interval).Should(BeTrue()) + }).Should(BeTrue()) By("Create MySQL Deployment and Service") // create mysql deployment & service From b017ea12646c92e2058d5ddd4a2db0677957a902 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 09:02:06 +0900 Subject: [PATCH 27/32] update --- .github/workflows/e2e.yml | 22 +++++++++++++--------- e2e/e2e_test.go | 1 - 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 71d0150c..90338705 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -14,12 +14,7 @@ jobs: e2e-with-kuttl: runs-on: ubuntu-latest steps: - - name: set up - uses: actions/setup-go@v3 - with: - go-version: 1.18 - - - uses: actions/checkout@master + - uses: actions/checkout@v3 # https://krew.sigs.k8s.io/docs/user-guide/setup/install/ - name: krew - install @@ -50,17 +45,26 @@ jobs: e2e-with-ginkgo: runs-on: ubuntu-latest steps: - - name: set up + - uses: actions/checkout@v3 + + - name: setup go uses: actions/setup-go@v3 with: - go-version: 1.18 + go-version-file: ./go.mod + cache: true - name: install skaffold # TODO: #69 Enable to install skaffold in e2e run: | curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && \ sudo install skaffold /usr/local/bin/ - - uses: actions/checkout@master + - name: create kind cluster + working-directory: e2e + run: kind create cluster --name mysql-operator-e2e --kubeconfig kubeconfig --config kind-config.yml --wait 30s + + - name: skaffold run + working-directory: e2e + run: skaffold run --kubeconfig kubeconfig --tail - name: e2e-with-ginkgo run: make e2e-with-ginkgo diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 98ba2847..04893d4e 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -141,7 +141,6 @@ var _ = Describe("E2e", func() { secret := &corev1.Secret{} Consistently(func() bool { err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) - log.Info("secret", "err", err) return errors.IsNotFound(err) }).Should(BeTrue()) From 13fc0eb661779fc9145aa18feb9e46ef19b2d7c7 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 09:05:00 +0900 Subject: [PATCH 28/32] update --- .github/workflows/e2e.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 90338705..e52a2f82 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -39,8 +39,11 @@ jobs: kubectl krew install kuttl kubectl kuttl -v - - name: e2e-with-kuttl - run: make e2e-with-kuttl + - name: docker build + run: docker build -t mysql-operator . + + - name: kuttl test + run: make kuttl e2e-with-ginkgo: runs-on: ubuntu-latest From 45de41ef162e785f433ffd4450e2044a7399b381 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 09:13:26 +0900 Subject: [PATCH 29/32] remove tail --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index e52a2f82..11e2cd22 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -67,7 +67,7 @@ jobs: - name: skaffold run working-directory: e2e - run: skaffold run --kubeconfig kubeconfig --tail + run: skaffold run --kubeconfig kubeconfig - name: e2e-with-ginkgo run: make e2e-with-ginkgo From 5506ddd0ca6baecbb8c6b6b32fbbd5360357ee20 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 10:27:41 +0900 Subject: [PATCH 30/32] use PingContext for db --- CONTRIBUTING.md | 7 +++++++ controllers/mysqluser_controller.go | 8 ++++++-- e2e/e2e_test.go | 13 ++----------- internal/mysql/mysql.go | 10 ++++++---- main.go | 2 ++ 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 384c2e36..d18801c2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -438,5 +438,12 @@ UID in precondition and UID in object meta are different? https://github.com/kubernetes-sigs/controller-runtime/issues/2209 +## Slow build + +``` +time CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go 161.57s user 24.90s system 283% cpu 1:05.76 total +``` + ## MySQL - http://go-database-sql.org/index.html diff --git a/controllers/mysqluser_controller.go b/controllers/mysqluser_controller.go index de9a2dfa..3b8db4b4 100644 --- a/controllers/mysqluser_controller.go +++ b/controllers/mysqluser_controller.go @@ -132,7 +132,9 @@ func (r *MySQLUserReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( return ctrl.Result{}, err // requeue } log.Info("[MySQLClient] Ping") - err = mysqlClient.Ping() + ctxPing, cancel := context.WithTimeout(ctx, time.Second) + defer cancel() + err = mysqlClient.PingContext(ctxPing) if err != nil { mysqlUser.Status.Phase = mysqlUserPhaseNotReady mysqlUser.Status.Reason = mysqlUserReasonMySQLConnectionFailed @@ -262,7 +264,9 @@ func (r *MySQLUserReconciler) finalizeMySQLUser(ctx context.Context, mysqlUser * if err != nil { return err } - err = mysqlClient.Ping() + ctxPing, cancel := context.WithTimeout(ctx, time.Second) + defer cancel() + err = mysqlClient.PingContext(ctxPing) if err != nil { return err } diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 04893d4e..b5a75c6f 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -38,13 +38,11 @@ var _ = Describe("E2e", func() { BeforeEach(func() { deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - deleteMySQLSecretIfExist(ctx) }) AfterEach(func() { deleteMySQLUserIfExist(ctx) deleteMySQLIfExist(ctx) - deleteMySQLSecretIfExist(ctx) }) Describe("Creating and deleting MySQL/MySQLUser object", func() { @@ -185,15 +183,6 @@ func checkMySQLHasUser(mysqluser string) (int, error) { } } -func deleteMySQLSecretIfExist(ctx context.Context) { - secret := &corev1.Secret{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) - if err != nil { - return - } - Expect(k8sClient.Delete(ctx, secret)).Should(Succeed()) -} - func deleteMySQLServiceIfExist(ctx context.Context) { svcNames := []string{"mysql", "mysql-nodeport"} for _, svcName := range svcNames { @@ -391,6 +380,7 @@ func newMySQLDeployment() *appsv1.Deployment { } func createMySQLDeploymentAndService(ctx context.Context) { + startTime := time.Now() log.Info("createMySQLDeploymentAndService started") _, err := getDeployment("mysql", mysqlNamespace) if err != nil { // try to create for any error @@ -414,4 +404,5 @@ func createMySQLDeploymentAndService(ctx context.Context) { svcNodePort := newMySQLServiceNodePort() Expect(k8sClient.Create(ctx, svcNodePort)).Should(Succeed()) } + log.Info("createMySQLDeploymentAndService completed", "elapsed time", time.Since(startTime)) } diff --git a/internal/mysql/mysql.go b/internal/mysql/mysql.go index 8caea0f3..580db81d 100644 --- a/internal/mysql/mysql.go +++ b/internal/mysql/mysql.go @@ -1,7 +1,9 @@ package mysql import ( + "context" "database/sql" + logf "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -13,7 +15,7 @@ type MySQLConfig struct { type MySQLClient interface { Exec(query string) error - Ping() error + PingContext(ctx context.Context) error Close() } @@ -32,7 +34,7 @@ func (mc fakeMysqlClient) Exec(query string) error { return nil } -func (mc fakeMysqlClient) Ping() error { +func (mc fakeMysqlClient) PingContext(ctx context.Context) error { return nil } @@ -57,8 +59,8 @@ func (mc mysqlClient) Exec(query string) error { return nil } -func (mc mysqlClient) Ping() error { - return mc.db.Ping() +func (mc mysqlClient) PingContext(ctx context.Context) error { + return mc.db.PingContext(ctx) } func (mc mysqlClient) Close() { diff --git a/main.go b/main.go index 0bdb54ca..e1274b3a 100644 --- a/main.go +++ b/main.go @@ -23,6 +23,7 @@ import ( // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. + "go.uber.org/zap/zapcore" _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/apimachinery/pkg/runtime" @@ -62,6 +63,7 @@ func main() { "Enabling this will ensure there is only one active controller manager.") opts := zap.Options{ Development: true, + TimeEncoder: zapcore.ISO8601TimeEncoder, } opts.BindFlags(flag.CommandLine) flag.Parse() From c0b10487e3c1b39fda80dec6b0501afba7d25ed0 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 10:33:37 +0900 Subject: [PATCH 31/32] set 100 millisecond --- e2e/e2e_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index b5a75c6f..6f688092 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -140,7 +140,7 @@ var _ = Describe("E2e", func() { Consistently(func() bool { err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) return errors.IsNotFound(err) - }).Should(BeTrue()) + }, 100 * time.Millisecond).Should(BeTrue()) By("Create MySQL Deployment and Service") // create mysql deployment & service From 765d9f7e823a99d45c91b2bb0d075ecb0ca3e6e1 Mon Sep 17 00:00:00 2001 From: Masato Naka Date: Sun, 12 Mar 2023 10:40:53 +0900 Subject: [PATCH 32/32] set timeout to 1 sec --- e2e/e2e_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 6f688092..583461a6 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -2,7 +2,6 @@ package e2e import ( "context" - "fmt" "time" "database/sql" @@ -140,7 +139,7 @@ var _ = Describe("E2e", func() { Consistently(func() bool { err := k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) return errors.IsNotFound(err) - }, 100 * time.Millisecond).Should(BeTrue()) + }, time.Second, time.Second).Should(BeTrue()) By("Create MySQL Deployment and Service") // create mysql deployment & service @@ -150,10 +149,10 @@ var _ = Describe("E2e", func() { Eventually(func() error { mysqlUser, err := getMySQLUser(mysqlUserName, mysqlNamespace) if err != nil { - fmt.Println("failed to get mysqluer") + log.Info("failed to get mysqluer") return err } - fmt.Printf("mysqluser: Status: %v, ResourceVersion: %s\n", mysqlUser.Status, mysqlUser.ObjectMeta.ResourceVersion) + log.Info("Successfully got mysqluser", "status", mysqlUser.Status, "ResourceVersion", mysqlUser.ObjectMeta.ResourceVersion) return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret) }, timeout, interval).Should(Succeed()) @@ -178,7 +177,7 @@ func checkMySQLHasUser(mysqluser string) (int, error) { if err := row.Scan(&count); err != nil { return 0, err } else { - fmt.Printf("mysql.user count: %s, %d\n", mysqluser, count) + log.Info("mysql.user count: %s, %d\n", mysqluser, count) return count, nil } }