Skip to content

Commit

Permalink
OverrideLabels hook for operand pod labels
Browse files Browse the repository at this point in the history
Signed-off-by: Swarup Ghosh <swghosh@redhat.com>
  • Loading branch information
swghosh committed Apr 4, 2023
1 parent 78af9b1 commit 966c6f3
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 18 deletions.
29 changes: 11 additions & 18 deletions api/operator/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 39 additions & 0 deletions pkg/controller/deployment/deployment_helper.go
Expand Up @@ -76,6 +76,17 @@ func parseArgMap(argMap map[string]string, args []string) {
}
}

func mergeLabels(sourceLabels map[string]string, overrideLabels map[string]string) map[string]string {
destLabels := map[string]string{}
for k, v := range sourceLabels {
destLabels[k] = v
}
for k, v := range overrideLabels {
destLabels[k] = v
}
return destLabels
}

// getOverrideArgsFor is a helper function that returns the overrideArgs provided
// in the operator spec based on the deployment name.
func getOverrideArgsFor(certmanagerinformer certmanagerinformer.CertManagerInformer, deploymentName string) ([]string, error) {
Expand Down Expand Up @@ -129,3 +140,31 @@ func getOverrideEnvFor(certmanagerinformer certmanagerinformer.CertManagerInform
}
return nil, nil
}

// getOverridePodLabelsFor() is a helper function that returns the OverridePodLabels provided
// in the operator spec based on the deployment name.
func getOverridePodLabelsFor(certmanagerinformer certmanagerinformer.CertManagerInformer, deploymentName string) (map[string]string, error) {
certmanager, err := certmanagerinformer.Lister().Get("cluster")
if err != nil {
return nil, fmt.Errorf("failed to get certmanager %q due to %v", "cluster", err)
}

switch deploymentName {
case certmanagerControllerDeployment:
if certmanager.Spec.ControllerConfig != nil {
return certmanager.Spec.ControllerConfig.OverrideLabels, nil
}
case certmanagerWebhookDeployment:
if certmanager.Spec.WebhookConfig != nil {
return certmanager.Spec.WebhookConfig.OverrideLabels, nil
}
case certmanagerCAinjectorDeployment:
if certmanager.Spec.CAInjectorConfig != nil {
return certmanager.Spec.CAInjectorConfig.OverrideLabels, nil
}
default:
return nil, fmt.Errorf("unsupported deployment name %q provided", deploymentName)
}
return nil, nil

}
20 changes: 20 additions & 0 deletions pkg/controller/deployment/deployment_overrides.go
Expand Up @@ -37,6 +37,11 @@ type overrideArgsFunc func(certmanagerinformer.CertManagerInformer, string) ([]s
// override env provided to the cert-manager-operator operator spec.
type overrideEnvFunc func(certmanagerinformer.CertManagerInformer, string) ([]corev1.EnvVar, error)

// overrideLabelsFunc defines a function signature that is accepted by
// withPodLabels(). This function returns the override labels provided
// to cert-manager-operator spec.
type overrideLabelsFunc func(certmanagerinformer.CertManagerInformer, string) (map[string]string, error)

// withOperandImageOverrideHook overrides the deployment image with
// the operand images provided to the operator.
func withOperandImageOverrideHook(operatorSpec *v1.OperatorSpec, deployment *appsv1.Deployment) error {
Expand Down Expand Up @@ -127,3 +132,18 @@ func withCAConfigMap(configmapinformer coreinformersv1.ConfigMapInformer, deploy
return nil
}
}

// withPodLabels patches the operand deployment to include custom pod labels
func withPodLabelsOverrideHook(certmanagerinformer certmanagerinformer.CertManagerInformer, deploymentName string, fn overrideLabelsFunc) func(operatorSpec *v1.OperatorSpec, deployment *appsv1.Deployment) error {
return func(operatorSpec *v1.OperatorSpec, deployment *appsv1.Deployment) error {
overrideLabels, err := fn(certmanagerinformer, deploymentName)
if err != nil {
return err
}

if overrideLabels != nil && len(overrideLabels) > 0 && len(deployment.Spec.Template.ObjectMeta.Labels) == 1 && deployment.Name == deploymentName {
deployment.Spec.Template.SetLabels(mergeLabels(deployment.Spec.Template.ObjectMeta.Labels, overrideLabels))
}
return nil
}
}
1 change: 1 addition & 0 deletions pkg/controller/deployment/generic_deployment_controller.go
Expand Up @@ -38,6 +38,7 @@ func newGenericDeploymentController(
},
[]deploymentcontroller.ManifestHookFunc{},
withOperandImageOverrideHook,
withPodLabelsOverrideHook(certManagerOperatorInformers.Operator().V1alpha1().CertManagers(), deployment.Name, getOverridePodLabelsFor),
withContainerArgsOverrideHook(certManagerOperatorInformers.Operator().V1alpha1().CertManagers(), deployment.Name, getOverrideArgsFor),
withContainerArgsValidateHook(certManagerOperatorInformers.Operator().V1alpha1().CertManagers(), deployment.Name),
withContainerEnvOverrideHook(certManagerOperatorInformers.Operator().V1alpha1().CertManagers(), deployment.Name, getOverrideEnvFor),
Expand Down

0 comments on commit 966c6f3

Please sign in to comment.