From 17d862d423e4db771b45edd42cf0a03479174dac Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Tue, 1 Apr 2025 11:07:53 +0800 Subject: [PATCH] Move client/informer out from secretOption (#926) Signed-off-by: Jian Qiu --- pkg/registration/register/interface.go | 4 --- .../register/secret_controller.go | 12 ++++++--- .../register/secret_controller_test.go | 7 ++--- .../spoke/addon/registration_controller.go | 18 +++++++------ pkg/registration/spoke/spokeagent.go | 26 +++++++++++-------- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/pkg/registration/register/interface.go b/pkg/registration/register/interface.go index 6268a65bf..ffdf9fba7 100644 --- a/pkg/registration/register/interface.go +++ b/pkg/registration/register/interface.go @@ -8,7 +8,6 @@ import ( "github.com/openshift/library-go/pkg/operator/events" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - corev1client "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" @@ -44,9 +43,6 @@ type SecretOption struct { HubKubeconfigFile string HubKubeconfigDir string - ManagementSecretInformer cache.SharedIndexInformer - ManagementCoreClient corev1client.CoreV1Interface - // subject of the agent, only used for addon Subject *pkix.Name // csr signer for the addon diff --git a/pkg/registration/register/secret_controller.go b/pkg/registration/register/secret_controller.go index 692d9f5c7..a00bb01a9 100644 --- a/pkg/registration/register/secret_controller.go +++ b/pkg/registration/register/secret_controller.go @@ -14,6 +14,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" ) @@ -28,6 +29,8 @@ type secretController struct { statusUpdater StatusUpdateFunc additionalSecretData map[string][]byte secretToSave *corev1.Secret + + managementCoreClient corev1client.CoreV1Interface } // NewSecretController return an instance of secretController @@ -35,6 +38,8 @@ func NewSecretController( secretOption SecretOption, driver RegisterDriver, statusUpdater StatusUpdateFunc, + managementCoreClient corev1client.CoreV1Interface, + managementSecretInformer cache.SharedIndexInformer, recorder events.Recorder, controllerName string, ) factory.Controller { @@ -72,6 +77,7 @@ func NewSecretController( controllerName: controllerName, statusUpdater: statusUpdater, additionalSecretData: additionalSecretData, + managementCoreClient: managementCoreClient, } f := factory.New(). @@ -87,7 +93,7 @@ func NewSecretController( return true } return false - }, secretOption.ManagementSecretInformer) + }, managementSecretInformer) driverInformer, driverFilter := driver.InformerHandler() if driverInformer != nil && driverFilter != nil { @@ -105,7 +111,7 @@ func NewSecretController( func (c *secretController) sync(ctx context.Context, syncCtx factory.SyncContext) error { // get secret containing client certificate - secret, err := c.ManagementCoreClient.Secrets(c.SecretNamespace).Get(ctx, c.SecretName, metav1.GetOptions{}) + secret, err := c.managementCoreClient.Secrets(c.SecretNamespace).Get(ctx, c.SecretName, metav1.GetOptions{}) switch { case apierrors.IsNotFound(err): secret = &corev1.Secret{ @@ -146,7 +152,7 @@ func (c *secretController) sync(ctx context.Context, syncCtx factory.SyncContext } // save the changes into secret - if err := saveSecret(c.ManagementCoreClient, c.SecretNamespace, c.secretToSave); err != nil { + if err := saveSecret(c.managementCoreClient, c.SecretNamespace, c.secretToSave); err != nil { return err } syncCtx.Recorder().Eventf("SecretSave", "Secret %s/%s for %s is updated", diff --git a/pkg/registration/register/secret_controller_test.go b/pkg/registration/register/secret_controller_test.go index 2a7278206..2a567bc17 100644 --- a/pkg/registration/register/secret_controller_test.go +++ b/pkg/registration/register/secret_controller_test.go @@ -149,12 +149,13 @@ func TestSync(t *testing.T) { t.Run(c.name, func(t *testing.T) { syncCtx := testingcommon.NewFakeSyncContext(t, "test") kubeClient := kubefake.NewClientset(c.secrets...) - c.option.ManagementCoreClient = kubeClient.CoreV1() informerFactory := informers.NewSharedInformerFactory(kubeClient, 10*time.Minute) - c.option.ManagementSecretInformer = informerFactory.Core().V1().Secrets().Informer() updater := &fakeStatusUpdater{} ctrl := NewSecretController( - c.option, c.driver, updater.update, syncCtx.Recorder(), "test") + c.option, c.driver, updater.update, + kubeClient.CoreV1(), + informerFactory.Core().V1().Secrets().Informer(), + syncCtx.Recorder(), "test") err := ctrl.Sync(context.Background(), syncCtx) if err != nil { t.Fatal(err) diff --git a/pkg/registration/spoke/addon/registration_controller.go b/pkg/registration/spoke/addon/registration_controller.go index fc551c6c5..1af276428 100644 --- a/pkg/registration/spoke/addon/registration_controller.go +++ b/pkg/registration/spoke/addon/registration_controller.go @@ -192,13 +192,11 @@ func (c *addOnRegistrationController) startRegistration(ctx context.Context, con kubeClient, 10*time.Minute, informers.WithNamespace(config.InstallationNamespace)) secretOption := register.SecretOption{ - SecretNamespace: config.InstallationNamespace, - SecretName: config.secretName, - ManagementCoreClient: kubeClient.CoreV1(), - ManagementSecretInformer: kubeInformerFactory.Core().V1().Secrets().Informer(), - Subject: config.x509Subject(c.clusterName, c.agentName), - Signer: config.registration.SignerName, - ClusterName: c.clusterName, + SecretNamespace: config.InstallationNamespace, + SecretName: config.secretName, + Subject: config.x509Subject(c.clusterName, c.agentName), + Signer: config.registration.SignerName, + ClusterName: c.clusterName, } if config.registration.SignerName == certificatesv1.KubeAPIServerClientSignerName { @@ -207,7 +205,11 @@ func (c *addOnRegistrationController) startRegistration(ctx context.Context, con driver := c.addonDriver.Fork(config.addOnName, secretOption) controllerName := fmt.Sprintf("ClientCertController@addon:%s:signer:%s", config.addOnName, config.registration.SignerName) statusUpdater := c.generateStatusUpdate(c.clusterName, config.addOnName) - secretController := register.NewSecretController(secretOption, driver, statusUpdater, c.recorder, controllerName) + secretController := register.NewSecretController( + secretOption, driver, statusUpdater, + kubeClient.CoreV1(), + kubeInformerFactory.Core().V1().Secrets().Informer(), + c.recorder, controllerName) go kubeInformerFactory.Start(ctx.Done()) go secretController.Run(ctx, 1) diff --git a/pkg/registration/spoke/spokeagent.go b/pkg/registration/spoke/spokeagent.go index d5feb8d08..d6e140590 100644 --- a/pkg/registration/spoke/spokeagent.go +++ b/pkg/registration/spoke/spokeagent.go @@ -207,15 +207,13 @@ func (o *SpokeAgentConfig) RunSpokeAgentWithSpokeInformers(ctx context.Context, // build up the secretOption secretOption := register.SecretOption{ - SecretNamespace: o.agentOptions.ComponentNamespace, - SecretName: o.registrationOption.HubKubeconfigSecret, - ClusterName: o.agentOptions.SpokeClusterName, - AgentName: o.agentOptions.AgentID, - ManagementSecretInformer: namespacedManagementKubeInformerFactory.Core().V1().Secrets().Informer(), - ManagementCoreClient: managementKubeClient.CoreV1(), - HubKubeconfigFile: o.agentOptions.HubKubeconfigFile, - HubKubeconfigDir: o.agentOptions.HubKubeconfigDir, - BootStrapKubeConfigFile: o.currentBootstrapKubeConfig, + SecretNamespace: o.agentOptions.ComponentNamespace, + SecretName: o.registrationOption.HubKubeconfigSecret, + ClusterName: o.agentOptions.SpokeClusterName, + AgentName: o.agentOptions.AgentID, + HubKubeconfigFile: o.agentOptions.HubKubeconfigFile, + HubKubeconfigDir: o.agentOptions.HubKubeconfigDir, + BootStrapKubeConfigFile: o.currentBootstrapKubeConfig, } // initiate registration driver @@ -281,7 +279,10 @@ func (o *SpokeAgentConfig) RunSpokeAgentWithSpokeInformers(ctx context.Context, controllerName := fmt.Sprintf("BootstrapController@cluster:%s", o.agentOptions.SpokeClusterName) secretController := register.NewSecretController( - secretOption, o.driver, register.GenerateBootstrapStatusUpdater(), recorder, controllerName) + secretOption, o.driver, register.GenerateBootstrapStatusUpdater(), + managementKubeClient.CoreV1(), + namespacedManagementKubeInformerFactory.Core().V1().Secrets().Informer(), + recorder, controllerName) go bootstrapClients.ClusterInformer.Informer().Run(bootstrapCtx.Done()) if driverInformer != nil { @@ -327,7 +328,10 @@ func (o *SpokeAgentConfig) RunSpokeAgentWithSpokeInformers(ctx context.Context, secretOption, o.driver, register.GenerateStatusUpdater( hubClient.ClusterClient, hubClient.ClusterInformer.Lister(), - o.agentOptions.SpokeClusterName), recorder, controllerName) + o.agentOptions.SpokeClusterName), + managementKubeClient.CoreV1(), + namespacedManagementKubeInformerFactory.Core().V1().Secrets().Informer(), + recorder, controllerName) // create ManagedClusterLeaseController to keep the spoke cluster heartbeat managedClusterLeaseController := lease.NewManagedClusterLeaseController(