From bb07e036badf7db1089cd5ca67d51e97d54ff0fc Mon Sep 17 00:00:00 2001 From: Hang Yan Date: Fri, 7 Apr 2023 22:13:45 +0800 Subject: [PATCH] Add missing labels for antreaconfig from clusterbootstrap (#4555) Signed-off-by: Hang Yan --- .../calicoconfig_controller_test.go | 1 + .../clusterbootstrap_controller.go | 5 ++ .../clusterbootstrapclone.go | 53 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/addons/controllers/calicoconfig_controller_test.go b/addons/controllers/calicoconfig_controller_test.go index 4a651f3122..a658781549 100644 --- a/addons/controllers/calicoconfig_controller_test.go +++ b/addons/controllers/calicoconfig_controller_test.go @@ -478,6 +478,7 @@ var _ = Describe("CalicoConfig Reconciler and Webhooks", func() { Expect(k8sClient.Get(ctx, configKey, calicoConfig)).To(Succeed()) Expect(calicoConfig.Spec.Calico.Config.VethMTU).Should(Equal(int64(1420))) + Expect(calicoConfig.ObjectMeta.Labels["tkg.tanzu.vmware.com/package-name"]).Should(Equal("calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1")) // why int64?? that would make it architecture specific, as oposed to why not just int? // (defined in apis/addonconfigs/cni/v1alpha1/calicoconfig_types.go) // seems to also have forced part of this fix: https://github.com/vmware-tanzu/tanzu-framework/pull/2164 diff --git a/addons/controllers/clusterbootstrap_controller.go b/addons/controllers/clusterbootstrap_controller.go index 017580b688..0d30e1d85a 100644 --- a/addons/controllers/clusterbootstrap_controller.go +++ b/addons/controllers/clusterbootstrap_controller.go @@ -481,6 +481,11 @@ func (r *ClusterBootstrapReconciler) patchClusterBootstrapFromTemplate( return nil, err } + if err := clusterBootstrapHelper.AddPackageLabelForCNIProvider(cluster.Name, updatedClusterBootstrap); err != nil { + r.Log.Error(err, fmt.Sprintf("unable to add labels to cni provider")) + return nil, err + } + r.Log.Info("updated clusterBootstrap", "clusterBootstrap", updatedClusterBootstrap) return updatedClusterBootstrap, nil } diff --git a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go index bc8b5d69eb..7884541863 100644 --- a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go +++ b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go @@ -444,6 +444,12 @@ func (h *Helper) HandleExistingClusterBootstrap(clusterBootstrap *runtanzuv1alph h.Logger.Error(err, fmt.Sprintf("unable to add cluster %s/%s as owner reference to providers", cluster.Namespace, cluster.Name)) } + if err := h.AddPackageLabelForCNIProvider(cluster.Name, clusterBootstrap); err != nil { + h.Logger.Error(err, fmt.Sprintf("unable to add labels to cni provider")) + return nil, err + } + h.Logger.Info("patched labels for cni provider.") + clusterBootstrap.OwnerReferences = []metav1.OwnerReference{ { APIVersion: clusterapiv1beta1.GroupVersion.String(), @@ -964,6 +970,31 @@ func (h *Helper) AddClusterOwnerRefToExistingProviders(cluster *clusterapiv1beta return nil } +// AddPackageLabelForCNIProvider patch the missing labels for AntreaConfig(cni config) when it's related to +// an existing clusterboostrap. To make antreaconfig works with old versions, it relies on the package label now. +func (h *Helper) AddPackageLabelForCNIProvider(clusterName string, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) error { + cni := clusterBootstrap.Spec.CNI + if cni != nil { + providers, err := h.getListOfExistingProviders(clusterBootstrap) + if err != nil { + return err + } + for _, p := range providers { + if cni.ValuesFrom != nil && cni.ValuesFrom.ProviderRef != nil && p.GetKind() == cni.ValuesFrom.ProviderRef.Kind { + labels := p.GetLabels() + if labels == nil { + labels = map[string]string{} + } + labels[addontypes.PackageNameLabel] = util.ParseStringForLabel(cni.RefName) + labels[addontypes.ClusterNameLabel] = clusterName + return h.setLabels(labels, p) + } + } + + } + return nil +} + // AddClusterOwnerRef adds cluster as an owner reference to the children with given controller and blockownerdeletion settings func (h *Helper) AddClusterOwnerRef(cluster *clusterapiv1beta1.Cluster, children []*unstructured.Unstructured, controller, blockownerdeletion *bool) error { ownerRef := metav1.OwnerReference{ @@ -995,6 +1026,28 @@ func ownedByDifferentCluster(k8SObject *unstructured.Unstructured, cluster *clus return "" } +func (h *Helper) setLabels(labels map[string]string, child *unstructured.Unstructured) error { + gvr, err := h.GVRHelper.GetGVR(child.GroupVersionKind().GroupKind()) + if err != nil { + h.Logger.Error(err, fmt.Sprintf("unable to get GVR of %s/%s", child.GetNamespace(), child.GetName())) + return err + } + + patchObj := unstructured.Unstructured{} + patchObj.SetLabels(labels) + patchData, err := patchObj.MarshalJSON() + if err != nil { + h.Logger.Error(err, fmt.Sprintf("unable to patch provider %s/%s", child.GetNamespace(), child.GetName()), "gvr", gvr) + return err + } + _, err = h.DynamicClient.Resource(*gvr).Namespace(child.GetNamespace()).Patch(h.Ctx, child.GetName(), types.MergePatchType, patchData, metav1.PatchOptions{}) + if err != nil { + h.Logger.Error(err, fmt.Sprintf("unable to patch provider %s/%s", child.GetNamespace(), child.GetName()), "gvr", gvr) + } + return err + +} + func (h *Helper) setOwnerRef(ownerRef *metav1.OwnerReference, children []*unstructured.Unstructured) error { for _, child := range children { gvr, err := h.GVRHelper.GetGVR(child.GroupVersionKind().GroupKind())