diff --git a/controllers/toolchainstatus/toolchainstatus_controller.go b/controllers/toolchainstatus/toolchainstatus_controller.go index 0593362bb..17e57b0f6 100644 --- a/controllers/toolchainstatus/toolchainstatus_controller.go +++ b/controllers/toolchainstatus/toolchainstatus_controller.go @@ -8,7 +8,6 @@ import ( "io" "net/http" "net/url" - "regexp" "text/template" "time" @@ -104,8 +103,6 @@ const ( {{end}}` ) -var emailRegex = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") - // SetupWithManager sets up the controller with the Manager. func (r *Reconciler) SetupWithManager(mgr manager.Manager) error { return ctrl.NewControllerManagedBy(mgr). @@ -490,11 +487,6 @@ func (r *Reconciler) sendToolchainStatusNotification(logger logr.Logger, return errs.Wrapf(err, "unable to get ToolchainConfig") } - if !isValidEmailAddress(config.Notifications().AdminEmail()) { - return errs.New(fmt.Sprintf("cannot create notification due to configuration error - admin.email [%s] is invalid or not set", - config.Notifications().AdminEmail())) - } - tsValue := time.Now().Format("20060102150405") contentString := "" subjectString := "" @@ -948,10 +940,3 @@ func (s *regServiceSubstatusHandler) addRegistrationServiceHealthAndRevisionChec // if we get here it means that component health is ok return true } - -func isValidEmailAddress(email string) bool { - if len(email) < 3 && len(email) > 254 { - return false - } - return emailRegex.MatchString(email) -} diff --git a/controllers/toolchainstatus/toolchainstatus_controller_test.go b/controllers/toolchainstatus/toolchainstatus_controller_test.go index 416a008b3..fabb64f51 100644 --- a/controllers/toolchainstatus/toolchainstatus_controller_test.go +++ b/controllers/toolchainstatus/toolchainstatus_controller_test.go @@ -1106,33 +1106,36 @@ func TestToolchainStatusNotifications(t *testing.T) { os.Setenv("WATCH_NAMESPACE", test.HostOperatorNs) - toolchainConfig := commonconfig.NewToolchainConfigObjWithReset(t, testconfig.Notifications().AdminEmail("admin@dev.sandbox.com")) - - reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, - hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) + t.Run("no notificaion created", func(t *testing.T) { + // given + toolchainConfig := commonconfig.NewToolchainConfigObjWithReset(t, testconfig.Notifications().AdminEmail("admin@dev.sandbox.com")) + reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, + hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) - // when - res, err := reconciler.Reconcile(context.TODO(), req) + // when + res, err := reconciler.Reconcile(context.TODO(), req) - // then - require.NoError(t, err) - assert.Equal(t, requeueResult, res) + // then + require.NoError(t, err) + assert.Equal(t, requeueResult, res) - AssertThatToolchainStatus(t, req.Namespace, requestName, fakeClient). - HasConditions(componentsReady(), unreadyNotificationNotCreated()). - HasHostOperatorStatus(hostOperatorStatusReady()). - HasMemberClusterStatus(memberCluster("member-1", ready()), memberCluster("member-2", ready())). - HasRegistrationServiceStatus(registrationServiceReady(conditionReady(toolchainv1alpha1.ToolchainStatusRegServiceReadyReason), conditionReadyWithMessage(toolchainv1alpha1.ToolchainStatusDeploymentRevisionCheckDisabledReason, "access token key is not provided"))). - HasHostRoutesStatus("https://api-toolchain-host-operator.host-cluster", hostRoutesAvailable()) + AssertThatToolchainStatus(t, req.Namespace, requestName, fakeClient). + HasConditions(componentsReady(), unreadyNotificationNotCreated()). + HasHostOperatorStatus(hostOperatorStatusReady()). + HasMemberClusterStatus(memberCluster("member-1", ready()), memberCluster("member-2", ready())). + HasRegistrationServiceStatus(registrationServiceReady(conditionReady(toolchainv1alpha1.ToolchainStatusRegServiceReadyReason), conditionReadyWithMessage(toolchainv1alpha1.ToolchainStatusDeploymentRevisionCheckDisabledReason, "access token key is not provided"))). + HasHostRoutesStatus("https://api-toolchain-host-operator.host-cluster", hostRoutesAvailable()) - // Confirm there is no notification - assertToolchainStatusNotificationNotCreated(t, fakeClient, unreadyStatusNotification) - assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) + // Confirm there is no notification + assertToolchainStatusNotificationNotCreated(t, fakeClient, unreadyStatusNotification) + assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) + }) t.Run("Notification not created when host operator deployment not ready within threshold", func(t *testing.T) { // given hostOperatorDeployment := newDeploymentWithConditions(defaultHostOperatorDeploymentName, status.DeploymentNotAvailableCondition(), status.DeploymentProgressingCondition()) + toolchainConfig := commonconfig.NewToolchainConfigObjWithReset(t, testconfig.Notifications().AdminEmail("admin@dev.sandbox.com")) reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) @@ -1172,9 +1175,7 @@ func TestToolchainStatusNotifications(t *testing.T) { // then require.Error(t, err) - require.Equal(t, fmt.Sprintf("Failed to create toolchain status unready notification: cannot create notification "+ - "due to configuration error - admin.email [%s] is invalid or not set", email), - err.Error()) + require.True(t, strings.HasPrefix(err.Error(), fmt.Sprintf("Failed to create toolchain status unready notification: The specified recipient [%s] is not a valid email address", email))) assert.Equal(t, requeueResult, res) // Confirm there is no notification @@ -1198,106 +1199,113 @@ func TestToolchainStatusNotifications(t *testing.T) { overrideLastTransitionTime(t, toolchainStatus, metav1.Time{Time: time.Now().Add(-time.Duration(24) * time.Hour)}) - reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, - hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) - - // when - res, err := reconciler.Reconcile(context.TODO(), req) - - // then - require.NoError(t, err) - assert.Equal(t, requeueResult, res) - // confirm restored notification has not been created - assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) - // Confirm the unready notification has been created - notification := assertToolchainStatusNotificationCreated(t, fakeClient) - require.True(t, strings.HasPrefix(notification.ObjectMeta.Name, "toolchainstatus-unready-")) - - require.NotNil(t, notification) - require.Equal(t, notification.Spec.Subject, "ToolchainStatus has been in an unready status for an extended period") - require.Equal(t, notification.Spec.Recipient, "admin@dev.sandbox.com") - - t.Run("Toolchain status now ok again, notification should be removed", func(t *testing.T) { - hostOperatorDeployment := newDeploymentWithConditions(defaultHostOperatorDeploymentName, - status.DeploymentAvailableCondition()) - - // Reload the toolchain status - require.NoError(t, fakeClient.Get(context.Background(), test.NamespacedName(test.HostOperatorNs, - toolchainStatus.Name), toolchainStatus)) - - reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, - hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, proxyRoute()) - - // when - res, err := reconciler.Reconcile(context.TODO(), req) - - // then - require.NoError(t, err) - assert.Equal(t, requeueResult, res) + for _, email := range []string{"admin@dev.sandbox.com", "admin@dev.sandbox.com, another-admin@acme.com"} { + t.Run("for email "+email, func(t *testing.T) { + toolchainConfig := commonconfig.NewToolchainConfigObjWithReset(t, testconfig.Notifications().AdminEmail(email)) - // Confirm there is no unready notification - assertToolchainStatusNotificationNotCreated(t, fakeClient, unreadyStatusNotification) - - // Confirm restored notification has been created - notification := assertToolchainStatusNotificationCreated(t, fakeClient) - require.True(t, strings.HasPrefix(notification.ObjectMeta.Name, "toolchainstatus-restored-")) - - require.NotNil(t, notification) - require.Equal(t, notification.Spec.Subject, "ToolchainStatus has now been restored to ready status") - require.Equal(t, notification.Spec.Recipient, "admin@dev.sandbox.com") - - t.Run("Toolchain status not ready again for extended period, notification is created", func(t *testing.T) { - // given - hostOperatorDeployment := newDeploymentWithConditions(defaultHostOperatorDeploymentName, - status.DeploymentNotAvailableCondition(), status.DeploymentProgressingCondition()) - - // Reload the toolchain status - require.NoError(t, fakeClient.Get(context.Background(), test.NamespacedName(test.HostOperatorNs, - toolchainStatus.Name), toolchainStatus)) - - // Reconcile in order to update the ready status to false reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) // when - _, err := reconciler.Reconcile(context.TODO(), req) - - require.NoError(t, err) - // Confirm there is no notification - assertToolchainStatusNotificationNotCreated(t, fakeClient, unreadyStatusNotification) - assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) - - // Reload the toolchain status - require.NoError(t, fakeClient.Get(context.Background(), test.NamespacedName(test.HostOperatorNs, - toolchainStatus.Name), toolchainStatus)) - - // Now override the last transition time again - overrideLastTransitionTime(t, toolchainStatus, metav1.Time{Time: time.Now().Add(-time.Duration(24) * time.Hour)}) - - // Reconcile once more - reconciler, req, fakeClient = prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, - hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) - - // when - res, err = reconciler.Reconcile(context.TODO(), req) + res, err := reconciler.Reconcile(context.TODO(), req) // then require.NoError(t, err) assert.Equal(t, requeueResult, res) - // Confirm restored notification is not created + // confirm restored notification has not been created assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) // Confirm the unready notification has been created notification := assertToolchainStatusNotificationCreated(t, fakeClient) require.True(t, strings.HasPrefix(notification.ObjectMeta.Name, "toolchainstatus-unready-")) - require.Len(t, notification.ObjectMeta.Name, 38) + require.NotNil(t, notification) - assert.Equal(t, notification.Spec.Subject, "ToolchainStatus has been in an unready status for an extended period") - assert.Equal(t, notification.Spec.Recipient, "admin@dev.sandbox.com") - assert.True(t, strings.HasPrefix(notification.Spec.Content, "

The following issues")) - assert.True(t, strings.HasSuffix(strings.TrimSpace(notification.Spec.Content), "")) - assert.NotContains(t, notification.Spec.Content, "managedFields") + require.Equal(t, notification.Spec.Subject, "ToolchainStatus has been in an unready status for an extended period") + require.Equal(t, notification.Spec.Recipient, email) + + t.Run("Toolchain status now ok again, notification should be removed", func(t *testing.T) { + hostOperatorDeployment := newDeploymentWithConditions(defaultHostOperatorDeploymentName, + status.DeploymentAvailableCondition()) + + // Reload the toolchain status + require.NoError(t, fakeClient.Get(context.Background(), test.NamespacedName(test.HostOperatorNs, + toolchainStatus.Name), toolchainStatus)) + + reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, + hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, proxyRoute()) + + // when + res, err := reconciler.Reconcile(context.TODO(), req) + + // then + require.NoError(t, err) + assert.Equal(t, requeueResult, res) + + // Confirm there is no unready notification + assertToolchainStatusNotificationNotCreated(t, fakeClient, unreadyStatusNotification) + + // Confirm restored notification has been created + notification := assertToolchainStatusNotificationCreated(t, fakeClient) + require.True(t, strings.HasPrefix(notification.ObjectMeta.Name, "toolchainstatus-restored-")) + + fmt.Println(notification) + require.NotNil(t, notification) + require.Equal(t, "ToolchainStatus has now been restored to ready status", notification.Spec.Subject) + require.Equal(t, email, notification.Spec.Recipient) + + t.Run("Toolchain status not ready again for extended period, notification is created", func(t *testing.T) { + // given + hostOperatorDeployment := newDeploymentWithConditions(defaultHostOperatorDeploymentName, + status.DeploymentNotAvailableCondition(), status.DeploymentProgressingCondition()) + + // Reload the toolchain status + require.NoError(t, fakeClient.Get(context.Background(), test.NamespacedName(test.HostOperatorNs, + toolchainStatus.Name), toolchainStatus)) + + // Reconcile in order to update the ready status to false + reconciler, req, fakeClient := prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, + hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) + + // when + _, err := reconciler.Reconcile(context.TODO(), req) + + require.NoError(t, err) + // Confirm there is no notification + assertToolchainStatusNotificationNotCreated(t, fakeClient, unreadyStatusNotification) + assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) + + // Reload the toolchain status + require.NoError(t, fakeClient.Get(context.Background(), test.NamespacedName(test.HostOperatorNs, + toolchainStatus.Name), toolchainStatus)) + + // Now override the last transition time again + overrideLastTransitionTime(t, toolchainStatus, metav1.Time{Time: time.Now().Add(-time.Duration(24) * time.Hour)}) + + // Reconcile once more + reconciler, req, fakeClient = prepareReconcile(t, requestName, newResponseGood(), mockLastGitHubAPICall, defaultGitHubClient, []string{"member-1", "member-2"}, + hostOperatorDeployment, memberStatus, registrationServiceDeployment, toolchainStatus, toolchainConfig, proxyRoute()) + + // when + res, err = reconciler.Reconcile(context.TODO(), req) + + // then + require.NoError(t, err) + assert.Equal(t, requeueResult, res) + // Confirm restored notification is not created + assertToolchainStatusNotificationNotCreated(t, fakeClient, restoredStatusNotification) + // Confirm the unready notification has been created + notification := assertToolchainStatusNotificationCreated(t, fakeClient) + require.True(t, strings.HasPrefix(notification.ObjectMeta.Name, "toolchainstatus-unready-")) + require.Len(t, notification.ObjectMeta.Name, 38) + require.NotNil(t, notification) + assert.Equal(t, "ToolchainStatus has been in an unready status for an extended period", notification.Spec.Subject) + assert.Equal(t, email, notification.Spec.Recipient) + assert.True(t, strings.HasPrefix(notification.Spec.Content, "

The following issues")) + assert.True(t, strings.HasSuffix(strings.TrimSpace(notification.Spec.Content), "")) + assert.NotContains(t, notification.Spec.Content, "managedFields") + }) + }) }) - }) + } }) }) }) diff --git a/go.mod b/go.mod index 289fb9f5b..59e064051 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/codeready-toolchain/host-operator require ( github.com/codeready-toolchain/api v0.0.0-20230912073725-4ae0201b4630 - github.com/codeready-toolchain/toolchain-common v0.0.0-20230919021542-5a14033d7b7c + github.com/codeready-toolchain/toolchain-common v0.0.0-20230920120310-0f59f17bca92 github.com/davecgh/go-spew v1.1.1 // indirect github.com/ghodss/yaml v1.0.0 github.com/go-bindata/go-bindata v3.1.2+incompatible @@ -55,13 +55,11 @@ require ( github.com/emicklei/go-restful/v3 v3.8.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fatih/color v1.12.0 // indirect github.com/fsnotify/fsnotify v1.5.4 // 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.19.5 // indirect github.com/go-openapi/swag v0.19.14 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -75,12 +73,9 @@ require ( github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect github.com/huandu/xstrings v1.3.1 // indirect github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // 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/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/migueleliasweb/go-github-mock v0.0.18 // indirect github.com/mitchellh/copystructure v1.0.0 // indirect @@ -94,31 +89,25 @@ require ( github.com/prometheus/procfs v0.7.3 // indirect github.com/segmentio/backo-go v1.0.0 // indirect github.com/shopspring/decimal v1.2.0 // indirect - github.com/spf13/cobra v1.4.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 golang.org/x/crypto v0.9.0 // indirect - golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/oauth2 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 - golang.org/x/tools v0.6.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/code-generator v0.25.0 // indirect k8s.io/component-base v0.25.0 // indirect - k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect k8s.io/kubectl v0.24.0 // indirect k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect - sigs.k8s.io/controller-tools v0.10.0 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/go.sum b/go.sum index 4aff8da31..4c7737f2c 100644 --- a/go.sum +++ b/go.sum @@ -136,16 +136,10 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codeready-toolchain/api v0.0.0-20230823083409-fe9ca973d9a9 h1:ytFqNSSEvgevqvwMilmmqlrrDH1O/qUwzg8bO3CxCiY= -github.com/codeready-toolchain/api v0.0.0-20230823083409-fe9ca973d9a9/go.mod h1:nn3W6eKb9PFIVwSwZW7wDeLACMBOwAV+4kddGuN+ARM= github.com/codeready-toolchain/api v0.0.0-20230912073725-4ae0201b4630 h1:Z281nLD0OLfdzbUq2tUK5/B6d2OX1hPg5oFGZSJM4RQ= github.com/codeready-toolchain/api v0.0.0-20230912073725-4ae0201b4630/go.mod h1:nn3W6eKb9PFIVwSwZW7wDeLACMBOwAV+4kddGuN+ARM= -github.com/codeready-toolchain/toolchain-common v0.0.0-20230906081513-e7f1da96c683 h1:pGWlpSRzJTBW1BZCDJoYVdRoSDMN3t2xIpSmXxxAsN4= -github.com/codeready-toolchain/toolchain-common v0.0.0-20230906081513-e7f1da96c683/go.mod h1:wvbndymhFMqyc8syiaanid91GsywkDfuVyiTjdyiqNM= -github.com/codeready-toolchain/toolchain-common v0.0.0-20230914033010-82394174ad63 h1:VniP6k6AgGnFZbaLjyztwLpphS/nJLkF70+4CHlPwXM= -github.com/codeready-toolchain/toolchain-common v0.0.0-20230914033010-82394174ad63/go.mod h1:amY2JAo3SMOsgjcXozOunXue7hRbOlajd46/0eQKPVM= -github.com/codeready-toolchain/toolchain-common v0.0.0-20230919021542-5a14033d7b7c h1:HgNSFo3WssvOS3smNeWX3Jxi599Tuc6vkvZ5YengLL4= -github.com/codeready-toolchain/toolchain-common v0.0.0-20230919021542-5a14033d7b7c/go.mod h1:amY2JAo3SMOsgjcXozOunXue7hRbOlajd46/0eQKPVM= +github.com/codeready-toolchain/toolchain-common v0.0.0-20230920120310-0f59f17bca92 h1:9gcDMkjSAjxM3RLUYCHv9prCDwdi7IgAWpTwTsDpGL8= +github.com/codeready-toolchain/toolchain-common v0.0.0-20230920120310-0f59f17bca92/go.mod h1:+rs3V8do2s0DzGPyCy2sgnvUs9GfSi5RVWx+AZC+cTM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -198,8 +192,6 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQD github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -249,8 +241,6 @@ github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5F github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -397,7 +387,6 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -444,11 +433,7 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= @@ -596,7 +581,6 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -730,7 +714,6 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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= @@ -847,7 +830,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200116001909-b77594299b42/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= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -997,7 +979,6 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= @@ -1205,8 +1186,6 @@ k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.25.0 h1:QP8fJuXu882ztf6dsqJsso/Btm94pMd68TAZC1rE6KI= -k8s.io/code-generator v0.25.0/go.mod h1:B6jZgI3DvDFAualltPitbYMQ74NjaCFxum3YeKZZ+3w= k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= @@ -1216,7 +1195,6 @@ k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnn k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= @@ -1247,8 +1225,6 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyz sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= -sigs.k8s.io/controller-tools v0.10.0 h1:0L5DTDTFB67jm9DkfrONgTGmfc/zYow0ZaHyppizU2U= -sigs.k8s.io/controller-tools v0.10.0/go.mod h1:uvr0EW6IsprfB0jpQq6evtKy+hHyHCXNfdWI5ONPx94= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= 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=