From 04c568d607e342a6c6618386da31a2c9d7366c1f Mon Sep 17 00:00:00 2001 From: Adolfo Duarte Date: Sat, 5 Nov 2022 04:12:45 -0700 Subject: [PATCH] clusterbootrap controller adds owner reference to existing objects --- .../clusterbootstrap_controller.go | 8 +++ .../clusterbootstrapclone.go | 38 ++++++++++++ .../clusterbootstrapclone_test.go | 61 +++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/addons/controllers/clusterbootstrap_controller.go b/addons/controllers/clusterbootstrap_controller.go index 2a7a65a31b..92350e0b27 100644 --- a/addons/controllers/clusterbootstrap_controller.go +++ b/addons/controllers/clusterbootstrap_controller.go @@ -186,6 +186,14 @@ func (r *ClusterBootstrapReconciler) reconcileNormal(cluster *clusterapiv1beta1. return ctrl.Result{}, nil } + clusterBootstrapHelper := clusterbootstrapclone.NewHelper( + r.context, r.Client, r.aggregatedAPIResourcesClient, r.dynamicClient, r.gvrHelper, r.Log) + + if err := clusterBootstrapHelper.AddClusterOwnerRefToExistingProviders(cluster, clusterBootstrap); err != nil { + log.Error(err, "could not add cluster as owner to existing providers") + return ctrl.Result{}, err + } + // reconcile the proxy settings of the cluster if err := r.reconcileClusterProxyAndNetworkSettings(cluster, log); err != nil { return ctrl.Result{}, err diff --git a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go index 70a1aeb8ad..279b9ba0cd 100644 --- a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go +++ b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go @@ -899,6 +899,44 @@ func (h *Helper) cloneEmbeddedLocalObjectRef(cluster *clusterapiv1beta1.Cluster, return nil } +func (h *Helper) getListOfExistingProviders(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) ([]*unstructured.Unstructured, error) { + // returns a slice of providers listed in the clusterbootstrap and that have been verified to exist. + providers := []*unstructured.Unstructured{} + cbPkgs, err := h.getListOfPkgsWithProviderRefNames(clusterBootstrap) + if err != nil { + return nil, err + } + for _, pkg := range cbPkgs { + gvr, err := h.GVRHelper.GetGVR(schema.GroupKind{Group: *pkg.ValuesFrom.ProviderRef.APIGroup, Kind: pkg.ValuesFrom.ProviderRef.Kind}) + if err != nil { + h.Logger.Error(err, "failed to getGVR") + return nil, err + } + provider, err := h.DynamicClient.Resource(*gvr).Namespace(clusterBootstrap.Namespace).Get(h.Ctx, pkg.ValuesFrom.ProviderRef.Name, metav1.GetOptions{}) + if apierrors.IsNotFound(err) { + continue + } + if err != nil { + h.Logger.Error(err, fmt.Sprintf("unable to fetch provider %s/%s", clusterBootstrap.Namespace, pkg.ValuesFrom.ProviderRef.Name), "gvr", gvr) + return nil, err + } + providers = append(providers, provider) + } + return providers, nil +} + +func (h *Helper) AddClusterOwnerRefToExistingProviders(cluster *clusterapiv1beta1.Cluster, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) error { + + exsitingProviders, err := h.getListOfExistingProviders(clusterBootstrap) + if err != nil { + return err + } + if err = h.AddClusterOwnerRef(cluster, exsitingProviders, nil, nil); err != nil { + return err + } + 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{ diff --git a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go index 3effc5fbdf..a9f8ad696f 100644 --- a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go +++ b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go @@ -159,6 +159,50 @@ var _ = Describe("ClusterbootstrapClone", func() { }) }) + Context("Verify AddclusterOwnerRefToExistingProviders()", func() { + It("should succeed on adding cluster as owner to existing orphan config", func() { + fakeCluster := constructFakeCluster() + fakeBootstrap := constructFakeClusterBootstrap() + fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, constructFakeAntreaConfig()) + helper.DynamicClient = fakeDynamicClient + + err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) + Expect(err).ToNot(HaveOccurred()) + }) + It("should succeed on adding cluster as owner to config which already lists same cluster as owner", func() { + fakeBootstrap := constructFakeClusterBootstrap() + fakeAntreaConfig := constructFakeAntreaConfig() + fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-ns") + fakeAntreaConfigWithOwner := constructFakeAntreaConfigWithClusterOwner(fakeAntreaConfig.Name, fakeCluster.Name) + fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, fakeAntreaConfigWithOwner) + helper.DynamicClient = fakeDynamicClient + + err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) + Expect(err).ToNot(HaveOccurred()) + }) + It("should throw error if config has different cluster owner", func() { + fakeBootstrap := constructFakeClusterBootstrap() + fakeAntreaConfig := constructFakeAntreaConfig() + fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-ns") + fakeAntreaConfigWithOwner := constructFakeAntreaConfigWithClusterOwner(fakeAntreaConfig.Name, "someothercluster") + fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, fakeAntreaConfigWithOwner) + helper.DynamicClient = fakeDynamicClient + + err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) + Expect(err).To(HaveOccurred()) + }) + It("should handle non existing config ", func() { + fakeBootstrap := constructFakeClusterBootstrap() + fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-ns") + fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme) + helper.DynamicClient = fakeDynamicClient + + err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) + Expect(err).ToNot(HaveOccurred()) + }) + + }) + Context("Verify cloneEmbeddedLocalObjectRef()", func() { BeforeEach(func() { fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, constructFakeAntreaConfig(), constructFakeVSphereCPIConfig(), constructFakeSecret()) @@ -789,6 +833,23 @@ func constructFakeClusterBootstrapTemplate() *v1alpha3.ClusterBootstrapTemplate } } +func constructFakeClusterBootstrap() *v1alpha3.ClusterBootstrap { + return &v1alpha3.ClusterBootstrap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "fake-clusterbootstrap", + Namespace: "fake-ns", + }, + Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ + CNI: constructFakeClusterBootstrapPackageWithAntreaProviderRef(), + CSI: constructFakeClusterBootstrapPackageWithCSIInlineRef(), + AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ + {RefName: fakePinnipedCBPackageRefName, ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "oidc"}}}, + {RefName: fakeMetricsServerCBPackageRefName}, + }, + }, + } +} + func prepareCarvelPackages(client client.Client, namespace string) { err := client.Create(context.TODO(), constructAntreaCarvelPackage(namespace)) Expect(err).To(BeNil())