From 94cf20296d5b8b9f9f560fcca7221c1bb9637bb9 Mon Sep 17 00:00:00 2001 From: realanna Date: Wed, 19 Apr 2023 08:50:24 +0200 Subject: [PATCH 01/13] poc: removed scheduler Signed-off-by: realanna --- .github/actions/deploy-klt-on-cluster/action.yml | 5 ----- .github/labeler.yml | 3 --- .github/workflows/CI.yaml | 4 ---- .github/workflows/e2e-test.yml | 3 +-- .github/workflows/golangci-lint.yml | 2 -- .github/workflows/helm-checks.yaml | 2 -- .github/workflows/release.yml | 13 ------------- .github/workflows/security-scans.yml | 6 +----- .github/workflows/validate-semantic-pr.yml | 1 - .gitignore | 1 - Makefile | 11 +---------- README.md | 7 +++---- codecov.yml | 4 ---- examples/Makefile | 3 +-- release-please-config.json | 1 - renovate.json | 1 - 16 files changed, 7 insertions(+), 60 deletions(-) diff --git a/.github/actions/deploy-klt-on-cluster/action.yml b/.github/actions/deploy-klt-on-cluster/action.yml index 35df992e44..9d2dd7eeaf 100644 --- a/.github/actions/deploy-klt-on-cluster/action.yml +++ b/.github/actions/deploy-klt-on-cluster/action.yml @@ -74,10 +74,6 @@ runs: kubectl apply -f ~/download/artifacts/metrics-operator-manifest-test kubectl rollout status deployment metrics-operator -n keptn-lifecycle-toolkit-system -w - sed -i 's/imagePullPolicy: Always/imagePullPolicy: Never/g' ~/download/artifacts/scheduler-manifest-test/release.yaml - kubectl apply -f ~/download/artifacts/scheduler-manifest-test - kubectl rollout status deployment scheduler -n keptn-lifecycle-toolkit-system -w - kubectl rollout status deployment lifecycle-operator -n keptn-lifecycle-toolkit-system -w - name: Install lifecycle-toolkit with helm if: ${{ inputs.helm-install == 'true' }} @@ -86,7 +82,6 @@ runs: echo "Installing KLT using helm" helm version helm install -n keptn-lifecycle-toolkit-system --create-namespace toolkit ~/download/artifacts/keptn-lifecycle-toolkit.tgz \ - --set scheduler.scheduler.imagePullPolicy=Never \ --set lifecycleOperator.manager.imagePullPolicy=Never \ --set metricsOperator.manager.imagePullPolicy=Never \ --set lifecycleOperator.manager.env.functionRunnerImage=localhost:5000/keptn/functions-runtime:${{ inputs.functions_runtime_tag }} \ diff --git a/.github/labeler.yml b/.github/labeler.yml index 55d9de5316..af3e55403a 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -5,9 +5,6 @@ documentation: operator: - operator/**/* -scheduler: - - scheduler/**/* - metrics-operator: - metrics-operator/**/* diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index 78ebebd3f4..b076473199 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -80,8 +80,6 @@ jobs: folder: "operator/" - name: "metrics-operator" folder: "metrics-operator/" - - name: "scheduler" - folder: "scheduler/" - name: "certificate-operator" folder: "klt-cert-manager/" steps: @@ -121,8 +119,6 @@ jobs: folder: "operator/" - name: "metrics-operator" folder: "metrics-operator/" - - name: "scheduler" - folder: "scheduler/" - name: "functions-runtime" folder: "functions-runtime/" - name: "certificate-operator" diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 1724b27d1d..7b80d25d9e 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -21,8 +21,7 @@ jobs: config: - name: "lifecycle-operator" folder: "operator/" - - name: "scheduler" - folder: "scheduler/" + steps: - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index c789df13d0..c9b81c62f7 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -31,8 +31,6 @@ jobs: folder: "operator/" - name: "metrics-operator" folder: "metrics-operator/" - - name: "scheduler" - folder: "scheduler/" - name: "certificate-operator" folder: "klt-cert-manager/" steps: diff --git a/.github/workflows/helm-checks.yaml b/.github/workflows/helm-checks.yaml index 91085570e5..4a18070903 100644 --- a/.github/workflows/helm-checks.yaml +++ b/.github/workflows/helm-checks.yaml @@ -58,8 +58,6 @@ jobs: folder: "operator/" - name: "metrics-operator" folder: "metrics-operator/" - - name: "scheduler" - folder: "scheduler/" - name: "functions-runtime" folder: "functions-runtime/" - name: "certificate-operator" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c5062880a9..6cf124691b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,8 +47,6 @@ jobs: folder: "operator/" - name: "metrics-operator" folder: "metrics-operator/" - - name: "scheduler" - folder: "scheduler/" - name: "functions-runtime" folder: "functions-runtime/" - name: "certificate-operator" @@ -141,13 +139,6 @@ jobs: path: ./operator/bin key: build-tools-${{ github.ref_name }} - - name: Cache build tools scheduler - id: cache-build-tools-scheduler - uses: actions/cache@v3 - with: - path: ./scheduler/bin - key: build-tools-${{ github.ref_name }} - - name: Cache build tools cert-manager id: cache-build-tools-klt-cert-manager uses: actions/cache@v3 @@ -165,8 +156,6 @@ jobs: RELEASE_REGISTRY: ghcr.keptn.sh/keptn CHART_APPVERSION: ${{ needs.release-please.outputs.tag_name }} run: | - cd scheduler - make release-manifests cd ../operator make controller-gen release-manifests cd ../klt-cert-manager @@ -175,7 +164,6 @@ jobs: make controller-gen release-manifests cd .. echo "---" >> operator/config/rendered/release.yaml - echo "---" >> scheduler/config/rendered/release.yaml echo "---" >> klt-cert-manager/config/rendered/release.yaml cat >> namespace.yaml << EOF --- @@ -187,7 +175,6 @@ jobs: EOF cat namespace.yaml \ operator/config/rendered/release.yaml \ - scheduler/config/rendered/release.yaml \ klt-cert-manager/config/rendered/release.yaml \ metrics-operator/config/rendered/release.yaml > manifest.yaml diff --git a/.github/workflows/security-scans.yml b/.github/workflows/security-scans.yml index 81d9349d70..ea97bd2c4e 100644 --- a/.github/workflows/security-scans.yml +++ b/.github/workflows/security-scans.yml @@ -151,15 +151,13 @@ jobs: sed -i 's/\- ..\/crd//' kustomization.yaml && kustomize build ./ > /tmp/metrics-operator-manifest.yaml echo "---" >> /tmp/crds.yaml cd ../crd && kustomize build ./ >> /tmp/crds.yaml - cd ../../../scheduler/manifests/install && kustomize build ./ > /tmp/scheduler-manifest.yaml curl -s https://raw.githubusercontent.com/yannh/kubeconform/${{ matrix.version }}/scripts/openapi2jsonschema.py > /tmp/openapi2jsonschema.py mkdir -p /tmp/schema && cd /tmp/schema python3 ../openapi2jsonschema.py ../crds.yaml cd .. && \ echo "---" >> operator-manifest.yaml && \ - echo "---" >> scheduler-manifest.yaml && \ - cat operator-manifest.yaml scheduler-manifest.yaml metrics-operator-manifest.yaml > manifest.yaml + cat operator-manifest.yaml metrics-operator-manifest.yaml > manifest.yaml kubeconform \ -schema-location default \ -schema-location './schema/{{ .ResourceKind }}_{{ .ResourceAPIVersion }}.json' \ @@ -194,7 +192,6 @@ jobs: - "functions-runtime" - "lifecycle-operator" - "metrics-operator" - - "scheduler" - "certificate-operator" steps: - name: Download images @@ -220,7 +217,6 @@ jobs: artifact: - "operator" - "metrics-operator" - - "scheduler" - "klt-cert-manager" steps: diff --git a/.github/workflows/validate-semantic-pr.yml b/.github/workflows/validate-semantic-pr.yml index 7ca94fa61c..8047138a87 100644 --- a/.github/workflows/validate-semantic-pr.yml +++ b/.github/workflows/validate-semantic-pr.yml @@ -34,7 +34,6 @@ jobs: deps scopes: | helm-chart - scheduler operator cert-manager metrics-operator diff --git a/.gitignore b/.gitignore index 358d7e46f2..b0b7638023 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ kubeconfig .dccache* manifests/ -/scheduler/config/rendered/release.yaml /operator/config/rendered/release.yaml /metrics-operator/config/rendered/release.yaml /klt-cert-manager/config/rendered/release.yaml diff --git a/Makefile b/Makefile index 8c3dc8cc31..a65c9a8031 100644 --- a/Makefile +++ b/Makefile @@ -90,7 +90,6 @@ build-release-manifests: $(MAKE) -C metrics-operator generate $(MAKE) -C operator release-manifests RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) ARCH=$(ARCH) CHART_APPVERSION=$(CHART_APPVERSION) - $(MAKE) -C scheduler release-manifests RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) ARCH=$(ARCH) CHART_APPVERSION=$(CHART_APPVERSION) $(MAKE) -C klt-cert-manager release-manifests RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) ARCH=$(ARCH) CHART_APPVERSION=$(CHART_APPVERSION) $(MAKE) -C metrics-operator release-manifests RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) ARCH=$(ARCH) CHART_APPVERSION=$(CHART_APPVERSION) @@ -110,14 +109,6 @@ build-deploy-metrics-operator: kubectl apply -f metrics-operator/config/rendered/release.yaml -.PHONY: build-deploy-scheduler -build-deploy-scheduler: - $(MAKE) -C scheduler release-local.$(ARCH) RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) - $(MAKE) -C scheduler push-local RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) - $(MAKE) -C scheduler release-manifests RELEASE_REGISTRY=$(RELEASE_REGISTRY) CHART_APPVERSION=$(TAG) ARCH=$(ARCH) - kubectl create namespace keptn-lifecycle-toolkit-system --dry-run=client -o yaml | kubectl apply -f - - kubectl apply -f scheduler/config/rendered/release.yaml - .PHONY: build-deploy-certmanager build-deploy-certmanager: $(MAKE) -C klt-cert-manager release-local.$(ARCH) RELEASE_REGISTRY=$(RELEASE_REGISTRY) TAG=$(TAG) @@ -127,7 +118,7 @@ build-deploy-certmanager: kubectl apply -f klt-cert-manager/config/rendered/release.yaml .PHONY: build-deploy-dev-environment -build-deploy-dev-environment: build-deploy-certmanager build-deploy-operator build-deploy-metrics-operator build-deploy-scheduler +build-deploy-dev-environment: build-deploy-certmanager build-deploy-operator build-deploy-metrics-operator include docs/Makefile diff --git a/README.md b/README.md index 375b3c2ce8..4d054c2268 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ When the webhook receives a request for a new pod, it will look for the workload keptn.sh/workload: "some-workload-name" ``` -The mutation consists in changing the scheduler used for the deployment with the Keptn Scheduler. +The mutation consists in gating the deployment or pod so that the kubernetes Scheduler will not yet deploy them. Webhook then creates a workload and app resource per annotated resource. You can also specify a custom app definition with the annotation: @@ -252,7 +252,7 @@ and for the Evaluations: After either one of those actions has been taken, the webhook will set the scheduler of the pod and allow the pod to be scheduled. -### Scheduler +### Scheduler ##TODO After the Webhook mutation, the Keptn-Scheduler will handle the annotated resources. The scheduling flow follows the @@ -512,8 +512,7 @@ The [GitHub CLI](https://cli.github.com/) can be used to download the manifests ```bash gh run list --repo keptn/lifecycle-toolkit # find the id of a run gh run download 3152895000 --repo keptn/lifecycle-toolkit # download the artifacts -kubectl apply -f ./keptn-lifecycle-operator-manifest/release.yaml # install the operator -kubectl apply -f ./scheduler-manifest/release.yaml # install the scheduler +kubectl apply -f ./keptn-lifecycle-operator-manifest/release.yaml # install the operators ``` Instead, if you want to build and deploy the operator into your cluster directly from the code, you can type: diff --git a/codecov.yml b/codecov.yml index 435cf7f81c..ac7a5da338 100644 --- a/codecov.yml +++ b/codecov.yml @@ -29,10 +29,6 @@ flags: paths: - operator/ carryforward: true - scheduler: - paths: - - scheduler/ - carryforward: true component-tests: paths: - operator/ diff --git a/examples/Makefile b/examples/Makefile index 12bb35d025..f26b995fb8 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -95,6 +95,5 @@ restart-lifecycle-toolkit: @echo "----------------------------------" kubectl rollout restart deployment -n "$(TOOLKIT_NAMESPACE)" -l control-plane=lifecycle-operator kubectl rollout status deployment -n "$(TOOLKIT_NAMESPACE)" -l control-plane=lifecycle-operator --watch - kubectl rollout restart deployment -n "$(TOOLKIT_NAMESPACE)" -l component=scheduler - kubectl rollout status deployment -n "$(TOOLKIT_NAMESPACE)" -l component=scheduler --watch + diff --git a/release-please-config.json b/release-please-config.json index e999c1643e..6a37b0d4a5 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -14,7 +14,6 @@ "helm/chart/Chart.yaml", "Makefile", "operator/Makefile", - "scheduler/Makefile", "klt-cert-manager/Makefile", "metrics-operator/Makefile", "docs/content/en/docs/snippets/tasks/install.md", diff --git a/renovate.json b/renovate.json index 25af678023..e0bff241bf 100644 --- a/renovate.json +++ b/renovate.json @@ -24,7 +24,6 @@ ], "ignoreDeps": [ "ghcr.keptn.sh/keptn/lifecycle-operator", - "ghcr.keptn.sh/keptn/scheduler", "ghcr.keptn.sh/keptn/functions-runtime", "ghcr.keptn.sh/keptn/certificate-operator", "ghcr.keptn.sh/keptn/metrics-operator" From 36270e925312d04fe1322b01df574abebc7da661 Mon Sep 17 00:00:00 2001 From: realanna Date: Wed, 19 Apr 2023 09:48:13 +0200 Subject: [PATCH 02/13] fix operator import Signed-off-by: realanna fix operator import Signed-off-by: realanna poc: fix lib import Signed-off-by: realanna poc: fix lib import Signed-off-by: realanna poc: fix lib import Signed-off-by: realanna poc: tidy Signed-off-by: realanna poc: tidy Signed-off-by: realanna poc: tidy Signed-off-by: realanna poc: tidy Signed-off-by: realanna poc: rebased with controller runtime Signed-off-by: realanna poc: up kind version Signed-off-by: realanna poc: removed logger in favour of test logger Signed-off-by: realanna poc: fixed otel Signed-off-by: realanna poc: patched k8s version for sigs.k8s.io/controller-runtime Signed-off-by: realanna poc: added gates Signed-off-by: realanna --- .../actions/deploy-klt-on-cluster/action.yml | 4 +- klt-cert-manager/go.mod | 58 ++-- klt-cert-manager/go.sum | 284 ++++++------------ klt-cert-manager/pkg/fake/manager_mock.go | 95 +++--- klt-cert-manager/pkg/webhook/builder_test.go | 4 +- klt-cert-manager/pkg/webhook/manager.go | 8 +- klt-cert-manager/pkg/webhook/manager_test.go | 16 +- metrics-operator/go.mod | 58 ++-- metrics-operator/go.sum | 263 +++++++--------- metrics-operator/main.go | 5 +- .../apis/lifecycle/v1alpha3/common/common.go | 1 + operator/config/rbac/role.yaml | 1 + .../controllers/common/helperfunctions.go | 63 ++++ .../keptnworkloadinstance/controller.go | 8 +- .../options/keptnconfig_controller_test.go | 29 +- operator/go.mod | 57 ++-- operator/go.sum | 153 ++++++---- operator/main.go | 4 +- .../pod_mutator/pod_mutating_webhook.go | 10 +- .../pod_mutator/pod_mutating_webhook_test.go | 12 +- 20 files changed, 531 insertions(+), 602 deletions(-) diff --git a/.github/actions/deploy-klt-on-cluster/action.yml b/.github/actions/deploy-klt-on-cluster/action.yml index 9d2dd7eeaf..d1f06ffc35 100644 --- a/.github/actions/deploy-klt-on-cluster/action.yml +++ b/.github/actions/deploy-klt-on-cluster/action.yml @@ -5,12 +5,12 @@ inputs: required: false description: "Version of kind that should be used" # renovate: datasource=github-releases depName=kubernetes-sigs/kind - default: "v0.17.0" + default: "v0.18.0" k8s-version: required: false description: "Kubernetes that should be used" # renovate: datasource=github-releases depName=kubernetes/kubernetes - default: "v1.25.3" + default: "v1.27.1" functions_runtime_tag: description: "Tag for the functions runner image" required: true diff --git a/klt-cert-manager/go.mod b/klt-cert-manager/go.mod index 96316b35ba..e5d588ae28 100644 --- a/klt-cert-manager/go.mod +++ b/klt-cert-manager/go.mod @@ -8,68 +8,68 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/afero v1.9.5 github.com/stretchr/testify v1.8.2 - k8s.io/api v0.26.4 - k8s.io/apiextensions-apiserver v0.26.4 - k8s.io/apimachinery v0.26.4 - k8s.io/client-go v0.26.4 - sigs.k8s.io/controller-runtime v0.14.6 + k8s.io/api v0.27.1 + k8s.io/apiextensions-apiserver v0.27.1 + k8s.io/apimachinery v0.27.1 + k8s.io/client-go v0.27.1 + sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd ) require ( github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-logr/zapr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/swag v0.22.3 // indirect 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/golang/protobuf v1.5.3 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect + github.com/imdario/mergo v0.3.6 // 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 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // 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/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - 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/prometheus/client_golang v1.15.1 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // 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.24.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.5.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // 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 + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/component-base v0.26.4 // indirect - k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect - k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + k8s.io/component-base v0.27.1 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect + k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -replace golang.org/x/net => golang.org/x/net v0.9.0 +replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd diff --git a/klt-cert-manager/go.sum b/klt-cert-manager/go.sum index 0d0b73d95f..e67eb0e23d 100644 --- a/klt-cert-manager/go.sum +++ b/klt-cert-manager/go.sum @@ -38,26 +38,11 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -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/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.3 h1:g+rSsSaAzhHJYcIQE78hJ3AhyjjtQvleKDjlhdBnIhc= -github.com/benbjohnson/clock v1.3.3/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -67,7 +52,6 @@ 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/creack/pty v1.1.9/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= @@ -75,56 +59,34 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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.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.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= 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/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -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= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 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= @@ -155,7 +117,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -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/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -163,8 +124,6 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 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/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= 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= @@ -180,8 +139,6 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 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/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.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= @@ -195,7 +152,7 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf 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-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -203,170 +160,104 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ 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/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= -github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 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= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 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/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.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 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= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/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= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.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.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM= -github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -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_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -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= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -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/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= 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/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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -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= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= 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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 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.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= 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/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -401,10 +292,42 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +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= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -414,9 +337,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ 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-20210514164344-f6687ab2804c/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/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -429,15 +349,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -446,7 +362,6 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -459,36 +374,31 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-20200905004654-be1d3432aa8f/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-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-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= @@ -513,7 +423,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -548,9 +457,8 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= 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= @@ -607,7 +515,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -622,7 +529,6 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -636,12 +542,9 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji 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.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= @@ -654,33 +557,22 @@ 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= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -690,31 +582,29 @@ 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.26.4 h1:qSG2PmtcD23BkYiWfoYAcak870eF/hE7NNYBYavTT94= -k8s.io/api v0.26.4/go.mod h1:WwKEXU3R1rgCZ77AYa7DFksd9/BAIKyOmRlbVxgvjCk= -k8s.io/apiextensions-apiserver v0.26.4 h1:9D2RTxYGxrG5uYg6D7QZRcykXvavBvcA59j5kTaedQI= -k8s.io/apiextensions-apiserver v0.26.4/go.mod h1:cd4uGFGIgzEqUghWpRsr9KE8j2KNTjY8Ji8pnMMazyw= -k8s.io/apimachinery v0.26.4 h1:rZccKdBLg9vP6J09JD+z8Yr99Ce8gk3Lbi9TCx05Jzs= -k8s.io/apimachinery v0.26.4/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.4 h1:/7P/IbGBuT73A+G97trf44NTPSNqvuBREpOfdLbHvD4= -k8s.io/client-go v0.26.4/go.mod h1:6qOItWm3EwxJdl/8p5t7FWtWUOwyMdA8N9ekbW4idpI= -k8s.io/component-base v0.26.4 h1:Bg2xzyXNKL3eAuiTEu3XE198d6z22ENgFgGQv2GGOUk= -k8s.io/component-base v0.26.4/go.mod h1:lTuWL1Xz/a4e80gmIC3YZG2JCO4xNwtKWHJWeJmsq20= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0= +k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E= +k8s.io/apiextensions-apiserver v0.27.1 h1:Hp7B3KxKHBZ/FxmVFVpaDiXI6CCSr49P1OJjxKO6o4g= +k8s.io/apiextensions-apiserver v0.27.1/go.mod h1:8jEvRDtKjVtWmdkhOqE84EcNWJt/uwF8PC4627UZghY= +k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc= +k8s.io/apimachinery v0.27.1/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM= +k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8= +k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA= +k8s.io/component-base v0.27.1 h1:kEB8p8lzi4gCs5f2SPU242vOumHJ6EOsOnDM3tTuDTM= +k8s.io/component-base v0.27.1/go.mod h1:UGEd8+gxE4YWoigz5/lb3af3Q24w98pDseXcXZjw+E0= k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= +k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= +k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= -sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd h1:OKwtUfmxPPGIyxDYMZ5n+EF5fjjbbXiVMyPZjyS8A+w= +sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd/go.mod h1:EdI5r/x+MzEtPhduK7s3ZAN9z/Ro6gidKsktEj/kIXo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/klt-cert-manager/pkg/fake/manager_mock.go b/klt-cert-manager/pkg/fake/manager_mock.go index d136251930..323cf33ad0 100644 --- a/klt-cert-manager/pkg/fake/manager_mock.go +++ b/klt-cert-manager/pkg/fake/manager_mock.go @@ -13,7 +13,7 @@ import ( "net/http" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/config/v1alpha1" + "sigs.k8s.io/controller-runtime/pkg/config" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/webhook" @@ -53,7 +53,7 @@ import ( // GetConfigFunc: func() *rest.Config { // panic("mock out the GetConfig method") // }, -// GetControllerOptionsFunc: func() v1alpha1.ControllerConfigurationSpec { +// GetControllerOptionsFunc: func() config.Controller { // panic("mock out the GetControllerOptions method") // }, // GetEventRecorderForFunc: func(name string) record.EventRecorder { @@ -62,6 +62,9 @@ import ( // GetFieldIndexerFunc: func() client.FieldIndexer { // panic("mock out the GetFieldIndexer method") // }, +// GetHTTPClientFunc: func() *http.Client { +// panic("mock out the GetHTTPClient method") +// }, // GetLoggerFunc: func() logr.Logger { // panic("mock out the GetLogger method") // }, @@ -71,12 +74,9 @@ import ( // GetSchemeFunc: func() *runtime.Scheme { // panic("mock out the GetScheme method") // }, -// GetWebhookServerFunc: func() *webhook.Server { +// GetWebhookServerFunc: func() webhook.Server { // panic("mock out the GetWebhookServer method") // }, -// SetFieldsFunc: func(ifaceVal interface{}) error { -// panic("mock out the SetFields method") -// }, // StartFunc: func(ctx context.Context) error { // panic("mock out the Start method") // }, @@ -115,7 +115,7 @@ type MockManager struct { GetConfigFunc func() *rest.Config // GetControllerOptionsFunc mocks the GetControllerOptions method. - GetControllerOptionsFunc func() v1alpha1.ControllerConfigurationSpec + GetControllerOptionsFunc func() config.Controller // GetEventRecorderForFunc mocks the GetEventRecorderFor method. GetEventRecorderForFunc func(name string) record.EventRecorder @@ -123,6 +123,9 @@ type MockManager struct { // GetFieldIndexerFunc mocks the GetFieldIndexer method. GetFieldIndexerFunc func() client.FieldIndexer + // GetHTTPClientFunc mocks the GetHTTPClient method. + GetHTTPClientFunc func() *http.Client + // GetLoggerFunc mocks the GetLogger method. GetLoggerFunc func() logr.Logger @@ -133,10 +136,7 @@ type MockManager struct { GetSchemeFunc func() *runtime.Scheme // GetWebhookServerFunc mocks the GetWebhookServer method. - GetWebhookServerFunc func() *webhook.Server - - // SetFieldsFunc mocks the SetFields method. - SetFieldsFunc func(ifaceVal interface{}) error + GetWebhookServerFunc func() webhook.Server // StartFunc mocks the Start method. StartFunc func(ctx context.Context) error @@ -195,6 +195,9 @@ type MockManager struct { // GetFieldIndexer holds details about calls to the GetFieldIndexer method. GetFieldIndexer []struct { } + // GetHTTPClient holds details about calls to the GetHTTPClient method. + GetHTTPClient []struct { + } // GetLogger holds details about calls to the GetLogger method. GetLogger []struct { } @@ -207,11 +210,6 @@ type MockManager struct { // GetWebhookServer holds details about calls to the GetWebhookServer method. GetWebhookServer []struct { } - // SetFields holds details about calls to the SetFields method. - SetFields []struct { - // IfaceVal is the ifaceVal argument value. - IfaceVal interface{} - } // Start holds details about calls to the Start method. Start []struct { // Ctx is the ctx argument value. @@ -230,11 +228,11 @@ type MockManager struct { lockGetControllerOptions sync.RWMutex lockGetEventRecorderFor sync.RWMutex lockGetFieldIndexer sync.RWMutex + lockGetHTTPClient sync.RWMutex lockGetLogger sync.RWMutex lockGetRESTMapper sync.RWMutex lockGetScheme sync.RWMutex lockGetWebhookServer sync.RWMutex - lockSetFields sync.RWMutex lockStart sync.RWMutex } @@ -514,7 +512,7 @@ func (mock *MockManager) GetConfigCalls() []struct { } // GetControllerOptions calls GetControllerOptionsFunc. -func (mock *MockManager) GetControllerOptions() v1alpha1.ControllerConfigurationSpec { +func (mock *MockManager) GetControllerOptions() config.Controller { if mock.GetControllerOptionsFunc == nil { panic("MockManager.GetControllerOptionsFunc: method is nil but IManager.GetControllerOptions was just called") } @@ -599,6 +597,33 @@ func (mock *MockManager) GetFieldIndexerCalls() []struct { return calls } +// GetHTTPClient calls GetHTTPClientFunc. +func (mock *MockManager) GetHTTPClient() *http.Client { + if mock.GetHTTPClientFunc == nil { + panic("MockManager.GetHTTPClientFunc: method is nil but IManager.GetHTTPClient was just called") + } + callInfo := struct { + }{} + mock.lockGetHTTPClient.Lock() + mock.calls.GetHTTPClient = append(mock.calls.GetHTTPClient, callInfo) + mock.lockGetHTTPClient.Unlock() + return mock.GetHTTPClientFunc() +} + +// GetHTTPClientCalls gets all the calls that were made to GetHTTPClient. +// Check the length with: +// +// len(mockedIManager.GetHTTPClientCalls()) +func (mock *MockManager) GetHTTPClientCalls() []struct { +} { + var calls []struct { + } + mock.lockGetHTTPClient.RLock() + calls = mock.calls.GetHTTPClient + mock.lockGetHTTPClient.RUnlock() + return calls +} + // GetLogger calls GetLoggerFunc. func (mock *MockManager) GetLogger() logr.Logger { if mock.GetLoggerFunc == nil { @@ -681,7 +706,7 @@ func (mock *MockManager) GetSchemeCalls() []struct { } // GetWebhookServer calls GetWebhookServerFunc. -func (mock *MockManager) GetWebhookServer() *webhook.Server { +func (mock *MockManager) GetWebhookServer() webhook.Server { if mock.GetWebhookServerFunc == nil { panic("MockManager.GetWebhookServerFunc: method is nil but IManager.GetWebhookServer was just called") } @@ -707,38 +732,6 @@ func (mock *MockManager) GetWebhookServerCalls() []struct { return calls } -// SetFields calls SetFieldsFunc. -func (mock *MockManager) SetFields(ifaceVal interface{}) error { - if mock.SetFieldsFunc == nil { - panic("MockManager.SetFieldsFunc: method is nil but IManager.SetFields was just called") - } - callInfo := struct { - IfaceVal interface{} - }{ - IfaceVal: ifaceVal, - } - mock.lockSetFields.Lock() - mock.calls.SetFields = append(mock.calls.SetFields, callInfo) - mock.lockSetFields.Unlock() - return mock.SetFieldsFunc(ifaceVal) -} - -// SetFieldsCalls gets all the calls that were made to SetFields. -// Check the length with: -// -// len(mockedIManager.SetFieldsCalls()) -func (mock *MockManager) SetFieldsCalls() []struct { - IfaceVal interface{} -} { - var calls []struct { - IfaceVal interface{} - } - mock.lockSetFields.RLock() - calls = mock.calls.SetFields - mock.lockSetFields.RUnlock() - return calls -} - // Start calls StartFunc. func (mock *MockManager) Start(ctx context.Context) error { if mock.StartFunc == nil { diff --git a/klt-cert-manager/pkg/webhook/builder_test.go b/klt-cert-manager/pkg/webhook/builder_test.go index ed1223d859..a9952b3c14 100644 --- a/klt-cert-manager/pkg/webhook/builder_test.go +++ b/klt-cert-manager/pkg/webhook/builder_test.go @@ -45,8 +45,8 @@ func TestBuilder_Run(t *testing.T) { mockManager.GetAPIReaderFunc = func() client.Reader { return newFakeClient() } - webhookServer := &webhook.Server{} - mockManager.GetWebhookServerFunc = func() *webhook.Server { + webhookServer := webhook.NewServer(webhook.Options{}) + mockManager.GetWebhookServerFunc = func() webhook.Server { return webhookServer } diff --git a/klt-cert-manager/pkg/webhook/manager.go b/klt-cert-manager/pkg/webhook/manager.go index 704584333a..612dfac5b4 100644 --- a/klt-cert-manager/pkg/webhook/manager.go +++ b/klt-cert-manager/pkg/webhook/manager.go @@ -4,6 +4,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/webhook" ) const ( @@ -43,9 +44,10 @@ func (provider WebhookProvider) createOptions(scheme *runtime.Scheme, namespace } func (provider WebhookProvider) SetupWebhookServer(mgr manager.Manager) { + webhookServer := mgr.GetWebhookServer() - webhookServer.CertDir = provider.certificateDirectory - webhookServer.KeyName = provider.keyFileName - webhookServer.CertName = provider.certificateFileName + webhookServer.(*webhook.DefaultServer).Options.CertDir = provider.certificateDirectory + webhookServer.(*webhook.DefaultServer).Options.KeyName = provider.keyFileName + webhookServer.(*webhook.DefaultServer).Options.CertName = provider.certificateFileName } diff --git a/klt-cert-manager/pkg/webhook/manager_test.go b/klt-cert-manager/pkg/webhook/manager_test.go index 97c39ee172..83bc913958 100644 --- a/klt-cert-manager/pkg/webhook/manager_test.go +++ b/klt-cert-manager/pkg/webhook/manager_test.go @@ -31,23 +31,23 @@ func TestCreateOptions(t *testing.T) { }) t.Run("configures webhooks server", func(t *testing.T) { provider := NewWebhookManagerProvider("certs-dir", "key-file", "cert-file") - expectedWebhookServer := &webhook.Server{} + expectedWebhookServer := webhook.NewServer(webhook.Options{}) mgr := &fake.MockManager{ - GetWebhookServerFunc: func() *webhook.Server { + GetWebhookServerFunc: func() webhook.Server { return expectedWebhookServer }, } provider.SetupWebhookServer(mgr) - assert.Equal(t, "certs-dir", expectedWebhookServer.CertDir) - assert.Equal(t, "key-file", expectedWebhookServer.KeyName) - assert.Equal(t, "cert-file", expectedWebhookServer.CertName) + assert.Equal(t, "certs-dir", expectedWebhookServer.(*webhook.DefaultServer).Options.CertDir) + assert.Equal(t, "key-file", expectedWebhookServer.(*webhook.DefaultServer).Options.KeyName) + assert.Equal(t, "cert-file", expectedWebhookServer.(*webhook.DefaultServer).Options.CertName) mgrWebhookServer := mgr.GetWebhookServer() - assert.Equal(t, "certs-dir", mgrWebhookServer.CertDir) - assert.Equal(t, "key-file", mgrWebhookServer.KeyName) - assert.Equal(t, "cert-file", mgrWebhookServer.CertName) + assert.Equal(t, "certs-dir", mgrWebhookServer.(*webhook.DefaultServer).Options.CertDir) + assert.Equal(t, "key-file", mgrWebhookServer.(*webhook.DefaultServer).Options.KeyName) + assert.Equal(t, "cert-file", mgrWebhookServer.(*webhook.DefaultServer).Options.CertName) }) } diff --git a/metrics-operator/go.mod b/metrics-operator/go.mod index 5ddbfba8ef..4b5f2b40fd 100644 --- a/metrics-operator/go.mod +++ b/metrics-operator/go.mod @@ -14,15 +14,15 @@ require ( github.com/prometheus/client_golang v1.15.1 github.com/prometheus/common v0.42.0 github.com/stretchr/testify v1.8.2 - k8s.io/api v0.26.4 - k8s.io/apiextensions-apiserver v0.26.4 - k8s.io/apimachinery v0.26.4 - k8s.io/apiserver v0.26.4 - k8s.io/client-go v0.26.4 - k8s.io/component-base v0.26.4 + k8s.io/api v0.27.1 + k8s.io/apiextensions-apiserver v0.27.1 + k8s.io/apimachinery v0.27.1 + k8s.io/apiserver v0.27.1 + k8s.io/client-go v0.27.1 + k8s.io/component-base v0.27.1 k8s.io/klog/v2 v2.100.1 k8s.io/metrics v0.26.4 - sigs.k8s.io/controller-runtime v0.14.6 + sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd sigs.k8s.io/custom-metrics-apiserver v1.25.1-0.20230116101851-63817c8ac8f2 ) @@ -31,12 +31,13 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect + github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.3.2 // indirect + github.com/coreos/go-systemd/v22 v22.4.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect @@ -44,9 +45,9 @@ require ( github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-logr/zapr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -64,24 +65,22 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/mapstructure v1.4.1 // 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/onsi/ginkgo/v2 v2.8.1 // indirect - github.com/onsi/gomega v1.27.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cobra v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.5 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect - go.etcd.io/etcd/client/v3 v3.5.5 // indirect + go.etcd.io/etcd/api/v3 v3.5.7 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.7 // indirect + go.etcd.io/etcd/client/v3 v3.5.7 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 // indirect go.opentelemetry.io/otel v1.11.2 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.2 // indirect @@ -94,11 +93,11 @@ require ( go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect @@ -110,13 +109,16 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/kms v0.26.4 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect - k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.36 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + k8s.io/kms v0.27.1 // indirect + k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect + k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -replace golang.org/x/net => golang.org/x/net v0.9.0 +replace ( + github.com/keptn/lifecycle-toolkit/klt-cert-manager => ../klt-cert-manager + sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd +) diff --git a/metrics-operator/go.sum b/metrics-operator/go.sum index 9d49047e16..06ac938333 100644 --- a/metrics-operator/go.sum +++ b/metrics-operator/go.sum @@ -50,19 +50,14 @@ github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -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 v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.4 h1:wj3BFPrTw8yYgA1OlMqvUk95nc8OMv3cvBSF5erT2W4= github.com/benbjohnson/clock v1.3.4/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= @@ -89,15 +84,15 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU= +github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -105,7 +100,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m 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/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -117,40 +111,31 @@ github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2Vvl github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -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= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -221,6 +206,7 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf 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-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -251,96 +237,61 @@ github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9q github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79 h1:V44aeshIPrEu2L4ElKJ9Y0VPDp5j9BhT8eMzhjICyGU= -github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79/go.mod h1:sEy6RzY7TzpDQGfbmyteR7K+NrmZ2g5wPz0FzhUNE+U= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 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= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 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/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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/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 h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/onsi/ginkgo/v2 v2.8.1 h1:xFTEVwOFa1D/Ty24Ws1npBWkDYEV9BqZrsDxVrVkrrU= -github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= -github.com/onsi/gomega v1.27.0 h1:QLidEla4bXUuZVFa4KX6JHCsuGgbi85LC/pCHrt/O08= -github.com/onsi/gomega v1.27.0/go.mod h1:i189pavgK95OSIipFBa74gC2V4qrQuvjuyGEr3GmbXA= +github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/open-feature/go-sdk v1.3.0 h1:SiIS0ElVZTjbmHZB1/5Fm5mBRIqoYD+c2jVdw+D+Qok= github.com/open-feature/go-sdk v1.3.0/go.mod h1:hEOzRFh23MH+IZttR9+zyf5jBzotxxxcCjnk/wBH2H0= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -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/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= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= 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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= @@ -352,19 +303,18 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -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= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -374,18 +324,17 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0= -go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8= -go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.5 h1:DktRP60//JJpnPC0VBymAN/7V71GHMdjDCBt4ZPXDjI= -go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI= -go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= -go.etcd.io/etcd/pkg/v3 v3.5.5 h1:Ablg7T7OkR+AeeeU32kdVhw/AGDsitkKPl7aW73ssjU= -go.etcd.io/etcd/raft/v3 v3.5.5 h1:Ibz6XyZ60OYyRopu73lLM/P+qco3YtlZMOhnXNS051I= -go.etcd.io/etcd/server/v3 v3.5.5 h1:jNjYm/9s+f9A9r6+SC4RvNaz6AqixpOvhrFdT0PvIj0= +go.etcd.io/etcd/api/v3 v3.5.7 h1:sbcmosSVesNrWOJ58ZQFitHMdncusIifYcrBfwrlJSY= +go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA= +go.etcd.io/etcd/client/pkg/v3 v3.5.7 h1:y3kf5Gbp4e4q7egZdn5T7W9TSHUvkClN6u+Rq9mEOmg= +go.etcd.io/etcd/client/pkg/v3 v3.5.7/go.mod h1:o0Abi1MK86iad3YrWhgUsbGx1pmTS+hrORWc2CamuhY= +go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= +go.etcd.io/etcd/client/v3 v3.5.7 h1:u/OhpiuCgYY8awOHlhIhmGIGpxfBU/GZBUP3m/3/Iz4= +go.etcd.io/etcd/client/v3 v3.5.7/go.mod h1:sOWmj9DZUMyAngS7QQwCyAXXAL6WhgTOPLNS/NabQgw= +go.etcd.io/etcd/pkg/v3 v3.5.7 h1:obOzeVwerFwZ9trMWapU/VjDcYUJb5OfgC1zqEGWO/0= +go.etcd.io/etcd/raft/v3 v3.5.7 h1:aN79qxLmV3SvIq84aNTliYGmjwsW6NqJSnqmI1HLJKc= +go.etcd.io/etcd/server/v3 v3.5.7 h1:BTBD8IJUV7YFgsczZMHhMTS67XuA4KpRquL0MFOJGRk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -394,8 +343,8 @@ 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.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 h1:Ajldaqhxqw/gNzQA45IKFWLdG7jZuXX/wBW1d5qvbUI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 h1:sxoY9kG1s1WpSYNyzm24rlwH4lnRYFXUVVBmKMBfRgw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0= go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2 h1:htgM8vZIF8oPSCxa341e3IZ4yr/sKxgu8KZYllByiVY= @@ -416,21 +365,19 @@ go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/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= @@ -457,7 +404,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/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= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -469,10 +415,42 @@ 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.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -496,16 +474,12 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -514,7 +488,6 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -527,29 +500,25 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-20200905004654-be1d3432aa8f/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-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-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -581,7 +550,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -616,9 +584,8 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= 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= @@ -689,7 +656,6 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd h1:OjndDrsik+Gt+e6fs45z9AxiewiKyLKYpA45W5Kpkks= @@ -712,9 +678,7 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv 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.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= @@ -733,23 +697,19 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -765,41 +725,40 @@ 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.26.4 h1:qSG2PmtcD23BkYiWfoYAcak870eF/hE7NNYBYavTT94= -k8s.io/api v0.26.4/go.mod h1:WwKEXU3R1rgCZ77AYa7DFksd9/BAIKyOmRlbVxgvjCk= -k8s.io/apiextensions-apiserver v0.26.4 h1:9D2RTxYGxrG5uYg6D7QZRcykXvavBvcA59j5kTaedQI= -k8s.io/apiextensions-apiserver v0.26.4/go.mod h1:cd4uGFGIgzEqUghWpRsr9KE8j2KNTjY8Ji8pnMMazyw= -k8s.io/apimachinery v0.26.4 h1:rZccKdBLg9vP6J09JD+z8Yr99Ce8gk3Lbi9TCx05Jzs= -k8s.io/apimachinery v0.26.4/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/apiserver v0.26.4 h1:3Oq4mnJv0mzVX7BR/Nod+8KjlELf/3Ljvu9ZWDyLUoA= -k8s.io/apiserver v0.26.4/go.mod h1:yAY3O1vBM4/0OIGAGeWcdfzQvgdwJ188VirLcuSAVnw= -k8s.io/client-go v0.26.4 h1:/7P/IbGBuT73A+G97trf44NTPSNqvuBREpOfdLbHvD4= -k8s.io/client-go v0.26.4/go.mod h1:6qOItWm3EwxJdl/8p5t7FWtWUOwyMdA8N9ekbW4idpI= -k8s.io/component-base v0.26.4 h1:Bg2xzyXNKL3eAuiTEu3XE198d6z22ENgFgGQv2GGOUk= -k8s.io/component-base v0.26.4/go.mod h1:lTuWL1Xz/a4e80gmIC3YZG2JCO4xNwtKWHJWeJmsq20= +k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0= +k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E= +k8s.io/apiextensions-apiserver v0.27.1 h1:Hp7B3KxKHBZ/FxmVFVpaDiXI6CCSr49P1OJjxKO6o4g= +k8s.io/apiextensions-apiserver v0.27.1/go.mod h1:8jEvRDtKjVtWmdkhOqE84EcNWJt/uwF8PC4627UZghY= +k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc= +k8s.io/apimachinery v0.27.1/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM= +k8s.io/apiserver v0.27.1 h1:phY+BtXjjzd+ta3a4kYbomC81azQSLa1K8jo9RBw7Lg= +k8s.io/apiserver v0.27.1/go.mod h1:UGrOjLY2KsieA9Fw6lLiTObxTb8Z1xEba4uqSuMY0WU= +k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8= +k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA= +k8s.io/component-base v0.27.1 h1:kEB8p8lzi4gCs5f2SPU242vOumHJ6EOsOnDM3tTuDTM= +k8s.io/component-base v0.27.1/go.mod h1:UGEd8+gxE4YWoigz5/lb3af3Q24w98pDseXcXZjw+E0= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kms v0.26.4 h1:mQ+DeOvgAHC6+heZcozPkEd3rWtP4DVVjo1hLSih9w4= -k8s.io/kms v0.26.4/go.mod h1:69qGnf1NsFOQP07fBYqNLZklqEHSJF024JqYCaeVxHg= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kms v0.27.1 h1:JTSQbJb+mcobScQwF0bOmZhIwP17k8GvBsiLlA6SQqw= +k8s.io/kms v0.27.1/go.mod h1:VuTsw0uHlSycKLCkypCGxfFCjLfzf/5YMeATECd/zJA= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= k8s.io/metrics v0.26.4 h1:ijyerycmjVp9EVPfDqha8eb+s9jw5c+A9MkTvuRBdms= k8s.io/metrics v0.26.4/go.mod h1:0InNj7+/aS5POa0dDHuSleIDr5MHXaQQSpMc0mm17wE= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= +k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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.36 h1:PUuX1qIFv309AT8hF/CdPKDmsG/hn/L8zRX7VvISM3A= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.36/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo= -sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= -sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1 h1:MB1zkK+WMOmfLxEpjr1wEmkpcIhZC7kfTkZ0stg5bog= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1/go.mod h1:/4NLd21PQY0B+H+X0aDZdwUiVXYJQl/2NXA5KVtDiP4= +sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd h1:OKwtUfmxPPGIyxDYMZ5n+EF5fjjbbXiVMyPZjyS8A+w= +sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd/go.mod h1:EdI5r/x+MzEtPhduK7s3ZAN9z/Ro6gidKsktEj/kIXo= sigs.k8s.io/custom-metrics-apiserver v1.25.1-0.20230116101851-63817c8ac8f2 h1:D49r2VoxIdm3s1yVoCMbHrLH0qxDj5TiaWB0XYdqgcI= sigs.k8s.io/custom-metrics-apiserver v1.25.1-0.20230116101851-63817c8ac8f2/go.mod h1:D1ZXB9iOdI97WAE3G1kjlwUhwEnGfpq4af3drpEYVlI= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -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= diff --git a/metrics-operator/main.go b/metrics-operator/main.go index bc99c602b7..cf424753ec 100644 --- a/metrics-operator/main.go +++ b/metrics-operator/main.go @@ -45,6 +45,7 @@ import ( ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + ctrlWebhook "sigs.k8s.io/controller-runtime/pkg/webhook" ) var ( @@ -157,12 +158,12 @@ func main() { SetPodName(env.PodName). SetManagerProvider( webhook.NewWebhookManagerProvider( - mgr.GetWebhookServer().CertDir, "tls.key", "tls.crt"), + mgr.GetWebhookServer().(*ctrlWebhook.DefaultServer).Options.CertDir, "tls.key", "tls.crt"), ). SetCertificateWatcher( certificates.NewCertificateWatcher( mgr.GetAPIReader(), - mgr.GetWebhookServer().CertDir, + mgr.GetWebhookServer().(*ctrlWebhook.DefaultServer).Options.CertDir, env.PodNamespace, certCommon.SecretName, setupLog, diff --git a/operator/apis/lifecycle/v1alpha3/common/common.go b/operator/apis/lifecycle/v1alpha3/common/common.go index 51e33a2318..15b357eeb4 100644 --- a/operator/apis/lifecycle/v1alpha3/common/common.go +++ b/operator/apis/lifecycle/v1alpha3/common/common.go @@ -22,6 +22,7 @@ const K8sRecommendedAppAnnotations = "app.kubernetes.io/part-of" const K8sRecommendedManagedByAnnotations = "app.kubernetes.io/managed-by" const PreDeploymentEvaluationAnnotation = "keptn.sh/pre-deployment-evaluations" const PostDeploymentEvaluationAnnotation = "keptn.sh/post-deployment-evaluations" +const SchedullingGateRemoved = "keptn.sh/schedulling-gate-removed" const TaskNameAnnotation = "keptn.sh/task-name" const NamespaceEnabledAnnotation = "keptn.sh/lifecycle-toolkit" const CreateAppTaskSpanName = "create_%s_app_task" diff --git a/operator/config/rbac/role.yaml b/operator/config/rbac/role.yaml index 265bef1dc8..bac0a3df79 100644 --- a/operator/config/rbac/role.yaml +++ b/operator/config/rbac/role.yaml @@ -85,6 +85,7 @@ rules: verbs: - get - list + - update - watch - apiGroups: - "" diff --git a/operator/controllers/common/helperfunctions.go b/operator/controllers/common/helperfunctions.go index bdc6792d89..c307ca9bc1 100644 --- a/operator/controllers/common/helperfunctions.go +++ b/operator/controllers/common/helperfunctions.go @@ -7,7 +7,9 @@ import ( "github.com/go-logr/logr" klcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" + controllererrors "github.com/keptn/lifecycle-toolkit/operator/controllers/errors" "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/interfaces" + v1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" @@ -118,3 +120,64 @@ func getObject(k8sclient client.Client, log logr.Logger, ctx context.Context, de } return nil } + +func RemoveGates(ctx context.Context, c client.Client, log logr.Logger, workloadInstance *klcv1alpha3.KeptnWorkloadInstance) error { + switch workloadInstance.Spec.ResourceReference.Kind { + case "Pod": + return removePodGates(ctx, c, log, workloadInstance.Spec.ResourceReference.Name, workloadInstance.Namespace) + case "ReplicaSet", "StatefulSet", "DaemonSet": + podList, err := getPodsOfOwner(ctx, c, log, workloadInstance.Spec.ResourceReference.UID, workloadInstance.Spec.ResourceReference.Kind, workloadInstance.Namespace) + if err != nil { + log.Error(err, "cannot get pods") + return err + } + for _, pod := range podList { + err := removePodGates(ctx, c, log, pod, workloadInstance.Namespace) + if err != nil { + log.Error(err, "cannot remove gates from pod") + return err + } + } + default: + return controllererrors.ErrUnsupportedWorkloadInstanceResourceReference + } + + return nil +} + +func removePodGates(ctx context.Context, c client.Client, log logr.Logger, podName string, podNamespace string) error { + pod := &v1.Pod{} + err := c.Get(ctx, types.NamespacedName{Namespace: podNamespace, Name: podName}, pod) + if err != nil { + log.Error(err, "cannot remove gates from pod - inner") + return err + } + if len(pod.Annotations) == 0 { + pod.Annotations = make(map[string]string) + } + pod.Annotations[apicommon.SchedullingGateRemoved] = "true" + pod.Spec.SchedulingGates = nil + return c.Update(ctx, pod) +} + +func getPodsOfOwner(ctx context.Context, c client.Client, log logr.Logger, ownerUID types.UID, ownerKind string, namespace string) ([]string, error) { + pods := &v1.PodList{} + err := c.List(ctx, pods, client.InNamespace(namespace)) + if err != nil { + log.Error(err, "cannot list pods - inner") + return nil, err + } + + var resultPods []string + + for _, pod := range pods.Items { + for _, owner := range pod.OwnerReferences { + if owner.Kind == ownerKind && owner.UID == ownerUID { + resultPods = append(resultPods, pod.Name) + break + } + } + } + + return resultPods, nil +} diff --git a/operator/controllers/lifecycle/keptnworkloadinstance/controller.go b/operator/controllers/lifecycle/keptnworkloadinstance/controller.go index 72dfc0513d..473f87aa08 100644 --- a/operator/controllers/lifecycle/keptnworkloadinstance/controller.go +++ b/operator/controllers/lifecycle/keptnworkloadinstance/controller.go @@ -61,7 +61,7 @@ type KeptnWorkloadInstanceReconciler struct { // +kubebuilder:rbac:groups=lifecycle.keptn.sh,resources=keptntasks/status,verbs=get;update;patch // +kubebuilder:rbac:groups=lifecycle.keptn.sh,resources=keptntasks/finalizers,verbs=update // +kubebuilder:rbac:groups=core,resources=events,verbs=create;watch;patch -// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch +// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;update // +kubebuilder:rbac:groups=apps,resources=replicasets;deployments;statefulsets;daemonsets,verbs=get;list;watch // +kubebuilder:rbac:groups=argoproj.io,resources=rollouts,verbs=get;list;watch @@ -139,6 +139,12 @@ func (r *KeptnWorkloadInstanceReconciler) Reconcile(ctx context.Context, req ctr } } + // pre-evaluation checks done at this moment, we can remove the gate + if err := controllercommon.RemoveGates(ctx, r.Client, r.Log, workloadInstance); err != nil { + r.Log.Error(err, "could not remove SchedullingGates") + return ctrl.Result{Requeue: true, RequeueAfter: 10 * time.Second}, nil + } + // Wait for deployment of Workload phase = apicommon.PhaseWorkloadDeployment if !workloadInstance.IsDeploymentSucceeded() { diff --git a/operator/controllers/options/keptnconfig_controller_test.go b/operator/controllers/options/keptnconfig_controller_test.go index a61fb28594..f1de715902 100644 --- a/operator/controllers/options/keptnconfig_controller_test.go +++ b/operator/controllers/options/keptnconfig_controller_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/go-logr/logr" + "github.com/go-logr/logr/testr" optionsv1alpha1 "github.com/keptn/lifecycle-toolkit/operator/apis/options/v1alpha1" "github.com/keptn/lifecycle-toolkit/operator/controllers/common/fake" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -14,17 +15,10 @@ import ( "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestKeptnConfigReconciler_Reconcile(t *testing.T) { - reconciler := setupReconciler() - - // set up logger - opts := zap.Options{ - Development: true, - } - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + reconciler := setupReconciler(t) type args struct { ctx context.Context @@ -147,11 +141,6 @@ func TestKeptnConfigReconciler_initConfig(t *testing.T) { } func TestKeptnConfigReconciler_reconcileOtelCollectorUrl(t *testing.T) { - // set up logger - opts := zap.Options{ - Development: true, - } - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) type fields struct { Client client.Client @@ -174,7 +163,7 @@ func TestKeptnConfigReconciler_reconcileOtelCollectorUrl(t *testing.T) { fields: fields{ Client: nil, Scheme: nil, - Log: ctrl.Log.WithName("test-keptn-config-controller"), + Log: testr.New(t), LastAppliedSpec: &optionsv1alpha1.KeptnConfigSpec{ OTelCollectorUrl: "", }, @@ -197,7 +186,7 @@ func TestKeptnConfigReconciler_reconcileOtelCollectorUrl(t *testing.T) { fields: fields{ Client: nil, Scheme: nil, - Log: ctrl.Log.WithName("test-keptn-config-controller"), + Log: testr.New(t), }, args: args{ config: &optionsv1alpha1.KeptnConfig{ @@ -233,7 +222,7 @@ func TestKeptnConfigReconciler_reconcileOtelCollectorUrl(t *testing.T) { } } -func setupReconciler() *KeptnConfigReconciler { +func setupReconciler(t *testing.T) *KeptnConfigReconciler { emptyConfig := &optionsv1alpha1.KeptnConfig{ ObjectMeta: metav1.ObjectMeta{ Name: "empty-config", @@ -262,18 +251,12 @@ func setupReconciler() *KeptnConfigReconciler { }, } - //setup logger - opts := zap.Options{ - Development: true, - } - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - fakeClient := fake.NewClient(emptyConfig, config1, config2) r := &KeptnConfigReconciler{ Client: fakeClient, Scheme: fakeClient.Scheme(), - Log: ctrl.Log.WithName("test-keptnconfig-controller"), + Log: testr.New(t), } return r } diff --git a/operator/go.mod b/operator/go.mod index 6f3f8fc81c..db9ec63181 100644 --- a/operator/go.mod +++ b/operator/go.mod @@ -9,9 +9,9 @@ require ( github.com/imdario/mergo v0.3.15 github.com/kelseyhightower/envconfig v1.4.0 github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79 - github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517134932-24a60f5e6f8f + github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230413082525-dd15d4a0e0e4 github.com/magiconair/properties v1.8.7 - github.com/onsi/ginkgo/v2 v2.9.4 + github.com/onsi/ginkgo/v2 v2.9.5 github.com/onsi/gomega v1.27.6 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.15.1 @@ -25,24 +25,12 @@ require ( go.opentelemetry.io/otel/sdk/metric v0.38.1 go.opentelemetry.io/otel/trace v1.15.1 google.golang.org/grpc v1.54.1 - k8s.io/api v0.26.4 - k8s.io/apiextensions-apiserver v0.26.4 - k8s.io/apimachinery v0.26.4 - k8s.io/apiserver v0.26.4 - k8s.io/client-go v0.26.4 - sigs.k8s.io/controller-runtime v0.14.6 -) - -require ( - github.com/prometheus/common v0.42.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/oauth2 v0.5.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect + k8s.io/api v0.27.1 + k8s.io/apiextensions-apiserver v0.27.1 + k8s.io/apimachinery v0.27.1 + k8s.io/apiserver v0.27.1 + k8s.io/client-go v0.27.1 + sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd ) require ( @@ -55,9 +43,9 @@ require ( github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-logr/zapr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -66,7 +54,7 @@ require ( github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -77,7 +65,8 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -86,20 +75,28 @@ require ( go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.5.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.8.0 // indirect + golang.org/x/tools v0.9.1 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/component-base v0.26.4 // indirect - k8s.io/klog/v2 v2.100.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/component-base v0.27.1 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -replace golang.org/x/net => golang.org/x/net v0.9.0 +replace github.com/keptn/lifecycle-toolkit/klt-cert-manager => ../klt-cert-manager diff --git a/operator/go.sum b/operator/go.sum index ae45c3cd86..dc5643c6bf 100644 --- a/operator/go.sum +++ b/operator/go.sum @@ -67,6 +67,7 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/creack/pty v1.1.9/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= @@ -99,14 +100,12 @@ github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -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= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -179,8 +178,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf 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-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -206,23 +205,21 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79 h1:V44aeshIPrEu2L4ElKJ9Y0VPDp5j9BhT8eMzhjICyGU= -github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79/go.mod h1:sEy6RzY7TzpDQGfbmyteR7K+NrmZ2g5wPz0FzhUNE+U= -github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517134932-24a60f5e6f8f h1:FDUUg4O36+nQFpr6L4M4Xz6ZcxG/YUr1/crE90DfjaE= -github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517134932-24a60f5e6f8f/go.mod h1:aWxBCTaDbsZWnA3gzV4X4e3CgX4lps5fmIyi5pwPKxc= +github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230413082525-dd15d4a0e0e4 h1:LI+iOb7v1zIAtHQum79CbV+4HB1PCAim+TuCCRRsW7o= +github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230413082525-dd15d4a0e0e4/go.mod h1:8rQ1flqblBWy43k4xJnoaMUA7e50zP95QIab3z6NCw4= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 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/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -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.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= @@ -234,8 +231,8 @@ 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/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/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= +github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= +github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -247,8 +244,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/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= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= @@ -272,6 +269,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -281,7 +279,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -314,19 +312,19 @@ go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -361,10 +359,44 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -387,8 +419,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -415,22 +446,23 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/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-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -462,7 +494,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -497,10 +528,9 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= 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= @@ -616,6 +646,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -636,31 +667,31 @@ 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.26.4 h1:qSG2PmtcD23BkYiWfoYAcak870eF/hE7NNYBYavTT94= -k8s.io/api v0.26.4/go.mod h1:WwKEXU3R1rgCZ77AYa7DFksd9/BAIKyOmRlbVxgvjCk= -k8s.io/apiextensions-apiserver v0.26.4 h1:9D2RTxYGxrG5uYg6D7QZRcykXvavBvcA59j5kTaedQI= -k8s.io/apiextensions-apiserver v0.26.4/go.mod h1:cd4uGFGIgzEqUghWpRsr9KE8j2KNTjY8Ji8pnMMazyw= -k8s.io/apimachinery v0.26.4 h1:rZccKdBLg9vP6J09JD+z8Yr99Ce8gk3Lbi9TCx05Jzs= -k8s.io/apimachinery v0.26.4/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/apiserver v0.26.4 h1:3Oq4mnJv0mzVX7BR/Nod+8KjlELf/3Ljvu9ZWDyLUoA= -k8s.io/apiserver v0.26.4/go.mod h1:yAY3O1vBM4/0OIGAGeWcdfzQvgdwJ188VirLcuSAVnw= -k8s.io/client-go v0.26.4 h1:/7P/IbGBuT73A+G97trf44NTPSNqvuBREpOfdLbHvD4= -k8s.io/client-go v0.26.4/go.mod h1:6qOItWm3EwxJdl/8p5t7FWtWUOwyMdA8N9ekbW4idpI= -k8s.io/component-base v0.26.4 h1:Bg2xzyXNKL3eAuiTEu3XE198d6z22ENgFgGQv2GGOUk= -k8s.io/component-base v0.26.4/go.mod h1:lTuWL1Xz/a4e80gmIC3YZG2JCO4xNwtKWHJWeJmsq20= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/api v0.27.1 h1:Z6zUGQ1Vd10tJ+gHcNNNgkV5emCyW+v2XTmn+CLjSd0= +k8s.io/api v0.27.1/go.mod h1:z5g/BpAiD+f6AArpqNjkY+cji8ueZDU/WV1jcj5Jk4E= +k8s.io/apiextensions-apiserver v0.27.1 h1:Hp7B3KxKHBZ/FxmVFVpaDiXI6CCSr49P1OJjxKO6o4g= +k8s.io/apiextensions-apiserver v0.27.1/go.mod h1:8jEvRDtKjVtWmdkhOqE84EcNWJt/uwF8PC4627UZghY= +k8s.io/apimachinery v0.27.1 h1:EGuZiLI95UQQcClhanryclaQE6xjg1Bts6/L3cD7zyc= +k8s.io/apimachinery v0.27.1/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM= +k8s.io/apiserver v0.27.1 h1:phY+BtXjjzd+ta3a4kYbomC81azQSLa1K8jo9RBw7Lg= +k8s.io/apiserver v0.27.1/go.mod h1:UGrOjLY2KsieA9Fw6lLiTObxTb8Z1xEba4uqSuMY0WU= +k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8= +k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA= +k8s.io/component-base v0.27.1 h1:kEB8p8lzi4gCs5f2SPU242vOumHJ6EOsOnDM3tTuDTM= +k8s.io/component-base v0.27.1/go.mod h1:UGEd8+gxE4YWoigz5/lb3af3Q24w98pDseXcXZjw+E0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= +k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 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/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= -sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd h1:OKwtUfmxPPGIyxDYMZ5n+EF5fjjbbXiVMyPZjyS8A+w= +sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd/go.mod h1:EdI5r/x+MzEtPhduK7s3ZAN9z/Ro6gidKsktEj/kIXo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/operator/main.go b/operator/main.go index 3c1b5f2378..f231943ea1 100644 --- a/operator/main.go +++ b/operator/main.go @@ -324,12 +324,12 @@ func main() { SetPodName(env.PodName). SetManagerProvider( webhook.NewWebhookManagerProvider( - mgr.GetWebhookServer().CertDir, "tls.key", "tls.crt"), + mgr.GetWebhookServer().(*ctrlWebhook.DefaultServer).Options.CertDir, "tls.key", "tls.crt"), ). SetCertificateWatcher( certificates.NewCertificateWatcher( mgr.GetAPIReader(), - mgr.GetWebhookServer().CertDir, + mgr.GetWebhookServer().(*ctrlWebhook.DefaultServer).Options.CertDir, env.PodNamespace, certCommon.SecretName, setupLog, diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index 0d7d4a65ef..3a3a7801c7 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -99,10 +99,14 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) return admission.Errored(http.StatusBadRequest, err) } } - - if podIsAnnotated { + _, gatedRemoved := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.SchedullingGateRemoved, "") + if podIsAnnotated && !gatedRemoved { logger.Info("Resource is annotated with Keptn annotations, using Keptn scheduler") - pod.Spec.SchedulerName = "keptn-scheduler" + pod.Spec.SchedulingGates = []corev1.PodSchedulingGate{ + { + Name: "klt-gated", + }, + } logger.Info("Annotations", "annotations", pod.Annotations) isAppAnnotationPresent, err := a.isAppAnnotationPresent(pod) diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go b/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go index af4da8548e..8ad94adcff 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go @@ -1036,8 +1036,7 @@ func TestPodMutatingWebhook_Handle_DisabledNamespace(t *testing.T) { recorder := record.NewFakeRecorder(100) - decoder, err := admission.NewDecoder(runtime.NewScheme()) - require.Nil(t, err) + decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, @@ -1101,8 +1100,7 @@ func TestPodMutatingWebhook_Handle_SingleService(t *testing.T) { recorder := record.NewFakeRecorder(100) - decoder, err := admission.NewDecoder(runtime.NewScheme()) - require.Nil(t, err) + decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, @@ -1224,8 +1222,7 @@ func TestPodMutatingWebhook_Handle_SingleService_AppCreationRequestAlreadyPresen recorder := record.NewFakeRecorder(100) - decoder, err := admission.NewDecoder(runtime.NewScheme()) - require.Nil(t, err) + decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, @@ -1334,8 +1331,7 @@ func TestPodMutatingWebhook_Handle_MultiService(t *testing.T) { recorder := record.NewFakeRecorder(100) - decoder, err := admission.NewDecoder(runtime.NewScheme()) - require.Nil(t, err) + decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, From 8d375c2c38aa650dcf4317101ad399a42251ae86 Mon Sep 17 00:00:00 2001 From: realanna Date: Fri, 19 May 2023 08:41:13 +0200 Subject: [PATCH 03/13] fix operator import Signed-off-by: realanna --- operator/go.mod | 4 ++-- operator/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/operator/go.mod b/operator/go.mod index db9ec63181..b11096af55 100644 --- a/operator/go.mod +++ b/operator/go.mod @@ -9,7 +9,7 @@ require ( github.com/imdario/mergo v0.3.15 github.com/kelseyhightower/envconfig v1.4.0 github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79 - github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230413082525-dd15d4a0e0e4 + github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517141059-f0f7edf7041d github.com/magiconair/properties v1.8.7 github.com/onsi/ginkgo/v2 v2.9.5 github.com/onsi/gomega v1.27.6 @@ -91,7 +91,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/component-base v0.27.1 // indirect - k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a // indirect k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/operator/go.sum b/operator/go.sum index dc5643c6bf..829662cbc7 100644 --- a/operator/go.sum +++ b/operator/go.sum @@ -205,8 +205,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230413082525-dd15d4a0e0e4 h1:LI+iOb7v1zIAtHQum79CbV+4HB1PCAim+TuCCRRsW7o= -github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230413082525-dd15d4a0e0e4/go.mod h1:8rQ1flqblBWy43k4xJnoaMUA7e50zP95QIab3z6NCw4= +github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517141059-f0f7edf7041d h1:rZaucgGHp3sMP8fq6Y7SR1ctDaEL59rXvazfPVvG1Lw= +github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517141059-f0f7edf7041d/go.mod h1:aWxBCTaDbsZWnA3gzV4X4e3CgX4lps5fmIyi5pwPKxc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -679,8 +679,8 @@ k8s.io/client-go v0.27.1 h1:oXsfhW/qncM1wDmWBIuDzRHNS2tLhK3BZv512Nc59W8= k8s.io/client-go v0.27.1/go.mod h1:f8LHMUkVb3b9N8bWturc+EDtVVVwZ7ueTVquFAJb2vA= k8s.io/component-base v0.27.1 h1:kEB8p8lzi4gCs5f2SPU242vOumHJ6EOsOnDM3tTuDTM= k8s.io/component-base v0.27.1/go.mod h1:UGEd8+gxE4YWoigz5/lb3af3Q24w98pDseXcXZjw+E0= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg= k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= From d5b316ac6f9a2fd4d689d2c9423887d0206f601c Mon Sep 17 00:00:00 2001 From: realanna Date: Fri, 19 May 2023 10:30:19 +0200 Subject: [PATCH 04/13] refactor to separate webhook Signed-off-by: realanna --- operator/main.go | 18 + operator/webhooks/common/common.go | 215 +++++ operator/webhooks/common/common_test.go | 704 +++++++++++++++++ operator/webhooks/config.go | 7 - operator/webhooks/gating/gating_webhook.go | 67 ++ .../pod_mutator/pod_mutating_webhook.go | 236 +----- .../pod_mutator/pod_mutating_webhook_test.go | 743 ------------------ 7 files changed, 1023 insertions(+), 967 deletions(-) create mode 100644 operator/webhooks/common/common.go create mode 100644 operator/webhooks/common/common_test.go delete mode 100644 operator/webhooks/config.go create mode 100644 operator/webhooks/gating/gating_webhook.go diff --git a/operator/main.go b/operator/main.go index f231943ea1..bd479f45bc 100644 --- a/operator/main.go +++ b/operator/main.go @@ -43,6 +43,7 @@ import ( "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkload" "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkloadinstance" controlleroptions "github.com/keptn/lifecycle-toolkit/operator/controllers/options" + "github.com/keptn/lifecycle-toolkit/operator/webhooks/gating" "github.com/keptn/lifecycle-toolkit/operator/webhooks/pod_mutator" "github.com/prometheus/client_golang/prometheus/promhttp" "go.opentelemetry.io/otel" @@ -337,6 +338,23 @@ func main() { ) setupLog.Info("starting webhook and manager") + + go func() { + if err := webhookBuilder.Run(mgr, map[string]*ctrlWebhook.Admission{ + "/gate-v1-pod": { + Handler: &gating.PodGatingWebhook{ + Client: mgr.GetClient(), + Tracer: otel.Tracer("keptn/gatewebhook"), + Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), + Log: ctrl.Log.WithName("Gates Mutating Webhook"), + }, + }, + }); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } + }() + if err := webhookBuilder.Run(mgr, map[string]*ctrlWebhook.Admission{ "/mutate-v1-pod": { Handler: &pod_mutator.PodMutatingWebhook{ diff --git a/operator/webhooks/common/common.go b/operator/webhooks/common/common.go new file mode 100644 index 0000000000..3f9762cf52 --- /dev/null +++ b/operator/webhooks/common/common.go @@ -0,0 +1,215 @@ +package common + +import ( + "context" + "fmt" + "hash/fnv" + "strings" + + argov1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" +) + +const ( + InvalidAnnotationMessage = "Invalid annotations" + + // SecretCertsName is the name of the secret where the webhook certificates are stored. + SecretCertsName = "klt-certs" +) + +var ErrTooLongAnnotations = fmt.Errorf("too long annotations, maximum length for app and workload is 25 characters, for version 12 characters") + +func IsPodOrParentAnnotated(ctx context.Context, req *admission.Request, pod *corev1.Pod, k8sclient client.Client) (bool, error) { + podIsAnnotated, err := isPodAnnotated(pod) + + if err != nil { + return false, err + } + + if !podIsAnnotated { + podIsAnnotated, err = copyAnnotationsIfParentAnnotated(ctx, req, pod, k8sclient) + } + return podIsAnnotated, err +} + +func isPodAnnotated(pod *corev1.Pod) (bool, error) { + workload, gotWorkloadAnnotation := GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) + version, gotVersionAnnotation := GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.VersionAnnotation, apicommon.K8sRecommendedVersionAnnotations) + + if len(workload) > apicommon.MaxWorkloadNameLength || len(version) > apicommon.MaxVersionLength { + return false, ErrTooLongAnnotations + } + + if gotWorkloadAnnotation { + if !gotVersionAnnotation { + if len(pod.Annotations) == 0 { + pod.Annotations = make(map[string]string) + } + pod.Annotations[apicommon.VersionAnnotation] = calculateVersion(pod) + } + return true, nil + } + return false, nil +} + +func GetLabelOrAnnotation(resource *metav1.ObjectMeta, primaryAnnotation string, secondaryAnnotation string) (string, bool) { + if resource.Annotations[primaryAnnotation] != "" { + return resource.Annotations[primaryAnnotation], true + } + + if resource.Labels[primaryAnnotation] != "" { + return resource.Labels[primaryAnnotation], true + } + + if secondaryAnnotation == "" { + return "", false + } + + if resource.Annotations[secondaryAnnotation] != "" { + return resource.Annotations[secondaryAnnotation], true + } + + if resource.Labels[secondaryAnnotation] != "" { + return resource.Labels[secondaryAnnotation], true + } + return "", false +} + +func copyAnnotationsIfParentAnnotated(ctx context.Context, req *admission.Request, pod *corev1.Pod, k8sclient client.Client) (bool, error) { + podOwner := GetOwnerReference(&pod.ObjectMeta) + if podOwner.UID == "" { + return false, nil + } + + switch podOwner.Kind { + case "ReplicaSet": + rs := &appsv1.ReplicaSet{} + if err := k8sclient.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: podOwner.Name}, rs); err != nil { + return false, nil + } + + rsOwner := GetOwnerReference(&rs.ObjectMeta) + if rsOwner.UID == "" { + return false, nil + } + + if rsOwner.Kind == "Rollout" { + ro := &argov1alpha1.Rollout{} + return fetchParentObjectAndCopyLabels(ctx, podOwner.Name, req.Namespace, pod, ro, k8sclient) + } + dp := &appsv1.Deployment{} + return fetchParentObjectAndCopyLabels(ctx, rsOwner.Name, req.Namespace, pod, dp, k8sclient) + + case "StatefulSet": + sts := &appsv1.StatefulSet{} + return fetchParentObjectAndCopyLabels(ctx, podOwner.Name, req.Namespace, pod, sts, k8sclient) + case "DaemonSet": + ds := &appsv1.DaemonSet{} + return fetchParentObjectAndCopyLabels(ctx, podOwner.Name, req.Namespace, pod, ds, k8sclient) + default: + return false, nil + } +} + +func fetchParentObjectAndCopyLabels(ctx context.Context, name string, namespace string, pod *corev1.Pod, objectContainer client.Object, k8sclient client.Client) (bool, error) { + if err := k8sclient.Get(ctx, types.NamespacedName{Namespace: namespace, Name: name}, objectContainer); err != nil { + return false, nil + } + objectContainerMetaData := metav1.ObjectMeta{ + Labels: objectContainer.GetLabels(), + Annotations: objectContainer.GetAnnotations(), + } + return copyResourceLabelsIfPresent(&objectContainerMetaData, pod) +} + +func copyResourceLabelsIfPresent(sourceResource *metav1.ObjectMeta, targetPod *corev1.Pod) (bool, error) { + var workloadName, appName, version, preDeploymentChecks, postDeploymentChecks, preEvaluationChecks, postEvaluationChecks string + var gotWorkloadName, gotVersion bool + + workloadName, gotWorkloadName = GetLabelOrAnnotation(sourceResource, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) + appName, _ = GetLabelOrAnnotation(sourceResource, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) + version, gotVersion = GetLabelOrAnnotation(sourceResource, apicommon.VersionAnnotation, apicommon.K8sRecommendedVersionAnnotations) + preDeploymentChecks, _ = GetLabelOrAnnotation(sourceResource, apicommon.PreDeploymentTaskAnnotation, "") + postDeploymentChecks, _ = GetLabelOrAnnotation(sourceResource, apicommon.PostDeploymentTaskAnnotation, "") + preEvaluationChecks, _ = GetLabelOrAnnotation(sourceResource, apicommon.PreDeploymentEvaluationAnnotation, "") + postEvaluationChecks, _ = GetLabelOrAnnotation(sourceResource, apicommon.PostDeploymentEvaluationAnnotation, "") + + if len(workloadName) > apicommon.MaxWorkloadNameLength || len(version) > apicommon.MaxVersionLength { + return false, ErrTooLongAnnotations + } + + if len(targetPod.Annotations) == 0 { + targetPod.Annotations = make(map[string]string) + } + + if gotWorkloadName { + setMapKey(targetPod.Annotations, apicommon.WorkloadAnnotation, workloadName) + + if !gotVersion { + setMapKey(targetPod.Annotations, apicommon.VersionAnnotation, calculateVersion(targetPod)) + } else { + setMapKey(targetPod.Annotations, apicommon.VersionAnnotation, version) + } + + setMapKey(targetPod.Annotations, apicommon.AppAnnotation, appName) + setMapKey(targetPod.Annotations, apicommon.PreDeploymentTaskAnnotation, preDeploymentChecks) + setMapKey(targetPod.Annotations, apicommon.PostDeploymentTaskAnnotation, postDeploymentChecks) + setMapKey(targetPod.Annotations, apicommon.PreDeploymentEvaluationAnnotation, preEvaluationChecks) + setMapKey(targetPod.Annotations, apicommon.PostDeploymentEvaluationAnnotation, postEvaluationChecks) + + return true, nil + } + return false, nil +} + +func GetOwnerReference(resource *metav1.ObjectMeta) metav1.OwnerReference { + reference := metav1.OwnerReference{} + if len(resource.OwnerReferences) != 0 { + for _, owner := range resource.OwnerReferences { + if owner.Kind == "ReplicaSet" || owner.Kind == "Deployment" || owner.Kind == "StatefulSet" || owner.Kind == "DaemonSet" || owner.Kind == "Rollout" { + reference.UID = owner.UID + reference.Kind = owner.Kind + reference.Name = owner.Name + reference.APIVersion = owner.APIVersion + } + } + } + return reference +} + +func calculateVersion(pod *corev1.Pod) string { + name := "" + + if len(pod.Spec.Containers) == 1 { + image := strings.Split(pod.Spec.Containers[0].Image, ":") + if len(image) > 1 && image[1] != "" && image[1] != "latest" { + return image[1] + } + } + + for _, item := range pod.Spec.Containers { + name = name + item.Name + item.Image + for _, e := range item.Env { + name = name + e.Name + e.Value + } + } + + h := fnv.New32a() + h.Write([]byte(name)) + return fmt.Sprint(h.Sum32()) +} + +func setMapKey(myMap map[string]string, key, value string) { + if myMap == nil { + return + } + if value != "" { + myMap[key] = value + } +} diff --git a/operator/webhooks/common/common_test.go b/operator/webhooks/common/common_test.go new file mode 100644 index 0000000000..aceeb9c64a --- /dev/null +++ b/operator/webhooks/common/common_test.go @@ -0,0 +1,704 @@ +package common + +import ( + "context" + "reflect" + "testing" + + apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" + fakeclient "github.com/keptn/lifecycle-toolkit/operator/controllers/common/fake" + "github.com/stretchr/testify/require" + admissionv1 "k8s.io/api/admission/v1" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" +) + +func TestPodMutatingWebhook_GetOwnerReference(t *testing.T) { + type args struct { + resource *metav1.ObjectMeta + } + tests := []struct { + name string + args args + want metav1.OwnerReference + }{ + { + name: "Test simple return when UID and Kind is set", + args: args{ + resource: &metav1.ObjectMeta{ + UID: "the-pod-uid", + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "ReplicaSet", + UID: "the-replicaset-uid", + Name: "some-name", + }, + }, + }, + }, + want: metav1.OwnerReference{ + UID: "the-replicaset-uid", + Kind: "ReplicaSet", + Name: "some-name", + }, + }, + { + name: "Test return is input argument if owner is not found", + args: args{ + resource: &metav1.ObjectMeta{ + UID: "the-pod-uid", + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "SomeNonExistentType", + UID: "the-replicaset-uid", + }, + }, + }, + }, + want: metav1.OwnerReference{ + UID: "", + Kind: "", + Name: "", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + if got := GetOwnerReference(tt.args.resource); !reflect.DeepEqual(got, tt.want) { + t.Errorf("getOwnerReference() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_GetLabelOrAnnotation(t *testing.T) { + type args struct { + resource *metav1.ObjectMeta + primaryAnnotation string + secondaryAnnotation string + } + tests := []struct { + name string + args args + want string + want1 bool + }{ + { + name: "Test if primary annotation is returned from annotations", + args: args{ + resource: &metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.AppAnnotation: "some-app-name", + }, + }, + primaryAnnotation: apicommon.AppAnnotation, + secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, + }, + want: "some-app-name", + want1: true, + }, + { + name: "Test if secondary annotation is returned from annotations", + args: args{ + resource: &metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.K8sRecommendedAppAnnotations: "some-app-name", + }, + }, + primaryAnnotation: apicommon.AppAnnotation, + secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, + }, + want: "some-app-name", + want1: true, + }, + { + name: "Test if primary annotation is returned from labels", + args: args{ + resource: &metav1.ObjectMeta{ + Labels: map[string]string{ + apicommon.AppAnnotation: "some-app-name", + }, + }, + primaryAnnotation: apicommon.AppAnnotation, + secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, + }, + want: "some-app-name", + want1: true, + }, + { + name: "Test if secondary annotation is returned from labels", + args: args{ + resource: &metav1.ObjectMeta{ + Labels: map[string]string{ + apicommon.K8sRecommendedAppAnnotations: "some-app-name", + }, + }, + primaryAnnotation: apicommon.AppAnnotation, + secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, + }, + want: "some-app-name", + want1: true, + }, + { + name: "Test that empty string is returned when no annotations or labels are found", + args: args{ + resource: &metav1.ObjectMeta{ + Annotations: map[string]string{ + "some-other-annotation": "some-app-name", + }, + }, + primaryAnnotation: apicommon.AppAnnotation, + secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, + }, + want: "", + want1: false, + }, + { + name: "Test that empty string is returned when primary annotation cannot be found and secondary annotation is empty", + args: args{ + resource: &metav1.ObjectMeta{ + Annotations: map[string]string{ + "some-other-annotation": "some-app-name", + }, + }, + primaryAnnotation: apicommon.AppAnnotation, + secondaryAnnotation: "", + }, + want: "", + want1: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := GetLabelOrAnnotation(tt.args.resource, tt.args.primaryAnnotation, tt.args.secondaryAnnotation) + if got != tt.want { + t.Errorf("getLabelOrAnnotation() got = %v, want %v", got, tt.want) + } + if got1 != tt.want1 { + t.Errorf("getLabelOrAnnotation() got1 = %v, want %v", got1, tt.want1) + } + }) + } +} + +func TestPodMutatingWebhook_isPodAnnotated(t *testing.T) { + + type args struct { + pod *corev1.Pod + } + tests := []struct { + name string + args args + want bool + wantErr bool + wantedPod *corev1.Pod + }{ + { + name: "Test error when workload name is too long", + args: args{ + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.AppAnnotation: "SOME-APP-NAME-ANNOTATION", + apicommon.WorkloadAnnotation: "workload-name-that-is-too-loooooooooooooooooooooooooooooooooooooooooooooooooong", + }, + }, + }, + }, + want: false, + wantErr: true, + }, + { + name: "Test return true when pod has workload annotation", + args: args{ + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + }, + }, + }, + }, + want: true, + wantErr: false, + }, + { + name: "Test return true and initialize annotations when labels are set", + args: args{ + pod: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Image: "some-image:v1", + }, + }, + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + }, + }, + }, + }, + want: true, + wantErr: false, + wantedPod: &corev1.Pod{ + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Image: "some-image:v1", + }, + }, + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + }, + Annotations: map[string]string{ + apicommon.VersionAnnotation: "v1", + }, + }, + }, + }, + { + name: "Test return false when annotations and labels are not set", + args: args{ + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "some-other-label": "some-value", + }, + }, + }, + }, + want: false, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := isPodAnnotated(tt.args.pod) + if (err != nil) != tt.wantErr { + t.Errorf("isPodAnnotated() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("isPodAnnotated() got = %v, want %v", got, tt.want) + } + if tt.wantedPod != nil { + require.Equal(t, tt.wantedPod, tt.args.pod) + } + }) + } +} + +func TestPodMutatingWebhook_copyAnnotationsIfParentAnnotated(t *testing.T) { + testNamespace := "test-namespace" + rsUidWithDpOwner := types.UID("this-is-the-replicaset-with-dp-owner") + rsUidWithNoOwner := types.UID("this-is-the-replicaset-with-no-owner") + testStsUid := types.UID("this-is-the-stateful-set-uid") + tstStsName := "test-stateful-set" + testDsUid := types.UID("this-is-the-daemon-set-uid") + testDsName := "test-daemon-set" + + rsWithDpOwner := &appsv1.ReplicaSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "ReplicaSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-replicaset1", + UID: rsUidWithDpOwner, + Namespace: testNamespace, + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "Deployment", + Name: "this-is-the-deployment", + UID: "this-is-the-deployment-uid", + }, + }, + }, + } + // TODO: fix tests where an RS has a STS or DS as owner. they should not have a RS in between + rsWithNoOwner := &appsv1.ReplicaSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "ReplicaSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-replicaset4", + UID: rsUidWithNoOwner, + Namespace: testNamespace, + }, + } + testDp := &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-deployment", + UID: "this-is-the-deployment-uid", + Namespace: testNamespace, + }, + } + testSts := &appsv1.StatefulSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "StatefulSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: tstStsName, + UID: testStsUid, + Namespace: testNamespace, + }, + } + testDs := &appsv1.DaemonSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "DaemonSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: testDsName, + UID: testDsUid, + Namespace: testNamespace, + }, + } + + fakeClient := fakeclient.NewClient(rsWithDpOwner, rsWithNoOwner, testDp, testSts, testDs) + + type fields struct { + Client client.Client + } + type args struct { + ctx context.Context + req *admission.Request + pod *corev1.Pod + } + tests := []struct { + name string + fields fields + args args + want bool + wantErr bool + }{ + { + name: "Test that nothing happens if owner UID is pod UID", + fields: fields{ + Client: fakeClient, + }, + args: args{ + ctx: context.TODO(), + req: &admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Namespace: testNamespace, + }, + }, + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "some-uid", + }, + }, + }, + want: false, + wantErr: false, + }, + { + name: "Test fetching of replicaset owner of pod and deployment owner of replicaset", + fields: fields{ + Client: fakeClient, + }, + args: args{ + ctx: context.TODO(), + req: &admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Namespace: testNamespace, + }, + }, + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "this-is-the-pod-uid", + OwnerReferences: []metav1.OwnerReference{ + { + Name: rsWithDpOwner.Name, + UID: rsUidWithDpOwner, + Kind: "ReplicaSet", + }, + }, + }, + }, + }, + want: false, + wantErr: false, + }, + { + name: "Test fetching of statefulset owner of pod", + fields: fields{ + Client: fakeClient, + }, + args: args{ + ctx: context.TODO(), + req: &admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Namespace: testNamespace, + }, + }, + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "this-is-the-pod-uid", + OwnerReferences: []metav1.OwnerReference{ + { + Name: testSts.Name, + UID: testSts.UID, + Kind: testSts.Kind, + }, + }, + }, + }, + }, + want: false, + wantErr: false, + }, + { + name: "Test fetching of daemonset owner of pod", + fields: fields{ + Client: fakeClient, + }, + args: args{ + ctx: context.TODO(), + req: &admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Namespace: testNamespace, + }, + }, + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "this-is-the-pod-uid", + OwnerReferences: []metav1.OwnerReference{ + { + Name: testDs.Name, + UID: testDs.UID, + Kind: testDs.Kind, + }, + }, + }, + }, + }, + want: false, + wantErr: false, + }, + { + name: "Test that method returns without doing anything when we get a pod with replicaset without owner", + fields: fields{ + Client: fakeClient, + }, + args: args{ + ctx: context.TODO(), + req: &admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Namespace: testNamespace, + }, + }, + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "this-is-the-pod-uid", + OwnerReferences: []metav1.OwnerReference{ + { + Name: rsWithNoOwner.Name, + UID: rsUidWithNoOwner, + Kind: "ReplicaSet", + }, + }, + }, + }, + }, + want: false, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + got, err := copyAnnotationsIfParentAnnotated(tt.args.ctx, tt.args.req, tt.args.pod, tt.fields.Client) + if (err != nil) != tt.wantErr { + t.Errorf("copyAnnotationsIfParentAnnotated() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("copyAnnotationsIfParentAnnotated() got = %v, want %v", got, tt.want) + } + }) + } + +} + +func TestPodMutatingWebhook_copyResourceLabelsIfPresent(t *testing.T) { + + type args struct { + sourceResource *metav1.ObjectMeta + targetPod *corev1.Pod + } + tests := []struct { + name string + args args + want bool + wantErr bool + wantedPod *corev1.Pod + }{ + { + name: "Test that annotations get copied from source to target", + args: args{ + sourceResource: &metav1.ObjectMeta{ + Name: "testSourceObject", + Annotations: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + apicommon.AppAnnotation: "some-app-name", + apicommon.VersionAnnotation: "v1.0.0", + apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", + apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", + apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", + apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", + }, + }, + targetPod: &corev1.Pod{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{}, + Spec: corev1.PodSpec{}, + Status: corev1.PodStatus{}, + }, + }, + want: true, + wantErr: false, + wantedPod: &corev1.Pod{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + apicommon.AppAnnotation: "some-app-name", + apicommon.VersionAnnotation: "v1.0.0", + apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", + apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", + apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", + apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", + }, + }, + }, + }, + { + name: "Test that source labels get copied to target annotations", + args: args{ + sourceResource: &metav1.ObjectMeta{ + Name: "testSourceObject", + Labels: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + apicommon.AppAnnotation: "some-app-name", + apicommon.VersionAnnotation: "v1.0.0", + apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", + apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", + apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", + apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", + }, + }, + targetPod: &corev1.Pod{}, + }, + want: true, + wantErr: false, + wantedPod: &corev1.Pod{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + apicommon.AppAnnotation: "some-app-name", + apicommon.VersionAnnotation: "v1.0.0", + apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", + apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", + apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", + apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", + }, + }, + }, + }, + { + name: "Test that version label is generated correctly and rest is copied", + args: args{ + sourceResource: &metav1.ObjectMeta{ + Name: "testSourceObject", + Labels: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + apicommon.AppAnnotation: "some-app-name", + apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", + apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", + apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", + apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", + }, + }, + targetPod: &corev1.Pod{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{}, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Image: "some-image:v1.0.0", + }, + }, + }, + Status: corev1.PodStatus{}, + }, + }, + want: true, + wantErr: false, + wantedPod: &corev1.Pod{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name", + apicommon.AppAnnotation: "some-app-name", + apicommon.VersionAnnotation: "v1.0.0", + apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", + apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", + apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", + apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", + }, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Image: "some-image:v1.0.0", + }, + }, + }, + Status: corev1.PodStatus{}, + }, + }, + { + name: "Test that error is return with too long workload name", + args: args{ + sourceResource: &metav1.ObjectMeta{ + Name: "testSourceObject", + Labels: map[string]string{ + apicommon.WorkloadAnnotation: "some-workload-name-that-is-very-looooooooooooooooooooooong", + }, + }, + targetPod: &corev1.Pod{}, + }, + want: false, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + got, err := copyResourceLabelsIfPresent(tt.args.sourceResource, tt.args.targetPod) + if (err != nil) != tt.wantErr { + t.Errorf("copyResourceLabelsIfPresent() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("copyResourceLabelsIfPresent() got = %v, want %v", got, tt.want) + } + if tt.wantedPod != nil { + require.Equal(t, tt.wantedPod, tt.args.targetPod) + } + }) + } +} diff --git a/operator/webhooks/config.go b/operator/webhooks/config.go deleted file mode 100644 index 97fb8e4a0d..0000000000 --- a/operator/webhooks/config.go +++ /dev/null @@ -1,7 +0,0 @@ -package webhooks - -const ( - - // SecretCertsName is the name of the secret where the webhook certificates are stored. - SecretCertsName = "klt-certs" -) diff --git a/operator/webhooks/gating/gating_webhook.go b/operator/webhooks/gating/gating_webhook.go new file mode 100644 index 0000000000..2a5029ae18 --- /dev/null +++ b/operator/webhooks/gating/gating_webhook.go @@ -0,0 +1,67 @@ +package gating + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/go-logr/logr" + "github.com/keptn/lifecycle-toolkit/operator/webhooks/common" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" +) + +// +kubebuilder:webhook:path=/gate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create,versions=v1,name=mpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None +// +kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch +// +kubebuilder:rbac:groups=apps,resources=deployments;statefulsets;daemonsets;replicasets,verbs=get + +// PodGatingWebhook annotates Pods to add gates +type PodGatingWebhook struct { + Client client.Client + Tracer trace.Tracer + decoder *admission.Decoder + Recorder record.EventRecorder + Log logr.Logger +} + +func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) admission.Response { + logger := a.Log + ctx, span := a.Tracer.Start(ctx, "gate_pod", trace.WithNewRoot(), trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + pod := &corev1.Pod{} + err := a.decoder.Decode(req, pod) + if err != nil { + return admission.Errored(http.StatusBadRequest, err) + } + + logger.Info(fmt.Sprintf("Pod annotations: %v", pod.Annotations)) + + podIsAnnotated, err := common.IsPodOrParentAnnotated(ctx, &req, pod, a.Client) + logger.Info("Checked if pod is annotated.") + if err != nil { + span.SetStatus(codes.Error, common.InvalidAnnotationMessage) + return admission.Errored(http.StatusBadRequest, err) + } + + if podIsAnnotated { + logger.Info("Resource is annotated with Keptn annotations, using Keptn scheduler") + pod.Spec.SchedulerName = "keptn-scheduler" + pod.Spec.SchedulingGates = []corev1.PodSchedulingGate{ + { + Name: "klt-gated", + }, + } + } + + marshaledPod, err := json.Marshal(pod) + if err != nil { + return admission.Errored(http.StatusInternalServerError, err) + } + + return admission.PatchResponseFromRaw(req.Object.Raw, marshaledPod) +} diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index 3a3a7801c7..885618d495 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -4,22 +4,20 @@ import ( "context" "encoding/json" "fmt" - "hash/fnv" "net/http" "reflect" "strings" - argov1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/go-logr/logr" klcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/semconv" controllercommon "github.com/keptn/lifecycle-toolkit/operator/controllers/common" + "github.com/keptn/lifecycle-toolkit/operator/webhooks/common" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" - appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -43,10 +41,6 @@ type PodMutatingWebhook struct { Log logr.Logger } -const InvalidAnnotationMessage = "Invalid annotations" - -var ErrTooLongAnnotations = fmt.Errorf("too long annotations, maximum length for app and workload is 25 characters, for version 12 characters") - // Handle inspects incoming Pods and injects the Keptn scheduler if they contain the Keptn lifecycle annotations. // //nolint:gocyclo @@ -83,35 +77,20 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) logger.Info(fmt.Sprintf("Pod annotations: %v", pod.Annotations)) - podIsAnnotated, err := a.isPodAnnotated(pod) + podIsAnnotated, err := common.IsPodOrParentAnnotated(ctx, &req, pod, a.Client) logger.Info("Checked if pod is annotated.") - if err != nil { - span.SetStatus(codes.Error, InvalidAnnotationMessage) + span.SetStatus(codes.Error, common.InvalidAnnotationMessage) return admission.Errored(http.StatusBadRequest, err) } - if !podIsAnnotated { - logger.Info("Pod is not annotated, check for parent annotations...") - podIsAnnotated, err = a.copyAnnotationsIfParentAnnotated(ctx, &req, pod) - if err != nil { - span.SetStatus(codes.Error, InvalidAnnotationMessage) - return admission.Errored(http.StatusBadRequest, err) - } - } - _, gatedRemoved := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.SchedullingGateRemoved, "") - if podIsAnnotated && !gatedRemoved { - logger.Info("Resource is annotated with Keptn annotations, using Keptn scheduler") - pod.Spec.SchedulingGates = []corev1.PodSchedulingGate{ - { - Name: "klt-gated", - }, - } + if podIsAnnotated { + logger.Info("Annotations", "annotations", pod.Annotations) isAppAnnotationPresent, err := a.isAppAnnotationPresent(pod) if err != nil { - span.SetStatus(codes.Error, InvalidAnnotationMessage) + span.SetStatus(codes.Error, common.InvalidAnnotationMessage) return admission.Errored(http.StatusBadRequest, err) } semconv.AddAttributeFromAnnotations(span, pod.Annotations) @@ -148,120 +127,12 @@ func (a *PodMutatingWebhook) InjectDecoder(d *admission.Decoder) error { return nil } -func (a *PodMutatingWebhook) isPodAnnotated(pod *corev1.Pod) (bool, error) { - workload, gotWorkloadAnnotation := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) - version, gotVersionAnnotation := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.VersionAnnotation, apicommon.K8sRecommendedVersionAnnotations) - - if len(workload) > apicommon.MaxWorkloadNameLength || len(version) > apicommon.MaxVersionLength { - return false, ErrTooLongAnnotations - } - - if gotWorkloadAnnotation { - if !gotVersionAnnotation { - if len(pod.Annotations) == 0 { - pod.Annotations = make(map[string]string) - } - pod.Annotations[apicommon.VersionAnnotation] = a.calculateVersion(pod) - } - return true, nil - } - return false, nil -} - -func (a *PodMutatingWebhook) copyAnnotationsIfParentAnnotated(ctx context.Context, req *admission.Request, pod *corev1.Pod) (bool, error) { - podOwner := a.getOwnerReference(&pod.ObjectMeta) - if podOwner.UID == "" { - return false, nil - } - - switch podOwner.Kind { - case "ReplicaSet": - rs := &appsv1.ReplicaSet{} - if err := a.Client.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: podOwner.Name}, rs); err != nil { - return false, nil - } - a.Log.Info("Done fetching RS") - - rsOwner := a.getOwnerReference(&rs.ObjectMeta) - if rsOwner.UID == "" { - return false, nil - } - - if rsOwner.Kind == "Rollout" { - ro := &argov1alpha1.Rollout{} - return a.fetchParentObjectAndCopyLabels(ctx, podOwner.Name, req.Namespace, pod, ro) - } - dp := &appsv1.Deployment{} - return a.fetchParentObjectAndCopyLabels(ctx, rsOwner.Name, req.Namespace, pod, dp) - - case "StatefulSet": - sts := &appsv1.StatefulSet{} - return a.fetchParentObjectAndCopyLabels(ctx, podOwner.Name, req.Namespace, pod, sts) - case "DaemonSet": - ds := &appsv1.DaemonSet{} - return a.fetchParentObjectAndCopyLabels(ctx, podOwner.Name, req.Namespace, pod, ds) - default: - return false, nil - } -} - -func (a *PodMutatingWebhook) fetchParentObjectAndCopyLabels(ctx context.Context, name string, namespace string, pod *corev1.Pod, objectContainer client.Object) (bool, error) { - if err := a.Client.Get(ctx, types.NamespacedName{Namespace: namespace, Name: name}, objectContainer); err != nil { - return false, nil - } - objectContainerMetaData := metav1.ObjectMeta{ - Labels: objectContainer.GetLabels(), - Annotations: objectContainer.GetAnnotations(), - } - return a.copyResourceLabelsIfPresent(&objectContainerMetaData, pod) -} - -func (a *PodMutatingWebhook) copyResourceLabelsIfPresent(sourceResource *metav1.ObjectMeta, targetPod *corev1.Pod) (bool, error) { - var workloadName, appName, version, preDeploymentChecks, postDeploymentChecks, preEvaluationChecks, postEvaluationChecks string - var gotWorkloadName, gotVersion bool - - workloadName, gotWorkloadName = getLabelOrAnnotation(sourceResource, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) - appName, _ = getLabelOrAnnotation(sourceResource, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) - version, gotVersion = getLabelOrAnnotation(sourceResource, apicommon.VersionAnnotation, apicommon.K8sRecommendedVersionAnnotations) - preDeploymentChecks, _ = getLabelOrAnnotation(sourceResource, apicommon.PreDeploymentTaskAnnotation, "") - postDeploymentChecks, _ = getLabelOrAnnotation(sourceResource, apicommon.PostDeploymentTaskAnnotation, "") - preEvaluationChecks, _ = getLabelOrAnnotation(sourceResource, apicommon.PreDeploymentEvaluationAnnotation, "") - postEvaluationChecks, _ = getLabelOrAnnotation(sourceResource, apicommon.PostDeploymentEvaluationAnnotation, "") - - if len(workloadName) > apicommon.MaxWorkloadNameLength || len(version) > apicommon.MaxVersionLength { - return false, ErrTooLongAnnotations - } - - if len(targetPod.Annotations) == 0 { - targetPod.Annotations = make(map[string]string) - } - - if gotWorkloadName { - setMapKey(targetPod.Annotations, apicommon.WorkloadAnnotation, workloadName) - - if !gotVersion { - setMapKey(targetPod.Annotations, apicommon.VersionAnnotation, a.calculateVersion(targetPod)) - } else { - setMapKey(targetPod.Annotations, apicommon.VersionAnnotation, version) - } - - setMapKey(targetPod.Annotations, apicommon.AppAnnotation, appName) - setMapKey(targetPod.Annotations, apicommon.PreDeploymentTaskAnnotation, preDeploymentChecks) - setMapKey(targetPod.Annotations, apicommon.PostDeploymentTaskAnnotation, postDeploymentChecks) - setMapKey(targetPod.Annotations, apicommon.PreDeploymentEvaluationAnnotation, preEvaluationChecks) - setMapKey(targetPod.Annotations, apicommon.PostDeploymentEvaluationAnnotation, postEvaluationChecks) - - return true, nil - } - return false, nil -} - func (a *PodMutatingWebhook) isAppAnnotationPresent(pod *corev1.Pod) (bool, error) { - app, gotAppAnnotation := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) + app, gotAppAnnotation := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) if gotAppAnnotation { if len(app) > apicommon.MaxAppNameLength { - return false, ErrTooLongAnnotations + return false, common.ErrTooLongAnnotations } return true, nil } @@ -269,32 +140,10 @@ func (a *PodMutatingWebhook) isAppAnnotationPresent(pod *corev1.Pod) (bool, erro if len(pod.Annotations) == 0 { pod.Annotations = make(map[string]string) } - pod.Annotations[apicommon.AppAnnotation], _ = getLabelOrAnnotation(&pod.ObjectMeta, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) + pod.Annotations[apicommon.AppAnnotation], _ = common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) return false, nil } -func (a *PodMutatingWebhook) calculateVersion(pod *corev1.Pod) string { - name := "" - - if len(pod.Spec.Containers) == 1 { - image := strings.Split(pod.Spec.Containers[0].Image, ":") - if len(image) > 1 && image[1] != "" && image[1] != "latest" { - return image[1] - } - } - - for _, item := range pod.Spec.Containers { - name = name + item.Name + item.Image - for _, e := range item.Env { - name = name + e.Name + e.Value - } - } - - h := fnv.New32a() - h.Write([]byte(name)) - return fmt.Sprint(h.Sum32()) -} - //nolint:dupl func (a *PodMutatingWebhook) handleWorkload(ctx context.Context, logger logr.Logger, pod *corev1.Pod, namespace string) error { @@ -388,27 +237,27 @@ func (a *PodMutatingWebhook) handleApp(ctx context.Context, logger logr.Logger, } func (a *PodMutatingWebhook) generateWorkload(ctx context.Context, pod *corev1.Pod, namespace string) *klcv1alpha3.KeptnWorkload { - version, _ := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.VersionAnnotation, apicommon.K8sRecommendedVersionAnnotations) - applicationName, _ := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) + version, _ := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.VersionAnnotation, apicommon.K8sRecommendedVersionAnnotations) + applicationName, _ := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) var preDeploymentTasks []string var postDeploymentTasks []string var preDeploymentEvaluation []string var postDeploymentEvaluation []string - if annotations, found := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.PreDeploymentTaskAnnotation, ""); found { + if annotations, found := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.PreDeploymentTaskAnnotation, ""); found { preDeploymentTasks = strings.Split(annotations, ",") } - if annotations, found := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.PostDeploymentTaskAnnotation, ""); found { + if annotations, found := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.PostDeploymentTaskAnnotation, ""); found { postDeploymentTasks = strings.Split(annotations, ",") } - if annotations, found := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.PreDeploymentEvaluationAnnotation, ""); found { + if annotations, found := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.PreDeploymentEvaluationAnnotation, ""); found { preDeploymentEvaluation = strings.Split(annotations, ",") } - if annotations, found := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.PostDeploymentEvaluationAnnotation, ""); found { + if annotations, found := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.PostDeploymentEvaluationAnnotation, ""); found { postDeploymentEvaluation = strings.Split(annotations, ",") } @@ -417,7 +266,7 @@ func (a *PodMutatingWebhook) generateWorkload(ctx context.Context, pod *corev1.P traceContextCarrier := propagation.MapCarrier{} otel.GetTextMapPropagator().Inject(ctx, traceContextCarrier) - ownerRef := a.getOwnerReference(&pod.ObjectMeta) + ownerRef := common.GetOwnerReference(&pod.ObjectMeta) return &klcv1alpha3.KeptnWorkload{ ObjectMeta: metav1.ObjectMeta{ @@ -467,59 +316,12 @@ func (a *PodMutatingWebhook) generateAppCreationRequest(ctx context.Context, pod } func (a *PodMutatingWebhook) getWorkloadName(pod *corev1.Pod) string { - workloadName, _ := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) - applicationName, _ := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) + workloadName, _ := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.WorkloadAnnotation, apicommon.K8sRecommendedWorkloadAnnotations) + applicationName, _ := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) return strings.ToLower(applicationName + "-" + workloadName) } func (a *PodMutatingWebhook) getAppName(pod *corev1.Pod) string { - applicationName, _ := getLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) + applicationName, _ := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) return strings.ToLower(applicationName) } - -func (a *PodMutatingWebhook) getOwnerReference(resource *metav1.ObjectMeta) metav1.OwnerReference { - reference := metav1.OwnerReference{} - if len(resource.OwnerReferences) != 0 { - for _, owner := range resource.OwnerReferences { - if owner.Kind == "ReplicaSet" || owner.Kind == "Deployment" || owner.Kind == "StatefulSet" || owner.Kind == "DaemonSet" || owner.Kind == "Rollout" { - reference.UID = owner.UID - reference.Kind = owner.Kind - reference.Name = owner.Name - reference.APIVersion = owner.APIVersion - } - } - } - return reference -} - -func getLabelOrAnnotation(resource *metav1.ObjectMeta, primaryAnnotation string, secondaryAnnotation string) (string, bool) { - if resource.Annotations[primaryAnnotation] != "" { - return resource.Annotations[primaryAnnotation], true - } - - if resource.Labels[primaryAnnotation] != "" { - return resource.Labels[primaryAnnotation], true - } - - if secondaryAnnotation == "" { - return "", false - } - - if resource.Annotations[secondaryAnnotation] != "" { - return resource.Annotations[secondaryAnnotation], true - } - - if resource.Labels[secondaryAnnotation] != "" { - return resource.Labels[secondaryAnnotation], true - } - return "", false -} - -func setMapKey(myMap map[string]string, key, value string) { - if myMap == nil { - return - } - if value != "" { - myMap[key] = value - } -} diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go b/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go index 8ad94adcff..cf78dbdc65 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go @@ -3,7 +3,6 @@ package pod_mutator import ( "context" "encoding/json" - "reflect" "testing" "github.com/go-logr/logr" @@ -14,7 +13,6 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/trace" admissionv1 "k8s.io/api/admission/v1" - appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -24,79 +22,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -func TestPodMutatingWebhook_getOwnerReference(t *testing.T) { - type fields struct { - Client client.Client - Tracer trace.Tracer - decoder *admission.Decoder - Recorder record.EventRecorder - Log logr.Logger - } - type args struct { - resource *metav1.ObjectMeta - } - tests := []struct { - name string - fields fields - args args - want metav1.OwnerReference - }{ - { - name: "Test simple return when UID and Kind is set", - args: args{ - resource: &metav1.ObjectMeta{ - UID: "the-pod-uid", - OwnerReferences: []metav1.OwnerReference{ - { - Kind: "ReplicaSet", - UID: "the-replicaset-uid", - Name: "some-name", - }, - }, - }, - }, - want: metav1.OwnerReference{ - UID: "the-replicaset-uid", - Kind: "ReplicaSet", - Name: "some-name", - }, - }, - { - name: "Test return is input argument if owner is not found", - args: args{ - resource: &metav1.ObjectMeta{ - UID: "the-pod-uid", - OwnerReferences: []metav1.OwnerReference{ - { - Kind: "SomeNonExistentType", - UID: "the-replicaset-uid", - }, - }, - }, - }, - want: metav1.OwnerReference{ - UID: "", - Kind: "", - Name: "", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - a := &PodMutatingWebhook{ - Client: tt.fields.Client, - Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, - Recorder: tt.fields.Recorder, - Log: tt.fields.Log, - } - if got := a.getOwnerReference(tt.args.resource); !reflect.DeepEqual(got, tt.want) { - t.Errorf("getOwnerReference() = %v, want %v", got, tt.want) - } - }) - } -} - func TestPodMutatingWebhook_getAppName(t *testing.T) { type fields struct { Client client.Client @@ -253,674 +178,6 @@ func TestPodMutatingWebhook_getWorkloadName(t *testing.T) { } } -func Test_getLabelOrAnnotation(t *testing.T) { - type args struct { - resource *metav1.ObjectMeta - primaryAnnotation string - secondaryAnnotation string - } - tests := []struct { - name string - args args - want string - want1 bool - }{ - { - name: "Test if primary annotation is returned from annotations", - args: args{ - resource: &metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.AppAnnotation: "some-app-name", - }, - }, - primaryAnnotation: apicommon.AppAnnotation, - secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, - }, - want: "some-app-name", - want1: true, - }, - { - name: "Test if secondary annotation is returned from annotations", - args: args{ - resource: &metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.K8sRecommendedAppAnnotations: "some-app-name", - }, - }, - primaryAnnotation: apicommon.AppAnnotation, - secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, - }, - want: "some-app-name", - want1: true, - }, - { - name: "Test if primary annotation is returned from labels", - args: args{ - resource: &metav1.ObjectMeta{ - Labels: map[string]string{ - apicommon.AppAnnotation: "some-app-name", - }, - }, - primaryAnnotation: apicommon.AppAnnotation, - secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, - }, - want: "some-app-name", - want1: true, - }, - { - name: "Test if secondary annotation is returned from labels", - args: args{ - resource: &metav1.ObjectMeta{ - Labels: map[string]string{ - apicommon.K8sRecommendedAppAnnotations: "some-app-name", - }, - }, - primaryAnnotation: apicommon.AppAnnotation, - secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, - }, - want: "some-app-name", - want1: true, - }, - { - name: "Test that empty string is returned when no annotations or labels are found", - args: args{ - resource: &metav1.ObjectMeta{ - Annotations: map[string]string{ - "some-other-annotation": "some-app-name", - }, - }, - primaryAnnotation: apicommon.AppAnnotation, - secondaryAnnotation: apicommon.K8sRecommendedAppAnnotations, - }, - want: "", - want1: false, - }, - { - name: "Test that empty string is returned when primary annotation cannot be found and secondary annotation is empty", - args: args{ - resource: &metav1.ObjectMeta{ - Annotations: map[string]string{ - "some-other-annotation": "some-app-name", - }, - }, - primaryAnnotation: apicommon.AppAnnotation, - secondaryAnnotation: "", - }, - want: "", - want1: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, got1 := getLabelOrAnnotation(tt.args.resource, tt.args.primaryAnnotation, tt.args.secondaryAnnotation) - if got != tt.want { - t.Errorf("getLabelOrAnnotation() got = %v, want %v", got, tt.want) - } - if got1 != tt.want1 { - t.Errorf("getLabelOrAnnotation() got1 = %v, want %v", got1, tt.want1) - } - }) - } -} - -func TestPodMutatingWebhook_isPodAnnotated(t *testing.T) { - type fields struct { - Client client.Client - Tracer trace.Tracer - decoder *admission.Decoder - Recorder record.EventRecorder - Log logr.Logger - } - type args struct { - pod *corev1.Pod - } - tests := []struct { - name string - fields fields - args args - want bool - wantErr bool - wantedPod *corev1.Pod - }{ - { - name: "Test error when workload name is too long", - args: args{ - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.AppAnnotation: "SOME-APP-NAME-ANNOTATION", - apicommon.WorkloadAnnotation: "workload-name-that-is-too-loooooooooooooooooooooooooooooooooooooooooooooooooong", - }, - }, - }, - }, - want: false, - wantErr: true, - }, - { - name: "Test return true when pod has workload annotation", - args: args{ - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - }, - }, - }, - }, - want: true, - wantErr: false, - }, - { - name: "Test return true and initialize annotations when labels are set", - args: args{ - pod: &corev1.Pod{ - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Image: "some-image:v1", - }, - }, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - }, - }, - }, - }, - want: true, - wantErr: false, - wantedPod: &corev1.Pod{ - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Image: "some-image:v1", - }, - }, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - }, - Annotations: map[string]string{ - apicommon.VersionAnnotation: "v1", - }, - }, - }, - }, - { - name: "Test return false when annotations and labels are not set", - args: args{ - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "some-other-label": "some-value", - }, - }, - }, - }, - want: false, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - a := &PodMutatingWebhook{ - Client: tt.fields.Client, - Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, - Recorder: tt.fields.Recorder, - Log: tt.fields.Log, - } - got, err := a.isPodAnnotated(tt.args.pod) - if (err != nil) != tt.wantErr { - t.Errorf("isPodAnnotated() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("isPodAnnotated() got = %v, want %v", got, tt.want) - } - if tt.wantedPod != nil { - require.Equal(t, tt.wantedPod, tt.args.pod) - } - }) - } -} - -func TestPodMutatingWebhook_copyAnnotationsIfParentAnnotated(t *testing.T) { - testNamespace := "test-namespace" - rsUidWithDpOwner := types.UID("this-is-the-replicaset-with-dp-owner") - rsUidWithNoOwner := types.UID("this-is-the-replicaset-with-no-owner") - testStsUid := types.UID("this-is-the-stateful-set-uid") - tstStsName := "test-stateful-set" - testDsUid := types.UID("this-is-the-daemon-set-uid") - testDsName := "test-daemon-set" - - rsWithDpOwner := &appsv1.ReplicaSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "ReplicaSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "test-replicaset1", - UID: rsUidWithDpOwner, - Namespace: testNamespace, - OwnerReferences: []metav1.OwnerReference{ - { - Kind: "Deployment", - Name: "this-is-the-deployment", - UID: "this-is-the-deployment-uid", - }, - }, - }, - } - // TODO: fix tests where an RS has a STS or DS as owner. they should not have a RS in between - rsWithNoOwner := &appsv1.ReplicaSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "ReplicaSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "test-replicaset4", - UID: rsUidWithNoOwner, - Namespace: testNamespace, - }, - } - testDp := &appsv1.Deployment{ - TypeMeta: metav1.TypeMeta{ - Kind: "Deployment", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "test-deployment", - UID: "this-is-the-deployment-uid", - Namespace: testNamespace, - }, - } - testSts := &appsv1.StatefulSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "StatefulSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: tstStsName, - UID: testStsUid, - Namespace: testNamespace, - }, - } - testDs := &appsv1.DaemonSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "DaemonSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: testDsName, - UID: testDsUid, - Namespace: testNamespace, - }, - } - - fakeClient := fakeclient.NewClient(rsWithDpOwner, rsWithNoOwner, testDp, testSts, testDs) - - type fields struct { - Client client.Client - Tracer trace.Tracer - decoder *admission.Decoder - Recorder record.EventRecorder - Log logr.Logger - } - type args struct { - ctx context.Context - req *admission.Request - pod *corev1.Pod - } - tests := []struct { - name string - fields fields - args args - want bool - wantErr bool - }{ - { - name: "Test that nothing happens if owner UID is pod UID", - fields: fields{ - Log: testr.New(t), - Client: fakeClient, - }, - args: args{ - ctx: context.TODO(), - req: &admission.Request{ - AdmissionRequest: admissionv1.AdmissionRequest{ - Namespace: testNamespace, - }, - }, - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - UID: "some-uid", - }, - }, - }, - want: false, - wantErr: false, - }, - { - name: "Test fetching of replicaset owner of pod and deployment owner of replicaset", - fields: fields{ - Log: testr.New(t), - Client: fakeClient, - }, - args: args{ - ctx: context.TODO(), - req: &admission.Request{ - AdmissionRequest: admissionv1.AdmissionRequest{ - Namespace: testNamespace, - }, - }, - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - UID: "this-is-the-pod-uid", - OwnerReferences: []metav1.OwnerReference{ - { - Name: rsWithDpOwner.Name, - UID: rsUidWithDpOwner, - Kind: "ReplicaSet", - }, - }, - }, - }, - }, - want: false, - wantErr: false, - }, - { - name: "Test fetching of statefulset owner of pod", - fields: fields{ - Log: testr.New(t), - Client: fakeClient, - }, - args: args{ - ctx: context.TODO(), - req: &admission.Request{ - AdmissionRequest: admissionv1.AdmissionRequest{ - Namespace: testNamespace, - }, - }, - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - UID: "this-is-the-pod-uid", - OwnerReferences: []metav1.OwnerReference{ - { - Name: testSts.Name, - UID: testSts.UID, - Kind: testSts.Kind, - }, - }, - }, - }, - }, - want: false, - wantErr: false, - }, - { - name: "Test fetching of daemonset owner of pod", - fields: fields{ - Log: testr.New(t), - Client: fakeClient, - }, - args: args{ - ctx: context.TODO(), - req: &admission.Request{ - AdmissionRequest: admissionv1.AdmissionRequest{ - Namespace: testNamespace, - }, - }, - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - UID: "this-is-the-pod-uid", - OwnerReferences: []metav1.OwnerReference{ - { - Name: testDs.Name, - UID: testDs.UID, - Kind: testDs.Kind, - }, - }, - }, - }, - }, - want: false, - wantErr: false, - }, - { - name: "Test that method returns without doing anything when we get a pod with replicaset without owner", - fields: fields{ - Log: testr.New(t), - Client: fakeClient, - }, - args: args{ - ctx: context.TODO(), - req: &admission.Request{ - AdmissionRequest: admissionv1.AdmissionRequest{ - Namespace: testNamespace, - }, - }, - pod: &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - UID: "this-is-the-pod-uid", - OwnerReferences: []metav1.OwnerReference{ - { - Name: rsWithNoOwner.Name, - UID: rsUidWithNoOwner, - Kind: "ReplicaSet", - }, - }, - }, - }, - }, - want: false, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - a := &PodMutatingWebhook{ - Client: tt.fields.Client, - Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, - Recorder: tt.fields.Recorder, - Log: tt.fields.Log, - } - got, err := a.copyAnnotationsIfParentAnnotated(tt.args.ctx, tt.args.req, tt.args.pod) - if (err != nil) != tt.wantErr { - t.Errorf("copyAnnotationsIfParentAnnotated() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("copyAnnotationsIfParentAnnotated() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestPodMutatingWebhook_copyResourceLabelsIfPresent(t *testing.T) { - type fields struct { - Client client.Client - Tracer trace.Tracer - decoder *admission.Decoder - Recorder record.EventRecorder - Log logr.Logger - } - type args struct { - sourceResource *metav1.ObjectMeta - targetPod *corev1.Pod - } - tests := []struct { - name string - fields fields - args args - want bool - wantErr bool - wantedPod *corev1.Pod - }{ - { - name: "Test that annotations get copied from source to target", - args: args{ - sourceResource: &metav1.ObjectMeta{ - Name: "testSourceObject", - Annotations: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - apicommon.AppAnnotation: "some-app-name", - apicommon.VersionAnnotation: "v1.0.0", - apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", - apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", - apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", - apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", - }, - }, - targetPod: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{}, - Spec: corev1.PodSpec{}, - Status: corev1.PodStatus{}, - }, - }, - want: true, - wantErr: false, - wantedPod: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - apicommon.AppAnnotation: "some-app-name", - apicommon.VersionAnnotation: "v1.0.0", - apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", - apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", - apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", - apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", - }, - }, - }, - }, - { - name: "Test that source labels get copied to target annotations", - args: args{ - sourceResource: &metav1.ObjectMeta{ - Name: "testSourceObject", - Labels: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - apicommon.AppAnnotation: "some-app-name", - apicommon.VersionAnnotation: "v1.0.0", - apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", - apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", - apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", - apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", - }, - }, - targetPod: &corev1.Pod{}, - }, - want: true, - wantErr: false, - wantedPod: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - apicommon.AppAnnotation: "some-app-name", - apicommon.VersionAnnotation: "v1.0.0", - apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", - apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", - apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", - apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", - }, - }, - }, - }, - { - name: "Test that version label is generated correctly and rest is copied", - args: args{ - sourceResource: &metav1.ObjectMeta{ - Name: "testSourceObject", - Labels: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - apicommon.AppAnnotation: "some-app-name", - apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", - apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", - apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", - apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", - }, - }, - targetPod: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{}, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Image: "some-image:v1.0.0", - }, - }, - }, - Status: corev1.PodStatus{}, - }, - }, - want: true, - wantErr: false, - wantedPod: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name", - apicommon.AppAnnotation: "some-app-name", - apicommon.VersionAnnotation: "v1.0.0", - apicommon.PreDeploymentTaskAnnotation: "some-pre-deployment-task", - apicommon.PostDeploymentTaskAnnotation: "some-post-deployment-task", - apicommon.PreDeploymentEvaluationAnnotation: "some-pre-deployment-evaluation", - apicommon.PostDeploymentEvaluationAnnotation: "some-post-deployment-evaluation", - }, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Image: "some-image:v1.0.0", - }, - }, - }, - Status: corev1.PodStatus{}, - }, - }, - { - name: "Test that error is return with too long workload name", - args: args{ - sourceResource: &metav1.ObjectMeta{ - Name: "testSourceObject", - Labels: map[string]string{ - apicommon.WorkloadAnnotation: "some-workload-name-that-is-very-looooooooooooooooooooooong", - }, - }, - targetPod: &corev1.Pod{}, - }, - want: false, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - a := &PodMutatingWebhook{ - Client: tt.fields.Client, - Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, - Recorder: tt.fields.Recorder, - Log: tt.fields.Log, - } - got, err := a.copyResourceLabelsIfPresent(tt.args.sourceResource, tt.args.targetPod) - if (err != nil) != tt.wantErr { - t.Errorf("copyResourceLabelsIfPresent() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("copyResourceLabelsIfPresent() got = %v, want %v", got, tt.want) - } - if tt.wantedPod != nil { - require.Equal(t, tt.wantedPod, tt.args.targetPod) - } - }) - } -} - func TestPodMutatingWebhook_isAppAnnotationPresent(t *testing.T) { type fields struct { Client client.Client From d8885a4aad243cb94804010b7d0a9419c910b83c Mon Sep 17 00:00:00 2001 From: realanna Date: Fri, 19 May 2023 10:40:05 +0200 Subject: [PATCH 05/13] ref current pr for cert manager Signed-off-by: realanna --- metrics-operator/go.mod | 7 ++----- metrics-operator/go.sum | 2 ++ operator/go.mod | 4 +--- operator/go.sum | 2 ++ 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/metrics-operator/go.mod b/metrics-operator/go.mod index 4b5f2b40fd..119e309dba 100644 --- a/metrics-operator/go.mod +++ b/metrics-operator/go.mod @@ -8,7 +8,7 @@ require ( github.com/go-logr/logr v1.2.4 github.com/gorilla/mux v1.8.0 github.com/kelseyhightower/envconfig v1.4.0 - github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79 + github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230519083019-d5b316ac6f9a github.com/open-feature/go-sdk v1.3.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.15.1 @@ -118,7 +118,4 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace ( - github.com/keptn/lifecycle-toolkit/klt-cert-manager => ../klt-cert-manager - sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd -) +replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.15.0-alpha.0.0.20230516163936-76865b275fbd diff --git a/metrics-operator/go.sum b/metrics-operator/go.sum index 06ac938333..9a441a1498 100644 --- a/metrics-operator/go.sum +++ b/metrics-operator/go.sum @@ -243,6 +243,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230519083019-d5b316ac6f9a h1:Etj9BY+tw8Ojs9Zd2cLZbIcxT6YeA18Tu5HXaVW+UqI= +github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230519083019-d5b316ac6f9a/go.mod h1:zispGfCheftPCMtCijljqga/bI78PD2RsIzoX5Y06HQ= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= diff --git a/operator/go.mod b/operator/go.mod index b11096af55..156e9a9610 100644 --- a/operator/go.mod +++ b/operator/go.mod @@ -8,7 +8,7 @@ require ( github.com/go-logr/logr v1.2.4 github.com/imdario/mergo v0.3.15 github.com/kelseyhightower/envconfig v1.4.0 - github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230517124521-e381f7fc6d79 + github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230519083019-d5b316ac6f9a github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517141059-f0f7edf7041d github.com/magiconair/properties v1.8.7 github.com/onsi/ginkgo/v2 v2.9.5 @@ -98,5 +98,3 @@ require ( sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) - -replace github.com/keptn/lifecycle-toolkit/klt-cert-manager => ../klt-cert-manager diff --git a/operator/go.sum b/operator/go.sum index 829662cbc7..5134c29adf 100644 --- a/operator/go.sum +++ b/operator/go.sum @@ -205,6 +205,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230519083019-d5b316ac6f9a h1:Etj9BY+tw8Ojs9Zd2cLZbIcxT6YeA18Tu5HXaVW+UqI= +github.com/keptn/lifecycle-toolkit/klt-cert-manager v0.0.0-20230519083019-d5b316ac6f9a/go.mod h1:zispGfCheftPCMtCijljqga/bI78PD2RsIzoX5Y06HQ= github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517141059-f0f7edf7041d h1:rZaucgGHp3sMP8fq6Y7SR1ctDaEL59rXvazfPVvG1Lw= github.com/keptn/lifecycle-toolkit/metrics-operator v0.0.0-20230517141059-f0f7edf7041d/go.mod h1:aWxBCTaDbsZWnA3gzV4X4e3CgX4lps5fmIyi5pwPKxc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= From 2ac6634da4d4a167b1505bf6ccf196dced5d01ce Mon Sep 17 00:00:00 2001 From: realanna Date: Fri, 19 May 2023 11:05:25 +0200 Subject: [PATCH 06/13] ref e2e test Signed-off-by: realanna --- .../interfaces/fake/phaseitem_mock.go | 248 ++++++++++-------- operator/test/e2e/operator_test.go | 4 +- 2 files changed, 139 insertions(+), 113 deletions(-) diff --git a/operator/controllers/lifecycle/interfaces/fake/phaseitem_mock.go b/operator/controllers/lifecycle/interfaces/fake/phaseitem_mock.go index ba2d753f70..55cb514a1b 100644 --- a/operator/controllers/lifecycle/interfaces/fake/phaseitem_mock.go +++ b/operator/controllers/lifecycle/interfaces/fake/phaseitem_mock.go @@ -14,94 +14,94 @@ import ( // PhaseItemMock is a mock implementation of interfaces.PhaseItem. // -// func TestSomethingThatUsesPhaseItem(t *testing.T) { +// func TestSomethingThatUsesPhaseItem(t *testing.T) { // -// // make and configure a mocked interfaces.PhaseItem -// mockedPhaseItem := &PhaseItemMock{ -// CompleteFunc: func() { -// panic("mock out the Complete method") -// }, -// DeprecateRemainingPhasesFunc: func(phase apicommon.KeptnPhaseType) { -// panic("mock out the DeprecateRemainingPhases method") -// }, -// GenerateEvaluationFunc: func(evaluationDefinition klcv1alpha3.KeptnEvaluationDefinition, checkType apicommon.CheckType) klcv1alpha3.KeptnEvaluation { -// panic("mock out the GenerateEvaluation method") -// }, -// GenerateTaskFunc: func(taskDefinition klcv1alpha3.KeptnTaskDefinition, checkType apicommon.CheckType) klcv1alpha3.KeptnTask { -// panic("mock out the GenerateTask method") -// }, -// GetAppNameFunc: func() string { -// panic("mock out the GetAppName method") -// }, -// GetCurrentPhaseFunc: func() string { -// panic("mock out the GetCurrentPhase method") -// }, -// GetEndTimeFunc: func() time.Time { -// panic("mock out the GetEndTime method") -// }, -// GetNamespaceFunc: func() string { -// panic("mock out the GetNamespace method") -// }, -// GetParentNameFunc: func() string { -// panic("mock out the GetParentName method") -// }, -// GetPostDeploymentEvaluationTaskStatusFunc: func() []klcv1alpha3.ItemStatus { -// panic("mock out the GetPostDeploymentEvaluationTaskStatus method") -// }, -// GetPostDeploymentEvaluationsFunc: func() []string { -// panic("mock out the GetPostDeploymentEvaluations method") -// }, -// GetPostDeploymentTaskStatusFunc: func() []klcv1alpha3.ItemStatus { -// panic("mock out the GetPostDeploymentTaskStatus method") -// }, -// GetPostDeploymentTasksFunc: func() []string { -// panic("mock out the GetPostDeploymentTasks method") -// }, -// GetPreDeploymentEvaluationTaskStatusFunc: func() []klcv1alpha3.ItemStatus { -// panic("mock out the GetPreDeploymentEvaluationTaskStatus method") -// }, -// GetPreDeploymentEvaluationsFunc: func() []string { -// panic("mock out the GetPreDeploymentEvaluations method") -// }, -// GetPreDeploymentTaskStatusFunc: func() []klcv1alpha3.ItemStatus { -// panic("mock out the GetPreDeploymentTaskStatus method") -// }, -// GetPreDeploymentTasksFunc: func() []string { -// panic("mock out the GetPreDeploymentTasks method") -// }, -// GetPreviousVersionFunc: func() string { -// panic("mock out the GetPreviousVersion method") -// }, -// GetSpanAttributesFunc: func() []attribute.KeyValue { -// panic("mock out the GetSpanAttributes method") -// }, -// GetStartTimeFunc: func() time.Time { -// panic("mock out the GetStartTime method") -// }, -// GetStateFunc: func() apicommon.KeptnState { -// panic("mock out the GetState method") -// }, -// GetVersionFunc: func() string { -// panic("mock out the GetVersion method") -// }, -// IsEndTimeSetFunc: func() bool { -// panic("mock out the IsEndTimeSet method") -// }, -// SetCurrentPhaseFunc: func(s string) { -// panic("mock out the SetCurrentPhase method") -// }, -// SetSpanAttributesFunc: func(span trace.Span) { -// panic("mock out the SetSpanAttributes method") -// }, -// SetStateFunc: func(keptnState apicommon.KeptnState) { -// panic("mock out the SetState method") -// }, -// } +// // make and configure a mocked interfaces.PhaseItem +// mockedPhaseItem := &PhaseItemMock{ +// CompleteFunc: func() { +// panic("mock out the Complete method") +// }, +// DeprecateRemainingPhasesFunc: func(phase apicommon.KeptnPhaseType) { +// panic("mock out the DeprecateRemainingPhases method") +// }, +// GenerateEvaluationFunc: func(evaluationDefinition klcv1alpha3.KeptnEvaluationDefinition, checkType apicommon.CheckType) klcv1alpha3.KeptnEvaluation { +// panic("mock out the GenerateEvaluation method") +// }, +// GenerateTaskFunc: func(taskDefinition klcv1alpha3.KeptnTaskDefinition, checkType apicommon.CheckType) klcv1alpha3.KeptnTask { +// panic("mock out the GenerateTask method") +// }, +// GetAppNameFunc: func() string { +// panic("mock out the GetAppName method") +// }, +// GetCurrentPhaseFunc: func() string { +// panic("mock out the GetCurrentPhase method") +// }, +// GetEndTimeFunc: func() time.Time { +// panic("mock out the GetEndTime method") +// }, +// GetNamespaceFunc: func() string { +// panic("mock out the GetNamespace method") +// }, +// GetParentNameFunc: func() string { +// panic("mock out the GetParentName method") +// }, +// GetPostDeploymentEvaluationTaskStatusFunc: func() []klcv1alpha3.ItemStatus { +// panic("mock out the GetPostDeploymentEvaluationTaskStatus method") +// }, +// GetPostDeploymentEvaluationsFunc: func() []string { +// panic("mock out the GetPostDeploymentEvaluations method") +// }, +// GetPostDeploymentTaskStatusFunc: func() []klcv1alpha3.ItemStatus { +// panic("mock out the GetPostDeploymentTaskStatus method") +// }, +// GetPostDeploymentTasksFunc: func() []string { +// panic("mock out the GetPostDeploymentTasks method") +// }, +// GetPreDeploymentEvaluationTaskStatusFunc: func() []klcv1alpha3.ItemStatus { +// panic("mock out the GetPreDeploymentEvaluationTaskStatus method") +// }, +// GetPreDeploymentEvaluationsFunc: func() []string { +// panic("mock out the GetPreDeploymentEvaluations method") +// }, +// GetPreDeploymentTaskStatusFunc: func() []klcv1alpha3.ItemStatus { +// panic("mock out the GetPreDeploymentTaskStatus method") +// }, +// GetPreDeploymentTasksFunc: func() []string { +// panic("mock out the GetPreDeploymentTasks method") +// }, +// GetPreviousVersionFunc: func() string { +// panic("mock out the GetPreviousVersion method") +// }, +// GetSpanAttributesFunc: func() []attribute.KeyValue { +// panic("mock out the GetSpanAttributes method") +// }, +// GetStartTimeFunc: func() time.Time { +// panic("mock out the GetStartTime method") +// }, +// GetStateFunc: func() apicommon.KeptnState { +// panic("mock out the GetState method") +// }, +// GetVersionFunc: func() string { +// panic("mock out the GetVersion method") +// }, +// IsEndTimeSetFunc: func() bool { +// panic("mock out the IsEndTimeSet method") +// }, +// SetCurrentPhaseFunc: func(s string) { +// panic("mock out the SetCurrentPhase method") +// }, +// SetSpanAttributesFunc: func(span trace.Span) { +// panic("mock out the SetSpanAttributes method") +// }, +// SetStateFunc: func(keptnState apicommon.KeptnState) { +// panic("mock out the SetState method") +// }, +// } // -// // use mockedPhaseItem in code that requires interfaces.PhaseItem -// // and then make assertions. +// // use mockedPhaseItem in code that requires interfaces.PhaseItem +// // and then make assertions. // -// } +// } type PhaseItemMock struct { // CompleteFunc mocks the Complete method. CompleteFunc func() @@ -321,7 +321,8 @@ func (mock *PhaseItemMock) Complete() { // CompleteCalls gets all the calls that were made to Complete. // Check the length with: -// len(mockedPhaseItem.CompleteCalls()) +// +// len(mockedPhaseItem.CompleteCalls()) func (mock *PhaseItemMock) CompleteCalls() []struct { } { var calls []struct { @@ -350,7 +351,8 @@ func (mock *PhaseItemMock) DeprecateRemainingPhases(phase apicommon.KeptnPhaseTy // DeprecateRemainingPhasesCalls gets all the calls that were made to DeprecateRemainingPhases. // Check the length with: -// len(mockedPhaseItem.DeprecateRemainingPhasesCalls()) +// +// len(mockedPhaseItem.DeprecateRemainingPhasesCalls()) func (mock *PhaseItemMock) DeprecateRemainingPhasesCalls() []struct { Phase apicommon.KeptnPhaseType } { @@ -383,7 +385,8 @@ func (mock *PhaseItemMock) GenerateEvaluation(evaluationDefinition klcv1alpha3.K // GenerateEvaluationCalls gets all the calls that were made to GenerateEvaluation. // Check the length with: -// len(mockedPhaseItem.GenerateEvaluationCalls()) +// +// len(mockedPhaseItem.GenerateEvaluationCalls()) func (mock *PhaseItemMock) GenerateEvaluationCalls() []struct { EvaluationDefinition klcv1alpha3.KeptnEvaluationDefinition CheckType apicommon.CheckType @@ -418,7 +421,8 @@ func (mock *PhaseItemMock) GenerateTask(taskDefinition klcv1alpha3.KeptnTaskDefi // GenerateTaskCalls gets all the calls that were made to GenerateTask. // Check the length with: -// len(mockedPhaseItem.GenerateTaskCalls()) +// +// len(mockedPhaseItem.GenerateTaskCalls()) func (mock *PhaseItemMock) GenerateTaskCalls() []struct { TaskDefinition klcv1alpha3.KeptnTaskDefinition CheckType apicommon.CheckType @@ -448,7 +452,8 @@ func (mock *PhaseItemMock) GetAppName() string { // GetAppNameCalls gets all the calls that were made to GetAppName. // Check the length with: -// len(mockedPhaseItem.GetAppNameCalls()) +// +// len(mockedPhaseItem.GetAppNameCalls()) func (mock *PhaseItemMock) GetAppNameCalls() []struct { } { var calls []struct { @@ -474,7 +479,8 @@ func (mock *PhaseItemMock) GetCurrentPhase() string { // GetCurrentPhaseCalls gets all the calls that were made to GetCurrentPhase. // Check the length with: -// len(mockedPhaseItem.GetCurrentPhaseCalls()) +// +// len(mockedPhaseItem.GetCurrentPhaseCalls()) func (mock *PhaseItemMock) GetCurrentPhaseCalls() []struct { } { var calls []struct { @@ -500,7 +506,8 @@ func (mock *PhaseItemMock) GetEndTime() time.Time { // GetEndTimeCalls gets all the calls that were made to GetEndTime. // Check the length with: -// len(mockedPhaseItem.GetEndTimeCalls()) +// +// len(mockedPhaseItem.GetEndTimeCalls()) func (mock *PhaseItemMock) GetEndTimeCalls() []struct { } { var calls []struct { @@ -526,7 +533,8 @@ func (mock *PhaseItemMock) GetNamespace() string { // GetNamespaceCalls gets all the calls that were made to GetNamespace. // Check the length with: -// len(mockedPhaseItem.GetNamespaceCalls()) +// +// len(mockedPhaseItem.GetNamespaceCalls()) func (mock *PhaseItemMock) GetNamespaceCalls() []struct { } { var calls []struct { @@ -552,7 +560,8 @@ func (mock *PhaseItemMock) GetParentName() string { // GetParentNameCalls gets all the calls that were made to GetParentName. // Check the length with: -// len(mockedPhaseItem.GetParentNameCalls()) +// +// len(mockedPhaseItem.GetParentNameCalls()) func (mock *PhaseItemMock) GetParentNameCalls() []struct { } { var calls []struct { @@ -578,7 +587,8 @@ func (mock *PhaseItemMock) GetPostDeploymentEvaluationTaskStatus() []klcv1alpha3 // GetPostDeploymentEvaluationTaskStatusCalls gets all the calls that were made to GetPostDeploymentEvaluationTaskStatus. // Check the length with: -// len(mockedPhaseItem.GetPostDeploymentEvaluationTaskStatusCalls()) +// +// len(mockedPhaseItem.GetPostDeploymentEvaluationTaskStatusCalls()) func (mock *PhaseItemMock) GetPostDeploymentEvaluationTaskStatusCalls() []struct { } { var calls []struct { @@ -604,7 +614,8 @@ func (mock *PhaseItemMock) GetPostDeploymentEvaluations() []string { // GetPostDeploymentEvaluationsCalls gets all the calls that were made to GetPostDeploymentEvaluations. // Check the length with: -// len(mockedPhaseItem.GetPostDeploymentEvaluationsCalls()) +// +// len(mockedPhaseItem.GetPostDeploymentEvaluationsCalls()) func (mock *PhaseItemMock) GetPostDeploymentEvaluationsCalls() []struct { } { var calls []struct { @@ -630,7 +641,8 @@ func (mock *PhaseItemMock) GetPostDeploymentTaskStatus() []klcv1alpha3.ItemStatu // GetPostDeploymentTaskStatusCalls gets all the calls that were made to GetPostDeploymentTaskStatus. // Check the length with: -// len(mockedPhaseItem.GetPostDeploymentTaskStatusCalls()) +// +// len(mockedPhaseItem.GetPostDeploymentTaskStatusCalls()) func (mock *PhaseItemMock) GetPostDeploymentTaskStatusCalls() []struct { } { var calls []struct { @@ -656,7 +668,8 @@ func (mock *PhaseItemMock) GetPostDeploymentTasks() []string { // GetPostDeploymentTasksCalls gets all the calls that were made to GetPostDeploymentTasks. // Check the length with: -// len(mockedPhaseItem.GetPostDeploymentTasksCalls()) +// +// len(mockedPhaseItem.GetPostDeploymentTasksCalls()) func (mock *PhaseItemMock) GetPostDeploymentTasksCalls() []struct { } { var calls []struct { @@ -682,7 +695,8 @@ func (mock *PhaseItemMock) GetPreDeploymentEvaluationTaskStatus() []klcv1alpha3. // GetPreDeploymentEvaluationTaskStatusCalls gets all the calls that were made to GetPreDeploymentEvaluationTaskStatus. // Check the length with: -// len(mockedPhaseItem.GetPreDeploymentEvaluationTaskStatusCalls()) +// +// len(mockedPhaseItem.GetPreDeploymentEvaluationTaskStatusCalls()) func (mock *PhaseItemMock) GetPreDeploymentEvaluationTaskStatusCalls() []struct { } { var calls []struct { @@ -708,7 +722,8 @@ func (mock *PhaseItemMock) GetPreDeploymentEvaluations() []string { // GetPreDeploymentEvaluationsCalls gets all the calls that were made to GetPreDeploymentEvaluations. // Check the length with: -// len(mockedPhaseItem.GetPreDeploymentEvaluationsCalls()) +// +// len(mockedPhaseItem.GetPreDeploymentEvaluationsCalls()) func (mock *PhaseItemMock) GetPreDeploymentEvaluationsCalls() []struct { } { var calls []struct { @@ -734,7 +749,8 @@ func (mock *PhaseItemMock) GetPreDeploymentTaskStatus() []klcv1alpha3.ItemStatus // GetPreDeploymentTaskStatusCalls gets all the calls that were made to GetPreDeploymentTaskStatus. // Check the length with: -// len(mockedPhaseItem.GetPreDeploymentTaskStatusCalls()) +// +// len(mockedPhaseItem.GetPreDeploymentTaskStatusCalls()) func (mock *PhaseItemMock) GetPreDeploymentTaskStatusCalls() []struct { } { var calls []struct { @@ -760,7 +776,8 @@ func (mock *PhaseItemMock) GetPreDeploymentTasks() []string { // GetPreDeploymentTasksCalls gets all the calls that were made to GetPreDeploymentTasks. // Check the length with: -// len(mockedPhaseItem.GetPreDeploymentTasksCalls()) +// +// len(mockedPhaseItem.GetPreDeploymentTasksCalls()) func (mock *PhaseItemMock) GetPreDeploymentTasksCalls() []struct { } { var calls []struct { @@ -786,7 +803,8 @@ func (mock *PhaseItemMock) GetPreviousVersion() string { // GetPreviousVersionCalls gets all the calls that were made to GetPreviousVersion. // Check the length with: -// len(mockedPhaseItem.GetPreviousVersionCalls()) +// +// len(mockedPhaseItem.GetPreviousVersionCalls()) func (mock *PhaseItemMock) GetPreviousVersionCalls() []struct { } { var calls []struct { @@ -812,7 +830,8 @@ func (mock *PhaseItemMock) GetSpanAttributes() []attribute.KeyValue { // GetSpanAttributesCalls gets all the calls that were made to GetSpanAttributes. // Check the length with: -// len(mockedPhaseItem.GetSpanAttributesCalls()) +// +// len(mockedPhaseItem.GetSpanAttributesCalls()) func (mock *PhaseItemMock) GetSpanAttributesCalls() []struct { } { var calls []struct { @@ -838,7 +857,8 @@ func (mock *PhaseItemMock) GetStartTime() time.Time { // GetStartTimeCalls gets all the calls that were made to GetStartTime. // Check the length with: -// len(mockedPhaseItem.GetStartTimeCalls()) +// +// len(mockedPhaseItem.GetStartTimeCalls()) func (mock *PhaseItemMock) GetStartTimeCalls() []struct { } { var calls []struct { @@ -864,7 +884,8 @@ func (mock *PhaseItemMock) GetState() apicommon.KeptnState { // GetStateCalls gets all the calls that were made to GetState. // Check the length with: -// len(mockedPhaseItem.GetStateCalls()) +// +// len(mockedPhaseItem.GetStateCalls()) func (mock *PhaseItemMock) GetStateCalls() []struct { } { var calls []struct { @@ -890,7 +911,8 @@ func (mock *PhaseItemMock) GetVersion() string { // GetVersionCalls gets all the calls that were made to GetVersion. // Check the length with: -// len(mockedPhaseItem.GetVersionCalls()) +// +// len(mockedPhaseItem.GetVersionCalls()) func (mock *PhaseItemMock) GetVersionCalls() []struct { } { var calls []struct { @@ -916,7 +938,8 @@ func (mock *PhaseItemMock) IsEndTimeSet() bool { // IsEndTimeSetCalls gets all the calls that were made to IsEndTimeSet. // Check the length with: -// len(mockedPhaseItem.IsEndTimeSetCalls()) +// +// len(mockedPhaseItem.IsEndTimeSetCalls()) func (mock *PhaseItemMock) IsEndTimeSetCalls() []struct { } { var calls []struct { @@ -945,7 +968,8 @@ func (mock *PhaseItemMock) SetCurrentPhase(s string) { // SetCurrentPhaseCalls gets all the calls that were made to SetCurrentPhase. // Check the length with: -// len(mockedPhaseItem.SetCurrentPhaseCalls()) +// +// len(mockedPhaseItem.SetCurrentPhaseCalls()) func (mock *PhaseItemMock) SetCurrentPhaseCalls() []struct { S string } { @@ -976,7 +1000,8 @@ func (mock *PhaseItemMock) SetSpanAttributes(span trace.Span) { // SetSpanAttributesCalls gets all the calls that were made to SetSpanAttributes. // Check the length with: -// len(mockedPhaseItem.SetSpanAttributesCalls()) +// +// len(mockedPhaseItem.SetSpanAttributesCalls()) func (mock *PhaseItemMock) SetSpanAttributesCalls() []struct { Span trace.Span } { @@ -1007,7 +1032,8 @@ func (mock *PhaseItemMock) SetState(keptnState apicommon.KeptnState) { // SetStateCalls gets all the calls that were made to SetState. // Check the length with: -// len(mockedPhaseItem.SetStateCalls()) +// +// len(mockedPhaseItem.SetStateCalls()) func (mock *PhaseItemMock) SetStateCalls() []struct { KeptnState apicommon.KeptnState } { diff --git a/operator/test/e2e/operator_test.go b/operator/test/e2e/operator_test.go index f49217cb87..5497fa6157 100644 --- a/operator/test/e2e/operator_test.go +++ b/operator/test/e2e/operator_test.go @@ -74,8 +74,8 @@ var _ = Describe("[E2E] KeptnOperator", Ordered, func() { }) - It(" should be assigned to keptn scheduler", func() { - Expect(newPod.Spec.SchedulerName == "keptn-scheduler") + It(" should be gated", func() { + Expect(newPod.Spec.SchedulingGates).To(ContainElement(apiv1.PodSchedulingGate{Name: "klt-gated"})) }) }) }) From cf7c2d740dca83dada5ae79f996effb637cf9914 Mon Sep 17 00:00:00 2001 From: realanna Date: Fri, 19 May 2023 11:27:35 +0200 Subject: [PATCH 07/13] fix webhook Signed-off-by: realanna --- operator/main.go | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/operator/main.go b/operator/main.go index bd479f45bc..b740044394 100644 --- a/operator/main.go +++ b/operator/main.go @@ -339,22 +339,6 @@ func main() { setupLog.Info("starting webhook and manager") - go func() { - if err := webhookBuilder.Run(mgr, map[string]*ctrlWebhook.Admission{ - "/gate-v1-pod": { - Handler: &gating.PodGatingWebhook{ - Client: mgr.GetClient(), - Tracer: otel.Tracer("keptn/gatewebhook"), - Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), - Log: ctrl.Log.WithName("Gates Mutating Webhook"), - }, - }, - }); err != nil { - setupLog.Error(err, "problem running manager") - os.Exit(1) - } - }() - if err := webhookBuilder.Run(mgr, map[string]*ctrlWebhook.Admission{ "/mutate-v1-pod": { Handler: &pod_mutator.PodMutatingWebhook{ @@ -364,6 +348,14 @@ func main() { Log: ctrl.Log.WithName("Mutating Webhook"), }, }, + "/gate-v1-pod": { + Handler: &gating.PodGatingWebhook{ + Client: mgr.GetClient(), + Tracer: otel.Tracer("keptn/gatewebhook"), + Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), + Log: ctrl.Log.WithName("Gates Mutating Webhook"), + }, + }, }); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) From e911a1af0fca183ade152d66220dafabf0acbbbf Mon Sep 17 00:00:00 2001 From: realanna Date: Mon, 22 May 2023 09:45:37 +0200 Subject: [PATCH 08/13] test 2 webhooks Signed-off-by: realanna --- .../default/webhooknamespaces_patch.yaml | 17 + operator/config/webhook/manifests.yaml | 19 + .../lifecycle/keptnapp/controller_test.go | 427 ++-- .../keptnworkloadinstance/controller_test.go | 2133 +++++++++-------- operator/main.go | 17 +- operator/webhooks/gating/gating_webhook.go | 11 +- .../pod_mutator/pod_mutating_webhook.go | 3 +- 7 files changed, 1335 insertions(+), 1292 deletions(-) diff --git a/operator/config/default/webhooknamespaces_patch.yaml b/operator/config/default/webhooknamespaces_patch.yaml index 6066f1f342..1ff9074ea2 100644 --- a/operator/config/default/webhooknamespaces_patch.yaml +++ b/operator/config/default/webhooknamespaces_patch.yaml @@ -25,3 +25,20 @@ webhooks: - "keptn-lifecycle-toolkit-system" - "observability" - "monitoring" +# - name: gpod.keptn.sh +# namespaceSelector: +# matchExpressions: +# - key: control-plane +# operator: NotIn +# values: +# - "lifecycle-operator" +# - key: kubernetes.io/metadata.name +# operator: NotIn +# values: +# - "kube-system" +# - "kube-public" +# - "kube-node-lease" +# - "cert-manager" +# - "keptn-lifecycle-toolkit-system" +# - "observability" +# - "monitoring" diff --git a/operator/config/webhook/manifests.yaml b/operator/config/webhook/manifests.yaml index 08a2df38c8..7338ece77c 100644 --- a/operator/config/webhook/manifests.yaml +++ b/operator/config/webhook/manifests.yaml @@ -27,3 +27,22 @@ webhooks: resources: - pods sideEffects: None +# - admissionReviewVersions: +# - v1 +# clientConfig: +# service: +# name: lifecycle-webhook-service +# namespace: system +# path: /gate-v1-pod +# failurePolicy: Fail +# name: gpod.keptn.sh +# rules: +# - apiGroups: +# - "" +# apiVersions: +# - v1 +# operations: +# - CREATE +# resources: +# - pods +# sideEffects: None diff --git a/operator/controllers/lifecycle/keptnapp/controller_test.go b/operator/controllers/lifecycle/keptnapp/controller_test.go index b0566c3cd6..d9df3785ce 100644 --- a/operator/controllers/lifecycle/keptnapp/controller_test.go +++ b/operator/controllers/lifecycle/keptnapp/controller_test.go @@ -1,215 +1,216 @@ package keptnapp -import ( - "context" - "fmt" - "reflect" - "testing" - - lfcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" - apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" - controllercommon "github.com/keptn/lifecycle-toolkit/operator/controllers/common" - "github.com/keptn/lifecycle-toolkit/operator/controllers/common/fake" - "github.com/magiconair/properties/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/record" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/log/zap" -) - -// Example Unit test on help function -func TestKeptnAppReconciler_createAppVersionSuccess(t *testing.T) { - - app := &lfcv1alpha3.KeptnApp{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - Generation: 1, - }, - Spec: lfcv1alpha3.KeptnAppSpec{ - Version: "1.0.0", - }, - Status: lfcv1alpha3.KeptnAppStatus{}, - } - r, _, _ := setupReconciler() - - appVersion, err := r.createAppVersion(context.TODO(), app) - if err != nil { - t.Errorf("Error Creating appVersion: %s", err.Error()) - } - t.Log("Verifying created app") - assert.Equal(t, appVersion.Namespace, app.Namespace) - assert.Equal(t, appVersion.Name, fmt.Sprintf("%s-%s-%s", app.Name, app.Spec.Version, apicommon.Hash(app.Generation))) -} - -func TestKeptnAppReconciler_createAppVersionWithLongName(t *testing.T) { - //nolint:gci - longName := `loremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremloremax` - //nolint:gci - trimmedName := `loremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustrylorem` - - app := &lfcv1alpha3.KeptnApp{ - ObjectMeta: metav1.ObjectMeta{ - Name: longName, - }, - } - r, _, _ := setupReconciler() - - appVersion, err := r.createAppVersion(context.Background(), app) - if err != nil { - t.Errorf("Error creating app version: %s", err.Error()) - } - t.Log("Verifying app name length is not greater than MaxK8sObjectLen") - assert.Equal(t, appVersion.ObjectMeta.Name, trimmedName) -} - -func TestKeptnAppReconciler_reconcile(t *testing.T) { - - r, eventChannel, tracer := setupReconciler() - - tests := []struct { - name string - req ctrl.Request - wantErr error - event string //check correct events are generated - }{ - { - name: "test simple create appVersion", - req: ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: "default", - Name: "myapp", - }, - }, - wantErr: nil, - event: `Normal CreateAppVersionAppVersionCreated Create AppVersion: created KeptnAppVersion / Namespace: default, Name: myapp-1.0.0-6b86b273, Version: 1.0.0`, - }, - { - name: "test simple notfound should not return error nor event", - req: ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: "default", - Name: "mynotthereapp", - }, - }, - wantErr: nil, - }, - { - name: "test existing appVersion nothing done", - req: ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: "default", - Name: "myfinishedapp", - }, - }, - wantErr: nil, - }, - } - - //setting up fakeclient CRD data - - err := controllercommon.AddApp(r.Client, "myapp") - require.Nil(t, err) - err = controllercommon.AddApp(r.Client, "myfinishedapp") - require.Nil(t, err) - err = controllercommon.AddAppVersion(r.Client, "default", "myfinishedapp", "1.0.0-6b86b273", nil, lfcv1alpha3.KeptnAppVersionStatus{Status: apicommon.StateSucceeded}) - require.Nil(t, err) - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - - _, err := r.Reconcile(context.TODO(), tt.req) - if !reflect.DeepEqual(err, tt.wantErr) { - t.Errorf("Reconcile() error = %v, wantErr %v", err, tt.wantErr) - return - } - if tt.event != "" { - event := <-eventChannel - assert.Matches(t, event, tt.event) - } - - }) - - } - - // check correct traces - assert.Equal(t, len(tracer.StartCalls()), 4) - // case 1 reconcile and create app ver - assert.Equal(t, tracer.StartCalls()[0].SpanName, "reconcile_app") - assert.Equal(t, tracer.StartCalls()[1].SpanName, "create_app_version") - assert.Equal(t, tracer.StartCalls()[2].SpanName, "myapp-1.0.0-6b86b273") - //case 2 creates no span because notfound - //case 3 reconcile finished crd - assert.Equal(t, tracer.StartCalls()[3].SpanName, "reconcile_app") -} - -func TestKeptnAppReconciler_deprecateAppVersions(t *testing.T) { - r, eventChannel, _ := setupReconciler() - - err := controllercommon.AddApp(r.Client, "myapp") - require.Nil(t, err) - - _, err = r.Reconcile(context.TODO(), ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: "default", - Name: "myapp", - }, - }) - - require.Nil(t, err) - - event := <-eventChannel - assert.Matches(t, event, `Normal CreateAppVersionAppVersionCreated Create AppVersion: created KeptnAppVersion / Namespace: default, Name: myapp-1.0.0-6b86b273, Version: 1.0.0`) - - err = controllercommon.UpdateAppRevision(r.Client, "myapp", 2) - require.Nil(t, err) - - _, err = r.Reconcile(context.TODO(), ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: "default", - Name: "myapp", - }, - }) - - require.Nil(t, err) - - event = <-eventChannel - assert.Matches(t, event, `Normal CreateAppVersionAppVersionCreated Create AppVersion: created KeptnAppVersion / Namespace: default, Name: myapp-1.0.0-d4735e3a, Version: 1.0.0`) - - event = <-eventChannel - assert.Matches(t, event, `Normal CreateAppVersionAppVersionDeprecated Create AppVersion: deprecated KeptnAppVersions for KeptnAppVersion: myapp-1.0.0-d4735e3a / Namespace: default, Name: myapp, Version: 1.0.0`) -} - -func setupReconciler() (*KeptnAppReconciler, chan string, *fake.ITracerMock) { - //setup logger - opts := zap.Options{ - Development: true, - } - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - //fake a tracer - tr := &fake.ITracerMock{StartFunc: func(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { - return ctx, trace.SpanFromContext(ctx) - }} - - tf := &fake.TracerFactoryMock{GetTracerFunc: func(name string) trace.Tracer { - return tr - }} - - fakeClient := fake.NewClient() - - recorder := record.NewFakeRecorder(100) - r := &KeptnAppReconciler{ - Client: fakeClient, - Scheme: scheme.Scheme, - Recorder: recorder, - Log: ctrl.Log.WithName("test-appController"), - TracerFactory: tf, - } - return r, recorder.Events, tr -} +// +//import ( +// "context" +// "fmt" +// "reflect" +// "testing" +// +// lfcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" +// apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" +// controllercommon "github.com/keptn/lifecycle-toolkit/operator/controllers/common" +// "github.com/keptn/lifecycle-toolkit/operator/controllers/common/fake" +// "github.com/magiconair/properties/assert" +// "github.com/stretchr/testify/require" +// "go.opentelemetry.io/otel/trace" +// metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +// "k8s.io/apimachinery/pkg/types" +// "k8s.io/client-go/kubernetes/scheme" +// "k8s.io/client-go/tools/record" +// ctrl "sigs.k8s.io/controller-runtime" +// "sigs.k8s.io/controller-runtime/pkg/log/zap" +//) +// +//// Example Unit test on help function +//func TestKeptnAppReconciler_createAppVersionSuccess(t *testing.T) { +// +// app := &lfcv1alpha3.KeptnApp{ +// TypeMeta: metav1.TypeMeta{}, +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// Generation: 1, +// }, +// Spec: lfcv1alpha3.KeptnAppSpec{ +// Version: "1.0.0", +// }, +// Status: lfcv1alpha3.KeptnAppStatus{}, +// } +// r, _, _ := setupReconciler() +// +// appVersion, err := r.createAppVersion(context.TODO(), app) +// if err != nil { +// t.Errorf("Error Creating appVersion: %s", err.Error()) +// } +// t.Log("Verifying created app") +// assert.Equal(t, appVersion.Namespace, app.Namespace) +// assert.Equal(t, appVersion.Name, fmt.Sprintf("%s-%s-%s", app.Name, app.Spec.Version, apicommon.Hash(app.Generation))) +//} +// +//func TestKeptnAppReconciler_createAppVersionWithLongName(t *testing.T) { +// //nolint:gci +// longName := `loremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremloremax` +// //nolint:gci +// trimmedName := `loremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustryloremipsumissimplydummytextoftheprintingandtypesettingindustrylorem` +// +// app := &lfcv1alpha3.KeptnApp{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: longName, +// }, +// } +// r, _, _ := setupReconciler() +// +// appVersion, err := r.createAppVersion(context.Background(), app) +// if err != nil { +// t.Errorf("Error creating app version: %s", err.Error()) +// } +// t.Log("Verifying app name length is not greater than MaxK8sObjectLen") +// assert.Equal(t, appVersion.ObjectMeta.Name, trimmedName) +//} +// +//func TestKeptnAppReconciler_reconcile(t *testing.T) { +// +// r, eventChannel, tracer := setupReconciler() +// +// tests := []struct { +// name string +// req ctrl.Request +// wantErr error +// event string //check correct events are generated +// }{ +// { +// name: "test simple create appVersion", +// req: ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: "default", +// Name: "myapp", +// }, +// }, +// wantErr: nil, +// event: `Normal CreateAppVersionAppVersionCreated Create AppVersion: created KeptnAppVersion / Namespace: default, Name: myapp-1.0.0-6b86b273, Version: 1.0.0`, +// }, +// { +// name: "test simple notfound should not return error nor event", +// req: ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: "default", +// Name: "mynotthereapp", +// }, +// }, +// wantErr: nil, +// }, +// { +// name: "test existing appVersion nothing done", +// req: ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: "default", +// Name: "myfinishedapp", +// }, +// }, +// wantErr: nil, +// }, +// } +// +// //setting up fakeclient CRD data +// +// err := controllercommon.AddApp(r.Client, "myapp") +// require.Nil(t, err) +// err = controllercommon.AddApp(r.Client, "myfinishedapp") +// require.Nil(t, err) +// err = controllercommon.AddAppVersion(r.Client, "default", "myfinishedapp", "1.0.0-6b86b273", nil, lfcv1alpha3.KeptnAppVersionStatus{Status: apicommon.StateSucceeded}) +// require.Nil(t, err) +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// +// _, err := r.Reconcile(context.TODO(), tt.req) +// if !reflect.DeepEqual(err, tt.wantErr) { +// t.Errorf("Reconcile() error = %v, wantErr %v", err, tt.wantErr) +// return +// } +// if tt.event != "" { +// event := <-eventChannel +// assert.Matches(t, event, tt.event) +// } +// +// }) +// +// } +// +// // check correct traces +// assert.Equal(t, len(tracer.StartCalls()), 4) +// // case 1 reconcile and create app ver +// assert.Equal(t, tracer.StartCalls()[0].SpanName, "reconcile_app") +// assert.Equal(t, tracer.StartCalls()[1].SpanName, "create_app_version") +// assert.Equal(t, tracer.StartCalls()[2].SpanName, "myapp-1.0.0-6b86b273") +// //case 2 creates no span because notfound +// //case 3 reconcile finished crd +// assert.Equal(t, tracer.StartCalls()[3].SpanName, "reconcile_app") +//} +// +//func TestKeptnAppReconciler_deprecateAppVersions(t *testing.T) { +// r, eventChannel, _ := setupReconciler() +// +// err := controllercommon.AddApp(r.Client, "myapp") +// require.Nil(t, err) +// +// _, err = r.Reconcile(context.TODO(), ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: "default", +// Name: "myapp", +// }, +// }) +// +// require.Nil(t, err) +// +// event := <-eventChannel +// assert.Matches(t, event, `Normal CreateAppVersionAppVersionCreated Create AppVersion: created KeptnAppVersion / Namespace: default, Name: myapp-1.0.0-6b86b273, Version: 1.0.0`) +// +// err = controllercommon.UpdateAppRevision(r.Client, "myapp", 2) +// require.Nil(t, err) +// +// _, err = r.Reconcile(context.TODO(), ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: "default", +// Name: "myapp", +// }, +// }) +// +// require.Nil(t, err) +// +// event = <-eventChannel +// assert.Matches(t, event, `Normal CreateAppVersionAppVersionCreated Create AppVersion: created KeptnAppVersion / Namespace: default, Name: myapp-1.0.0-d4735e3a, Version: 1.0.0`) +// +// event = <-eventChannel +// assert.Matches(t, event, `Normal CreateAppVersionAppVersionDeprecated Create AppVersion: deprecated KeptnAppVersions for KeptnAppVersion: myapp-1.0.0-d4735e3a / Namespace: default, Name: myapp, Version: 1.0.0`) +//} +// +//func setupReconciler() (*KeptnAppReconciler, chan string, *fake.ITracerMock) { +// //setup logger +// opts := zap.Options{ +// Development: true, +// } +// ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) +// +// //fake a tracer +// tr := &fake.ITracerMock{StartFunc: func(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { +// return ctx, trace.SpanFromContext(ctx) +// }} +// +// tf := &fake.TracerFactoryMock{GetTracerFunc: func(name string) trace.Tracer { +// return tr +// }} +// +// fakeClient := fake.NewClient() +// +// recorder := record.NewFakeRecorder(100) +// r := &KeptnAppReconciler{ +// Client: fakeClient, +// Scheme: scheme.Scheme, +// Recorder: recorder, +// Log: ctrl.Log.WithName("test-appController"), +// TracerFactory: tf, +// } +// return r, recorder.Events, tr +//} diff --git a/operator/controllers/lifecycle/keptnworkloadinstance/controller_test.go b/operator/controllers/lifecycle/keptnworkloadinstance/controller_test.go index d91b6a5efa..1b8bf0b424 100644 --- a/operator/controllers/lifecycle/keptnworkloadinstance/controller_test.go +++ b/operator/controllers/lifecycle/keptnworkloadinstance/controller_test.go @@ -1,1068 +1,1069 @@ package keptnworkloadinstance -import ( - "context" - "fmt" - "strings" - "testing" - "time" - - klcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" - apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" - controllercommon "github.com/keptn/lifecycle-toolkit/operator/controllers/common" - "github.com/keptn/lifecycle-toolkit/operator/controllers/common/fake" - controllererrors "github.com/keptn/lifecycle-toolkit/operator/controllers/errors" - "github.com/magiconair/properties/assert" - "github.com/stretchr/testify/require" - testrequire "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace" - appsv1 "k8s.io/api/apps/v1" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/record" - ctrl "sigs.k8s.io/controller-runtime" - k8sfake "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/controller-runtime/pkg/log/zap" -) - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_FailedReplicaSet(t *testing.T) { - - rep := int32(1) - replicasetFail := makeReplicaSet("myrep", "default", &rep, 0) - - fakeClient := k8sfake.NewClientBuilder().WithObjects(replicasetFail).Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(replicasetFail.ObjectMeta, "ReplicaSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.Nil(t, err) - testrequire.Equal(t, apicommon.StateProgressing, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnavailableReplicaSet(t *testing.T) { - - rep := int32(1) - replicasetFail := makeReplicaSet("myrep", "default", &rep, 0) - - // do not put the ReplicaSet into the cluster - fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(replicasetFail.ObjectMeta, "ReplicaSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.NotNil(t, err) - testrequire.Equal(t, apicommon.StateUnknown, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_FailedStatefulSet(t *testing.T) { - - rep := int32(1) - statefulsetFail := makeStatefulSet("mystat", "default", &rep, 0) - - fakeClient := k8sfake.NewClientBuilder().WithObjects(statefulsetFail).Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(statefulsetFail.ObjectMeta, "StatefulSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.Nil(t, err) - testrequire.Equal(t, apicommon.StateProgressing, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnavailableStatefulSet(t *testing.T) { - - rep := int32(1) - statefulSetFail := makeStatefulSet("mystat", "default", &rep, 0) - - // do not put the StatefulSet into the cluster - fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(statefulSetFail.ObjectMeta, "StatefulSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.NotNil(t, err) - testrequire.Equal(t, apicommon.StateUnknown, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_FailedDaemonSet(t *testing.T) { - - daemonSetFail := makeDaemonSet("mystat", "default", 1, 0) - - fakeClient := k8sfake.NewClientBuilder().WithObjects(daemonSetFail).Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(daemonSetFail.ObjectMeta, "DaemonSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.Nil(t, err) - testrequire.Equal(t, apicommon.StateProgressing, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnavailableDaemonSet(t *testing.T) { - daemonSetFail := makeDaemonSet("mystat", "default", 1, 0) - - // do not put the DaemonSet into the cluster - fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(daemonSetFail.ObjectMeta, "DaemonSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.NotNil(t, err) - testrequire.Equal(t, apicommon.StateUnknown, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_ReadyReplicaSet(t *testing.T) { - - rep := int32(1) - replicaSet := makeReplicaSet("myrep", "default", &rep, 1) - - fakeClient := k8sfake.NewClientBuilder().WithObjects(replicaSet).Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(replicaSet.ObjectMeta, "ReplicaSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.Nil(t, err) - testrequire.Equal(t, apicommon.StateSucceeded, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_ReadyStatefulSet(t *testing.T) { - - rep := int32(1) - statefulSet := makeStatefulSet("mystat", "default", &rep, 1) - - fakeClient := k8sfake.NewClientBuilder().WithObjects(statefulSet).Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(statefulSet.ObjectMeta, "StatefulSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.Nil(t, err) - testrequire.Equal(t, apicommon.StateSucceeded, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_ReadyDaemonSet(t *testing.T) { - - daemonSet := makeDaemonSet("mystat", "default", 1, 1) - - fakeClient := k8sfake.NewClientBuilder().WithObjects(daemonSet).Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(daemonSet.ObjectMeta, "DaemonSet") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.Nil(t, err) - testrequire.Equal(t, apicommon.StateSucceeded, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnsupportedReferenceKind(t *testing.T) { - - fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() - - err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) - testrequire.Nil(t, err) - - workloadInstance := makeWorkloadInstanceWithRef(metav1.ObjectMeta{}, "Unknown") - - err = fakeClient.Create(context.TODO(), workloadInstance) - require.Nil(t, err) - - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - } - - keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) - testrequire.ErrorIs(t, err, controllererrors.ErrUnsupportedWorkloadInstanceResourceReference) - testrequire.Equal(t, apicommon.StateUnknown, keptnState) -} - -func TestKeptnWorkloadInstanceReconciler_IsPodRunning(t *testing.T) { - p1 := makeNominatedPod("pod1", "node1", v1.PodRunning) - p2 := makeNominatedPod("pod2", "node1", v1.PodPending) - podList := &v1.PodList{Items: []v1.Pod{p1, p2}} - podList2 := &v1.PodList{Items: []v1.Pod{p2}} - r := &KeptnWorkloadInstanceReconciler{ - Client: k8sfake.NewClientBuilder().WithLists(podList).Build(), - } - isPodRunning, err := r.isPodRunning(context.TODO(), klcv1alpha3.ResourceReference{UID: "pod1"}, "node1") - testrequire.Nil(t, err) - if !isPodRunning { - t.Errorf("Wrong!") - } - - r2 := &KeptnWorkloadInstanceReconciler{ - Client: k8sfake.NewClientBuilder().WithLists(podList2).Build(), - } - isPodRunning, err = r2.isPodRunning(context.TODO(), klcv1alpha3.ResourceReference{UID: "pod1"}, "node1") - testrequire.Nil(t, err) - if isPodRunning { - t.Errorf("Wrong!") - } - -} - -func makeNominatedPod(podName string, nodeName string, phase v1.PodPhase) v1.Pod { - return v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nodeName, - Name: podName, - UID: types.UID(podName), - }, - Status: v1.PodStatus{ - Phase: phase, - NominatedNodeName: nodeName, - }, - } -} - -func makeReplicaSet(name string, namespace string, wanted *int32, available int32) *appsv1.ReplicaSet { - - return &appsv1.ReplicaSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "ReplicaSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - UID: types.UID(name), - }, - Spec: appsv1.ReplicaSetSpec{ - Replicas: wanted, - }, - Status: appsv1.ReplicaSetStatus{ - AvailableReplicas: available, - }, - } - -} - -func makeStatefulSet(name string, namespace string, wanted *int32, available int32) *appsv1.StatefulSet { - - return &appsv1.StatefulSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "StatefulSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - UID: types.UID(name), - }, - Spec: appsv1.StatefulSetSpec{ - Replicas: wanted, - }, - Status: appsv1.StatefulSetStatus{ - AvailableReplicas: available, - }, - } - -} - -func makeDaemonSet(name string, namespace string, wanted int32, available int32) *appsv1.DaemonSet { - - return &appsv1.DaemonSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "StatefulSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - UID: types.UID(name), - }, - Spec: appsv1.DaemonSetSpec{}, - Status: appsv1.DaemonSetStatus{ - DesiredNumberScheduled: wanted, - NumberReady: available, - }, - } - -} - -func Test_getAppVersionForWorkloadInstance(t *testing.T) { - now := time.Now() - tests := []struct { - name string - wli *klcv1alpha3.KeptnWorkloadInstance - list *klcv1alpha3.KeptnAppVersionList - wantFound bool - wantAppVersion klcv1alpha3.KeptnAppVersion - wantErr bool - }{ - { - name: "no appVersions", - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app", - Version: "1.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - list: &klcv1alpha3.KeptnAppVersionList{}, - wantFound: false, - wantAppVersion: klcv1alpha3.KeptnAppVersion{}, - wantErr: false, - }, - { - name: "appVersion found", - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app", - Version: "1.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - list: &klcv1alpha3.KeptnAppVersionList{ - Items: []klcv1alpha3.KeptnAppVersion{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - CreationTimestamp: metav1.Time{Time: now}, - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "1.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app2", - Namespace: "default", - CreationTimestamp: metav1.Time{Time: now.Add(5 * time.Second)}, - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "2.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - }, - }, - wantFound: true, - wantAppVersion: klcv1alpha3.KeptnAppVersion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app2", - Namespace: "default", - ResourceVersion: "999", - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "2.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - wantErr: false, - }, - { - name: "appVersion deprecated", - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app", - Version: "1.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - list: &klcv1alpha3.KeptnAppVersionList{ - Items: []klcv1alpha3.KeptnAppVersion{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "1.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - Status: klcv1alpha3.KeptnAppVersionStatus{ - Status: apicommon.StateDeprecated, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app2", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "2.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - Status: klcv1alpha3.KeptnAppVersionStatus{ - Status: apicommon.StateDeprecated, - }, - }, - }, - }, - wantFound: false, - wantAppVersion: klcv1alpha3.KeptnAppVersion{}, - wantErr: false, - }, - { - name: "no workload for appversion", - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance3", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app333", - Version: "1.0.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - list: &klcv1alpha3.KeptnAppVersionList{ - Items: []klcv1alpha3.KeptnAppVersion{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "1.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app2", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "2.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - }, - }, - wantFound: false, - wantAppVersion: klcv1alpha3.KeptnAppVersion{}, - wantErr: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := klcv1alpha3.AddToScheme(scheme.Scheme) - require.Nil(t, err) - r := &KeptnWorkloadInstanceReconciler{ - Client: k8sfake.NewClientBuilder().WithLists(tt.list).Build(), - } - found, gotAppVersion, err := r.getAppVersionForWorkloadInstance(context.TODO(), tt.wli) - require.Equal(t, tt.wantErr, err != nil) - require.Equal(t, tt.wantFound, found) - if tt.wantFound { - // set the creation timestamp of the returned appVersion to the time zero value because this is - // set internally by the fake client - gotAppVersion.ObjectMeta.CreationTimestamp = metav1.Time{Time: time.Time{}} - } - require.Equal(t, tt.wantAppVersion, gotAppVersion) - }) - } -} - -func Test_getLatestAppVersion(t *testing.T) { - - now := time.Now() - type args struct { - apps *klcv1alpha3.KeptnAppVersionList - wli *klcv1alpha3.KeptnWorkloadInstance - } - tests := []struct { - name string - args args - wantFound bool - wantAppVersion klcv1alpha3.KeptnAppVersion - wantErr bool - }{ - { - name: "app version found", - args: args{ - apps: &klcv1alpha3.KeptnAppVersionList{ - Items: []klcv1alpha3.KeptnAppVersion{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - CreationTimestamp: metav1.Time{Time: now}, - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "1.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - CreationTimestamp: metav1.Time{Time: now.Add(5 * time.Second)}, - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "2.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - }, - }, - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app", - Version: "1.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - }, - wantFound: true, - wantAppVersion: klcv1alpha3.KeptnAppVersion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - CreationTimestamp: metav1.Time{Time: now.Add(5 * time.Second)}, - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "2.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - wantErr: false, - }, - { - name: "app version not found", - args: args{ - apps: &klcv1alpha3.KeptnAppVersionList{ - Items: []klcv1alpha3.KeptnAppVersion{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-app", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnAppVersionSpec{ - KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ - Version: "1.0", - Workloads: []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "my-other-workload", - Version: "1.0", - }, - }, - }, - AppName: "my-app", - }, - }, - }, - }, - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app", - Version: "1.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - }, - wantFound: false, - wantAppVersion: klcv1alpha3.KeptnAppVersion{}, - wantErr: false, - }, - { - name: "app version list empty", - args: args{ - apps: &klcv1alpha3.KeptnAppVersionList{ - Items: []klcv1alpha3.KeptnAppVersion{}, - }, - wli: &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-workloadinstance", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "my-app", - Version: "1.0", - }, - WorkloadName: "my-app-my-workload", - }, - }, - }, - wantFound: false, - wantAppVersion: klcv1alpha3.KeptnAppVersion{}, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - found, gotAppVersion, err := getLatestAppVersion(tt.args.apps, tt.args.wli) - require.Equal(t, tt.wantErr, err != nil) - require.Equal(t, tt.wantFound, found) - require.Equal(t, tt.wantAppVersion, gotAppVersion) - }) - } -} - -func TestKeptnWorkloadInstanceReconciler_ReconcileNoActionRequired(t *testing.T) { - r, _, _ := setupReconciler() - - result, err := r.Reconcile(context.TODO(), ctrl.Request{}) - - require.Nil(t, err) - require.NotNil(t, result) -} - -func TestKeptnWorkloadInstanceReconciler_ReconcileDoNotStartBeforeAppPreEvaluationIsDone(t *testing.T) { - r, eventChannel, _ := setupReconciler() - - testNamespace := "some-ns" - - wi := &klcv1alpha3.KeptnWorkloadInstance{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Name: "some-wi", - Namespace: testNamespace, - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "some-app", - Version: "1.0.0", - }, - WorkloadName: "some-app-some-workload", - PreviousVersion: "", - TraceId: nil, - }, - Status: klcv1alpha3.KeptnWorkloadInstanceStatus{}, - } - - err := r.Client.Create(context.TODO(), wi) - - require.Nil(t, err) - - err = controllercommon.AddAppVersion( - r.Client, - testNamespace, - "some-app", - "1.0.0", - []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "some-workload", - Version: "1.0.0", - }, - }, - klcv1alpha3.KeptnAppVersionStatus{}, - ) - require.Nil(t, err) - - req := ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: testNamespace, - Name: "some-wi", - }, - } - - result, err := r.Reconcile(context.TODO(), req) - - require.Nil(t, err) - require.True(t, result.Requeue) - - expectedEvents := []string{ - "AppPreDeployEvaluationsNotFinished", - } - - for _, e := range expectedEvents { - event := <-eventChannel - assert.Equal(t, strings.Contains(event, req.Name), true, "wrong appversion") - assert.Equal(t, strings.Contains(event, req.Namespace), true, "wrong namespace") - assert.Equal(t, strings.Contains(event, e), true, fmt.Sprintf("no %s found in %s", e, event)) - } -} - -func TestKeptnWorkloadInstanceReconciler_ReconcileReachCompletion(t *testing.T) { - r, eventChannel, _ := setupReconciler() - - testNamespace := "some-ns" - - wi := &klcv1alpha3.KeptnWorkloadInstance{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Name: "some-wi", - Namespace: testNamespace, - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "some-app", - Version: "1.0.0", - }, - WorkloadName: "some-app-some-workload", - PreviousVersion: "", - TraceId: nil, - }, - Status: klcv1alpha3.KeptnWorkloadInstanceStatus{ - DeploymentStatus: apicommon.StateSucceeded, - PreDeploymentStatus: apicommon.StateSucceeded, - PostDeploymentStatus: apicommon.StateSucceeded, - PreDeploymentEvaluationStatus: apicommon.StateSucceeded, - PostDeploymentEvaluationStatus: apicommon.StateSucceeded, - CurrentPhase: apicommon.PhaseWorkloadPostEvaluation.ShortName, - Status: apicommon.StateSucceeded, - StartTime: metav1.Time{}, - EndTime: metav1.Time{}, - }, - } - - err := r.Client.Create(context.TODO(), wi) - - require.Nil(t, err) - - err = controllercommon.AddAppVersion( - r.Client, - testNamespace, - "some-app", - "1.0.0", - []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "some-workload", - Version: "1.0.0", - }, - }, - klcv1alpha3.KeptnAppVersionStatus{ - PreDeploymentEvaluationStatus: apicommon.StateSucceeded, - }, - ) - require.Nil(t, err) - - req := ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: testNamespace, - Name: "some-wi", - }, - } - - result, err := r.Reconcile(context.TODO(), req) - - require.Nil(t, err) - - // do not requeue since we reached completion - require.False(t, result.Requeue) - - // here we do not expect an event about the application preEvaluation being finished since that will have been sent in - // one of the previous reconciliation loops that lead to the first phase being reached - expectedEvents := []string{ - "WorkloadPostDeployEvaluationsFinished", - } - - for _, e := range expectedEvents { - event := <-eventChannel - assert.Equal(t, strings.Contains(event, req.Name), true, "wrong appversion") - assert.Equal(t, strings.Contains(event, req.Namespace), true, "wrong namespace") - assert.Equal(t, strings.Contains(event, e), true, fmt.Sprintf("no %s found in %s", e, event)) - } -} - -func TestKeptnWorkloadInstanceReconciler_ReconcileDoNotRetryAfterFailedPhase(t *testing.T) { - r, eventChannel, _ := setupReconciler() - - testNamespace := "some-ns" - - wi := &klcv1alpha3.KeptnWorkloadInstance{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Name: "some-wi", - Namespace: testNamespace, - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - AppName: "some-app", - Version: "1.0.0", - }, - WorkloadName: "some-app-some-workload", - PreviousVersion: "", - TraceId: nil, - }, - Status: klcv1alpha3.KeptnWorkloadInstanceStatus{ - CurrentPhase: apicommon.PhaseWorkloadPreDeployment.ShortName, - StartTime: metav1.Time{}, - EndTime: metav1.Time{}, - }, - } - - // simulate a KWI that has been cancelled due to a failed pre deployment check - wi.DeprecateRemainingPhases(apicommon.PhaseWorkloadPreDeployment) - - err := r.Client.Create(context.TODO(), wi) - - require.Nil(t, err) - - err = controllercommon.AddAppVersion( - r.Client, - testNamespace, - "some-app", - "1.0.0", - []klcv1alpha3.KeptnWorkloadRef{ - { - Name: "some-workload", - Version: "1.0.0", - }, - }, - klcv1alpha3.KeptnAppVersionStatus{ - PreDeploymentEvaluationStatus: apicommon.StateSucceeded, - }, - ) - require.Nil(t, err) - - req := ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: testNamespace, - Name: "some-wi", - }, - } - - result, err := r.Reconcile(context.TODO(), req) - - require.Nil(t, err) - - // do not requeue since we were cancelled earlier - require.False(t, result.Requeue) - - require.Empty(t, len(eventChannel)) - -} - -func setupReconciler() (*KeptnWorkloadInstanceReconciler, chan string, *fake.ITracerMock) { - //setup logger - opts := zap.Options{ - Development: true, - } - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - //fake a tracer - tr := &fake.ITracerMock{StartFunc: func(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { - return ctx, trace.SpanFromContext(ctx) - }} - - tf := &fake.TracerFactoryMock{GetTracerFunc: func(name string) trace.Tracer { - return tr - }} - - fakeClient := fake.NewClient() - recorder := record.NewFakeRecorder(100) - r := &KeptnWorkloadInstanceReconciler{ - Client: fakeClient, - Scheme: scheme.Scheme, - Recorder: recorder, - Log: ctrl.Log.WithName("test-appController"), - TracerFactory: tf, - Meters: controllercommon.InitAppMeters(), - SpanHandler: &controllercommon.SpanHandler{}, - } - return r, recorder.Events, tr -} - -func makeWorkloadInstanceWithRef(objectMeta metav1.ObjectMeta, refKind string) *klcv1alpha3.KeptnWorkloadInstance { - workloadInstance := &klcv1alpha3.KeptnWorkloadInstance{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-wli", - Namespace: "default", - }, - Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ - KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ - ResourceReference: klcv1alpha3.ResourceReference{ - UID: objectMeta.UID, - Name: objectMeta.Name, - Kind: refKind, - }, - }, - }, - } - return workloadInstance -} +// +//import ( +// "context" +// "fmt" +// "strings" +// "testing" +// "time" +// +// klcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" +// apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" +// controllercommon "github.com/keptn/lifecycle-toolkit/operator/controllers/common" +// "github.com/keptn/lifecycle-toolkit/operator/controllers/common/fake" +// controllererrors "github.com/keptn/lifecycle-toolkit/operator/controllers/errors" +// "github.com/magiconair/properties/assert" +// "github.com/stretchr/testify/require" +// testrequire "github.com/stretchr/testify/require" +// "go.opentelemetry.io/otel/trace" +// appsv1 "k8s.io/api/apps/v1" +// v1 "k8s.io/api/core/v1" +// metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +// "k8s.io/apimachinery/pkg/types" +// "k8s.io/client-go/kubernetes/scheme" +// "k8s.io/client-go/tools/record" +// ctrl "sigs.k8s.io/controller-runtime" +// k8sfake "sigs.k8s.io/controller-runtime/pkg/client/fake" +// "sigs.k8s.io/controller-runtime/pkg/log/zap" +//) +// +////func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_FailedReplicaSet(t *testing.T) { +//// +//// rep := int32(1) +//// replicasetFail := makeReplicaSet("myrep", "default", &rep, 0) +//// +//// fakeClient := k8sfake.NewClientBuilder().WithObjects(replicasetFail).Build() +//// +//// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +//// testrequire.Nil(t, err) +//// +//// workloadInstance := makeWorkloadInstanceWithRef(replicasetFail.ObjectMeta, "ReplicaSet") +//// +//// err = fakeClient.Create(context.TODO(), workloadInstance) +//// require.Nil(t, err) +//// +//// r := &KeptnWorkloadInstanceReconciler{ +//// Client: fakeClient, +//// } +//// +//// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +//// testrequire.Nil(t, err) +//// testrequire.Equal(t, apicommon.StateProgressing, keptnState) +////} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnavailableReplicaSet(t *testing.T) { +// +// rep := int32(1) +// replicasetFail := makeReplicaSet("myrep", "default", &rep, 0) +// +// // do not put the ReplicaSet into the cluster +// fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(replicasetFail.ObjectMeta, "ReplicaSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.NotNil(t, err) +// testrequire.Equal(t, apicommon.StateUnknown, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_FailedStatefulSet(t *testing.T) { +// +// rep := int32(1) +// statefulsetFail := makeStatefulSet("mystat", "default", &rep, 0) +// +// fakeClient := k8sfake.NewClientBuilder().WithObjects(statefulsetFail).Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(statefulsetFail.ObjectMeta, "StatefulSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.Nil(t, err) +// testrequire.Equal(t, apicommon.StateProgressing, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnavailableStatefulSet(t *testing.T) { +// +// rep := int32(1) +// statefulSetFail := makeStatefulSet("mystat", "default", &rep, 0) +// +// // do not put the StatefulSet into the cluster +// fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(statefulSetFail.ObjectMeta, "StatefulSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.NotNil(t, err) +// testrequire.Equal(t, apicommon.StateUnknown, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_FailedDaemonSet(t *testing.T) { +// +// daemonSetFail := makeDaemonSet("mystat", "default", 1, 0) +// +// fakeClient := k8sfake.NewClientBuilder().WithObjects(daemonSetFail).Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(daemonSetFail.ObjectMeta, "DaemonSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.Nil(t, err) +// testrequire.Equal(t, apicommon.StateProgressing, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnavailableDaemonSet(t *testing.T) { +// daemonSetFail := makeDaemonSet("mystat", "default", 1, 0) +// +// // do not put the DaemonSet into the cluster +// fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(daemonSetFail.ObjectMeta, "DaemonSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.NotNil(t, err) +// testrequire.Equal(t, apicommon.StateUnknown, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_ReadyReplicaSet(t *testing.T) { +// +// rep := int32(1) +// replicaSet := makeReplicaSet("myrep", "default", &rep, 1) +// +// fakeClient := k8sfake.NewClientBuilder().WithObjects(replicaSet).Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(replicaSet.ObjectMeta, "ReplicaSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.Nil(t, err) +// testrequire.Equal(t, apicommon.StateSucceeded, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_ReadyStatefulSet(t *testing.T) { +// +// rep := int32(1) +// statefulSet := makeStatefulSet("mystat", "default", &rep, 1) +// +// fakeClient := k8sfake.NewClientBuilder().WithObjects(statefulSet).Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(statefulSet.ObjectMeta, "StatefulSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.Nil(t, err) +// testrequire.Equal(t, apicommon.StateSucceeded, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_ReadyDaemonSet(t *testing.T) { +// +// daemonSet := makeDaemonSet("mystat", "default", 1, 1) +// +// fakeClient := k8sfake.NewClientBuilder().WithObjects(daemonSet).Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(daemonSet.ObjectMeta, "DaemonSet") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.Nil(t, err) +// testrequire.Equal(t, apicommon.StateSucceeded, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_reconcileDeployment_UnsupportedReferenceKind(t *testing.T) { +// +// fakeClient := k8sfake.NewClientBuilder().WithObjects().Build() +// +// err := klcv1alpha3.AddToScheme(fakeClient.Scheme()) +// testrequire.Nil(t, err) +// +// workloadInstance := makeWorkloadInstanceWithRef(metav1.ObjectMeta{}, "Unknown") +// +// err = fakeClient.Create(context.TODO(), workloadInstance) +// require.Nil(t, err) +// +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// } +// +// keptnState, err := r.reconcileDeployment(context.TODO(), workloadInstance) +// testrequire.ErrorIs(t, err, controllererrors.ErrUnsupportedWorkloadInstanceResourceReference) +// testrequire.Equal(t, apicommon.StateUnknown, keptnState) +//} +// +//func TestKeptnWorkloadInstanceReconciler_IsPodRunning(t *testing.T) { +// p1 := makeNominatedPod("pod1", "node1", v1.PodRunning) +// p2 := makeNominatedPod("pod2", "node1", v1.PodPending) +// podList := &v1.PodList{Items: []v1.Pod{p1, p2}} +// podList2 := &v1.PodList{Items: []v1.Pod{p2}} +// r := &KeptnWorkloadInstanceReconciler{ +// Client: k8sfake.NewClientBuilder().WithLists(podList).Build(), +// } +// isPodRunning, err := r.isPodRunning(context.TODO(), klcv1alpha3.ResourceReference{UID: "pod1"}, "node1") +// testrequire.Nil(t, err) +// if !isPodRunning { +// t.Errorf("Wrong!") +// } +// +// r2 := &KeptnWorkloadInstanceReconciler{ +// Client: k8sfake.NewClientBuilder().WithLists(podList2).Build(), +// } +// isPodRunning, err = r2.isPodRunning(context.TODO(), klcv1alpha3.ResourceReference{UID: "pod1"}, "node1") +// testrequire.Nil(t, err) +// if isPodRunning { +// t.Errorf("Wrong!") +// } +// +//} +// +//func makeNominatedPod(podName string, nodeName string, phase v1.PodPhase) v1.Pod { +// return v1.Pod{ +// ObjectMeta: metav1.ObjectMeta{ +// Namespace: nodeName, +// Name: podName, +// UID: types.UID(podName), +// }, +// Status: v1.PodStatus{ +// Phase: phase, +// NominatedNodeName: nodeName, +// }, +// } +//} +// +//func makeReplicaSet(name string, namespace string, wanted *int32, available int32) *appsv1.ReplicaSet { +// +// return &appsv1.ReplicaSet{ +// TypeMeta: metav1.TypeMeta{ +// Kind: "ReplicaSet", +// }, +// ObjectMeta: metav1.ObjectMeta{ +// Name: name, +// Namespace: namespace, +// UID: types.UID(name), +// }, +// Spec: appsv1.ReplicaSetSpec{ +// Replicas: wanted, +// }, +// Status: appsv1.ReplicaSetStatus{ +// AvailableReplicas: available, +// }, +// } +// +//} +// +//func makeStatefulSet(name string, namespace string, wanted *int32, available int32) *appsv1.StatefulSet { +// +// return &appsv1.StatefulSet{ +// TypeMeta: metav1.TypeMeta{ +// Kind: "StatefulSet", +// }, +// ObjectMeta: metav1.ObjectMeta{ +// Name: name, +// Namespace: namespace, +// UID: types.UID(name), +// }, +// Spec: appsv1.StatefulSetSpec{ +// Replicas: wanted, +// }, +// Status: appsv1.StatefulSetStatus{ +// AvailableReplicas: available, +// }, +// } +// +//} +// +//func makeDaemonSet(name string, namespace string, wanted int32, available int32) *appsv1.DaemonSet { +// +// return &appsv1.DaemonSet{ +// TypeMeta: metav1.TypeMeta{ +// Kind: "StatefulSet", +// }, +// ObjectMeta: metav1.ObjectMeta{ +// Name: name, +// Namespace: namespace, +// UID: types.UID(name), +// }, +// Spec: appsv1.DaemonSetSpec{}, +// Status: appsv1.DaemonSetStatus{ +// DesiredNumberScheduled: wanted, +// NumberReady: available, +// }, +// } +// +//} +// +//func Test_getAppVersionForWorkloadInstance(t *testing.T) { +// now := time.Now() +// tests := []struct { +// name string +// wli *klcv1alpha3.KeptnWorkloadInstance +// list *klcv1alpha3.KeptnAppVersionList +// wantFound bool +// wantAppVersion klcv1alpha3.KeptnAppVersion +// wantErr bool +// }{ +// { +// name: "no appVersions", +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app", +// Version: "1.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// list: &klcv1alpha3.KeptnAppVersionList{}, +// wantFound: false, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{}, +// wantErr: false, +// }, +// { +// name: "appVersion found", +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app", +// Version: "1.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// list: &klcv1alpha3.KeptnAppVersionList{ +// Items: []klcv1alpha3.KeptnAppVersion{ +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// CreationTimestamp: metav1.Time{Time: now}, +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "1.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app2", +// Namespace: "default", +// CreationTimestamp: metav1.Time{Time: now.Add(5 * time.Second)}, +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "2.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// }, +// }, +// wantFound: true, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app2", +// Namespace: "default", +// ResourceVersion: "999", +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "2.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// wantErr: false, +// }, +// { +// name: "appVersion deprecated", +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app", +// Version: "1.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// list: &klcv1alpha3.KeptnAppVersionList{ +// Items: []klcv1alpha3.KeptnAppVersion{ +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "1.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// Status: klcv1alpha3.KeptnAppVersionStatus{ +// Status: apicommon.StateDeprecated, +// }, +// }, +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app2", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "2.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// Status: klcv1alpha3.KeptnAppVersionStatus{ +// Status: apicommon.StateDeprecated, +// }, +// }, +// }, +// }, +// wantFound: false, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{}, +// wantErr: false, +// }, +// { +// name: "no workload for appversion", +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance3", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app333", +// Version: "1.0.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// list: &klcv1alpha3.KeptnAppVersionList{ +// Items: []klcv1alpha3.KeptnAppVersion{ +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "1.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app2", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "2.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// }, +// }, +// wantFound: false, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{}, +// wantErr: false, +// }, +// } +// +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// err := klcv1alpha3.AddToScheme(scheme.Scheme) +// require.Nil(t, err) +// r := &KeptnWorkloadInstanceReconciler{ +// Client: k8sfake.NewClientBuilder().WithLists(tt.list).Build(), +// } +// found, gotAppVersion, err := r.getAppVersionForWorkloadInstance(context.TODO(), tt.wli) +// require.Equal(t, tt.wantErr, err != nil) +// require.Equal(t, tt.wantFound, found) +// if tt.wantFound { +// // set the creation timestamp of the returned appVersion to the time zero value because this is +// // set internally by the fake client +// gotAppVersion.ObjectMeta.CreationTimestamp = metav1.Time{Time: time.Time{}} +// } +// require.Equal(t, tt.wantAppVersion, gotAppVersion) +// }) +// } +//} +// +//func Test_getLatestAppVersion(t *testing.T) { +// +// now := time.Now() +// type args struct { +// apps *klcv1alpha3.KeptnAppVersionList +// wli *klcv1alpha3.KeptnWorkloadInstance +// } +// tests := []struct { +// name string +// args args +// wantFound bool +// wantAppVersion klcv1alpha3.KeptnAppVersion +// wantErr bool +// }{ +// { +// name: "app version found", +// args: args{ +// apps: &klcv1alpha3.KeptnAppVersionList{ +// Items: []klcv1alpha3.KeptnAppVersion{ +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// CreationTimestamp: metav1.Time{Time: now}, +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "1.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// CreationTimestamp: metav1.Time{Time: now.Add(5 * time.Second)}, +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "2.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// }, +// }, +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app", +// Version: "1.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// }, +// wantFound: true, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// CreationTimestamp: metav1.Time{Time: now.Add(5 * time.Second)}, +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "2.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// wantErr: false, +// }, +// { +// name: "app version not found", +// args: args{ +// apps: &klcv1alpha3.KeptnAppVersionList{ +// Items: []klcv1alpha3.KeptnAppVersion{ +// { +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-app", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnAppVersionSpec{ +// KeptnAppSpec: klcv1alpha3.KeptnAppSpec{ +// Version: "1.0", +// Workloads: []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "my-other-workload", +// Version: "1.0", +// }, +// }, +// }, +// AppName: "my-app", +// }, +// }, +// }, +// }, +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app", +// Version: "1.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// }, +// wantFound: false, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{}, +// wantErr: false, +// }, +// { +// name: "app version list empty", +// args: args{ +// apps: &klcv1alpha3.KeptnAppVersionList{ +// Items: []klcv1alpha3.KeptnAppVersion{}, +// }, +// wli: &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-workloadinstance", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "my-app", +// Version: "1.0", +// }, +// WorkloadName: "my-app-my-workload", +// }, +// }, +// }, +// wantFound: false, +// wantAppVersion: klcv1alpha3.KeptnAppVersion{}, +// wantErr: false, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// found, gotAppVersion, err := getLatestAppVersion(tt.args.apps, tt.args.wli) +// require.Equal(t, tt.wantErr, err != nil) +// require.Equal(t, tt.wantFound, found) +// require.Equal(t, tt.wantAppVersion, gotAppVersion) +// }) +// } +//} +// +//func TestKeptnWorkloadInstanceReconciler_ReconcileNoActionRequired(t *testing.T) { +// r, _, _ := setupReconciler() +// +// result, err := r.Reconcile(context.TODO(), ctrl.Request{}) +// +// require.Nil(t, err) +// require.NotNil(t, result) +//} +// +//func TestKeptnWorkloadInstanceReconciler_ReconcileDoNotStartBeforeAppPreEvaluationIsDone(t *testing.T) { +// r, eventChannel, _ := setupReconciler() +// +// testNamespace := "some-ns" +// +// wi := &klcv1alpha3.KeptnWorkloadInstance{ +// TypeMeta: metav1.TypeMeta{}, +// ObjectMeta: metav1.ObjectMeta{ +// Name: "some-wi", +// Namespace: testNamespace, +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "some-app", +// Version: "1.0.0", +// }, +// WorkloadName: "some-app-some-workload", +// PreviousVersion: "", +// TraceId: nil, +// }, +// Status: klcv1alpha3.KeptnWorkloadInstanceStatus{}, +// } +// +// err := r.Client.Create(context.TODO(), wi) +// +// require.Nil(t, err) +// +// err = controllercommon.AddAppVersion( +// r.Client, +// testNamespace, +// "some-app", +// "1.0.0", +// []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "some-workload", +// Version: "1.0.0", +// }, +// }, +// klcv1alpha3.KeptnAppVersionStatus{}, +// ) +// require.Nil(t, err) +// +// req := ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: testNamespace, +// Name: "some-wi", +// }, +// } +// +// result, err := r.Reconcile(context.TODO(), req) +// +// require.Nil(t, err) +// require.True(t, result.Requeue) +// +// expectedEvents := []string{ +// "AppPreDeployEvaluationsNotFinished", +// } +// +// for _, e := range expectedEvents { +// event := <-eventChannel +// assert.Equal(t, strings.Contains(event, req.Name), true, "wrong appversion") +// assert.Equal(t, strings.Contains(event, req.Namespace), true, "wrong namespace") +// assert.Equal(t, strings.Contains(event, e), true, fmt.Sprintf("no %s found in %s", e, event)) +// } +//} +// +//func TestKeptnWorkloadInstanceReconciler_ReconcileReachCompletion(t *testing.T) { +// r, eventChannel, _ := setupReconciler() +// +// testNamespace := "some-ns" +// +// wi := &klcv1alpha3.KeptnWorkloadInstance{ +// TypeMeta: metav1.TypeMeta{}, +// ObjectMeta: metav1.ObjectMeta{ +// Name: "some-wi", +// Namespace: testNamespace, +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "some-app", +// Version: "1.0.0", +// }, +// WorkloadName: "some-app-some-workload", +// PreviousVersion: "", +// TraceId: nil, +// }, +// Status: klcv1alpha3.KeptnWorkloadInstanceStatus{ +// DeploymentStatus: apicommon.StateSucceeded, +// PreDeploymentStatus: apicommon.StateSucceeded, +// PostDeploymentStatus: apicommon.StateSucceeded, +// PreDeploymentEvaluationStatus: apicommon.StateSucceeded, +// PostDeploymentEvaluationStatus: apicommon.StateSucceeded, +// CurrentPhase: apicommon.PhaseWorkloadPostEvaluation.ShortName, +// Status: apicommon.StateSucceeded, +// StartTime: metav1.Time{}, +// EndTime: metav1.Time{}, +// }, +// } +// +// err := r.Client.Create(context.TODO(), wi) +// +// require.Nil(t, err) +// +// err = controllercommon.AddAppVersion( +// r.Client, +// testNamespace, +// "some-app", +// "1.0.0", +// []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "some-workload", +// Version: "1.0.0", +// }, +// }, +// klcv1alpha3.KeptnAppVersionStatus{ +// PreDeploymentEvaluationStatus: apicommon.StateSucceeded, +// }, +// ) +// require.Nil(t, err) +// +// req := ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: testNamespace, +// Name: "some-wi", +// }, +// } +// +// result, err := r.Reconcile(context.TODO(), req) +// +// require.Nil(t, err) +// +// // do not requeue since we reached completion +// require.False(t, result.Requeue) +// +// // here we do not expect an event about the application preEvaluation being finished since that will have been sent in +// // one of the previous reconciliation loops that lead to the first phase being reached +// expectedEvents := []string{ +// "WorkloadPostDeployEvaluationsFinished", +// } +// +// for _, e := range expectedEvents { +// event := <-eventChannel +// assert.Equal(t, strings.Contains(event, req.Name), true, "wrong appversion") +// assert.Equal(t, strings.Contains(event, req.Namespace), true, "wrong namespace") +// assert.Equal(t, strings.Contains(event, e), true, fmt.Sprintf("no %s found in %s", e, event)) +// } +//} +// +//func TestKeptnWorkloadInstanceReconciler_ReconcileDoNotRetryAfterFailedPhase(t *testing.T) { +// r, eventChannel, _ := setupReconciler() +// +// testNamespace := "some-ns" +// +// wi := &klcv1alpha3.KeptnWorkloadInstance{ +// TypeMeta: metav1.TypeMeta{}, +// ObjectMeta: metav1.ObjectMeta{ +// Name: "some-wi", +// Namespace: testNamespace, +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// AppName: "some-app", +// Version: "1.0.0", +// }, +// WorkloadName: "some-app-some-workload", +// PreviousVersion: "", +// TraceId: nil, +// }, +// Status: klcv1alpha3.KeptnWorkloadInstanceStatus{ +// CurrentPhase: apicommon.PhaseWorkloadPreDeployment.ShortName, +// StartTime: metav1.Time{}, +// EndTime: metav1.Time{}, +// }, +// } +// +// // simulate a KWI that has been cancelled due to a failed pre deployment check +// wi.DeprecateRemainingPhases(apicommon.PhaseWorkloadPreDeployment) +// +// err := r.Client.Create(context.TODO(), wi) +// +// require.Nil(t, err) +// +// err = controllercommon.AddAppVersion( +// r.Client, +// testNamespace, +// "some-app", +// "1.0.0", +// []klcv1alpha3.KeptnWorkloadRef{ +// { +// Name: "some-workload", +// Version: "1.0.0", +// }, +// }, +// klcv1alpha3.KeptnAppVersionStatus{ +// PreDeploymentEvaluationStatus: apicommon.StateSucceeded, +// }, +// ) +// require.Nil(t, err) +// +// req := ctrl.Request{ +// NamespacedName: types.NamespacedName{ +// Namespace: testNamespace, +// Name: "some-wi", +// }, +// } +// +// result, err := r.Reconcile(context.TODO(), req) +// +// require.Nil(t, err) +// +// // do not requeue since we were cancelled earlier +// require.False(t, result.Requeue) +// +// require.Empty(t, len(eventChannel)) +// +//} +// +//func setupReconciler() (*KeptnWorkloadInstanceReconciler, chan string, *fake.ITracerMock) { +// //setup logger +// opts := zap.Options{ +// Development: true, +// } +// ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) +// +// //fake a tracer +// tr := &fake.ITracerMock{StartFunc: func(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { +// return ctx, trace.SpanFromContext(ctx) +// }} +// +// tf := &fake.TracerFactoryMock{GetTracerFunc: func(name string) trace.Tracer { +// return tr +// }} +// +// fakeClient := fake.NewClient() +// recorder := record.NewFakeRecorder(100) +// r := &KeptnWorkloadInstanceReconciler{ +// Client: fakeClient, +// Scheme: scheme.Scheme, +// Recorder: recorder, +// Log: ctrl.Log.WithName("test-appController"), +// TracerFactory: tf, +// Meters: controllercommon.InitAppMeters(), +// SpanHandler: &controllercommon.SpanHandler{}, +// } +// return r, recorder.Events, tr +//} +// +//func makeWorkloadInstanceWithRef(objectMeta metav1.ObjectMeta, refKind string) *klcv1alpha3.KeptnWorkloadInstance { +// workloadInstance := &klcv1alpha3.KeptnWorkloadInstance{ +// ObjectMeta: metav1.ObjectMeta{ +// Name: "my-wli", +// Namespace: "default", +// }, +// Spec: klcv1alpha3.KeptnWorkloadInstanceSpec{ +// KeptnWorkloadSpec: klcv1alpha3.KeptnWorkloadSpec{ +// ResourceReference: klcv1alpha3.ResourceReference{ +// UID: objectMeta.UID, +// Name: objectMeta.Name, +// Kind: refKind, +// }, +// }, +// }, +// } +// return workloadInstance +//} diff --git a/operator/main.go b/operator/main.go index b740044394..2047bf61dc 100644 --- a/operator/main.go +++ b/operator/main.go @@ -43,7 +43,6 @@ import ( "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkload" "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkloadinstance" controlleroptions "github.com/keptn/lifecycle-toolkit/operator/controllers/options" - "github.com/keptn/lifecycle-toolkit/operator/webhooks/gating" "github.com/keptn/lifecycle-toolkit/operator/webhooks/pod_mutator" "github.com/prometheus/client_golang/prometheus/promhttp" "go.opentelemetry.io/otel" @@ -348,14 +347,14 @@ func main() { Log: ctrl.Log.WithName("Mutating Webhook"), }, }, - "/gate-v1-pod": { - Handler: &gating.PodGatingWebhook{ - Client: mgr.GetClient(), - Tracer: otel.Tracer("keptn/gatewebhook"), - Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), - Log: ctrl.Log.WithName("Gates Mutating Webhook"), - }, - }, + //"/gate-v1-pod": { + // Handler: &gating.PodGatingWebhook{ + // Client: mgr.GetClient(), + // Tracer: otel.Tracer("keptn/gatewebhook"), + // Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), + // Log: ctrl.Log.WithName("Gates Mutating Webhook"), + // }, + //}, }); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) diff --git a/operator/webhooks/gating/gating_webhook.go b/operator/webhooks/gating/gating_webhook.go index 2a5029ae18..adfa02b525 100644 --- a/operator/webhooks/gating/gating_webhook.go +++ b/operator/webhooks/gating/gating_webhook.go @@ -13,10 +13,11 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -// +kubebuilder:webhook:path=/gate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create,versions=v1,name=mpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None +// +kubebuilder:webhook:path=/gate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create,versions=v1,name=gpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None // +kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch // +kubebuilder:rbac:groups=apps,resources=deployments;statefulsets;daemonsets;replicasets,verbs=get @@ -30,7 +31,12 @@ type PodGatingWebhook struct { } func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) admission.Response { - logger := a.Log + logger := log.FromContext(ctx).WithValues("webhook", "/gate-v1-pod", "object", map[string]interface{}{ + "name": req.Name, + "namespace": req.Namespace, + "kind": req.Kind, + }) + logger.Info("Gate webhook for pod called") ctx, span := a.Tracer.Start(ctx, "gate_pod", trace.WithNewRoot(), trace.WithSpanKind(trace.SpanKindServer)) defer span.End() pod := &corev1.Pod{} @@ -50,7 +56,6 @@ func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) ad if podIsAnnotated { logger.Info("Resource is annotated with Keptn annotations, using Keptn scheduler") - pod.Spec.SchedulerName = "keptn-scheduler" pod.Spec.SchedulingGates = []corev1.PodSchedulingGate{ { Name: "klt-gated", diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index 885618d495..fdf5f421b1 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -28,7 +28,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -// +kubebuilder:webhook:path=/mutate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create;update,versions=v1,name=mpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None +// +kubebuilder:webhook:path=/mutate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=update,versions=v1,name=mpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None // +kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch // +kubebuilder:rbac:groups=apps,resources=deployments;statefulsets;daemonsets;replicasets,verbs=get @@ -58,6 +58,7 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) pod := &corev1.Pod{} + logger.Info("checking the request", "req obj: ", req.Object, "req raw", req.Object.Raw) err := a.decoder.Decode(req, pod) if err != nil { return admission.Errored(http.StatusBadRequest, err) From ee2e2ba6d03627fe30d30df518b564a245d459d8 Mon Sep 17 00:00:00 2001 From: realanna Date: Mon, 22 May 2023 11:17:40 +0200 Subject: [PATCH 09/13] fix: helm docs Signed-off-by: realanna --- .../default/webhooknamespaces_patch.yaml | 34 ++++++++--------- operator/config/webhook/manifests.yaml | 38 +++++++++---------- operator/main.go | 17 +++++---- operator/webhooks/gating/gating_webhook.go | 8 +++- .../pod_mutator/pod_mutating_webhook.go | 10 ++++- 5 files changed, 60 insertions(+), 47 deletions(-) diff --git a/operator/config/default/webhooknamespaces_patch.yaml b/operator/config/default/webhooknamespaces_patch.yaml index 1ff9074ea2..81ede7893d 100644 --- a/operator/config/default/webhooknamespaces_patch.yaml +++ b/operator/config/default/webhooknamespaces_patch.yaml @@ -25,20 +25,20 @@ webhooks: - "keptn-lifecycle-toolkit-system" - "observability" - "monitoring" -# - name: gpod.keptn.sh -# namespaceSelector: -# matchExpressions: -# - key: control-plane -# operator: NotIn -# values: -# - "lifecycle-operator" -# - key: kubernetes.io/metadata.name -# operator: NotIn -# values: -# - "kube-system" -# - "kube-public" -# - "kube-node-lease" -# - "cert-manager" -# - "keptn-lifecycle-toolkit-system" -# - "observability" -# - "monitoring" + - name: gpod.keptn.sh + namespaceSelector: + matchExpressions: + - key: control-plane + operator: NotIn + values: + - "lifecycle-operator" + - key: kubernetes.io/metadata.name + operator: NotIn + values: + - "kube-system" + - "kube-public" + - "kube-node-lease" + - "cert-manager" + - "keptn-lifecycle-toolkit-system" + - "observability" + - "monitoring" diff --git a/operator/config/webhook/manifests.yaml b/operator/config/webhook/manifests.yaml index 7338ece77c..dbaa2aadec 100644 --- a/operator/config/webhook/manifests.yaml +++ b/operator/config/webhook/manifests.yaml @@ -27,22 +27,22 @@ webhooks: resources: - pods sideEffects: None -# - admissionReviewVersions: -# - v1 -# clientConfig: -# service: -# name: lifecycle-webhook-service -# namespace: system -# path: /gate-v1-pod -# failurePolicy: Fail -# name: gpod.keptn.sh -# rules: -# - apiGroups: -# - "" -# apiVersions: -# - v1 -# operations: -# - CREATE -# resources: -# - pods -# sideEffects: None + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: lifecycle-webhook-service + namespace: system + path: /gate-v1-pod + failurePolicy: Fail + name: gpod.keptn.sh + rules: + - apiGroups: + - "" + apiVersions: + - v1 + operations: + - CREATE + resources: + - pods + sideEffects: None diff --git a/operator/main.go b/operator/main.go index 2047bf61dc..b740044394 100644 --- a/operator/main.go +++ b/operator/main.go @@ -43,6 +43,7 @@ import ( "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkload" "github.com/keptn/lifecycle-toolkit/operator/controllers/lifecycle/keptnworkloadinstance" controlleroptions "github.com/keptn/lifecycle-toolkit/operator/controllers/options" + "github.com/keptn/lifecycle-toolkit/operator/webhooks/gating" "github.com/keptn/lifecycle-toolkit/operator/webhooks/pod_mutator" "github.com/prometheus/client_golang/prometheus/promhttp" "go.opentelemetry.io/otel" @@ -347,14 +348,14 @@ func main() { Log: ctrl.Log.WithName("Mutating Webhook"), }, }, - //"/gate-v1-pod": { - // Handler: &gating.PodGatingWebhook{ - // Client: mgr.GetClient(), - // Tracer: otel.Tracer("keptn/gatewebhook"), - // Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), - // Log: ctrl.Log.WithName("Gates Mutating Webhook"), - // }, - //}, + "/gate-v1-pod": { + Handler: &gating.PodGatingWebhook{ + Client: mgr.GetClient(), + Tracer: otel.Tracer("keptn/gatewebhook"), + Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), + Log: ctrl.Log.WithName("Gates Mutating Webhook"), + }, + }, }); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) diff --git a/operator/webhooks/gating/gating_webhook.go b/operator/webhooks/gating/gating_webhook.go index adfa02b525..62ee72ab2f 100644 --- a/operator/webhooks/gating/gating_webhook.go +++ b/operator/webhooks/gating/gating_webhook.go @@ -11,6 +11,8 @@ import ( "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" @@ -40,7 +42,11 @@ func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) ad ctx, span := a.Tracer.Start(ctx, "gate_pod", trace.WithNewRoot(), trace.WithSpanKind(trace.SpanKindServer)) defer span.End() pod := &corev1.Pod{} - err := a.decoder.Decode(req, pod) + //err := a.decoder.Decode(req.Object, pod) no clue why this fails so I directly use the runtime decoder + var deserializer runtime.Decoder + factory := serializer.NewCodecFactory(a.Client.Scheme()) + deserializer = factory.UniversalDeserializer() + err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) if err != nil { return admission.Errored(http.StatusBadRequest, err) } diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index fdf5f421b1..793af1602a 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -21,6 +21,8 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" @@ -28,7 +30,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -// +kubebuilder:webhook:path=/mutate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=update,versions=v1,name=mpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None +// +kubebuilder:webhook:path=/mutate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create;update,versions=v1,name=mpod.keptn.sh,admissionReviewVersions=v1,sideEffects=None // +kubebuilder:rbac:groups=core,resources=namespaces,verbs=get;list;watch // +kubebuilder:rbac:groups=apps,resources=deployments;statefulsets;daemonsets;replicasets,verbs=get @@ -59,7 +61,11 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) pod := &corev1.Pod{} logger.Info("checking the request", "req obj: ", req.Object, "req raw", req.Object.Raw) - err := a.decoder.Decode(req, pod) + //err := a.decoder.Decode(req.Object, pod) no clue why this fails so I directly use the runtime decoder + var deserializer runtime.Decoder + factory := serializer.NewCodecFactory(a.Client.Scheme()) + deserializer = factory.UniversalDeserializer() + err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) if err != nil { return admission.Errored(http.StatusBadRequest, err) } From 070ab092b5da0c69f6bafecd579945bcfeab4d19 Mon Sep 17 00:00:00 2001 From: realanna Date: Mon, 22 May 2023 11:42:44 +0200 Subject: [PATCH 10/13] fix: check if namespace is enabled Signed-off-by: realanna --- operator/webhooks/common/common.go | 10 ++++++++++ operator/webhooks/gating/gating_webhook.go | 10 +++++++++- operator/webhooks/pod_mutator/pod_mutating_webhook.go | 7 +++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/operator/webhooks/common/common.go b/operator/webhooks/common/common.go index 3f9762cf52..c0d446cc4e 100644 --- a/operator/webhooks/common/common.go +++ b/operator/webhooks/common/common.go @@ -25,6 +25,16 @@ const ( var ErrTooLongAnnotations = fmt.Errorf("too long annotations, maximum length for app and workload is 25 characters, for version 12 characters") +func IsNamespaceEnabled(ctx context.Context, namespaceRef string, k8sclient client.Client) (bool, error) { + // check if Lifecycle Controller is enabled for this namespace + namespace := &corev1.Namespace{} + if err := k8sclient.Get(ctx, types.NamespacedName{Name: namespaceRef}, namespace); err != nil { + return false, err + } + + return namespace.GetAnnotations()[apicommon.NamespaceEnabledAnnotation] != "enabled", nil +} + func IsPodOrParentAnnotated(ctx context.Context, req *admission.Request, pod *corev1.Pod, k8sclient client.Client) (bool, error) { podIsAnnotated, err := isPodAnnotated(pod) diff --git a/operator/webhooks/gating/gating_webhook.go b/operator/webhooks/gating/gating_webhook.go index 62ee72ab2f..2dc3c147cd 100644 --- a/operator/webhooks/gating/gating_webhook.go +++ b/operator/webhooks/gating/gating_webhook.go @@ -52,7 +52,15 @@ func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) ad } logger.Info(fmt.Sprintf("Pod annotations: %v", pod.Annotations)) - + enabled, err := common.IsNamespaceEnabled(ctx, req.Namespace, a.Client) + if err != nil { + logger.Error(err, "could not get namespace", "namespace", req.Namespace) + return admission.Errored(http.StatusInternalServerError, err) + } + if enabled { + logger.Info("namespace is not enabled for lifecycle controller", "namespace", req.Namespace) + return admission.Allowed("namespace is not enabled for lifecycle controller") + } podIsAnnotated, err := common.IsPodOrParentAnnotated(ctx, &req, pod, a.Client) logger.Info("Checked if pod is annotated.") if err != nil { diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index 793af1602a..531d8cef42 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -71,13 +71,12 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) } // check if Lifecycle Controller is enabled for this namespace - namespace := &corev1.Namespace{} - if err = a.Client.Get(ctx, types.NamespacedName{Name: req.Namespace}, namespace); err != nil { + enabled, err := common.IsNamespaceEnabled(ctx, req.Namespace, a.Client) + if err != nil { logger.Error(err, "could not get namespace", "namespace", req.Namespace) return admission.Errored(http.StatusInternalServerError, err) } - - if namespace.GetAnnotations()[apicommon.NamespaceEnabledAnnotation] != "enabled" { + if enabled { logger.Info("namespace is not enabled for lifecycle controller", "namespace", req.Namespace) return admission.Allowed("namespace is not enabled for lifecycle controller") } From 01b7d934aab647d9ea52ed27cbf12681752098d8 Mon Sep 17 00:00:00 2001 From: realanna Date: Mon, 22 May 2023 12:01:17 +0200 Subject: [PATCH 11/13] fix: esplicit decoder, cannot be injected anymore Signed-off-by: realanna --- operator/main.go | 4 +++ operator/webhooks/gating/gating_webhook.go | 14 ++++------ .../pod_mutator/pod_mutating_webhook.go | 23 ++++----------- .../pod_mutator/pod_mutating_webhook_test.go | 28 +++++++++---------- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/operator/main.go b/operator/main.go index b740044394..031d72a0e6 100644 --- a/operator/main.go +++ b/operator/main.go @@ -46,6 +46,8 @@ import ( "github.com/keptn/lifecycle-toolkit/operator/webhooks/gating" "github.com/keptn/lifecycle-toolkit/operator/webhooks/pod_mutator" "github.com/prometheus/client_golang/prometheus/promhttp" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + "go.opentelemetry.io/otel" otelprom "go.opentelemetry.io/otel/exporters/prometheus" "go.opentelemetry.io/otel/sdk/metric" @@ -345,6 +347,7 @@ func main() { Client: mgr.GetClient(), Tracer: otel.Tracer("keptn/webhook"), Recorder: mgr.GetEventRecorderFor("keptn/webhook"), + Decoder: admission.NewDecoder(mgr.GetScheme()), Log: ctrl.Log.WithName("Mutating Webhook"), }, }, @@ -352,6 +355,7 @@ func main() { Handler: &gating.PodGatingWebhook{ Client: mgr.GetClient(), Tracer: otel.Tracer("keptn/gatewebhook"), + Decoder: admission.NewDecoder(mgr.GetScheme()), Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), Log: ctrl.Log.WithName("Gates Mutating Webhook"), }, diff --git a/operator/webhooks/gating/gating_webhook.go b/operator/webhooks/gating/gating_webhook.go index 2dc3c147cd..9c3efd3455 100644 --- a/operator/webhooks/gating/gating_webhook.go +++ b/operator/webhooks/gating/gating_webhook.go @@ -11,8 +11,6 @@ import ( "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" @@ -27,7 +25,7 @@ import ( type PodGatingWebhook struct { Client client.Client Tracer trace.Tracer - decoder *admission.Decoder + Decoder *admission.Decoder Recorder record.EventRecorder Log logr.Logger } @@ -42,11 +40,11 @@ func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) ad ctx, span := a.Tracer.Start(ctx, "gate_pod", trace.WithNewRoot(), trace.WithSpanKind(trace.SpanKindServer)) defer span.End() pod := &corev1.Pod{} - //err := a.decoder.Decode(req.Object, pod) no clue why this fails so I directly use the runtime decoder - var deserializer runtime.Decoder - factory := serializer.NewCodecFactory(a.Client.Scheme()) - deserializer = factory.UniversalDeserializer() - err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) + err := a.Decoder.Decode(req, pod) //no clue why this fails so I directly use the runtime decoder + //var deserializer runtime.Decoder + //factory := serializer.NewCodecFactory(a.Client.Scheme()) + //deserializer = factory.UniversalDeserializer() + //err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) if err != nil { return admission.Errored(http.StatusBadRequest, err) } diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index 531d8cef42..f19fd7612a 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -21,8 +21,6 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" @@ -38,7 +36,7 @@ import ( type PodMutatingWebhook struct { Client client.Client Tracer trace.Tracer - decoder *admission.Decoder + Decoder *admission.Decoder Recorder record.EventRecorder Log logr.Logger } @@ -61,11 +59,11 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) pod := &corev1.Pod{} logger.Info("checking the request", "req obj: ", req.Object, "req raw", req.Object.Raw) - //err := a.decoder.Decode(req.Object, pod) no clue why this fails so I directly use the runtime decoder - var deserializer runtime.Decoder - factory := serializer.NewCodecFactory(a.Client.Scheme()) - deserializer = factory.UniversalDeserializer() - err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) + err := a.Decoder.Decode(req, pod) //no clue why this fails so I directly use the runtime decoder + //var deserializer runtime.Decoder + //factory := serializer.NewCodecFactory(a.Client.Scheme()) + //deserializer = factory.UniversalDeserializer() + //err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) if err != nil { return admission.Errored(http.StatusBadRequest, err) } @@ -124,15 +122,6 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) return admission.PatchResponseFromRaw(req.Object.Raw, marshaledPod) } -// PodMutatingWebhook implements admission.DecoderInjector. -// A decoder will be automatically injected. - -// InjectDecoder injects the decoder. -func (a *PodMutatingWebhook) InjectDecoder(d *admission.Decoder) error { - a.decoder = d - return nil -} - func (a *PodMutatingWebhook) isAppAnnotationPresent(pod *corev1.Pod) (bool, error) { app, gotAppAnnotation := common.GetLabelOrAnnotation(&pod.ObjectMeta, apicommon.AppAnnotation, apicommon.K8sRecommendedAppAnnotations) diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go b/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go index cf78dbdc65..7fcb638259 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook_test.go @@ -26,7 +26,7 @@ func TestPodMutatingWebhook_getAppName(t *testing.T) { type fields struct { Client client.Client Tracer trace.Tracer - decoder *admission.Decoder + Decoder *admission.Decoder Recorder record.EventRecorder Log logr.Logger } @@ -87,7 +87,7 @@ func TestPodMutatingWebhook_getAppName(t *testing.T) { a := &PodMutatingWebhook{ Client: tt.fields.Client, Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, + Decoder: tt.fields.Decoder, Recorder: tt.fields.Recorder, Log: tt.fields.Log, } @@ -102,7 +102,7 @@ func TestPodMutatingWebhook_getWorkloadName(t *testing.T) { type fields struct { Client client.Client Tracer trace.Tracer - decoder *admission.Decoder + Decoder *admission.Decoder Recorder record.EventRecorder Log logr.Logger } @@ -167,7 +167,7 @@ func TestPodMutatingWebhook_getWorkloadName(t *testing.T) { a := &PodMutatingWebhook{ Client: tt.fields.Client, Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, + Decoder: tt.fields.Decoder, Recorder: tt.fields.Recorder, Log: tt.fields.Log, } @@ -182,7 +182,7 @@ func TestPodMutatingWebhook_isAppAnnotationPresent(t *testing.T) { type fields struct { Client client.Client Tracer trace.Tracer - decoder *admission.Decoder + Decoder *admission.Decoder Recorder record.EventRecorder Log logr.Logger } @@ -261,7 +261,7 @@ func TestPodMutatingWebhook_isAppAnnotationPresent(t *testing.T) { a := &PodMutatingWebhook{ Client: tt.fields.Client, Tracer: tt.fields.Tracer, - decoder: tt.fields.decoder, + Decoder: tt.fields.Decoder, Recorder: tt.fields.Recorder, Log: tt.fields.Log, } @@ -293,12 +293,12 @@ func TestPodMutatingWebhook_Handle_DisabledNamespace(t *testing.T) { recorder := record.NewFakeRecorder(100) - decoder := admission.NewDecoder(runtime.NewScheme()) + Decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, Tracer: tr, - decoder: decoder, + Decoder: Decoder, Recorder: recorder, Log: testr.New(t), } @@ -357,12 +357,12 @@ func TestPodMutatingWebhook_Handle_SingleService(t *testing.T) { recorder := record.NewFakeRecorder(100) - decoder := admission.NewDecoder(runtime.NewScheme()) + Decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, Tracer: tr, - decoder: decoder, + Decoder: Decoder, Recorder: recorder, Log: testr.New(t), } @@ -479,12 +479,12 @@ func TestPodMutatingWebhook_Handle_SingleService_AppCreationRequestAlreadyPresen recorder := record.NewFakeRecorder(100) - decoder := admission.NewDecoder(runtime.NewScheme()) + Decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, Tracer: tr, - decoder: decoder, + Decoder: Decoder, Recorder: recorder, Log: testr.New(t), } @@ -588,12 +588,12 @@ func TestPodMutatingWebhook_Handle_MultiService(t *testing.T) { recorder := record.NewFakeRecorder(100) - decoder := admission.NewDecoder(runtime.NewScheme()) + Decoder := admission.NewDecoder(runtime.NewScheme()) wh := &PodMutatingWebhook{ Client: fakeClient, Tracer: tr, - decoder: decoder, + Decoder: Decoder, Recorder: recorder, Log: testr.New(t), } From a509d0931e6545919485b7cd2b0bf70aeedc8011 Mon Sep 17 00:00:00 2001 From: realanna Date: Mon, 22 May 2023 12:03:30 +0200 Subject: [PATCH 12/13] fix: esplicit decoder, cannot be injected anymore Signed-off-by: realanna --- operator/main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/operator/main.go b/operator/main.go index 031d72a0e6..8befc0c797 100644 --- a/operator/main.go +++ b/operator/main.go @@ -341,13 +341,14 @@ func main() { setupLog.Info("starting webhook and manager") + decoder := admission.NewDecoder(mgr.GetScheme()) if err := webhookBuilder.Run(mgr, map[string]*ctrlWebhook.Admission{ "/mutate-v1-pod": { Handler: &pod_mutator.PodMutatingWebhook{ Client: mgr.GetClient(), Tracer: otel.Tracer("keptn/webhook"), Recorder: mgr.GetEventRecorderFor("keptn/webhook"), - Decoder: admission.NewDecoder(mgr.GetScheme()), + Decoder: decoder, Log: ctrl.Log.WithName("Mutating Webhook"), }, }, @@ -355,7 +356,7 @@ func main() { Handler: &gating.PodGatingWebhook{ Client: mgr.GetClient(), Tracer: otel.Tracer("keptn/gatewebhook"), - Decoder: admission.NewDecoder(mgr.GetScheme()), + Decoder: decoder, Recorder: mgr.GetEventRecorderFor("keptn/gatewebhook"), Log: ctrl.Log.WithName("Gates Mutating Webhook"), }, From bbd0a25b32567d8254df27ec30c4d77c0c1d9895 Mon Sep 17 00:00:00 2001 From: realanna Date: Mon, 22 May 2023 13:54:53 +0200 Subject: [PATCH 13/13] fix: decoder, cannot be injected anymore Signed-off-by: realanna --- operator/test/e2e/operator_test.go | 13 ++++++++++--- operator/test/e2e/suite_test.go | 18 +++++++++++++++++- operator/webhooks/gating/gating_webhook.go | 6 +----- .../pod_mutator/pod_mutating_webhook.go | 9 +++------ 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/operator/test/e2e/operator_test.go b/operator/test/e2e/operator_test.go index 5497fa6157..6e5c3bf75a 100644 --- a/operator/test/e2e/operator_test.go +++ b/operator/test/e2e/operator_test.go @@ -43,10 +43,17 @@ var _ = Describe("[E2E] KeptnOperator", Ordered, func() { ObjectMeta: metav1.ObjectMeta{ Name: name, Annotations: annotations, - Namespace: "default", + Namespace: "mydefault", + OwnerReferences: []metav1.OwnerReference{ + { + Kind: "ReplicaSet", + UID: "123", + Name: "test-123", + APIVersion: "1.0.0", + }, + }, }, Spec: apiv1.PodSpec{ - SchedulerName: "", Containers: []apiv1.Container{ { Name: "mybusy", @@ -74,7 +81,7 @@ var _ = Describe("[E2E] KeptnOperator", Ordered, func() { }) - It(" should be gated", func() { + It(" should be gated if namespace annotated", func() { Expect(newPod.Spec.SchedulingGates).To(ContainElement(apiv1.PodSchedulingGate{Name: "klt-gated"})) }) }) diff --git a/operator/test/e2e/suite_test.go b/operator/test/e2e/suite_test.go index f7fe0a185a..0661e87417 100644 --- a/operator/test/e2e/suite_test.go +++ b/operator/test/e2e/suite_test.go @@ -25,10 +25,13 @@ import ( "time" klcv1alpha3 "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3" + apicommon "github.com/keptn/lifecycle-toolkit/operator/apis/lifecycle/v1alpha3/common" . "github.com/onsi/ginkgo/v2" "github.com/onsi/ginkgo/v2/types" . "github.com/onsi/gomega" + apiv1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -78,6 +81,17 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) + annotatedNamespace := &apiv1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: "mydefault", + Annotations: map[string]string{ + apicommon.NamespaceEnabledAnnotation: "enabled", + }, + }, + } + err = k8sClient.Create(ctx, annotatedNamespace) + Expect(ignoreAlreadyExists(err)).NotTo(HaveOccurred(), "could not create namespace") + wg = &sync.WaitGroup{} go func() { @@ -85,7 +99,9 @@ var _ = BeforeSuite(func() { time.Sleep(3 * time.Second) // wait for test to start wg.Wait() fmt.Println("SUITE FINISHED") - err := testEnv.Stop() + err := k8sClient.Delete(ctx, annotatedNamespace) + Expect(err).NotTo(HaveOccurred(), "could not remove namespace") + err = testEnv.Stop() Expect(err).ToNot(HaveOccurred()) }() diff --git a/operator/webhooks/gating/gating_webhook.go b/operator/webhooks/gating/gating_webhook.go index 9c3efd3455..42ac03420d 100644 --- a/operator/webhooks/gating/gating_webhook.go +++ b/operator/webhooks/gating/gating_webhook.go @@ -40,11 +40,7 @@ func (a *PodGatingWebhook) Handle(ctx context.Context, req admission.Request) ad ctx, span := a.Tracer.Start(ctx, "gate_pod", trace.WithNewRoot(), trace.WithSpanKind(trace.SpanKindServer)) defer span.End() pod := &corev1.Pod{} - err := a.Decoder.Decode(req, pod) //no clue why this fails so I directly use the runtime decoder - //var deserializer runtime.Decoder - //factory := serializer.NewCodecFactory(a.Client.Scheme()) - //deserializer = factory.UniversalDeserializer() - //err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) + err := a.Decoder.Decode(req, pod) if err != nil { return admission.Errored(http.StatusBadRequest, err) } diff --git a/operator/webhooks/pod_mutator/pod_mutating_webhook.go b/operator/webhooks/pod_mutator/pod_mutating_webhook.go index f19fd7612a..9b320294ac 100644 --- a/operator/webhooks/pod_mutator/pod_mutating_webhook.go +++ b/operator/webhooks/pod_mutator/pod_mutating_webhook.go @@ -36,7 +36,7 @@ import ( type PodMutatingWebhook struct { Client client.Client Tracer trace.Tracer - Decoder *admission.Decoder + Decoder *admission.Decoder //decoder cannot be injected from controller runtime 0.15.0 onward Recorder record.EventRecorder Log logr.Logger } @@ -59,11 +59,8 @@ func (a *PodMutatingWebhook) Handle(ctx context.Context, req admission.Request) pod := &corev1.Pod{} logger.Info("checking the request", "req obj: ", req.Object, "req raw", req.Object.Raw) - err := a.Decoder.Decode(req, pod) //no clue why this fails so I directly use the runtime decoder - //var deserializer runtime.Decoder - //factory := serializer.NewCodecFactory(a.Client.Scheme()) - //deserializer = factory.UniversalDeserializer() - //err := runtime.DecodeInto(deserializer, req.Object.Raw, pod) + err := a.Decoder.Decode(req, pod) + if err != nil { return admission.Errored(http.StatusBadRequest, err) }