diff --git a/docs/multicluster/upgrade.md b/docs/multicluster/upgrade.md index 98e1aae9091..a35718a4f8b 100644 --- a/docs/multicluster/upgrade.md +++ b/docs/multicluster/upgrade.md @@ -37,6 +37,43 @@ for the feature in new version. It should have no impact during upgrade to those imported resources like Service, Endpoints or AntreaClusterNetworkPolicy. +## Upgrade from a version prior to v1.13 + +Prior to Antrea v1.13, the `ClusterClaim` CRD is used to define both the Cluster ID and +ClusterSet ID for a ClusterSet. Since Antrea v1.13, the `ClusterClaim` CRD is removed, and +the `ClusterSet` CRD solely defines a ClusterSet. The name of a ClusterSet CR must match the +ClusterSet ID, and a new `clusterID` field specifies the Cluster ID. + +To upgrade from a version older than v1.13, once you apply the latest manifests for an +existing ClusterSet, you need to update the existing `ClusterSet` CR with the right `clusterID` +in the spec. A sample ClusterSet CR is like following: + +```yaml +apiVersion: multicluster.crd.antrea.io/v1alpha2 +kind: ClusterSet +metadata: + name: test-clusterset # This value must match the ClusterSet ID. + namespace: kube-system +spec: + clusterID: test-cluster-north # The new added field since v1.13. + leaders: + - clusterID: test-cluster-north + secret: "member-north-token" + server: "https://172.18.0.1:6443" + namespace: antrea-multicluster +``` + +Note: No action is required if there is already a Cluster ID in a `ClusterClaim` CR. The new +version of Antrea Multi-cluster controller will update the existing `ClusterSet` CR with +the valid Cluster ID. You can verify this via `kubectl get clusterclaim id.k8s.io -o json -n kube-system | jq -r '.value'`. + +Once you finish the cluster upgrade, you should also delete the `ClusterClaim` CRD +manually, all `ClusterClaim` CRs will be removed automatically after the CRD is deleted. + +```bash +kubectl delete crds clusterclaims.multicluster.crd.antrea.io +``` + ## APIs deprecation policy The Antrea Multi-cluster APIs are built using K8s CustomResourceDefinitions and we diff --git a/docs/multicluster/user-guide.md b/docs/multicluster/user-guide.md index 543d163a6d4..87a9ba269e3 100644 --- a/docs/multicluster/user-guide.md +++ b/docs/multicluster/user-guide.md @@ -33,6 +33,10 @@ through tunnels among clusters. The ClusterNetworkPolicy replication feature is supported since Antrea v1.6.0, and Multi-cluster NetworkPolicy rules are supported since Antrea v1.10.0. +Antrea v1.13 promoted the ClusterSet CRD version from v1alpha1 to v1alpha2. If you +plan to upgrade from a previous version to v1.13 or later, please check +the [upgrade guide](./upgrade.md#upgrade-from-a-version-prior-to-v113). + ## Quick Start Please refer to the [Quick Start Guide](quick-start.md) to learn how to build a diff --git a/multicluster/cmd/multicluster-controller/controller.go b/multicluster/cmd/multicluster-controller/controller.go index 4f998040ed6..8ced43a148a 100644 --- a/multicluster/cmd/multicluster-controller/controller.go +++ b/multicluster/cmd/multicluster-controller/controller.go @@ -18,7 +18,9 @@ import ( "fmt" "time" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" @@ -171,6 +173,14 @@ func setupManagerAndCertController(isLeader bool, o *Options) (manager.Manager, o.EnableEndpointSlice = true } + // ClusterClaim CRD is removed since v1.13. Check the existence of + // ClusterClaim API before using ClusterClaim API. + clusterClaimCRDAvailable, err := clusterClaimCRDAvailable(client) + if err != nil { + return nil, fmt.Errorf("error checking if ClusterClaim API is available") + } + o.ClusterCalimCRDAvailable = clusterClaimCRDAvailable + mgr, err := ctrl.NewManager(k8sConfig, o.options) if err != nil { return nil, fmt.Errorf("error starting manager: %v", err) @@ -192,3 +202,21 @@ func setupManagerAndCertController(isLeader bool, o *Options) (manager.Manager, } return mgr, nil } + +func clusterClaimCRDAvailable(k8sClient clientset.Interface) (bool, error) { + groupVersion := mcv1alpha2.SchemeGroupVersion.String() + resources, err := k8sClient.Discovery().ServerResourcesForGroupVersion(groupVersion) + if err != nil { + // The group version doesn't exist. + if errors.IsNotFound(err) { + return false, nil + } + return false, fmt.Errorf("error getting server resources for GroupVersion %s: %v", groupVersion, err) + } + for _, resource := range resources.APIResources { + if resource.Kind == "ClusterClaim" { + return true, nil + } + } + return false, nil +} diff --git a/multicluster/cmd/multicluster-controller/controller_test.go b/multicluster/cmd/multicluster-controller/controller_test.go index c795358e76b..811132bb606 100644 --- a/multicluster/cmd/multicluster-controller/controller_test.go +++ b/multicluster/cmd/multicluster-controller/controller_test.go @@ -23,8 +23,12 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/rest" + mcv1alpha2 "antrea.io/antrea/multicluster/apis/multicluster/v1alpha2" "antrea.io/antrea/pkg/apiserver/certificate" ) @@ -93,3 +97,45 @@ func TestGetCAConfig(t *testing.T) { }) } } + +func TestClusterClaimCRDAvailable(t *testing.T) { + groupVersion := mcv1alpha2.SchemeGroupVersion.String() + testCases := []struct { + name string + resources []*metav1.APIResourceList + expectedAvailable bool + }{ + { + name: "empty", + expectedAvailable: false, + }, + { + name: "GroupVersion exists", + resources: []*metav1.APIResourceList{ + { + GroupVersion: groupVersion, + }, + }, + expectedAvailable: false, + }, + { + name: "API exists", + resources: []*metav1.APIResourceList{ + { + GroupVersion: groupVersion, + APIResources: []metav1.APIResource{{Kind: "ClusterClaim"}}, + }, + }, + expectedAvailable: true, + }, + } + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + k8sClient := fake.NewSimpleClientset() + k8sClient.Resources = tt.resources + available, err := clusterClaimCRDAvailable(k8sClient) + require.NoError(t, err) + assert.Equal(t, tt.expectedAvailable, available) + }) + } +} diff --git a/multicluster/cmd/multicluster-controller/leader.go b/multicluster/cmd/multicluster-controller/leader.go index be74f27242a..4d6271c5ca6 100644 --- a/multicluster/cmd/multicluster-controller/leader.go +++ b/multicluster/cmd/multicluster-controller/leader.go @@ -77,9 +77,10 @@ func runLeader(o *Options) error { namespace: env.GetPodNamespace()}}) clusterSetReconciler := &leader.LeaderClusterSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - StatusManager: memberClusterStatusManager, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + StatusManager: memberClusterStatusManager, + ClusterCalimCRDAvailable: o.ClusterCalimCRDAvailable, } if err = clusterSetReconciler.SetupWithManager(mgr); err != nil { return fmt.Errorf("error creating ClusterSet controller: %v", err) diff --git a/multicluster/cmd/multicluster-controller/member.go b/multicluster/cmd/multicluster-controller/member.go index 52892d134e3..5ae65847f44 100644 --- a/multicluster/cmd/multicluster-controller/member.go +++ b/multicluster/cmd/multicluster-controller/member.go @@ -67,6 +67,7 @@ func runMember(o *Options) error { mgr.GetScheme(), env.GetPodNamespace(), o.EnableStretchedNetworkPolicy, + o.ClusterCalimCRDAvailable, ) if err = clusterSetReconciler.SetupWithManager(mgr); err != nil { return fmt.Errorf("error creating ClusterSet controller: %v", err) diff --git a/multicluster/cmd/multicluster-controller/options.go b/multicluster/cmd/multicluster-controller/options.go index a343962ed58..071de7c07b4 100644 --- a/multicluster/cmd/multicluster-controller/options.go +++ b/multicluster/cmd/multicluster-controller/options.go @@ -46,6 +46,9 @@ type Options struct { EnableStretchedNetworkPolicy bool // Watch EndpointSlice API for exported Service if EndpointSlice API is available. EnableEndpointSlice bool + // ClusterCalimCRDAvailable indicates if the ClusterClaim CRD is available or not + // in the cluster. + ClusterCalimCRDAvailable bool } func newOptions() *Options { diff --git a/multicluster/controllers/multicluster/common/controller_utils.go b/multicluster/controllers/multicluster/common/controller_utils.go index 75ea7e3a529..ce6018bbf6a 100644 --- a/multicluster/controllers/multicluster/common/controller_utils.go +++ b/multicluster/controllers/multicluster/common/controller_utils.go @@ -22,7 +22,10 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + + mcv1alpha2 "antrea.io/antrea/multicluster/apis/multicluster/v1alpha2" ) // DiscoverServiceCIDRByInvalidServiceCreation creates an invalid Service to get returned error, and analyzes @@ -78,3 +81,40 @@ func parseServiceCIDRFromError(msg string) (string, error) { func NewClusterInfoResourceExportName(clusterID string) string { return clusterID + "-clusterinfo" } + +func getClusterIDFromClusterClaim(c client.Client, clusterSet *mcv1alpha2.ClusterSet) (ClusterID, error) { + configNamespace := clusterSet.GetNamespace() + + clusterClaimList := &mcv1alpha2.ClusterClaimList{} + if err := c.List(context.TODO(), clusterClaimList, client.InNamespace(configNamespace)); err != nil { + return "", err + } + if len(clusterClaimList.Items) == 0 { + return "", fmt.Errorf("ClusterClaim is not configured for the cluster") + } + + for _, clusterClaim := range clusterClaimList.Items { + if clusterClaim.Name == mcv1alpha2.WellKnownClusterClaimID { + return ClusterID(clusterClaim.Value), nil + } + } + + return "", fmt.Errorf("ClusterClaim not configured for Name=%s", + mcv1alpha2.WellKnownClusterClaimID) +} + +func GetClusterID(clusterCalimCRDAvailable bool, req ctrl.Request, client client.Client, clusterSet *mcv1alpha2.ClusterSet) (ClusterID, error) { + if clusterSet.Spec.ClusterID == "" { + // ClusterID is a required feild, and the empty value case should only happen + // when Antrea Multi-cluster is upgraded from an old version prior to v1.13. + // Here we try to get the ClusterID from ClusterClaim before returning any error. + if clusterCalimCRDAvailable { + clusterID, err := getClusterIDFromClusterClaim(client, clusterSet) + if err == nil { + return clusterID, nil + } + } + return "", fmt.Errorf("the spec.clusterID field of ClusterSet %s is required", req.NamespacedName) + } + return ClusterID(clusterSet.Spec.ClusterID), nil +} diff --git a/multicluster/controllers/multicluster/common/controller_utils_test.go b/multicluster/controllers/multicluster/common/controller_utils_test.go index 98454cda16a..c99e272a722 100644 --- a/multicluster/controllers/multicluster/common/controller_utils_test.go +++ b/multicluster/controllers/multicluster/common/controller_utils_test.go @@ -21,7 +21,12 @@ import ( "testing" "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client/fake" + + mcv1alpha2 "antrea.io/antrea/multicluster/apis/multicluster/v1alpha2" ) func TestDiscoverServiceCIDRByInvalidServiceCreation(t *testing.T) { @@ -60,3 +65,158 @@ func TestParseServiceCIDRFromError(t *testing.T) { assert.Equal(t, cidr, tt.expectedCIDR) } } + +func TestGetClusterIDFromClusterClaim(t *testing.T) { + clusterSet := &mcv1alpha2.ClusterSet{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test-clusterset", + }, + } + clusterClaim1 := mcv1alpha2.ClusterClaim{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "id.k8s.io", + }, + Value: "cluster-a", + } + clusterClaim2 := mcv1alpha2.ClusterClaim{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "clusterset.k8s.io", + }, + Value: "test-clusterset", + } + + tests := []struct { + name string + clusterClaimList mcv1alpha2.ClusterClaimList + expectedErr string + }{ + { + name: "succeed to get clusterID", + clusterClaimList: mcv1alpha2.ClusterClaimList{ + Items: []mcv1alpha2.ClusterClaim{ + clusterClaim1, + clusterClaim2, + }, + }, + }, + { + name: "empty ClusterClaims", + clusterClaimList: mcv1alpha2.ClusterClaimList{}, + expectedErr: "ClusterClaim is not configured for the cluster", + }, + { + name: "No ClusterClaim with ClusterID", + clusterClaimList: mcv1alpha2.ClusterClaimList{ + Items: []mcv1alpha2.ClusterClaim{ + clusterClaim2, + }, + }, + expectedErr: "ClusterClaim not configured for Name=id.k8s.io", + }, + } + + for _, tt := range tests { + fakeClient := fake.NewClientBuilder().WithScheme(TestScheme).WithLists(&tt.clusterClaimList).Build() + t.Run(tt.name, func(t *testing.T) { + actualClusterID, err := getClusterIDFromClusterClaim(fakeClient, clusterSet) + if err != nil { + assert.Equal(t, tt.expectedErr, err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, clusterClaim1.Value, string(actualClusterID)) + } + }) + } +} + +func TestGetClusterID(t *testing.T) { + tests := []struct { + name string + clusterSet *mcv1alpha2.ClusterSet + clusterClaimList *mcv1alpha2.ClusterClaimList + expectedErr string + expectedID string + }{ + { + name: "succeed to get clusterID from ClusterClaim", + clusterSet: &mcv1alpha2.ClusterSet{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test-clusterset", + }, + Spec: mcv1alpha2.ClusterSetSpec{}, + }, + clusterClaimList: &mcv1alpha2.ClusterClaimList{ + Items: []mcv1alpha2.ClusterClaim{ + { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "id.k8s.io", + }, + Value: "cluster-a", + }, + }, + }, + expectedID: "cluster-a", + }, + { + name: "error to get clusterID from ClusterClaim", + clusterSet: &mcv1alpha2.ClusterSet{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test-clusterset", + }, + Spec: mcv1alpha2.ClusterSetSpec{}, + }, + clusterClaimList: &mcv1alpha2.ClusterClaimList{ + Items: []mcv1alpha2.ClusterClaim{ + { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "clusterset.k8s.io", + }, + Value: "cluster-a", + }, + }, + }, + expectedErr: "the spec.clusterID field of ClusterSet default/test-clusterset is required", + }, + { + name: "succeed to get clusterID from ClusterSet", + clusterSet: &mcv1alpha2.ClusterSet{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test-clusterset", + }, + Spec: mcv1alpha2.ClusterSetSpec{ + ClusterID: "cluster-1", + }, + }, + clusterClaimList: &mcv1alpha2.ClusterClaimList{}, + expectedID: "cluster-1", + }, + } + + req := ctrl.Request{ + NamespacedName: types.NamespacedName{ + Namespace: "default", + Name: "test-clusterset", + }, + } + + for _, tt := range tests { + fakeClient := fake.NewClientBuilder().WithScheme(TestScheme).WithLists(tt.clusterClaimList).Build() + t.Run(tt.name, func(t *testing.T) { + actualID, err := GetClusterID(true, req, fakeClient, tt.clusterSet) + if err != nil { + assert.Equal(t, tt.expectedErr, err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedID, string(actualID)) + } + }) + } +} diff --git a/multicluster/controllers/multicluster/leader/clusterset_controller.go b/multicluster/controllers/multicluster/leader/clusterset_controller.go index a16baae1b3f..8741ac41c40 100644 --- a/multicluster/controllers/multicluster/leader/clusterset_controller.go +++ b/multicluster/controllers/multicluster/leader/clusterset_controller.go @@ -46,8 +46,9 @@ var ( // Namespace, so a MC Controller will be handling only a single ClusterSet in the given Namespace. type LeaderClusterSetReconciler struct { client.Client - Scheme *runtime.Scheme - mutex sync.Mutex + Scheme *runtime.Scheme + mutex sync.Mutex + ClusterCalimCRDAvailable bool clusterSetConfig *mcv1alpha2.ClusterSet clusterSetID common.ClusterSetID @@ -82,19 +83,15 @@ func (r *LeaderClusterSetReconciler) Reconcile(ctx context.Context, req ctrl.Req // Handle create or update if r.clusterSetConfig == nil { - if clusterSet.Spec.ClusterID == "" { - // ClusterID is a required feild, and the empty value case should only happen - // when Antrea Multi-cluster is upgraded from an old version prior to v1.13. - return ctrl.Result{}, fmt.Errorf("the spec.clusterID field of ClusterSet %s is required", req.NamespacedName) + r.clusterID, err = common.GetClusterID(r.ClusterCalimCRDAvailable, req, r.Client, clusterSet) + if err != nil { + return ctrl.Result{}, err } - clusterID := common.ClusterID(clusterSet.Spec.ClusterID) - clusterSetID := common.ClusterSetID(clusterSet.Name) - if err = validateMemberClusterExists(clusterID, clusterSet.Spec.Leaders); err != nil { - err = fmt.Errorf("local cluster %s is not defined as leader in ClusterSet", clusterID) + r.clusterSetID = common.ClusterSetID(clusterSet.Name) + if err = validateMemberClusterExists(r.clusterID, clusterSet.Spec.Leaders); err != nil { + err = fmt.Errorf("local cluster %s is not defined as leader in ClusterSet", r.clusterID) return ctrl.Result{}, err } - r.clusterID = clusterID - r.clusterSetID = clusterSetID } r.clusterSetConfig = clusterSet.DeepCopy() @@ -202,7 +199,14 @@ func (r *LeaderClusterSetReconciler) updateStatus() { status.Conditions = []mcv1alpha2.ClusterSetCondition{overallCondition} } clusterSet.Status = status - err = r.Status().Update(context.TODO(), clusterSet) + if clusterSet.Spec.ClusterID == "" { + // When the common area is not empty but ClusterID is empty, it means the + // CR was created by an old version of ClusterSet CRD. We can use the ClusterID + // from ClusterClaim to update the CR, otherwise, the update will fail due + // to invalid ClusterID. + clusterSet.Spec.ClusterID = string(r.clusterID) + } + err = r.Update(context.TODO(), clusterSet) if err != nil { klog.ErrorS(err, "Failed to update Status of ClusterSet", "name", namespacedName) } diff --git a/multicluster/controllers/multicluster/member/clusterset_controller.go b/multicluster/controllers/multicluster/member/clusterset_controller.go index d810746c15d..d161672625f 100644 --- a/multicluster/controllers/multicluster/member/clusterset_controller.go +++ b/multicluster/controllers/multicluster/member/clusterset_controller.go @@ -51,8 +51,9 @@ var getRemoteConfigAndClient = commonarea.GetRemoteConfigAndClient // MemberClusterSetReconciler reconciles a ClusterSet object in the member cluster deployment. type MemberClusterSetReconciler struct { client.Client - Scheme *runtime.Scheme - Namespace string + Scheme *runtime.Scheme + Namespace string + ClusterCalimCRDAvailable bool // commonAreaLock protects the access to RemoteCommonArea. commonAreaLock sync.RWMutex @@ -70,12 +71,14 @@ func NewMemberClusterSetReconciler(client client.Client, scheme *runtime.Scheme, namespace string, enableStretchedNetworkPolicy bool, + clusterCalimCRDAvailable bool, ) *MemberClusterSetReconciler { return &MemberClusterSetReconciler{ Client: client, Scheme: scheme, Namespace: namespace, enableStretchedNetworkPolicy: enableStretchedNetworkPolicy, + ClusterCalimCRDAvailable: clusterCalimCRDAvailable, } } @@ -113,12 +116,10 @@ func (r *MemberClusterSetReconciler) Reconcile(ctx context.Context, req ctrl.Req // Handle create or update if r.clusterSetConfig == nil { - if clusterSet.Spec.ClusterID == "" { - // ClusterID is a required feild, and the empty value case should only happen - // when Antrea Multi-cluster is upgraded from an old version prior to v1.13. - return ctrl.Result{}, fmt.Errorf("the spec.clusterID field of ClusterSet %s is required", req.NamespacedName) + r.clusterID, err = common.GetClusterID(r.ClusterCalimCRDAvailable, req, r.Client, clusterSet) + if err != nil { + return ctrl.Result{}, err } - r.clusterID = common.ClusterID(clusterSet.Spec.ClusterID) r.clusterSetID = common.ClusterSetID(clusterSet.Name) } r.clusterSetConfig = clusterSet.DeepCopy() @@ -353,7 +354,14 @@ func (r *MemberClusterSetReconciler) updateStatus() { status.Conditions = []mcv1alpha2.ClusterSetCondition{overallCondition} } clusterSet.Status = status - err = r.Status().Update(context.TODO(), clusterSet) + if clusterSet.Spec.ClusterID == "" { + // When the common area is not empty but ClusterID is empty, it means the + // CR was created by an old version of ClusterSet CRD. We can use the ClusterID + // from ClusterClaim to update the CR, otherwise, the update will fail due + // to invalid ClusterID. + clusterSet.Spec.ClusterID = string(r.clusterID) + } + err = r.Update(context.TODO(), clusterSet) if err != nil { klog.ErrorS(err, "Failed to update Status of ClusterSet", "name", namespacedName) } diff --git a/multicluster/controllers/multicluster/member/gateway_controller_test.go b/multicluster/controllers/multicluster/member/gateway_controller_test.go index 5d289ec3a2c..1c48eff722b 100644 --- a/multicluster/controllers/multicluster/member/gateway_controller_test.go +++ b/multicluster/controllers/multicluster/member/gateway_controller_test.go @@ -153,7 +153,7 @@ func TestGatewayReconciler(t *testing.T) { fakeRemoteClient = fake.NewClientBuilder().WithScheme(common.TestScheme).WithObjects(tt.resExport).Build() } commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, common.LeaderNamespace, nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) commonAreaGatter := mcReconciler r := NewGatewayReconciler(fakeClient, common.TestScheme, "default", []string{"10.200.1.1/16"}, commonAreaGatter) diff --git a/multicluster/controllers/multicluster/member/labelidentity_controller_test.go b/multicluster/controllers/multicluster/member/labelidentity_controller_test.go index ee590b1df20..3684f452b4c 100644 --- a/multicluster/controllers/multicluster/member/labelidentity_controller_test.go +++ b/multicluster/controllers/multicluster/member/labelidentity_controller_test.go @@ -174,7 +174,7 @@ func TestLabelIdentityReconciler(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existingPods).WithObjects(ns).Build() fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, common.LeaderNamespace, nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", true) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", true, false) mcReconciler.SetRemoteCommonArea(commonArea) r := NewLabelIdentityReconciler(fakeClient, common.TestScheme, mcReconciler) go r.Run(stopCh) @@ -241,7 +241,7 @@ func TestNamespaceMapFunc(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithObjects(podA, podC, ns).Build() fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, common.LeaderNamespace, nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", true) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", true, false) mcReconciler.SetRemoteCommonArea(commonArea) r := NewLabelIdentityReconciler(fakeClient, common.TestScheme, mcReconciler) diff --git a/multicluster/controllers/multicluster/member/resourceimport_controller_test.go b/multicluster/controllers/multicluster/member/resourceimport_controller_test.go index 5be782db638..8446d471f37 100644 --- a/multicluster/controllers/multicluster/member/resourceimport_controller_test.go +++ b/multicluster/controllers/multicluster/member/resourceimport_controller_test.go @@ -558,7 +558,7 @@ func TestStaleControllerNoRaceWithResourceImportReconciler(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists().Build() ca := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "antrea-mcs", nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", true) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", true, false) mcReconciler.SetRemoteCommonArea(ca) c := multicluster.NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, multicluster.MemberCluster) r := newLabelIdentityResourceImportReconciler(fakeClient, scheme, fakeClient, localClusterID, "default", ca) diff --git a/multicluster/controllers/multicluster/member/serviceexport_controller_test.go b/multicluster/controllers/multicluster/member/serviceexport_controller_test.go index 1be66be44a1..6da358953db 100644 --- a/multicluster/controllers/multicluster/member/serviceexport_controller_test.go +++ b/multicluster/controllers/multicluster/member/serviceexport_controller_test.go @@ -78,7 +78,7 @@ func TestServiceExportReconciler_handleDeleteEvent(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithObjects(existSvcResExport, existEpResExport).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) r := NewServiceExportReconciler(fakeClient, common.TestScheme, mcReconciler, "ClusterIP", false) r.installedSvcs.Add(&svcInfo{ @@ -273,7 +273,7 @@ func TestServiceExportReconciler_CheckExportStatus(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) r := NewServiceExportReconciler(fakeClient, common.TestScheme, mcReconciler, "ClusterIP", false) for _, tt := range tests { @@ -349,7 +349,7 @@ func TestServiceExportReconciler_handleServiceExportCreateEvent(t *testing.T) { t.Run(tt.name, func(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := NewMemberClusterSetReconciler(tt.fakeClient, common.TestScheme, "default", false) + mcReconciler := NewMemberClusterSetReconciler(tt.fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) r := NewServiceExportReconciler(tt.fakeClient, common.TestScheme, mcReconciler, tt.endpointIPType, tt.endpointSliceEnabled) if _, err := r.Reconcile(common.TestCtx, nginxReq); err != nil { @@ -532,7 +532,7 @@ func TestServiceExportReconciler_handleUpdateEvent(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithObjects(existSvcRe, existEpRe).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) r := NewServiceExportReconciler(fakeClient, common.TestScheme, mcReconciler, tt.endpointIPType, false) r.installedSvcs.Add(sinfo) diff --git a/multicluster/controllers/multicluster/stale_controller_test.go b/multicluster/controllers/multicluster/stale_controller_test.go index ae0658a0e0c..e73b2941243 100644 --- a/multicluster/controllers/multicluster/stale_controller_test.go +++ b/multicluster/controllers/multicluster/stale_controller_test.go @@ -99,7 +99,7 @@ func TestStaleController_CleanupService(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existSvcList, tt.existSvcImpList).Build() fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existingResImpList).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) c := NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, MemberCluster) if err := c.cleanup(ctx); err != nil { @@ -194,7 +194,7 @@ func TestStaleController_CleanupACNP(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existingResImpList).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) c := NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, MemberCluster) if err := c.cleanup(ctx); err != nil { @@ -389,7 +389,7 @@ func TestStaleController_CleanupResourceExport(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existResExpList).Build() commonArea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "default", nil) - mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonArea) c := NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, MemberCluster) if err := c.cleanup(ctx); err != nil { @@ -466,7 +466,7 @@ func TestStaleController_CleanupClusterInfoImport(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existingResImpList).Build() commonarea := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "antrea-mcs", nil) - mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(commonarea) c := NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, MemberCluster) if err := c.cleanup(ctx); err != nil { @@ -573,7 +573,7 @@ func TestStaleController_CleanupMemberClusterAnnounce(t *testing.T) { t.Run(tt.name, func(t *testing.T) { fakeClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.memberClusterAnnounceList).WithLists(tt.clusterSet).Build() - mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) c := NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, LeaderCluster) assert.Equal(t, nil, c.cleanup(ctx)) @@ -649,7 +649,7 @@ func TestStaleController_CleanupLabelIdentites(t *testing.T) { fakeRemoteClient := fake.NewClientBuilder().WithScheme(common.TestScheme).WithLists(tt.existingResImpList).Build() ca := commonarea.NewFakeRemoteCommonArea(fakeRemoteClient, "leader-cluster", common.LocalClusterID, "antrea-mcs", nil) - mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false) + mcReconciler := member.NewMemberClusterSetReconciler(fakeClient, common.TestScheme, "default", false, false) mcReconciler.SetRemoteCommonArea(ca) c := NewStaleResCleanupController(fakeClient, common.TestScheme, "default", mcReconciler, MemberCluster) if err := c.cleanup(ctx); err != nil { diff --git a/multicluster/test/integration/suite_test.go b/multicluster/test/integration/suite_test.go index 69d5d54c998..9973ce4e32b 100644 --- a/multicluster/test/integration/suite_test.go +++ b/multicluster/test/integration/suite_test.go @@ -143,6 +143,7 @@ var _ = BeforeSuite(func() { k8sManager.GetScheme(), LeaderNamespace, false, + false, ) err = clusterSetReconciler.SetupWithManager(k8sManager) Expect(err).ToNot(HaveOccurred())