diff --git a/api/operator/v1alpha1/zz_generated.deepcopy.go b/api/operator/v1alpha1/zz_generated.deepcopy.go index 4449d6178..f6b89b012 100644 --- a/api/operator/v1alpha1/zz_generated.deepcopy.go +++ b/api/operator/v1alpha1/zz_generated.deepcopy.go @@ -1,28 +1,12 @@ //go:build !ignore_autogenerated // +build !ignore_autogenerated -/* -Copyright 2022. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by controller-gen. DO NOT EDIT. +// Code generated by deepcopy-gen. DO NOT EDIT. package v1alpha1 import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -33,6 +17,7 @@ func (in *CertManager) DeepCopyInto(out *CertManager) { in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) in.Status.DeepCopyInto(&out.Status) + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertManager. @@ -65,6 +50,7 @@ func (in *CertManagerList) DeepCopyInto(out *CertManagerList) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertManagerList. @@ -104,6 +90,7 @@ func (in *CertManagerSpec) DeepCopyInto(out *CertManagerSpec) { *out = new(DeploymentConfig) (*in).DeepCopyInto(*out) } + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertManagerSpec. @@ -120,6 +107,7 @@ func (in *CertManagerSpec) DeepCopy() *CertManagerSpec { func (in *CertManagerStatus) DeepCopyInto(out *CertManagerStatus) { *out = *in in.OperatorStatus.DeepCopyInto(&out.OperatorStatus) + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertManagerStatus. @@ -154,6 +142,7 @@ func (in *DeploymentConfig) DeepCopyInto(out *DeploymentConfig) { (*out)[key] = val } } + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentConfig. @@ -172,6 +161,7 @@ func (in *UnsupportedConfigOverrides) DeepCopyInto(out *UnsupportedConfigOverrid in.Controller.DeepCopyInto(&out.Controller) in.Webhook.DeepCopyInto(&out.Webhook) in.CAInjector.DeepCopyInto(&out.CAInjector) + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UnsupportedConfigOverrides. @@ -192,6 +182,7 @@ func (in *UnsupportedConfigOverridesForCertManagerCAInjector) DeepCopyInto(out * *out = make([]string, len(*in)) copy(*out, *in) } + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UnsupportedConfigOverridesForCertManagerCAInjector. @@ -212,6 +203,7 @@ func (in *UnsupportedConfigOverridesForCertManagerController) DeepCopyInto(out * *out = make([]string, len(*in)) copy(*out, *in) } + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UnsupportedConfigOverridesForCertManagerController. @@ -232,6 +224,7 @@ func (in *UnsupportedConfigOverridesForCertManagerWebhook) DeepCopyInto(out *Uns *out = make([]string, len(*in)) copy(*out, *in) } + return } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UnsupportedConfigOverridesForCertManagerWebhook. diff --git a/pkg/controller/deployment/deployment_helper.go b/pkg/controller/deployment/deployment_helper.go index fb544efb3..783edfe53 100644 --- a/pkg/controller/deployment/deployment_helper.go +++ b/pkg/controller/deployment/deployment_helper.go @@ -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) { @@ -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 + +} diff --git a/pkg/controller/deployment/deployment_overrides.go b/pkg/controller/deployment/deployment_overrides.go index ffde28e4e..175fc4fd0 100644 --- a/pkg/controller/deployment/deployment_overrides.go +++ b/pkg/controller/deployment/deployment_overrides.go @@ -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 { @@ -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 + } +} diff --git a/pkg/controller/deployment/generic_deployment_controller.go b/pkg/controller/deployment/generic_deployment_controller.go index d6bf65bdb..56dca5e29 100644 --- a/pkg/controller/deployment/generic_deployment_controller.go +++ b/pkg/controller/deployment/generic_deployment_controller.go @@ -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),