diff --git a/controllers/common/common.go b/controllers/common/common.go index c23f6f05..715c9860 100644 --- a/controllers/common/common.go +++ b/controllers/common/common.go @@ -11,11 +11,14 @@ import ( "fmt" "strings" + "github.com/go-logr/logr" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" clusterv1 "open-cluster-management.io/api/cluster/v1" + clusterv1alpha1 "open-cluster-management.io/api/cluster/v1alpha1" clusterv1beta1 "open-cluster-management.io/api/cluster/v1beta1" appsv1 "open-cluster-management.io/multicloud-operators-subscription/pkg/apis/apps/placementrule/v1" ctrl "sigs.k8s.io/controller-runtime" @@ -206,19 +209,73 @@ func HasValidPlacementRef(pb *policiesv1.PlacementBinding) bool { } } -// GetDecisions returns the placement decisions from the Placement or PlacementRule referred to by -// the PlacementBinding -func GetDecisions( +// The placementDecisionGetter is an implementation of the cluster PlacementDecisionGetter +type placementDecisionGetter struct { + c client.Client +} + +// List the PlacementDecisions using the method signature from the cluster PlacementDecisionGetter +// interface. (The signature was originally written to retrieve from a cache, so we need to convert +// the returned values to an array of pointers.) +func (pd placementDecisionGetter) List( + selector labels.Selector, namespace string, +) ([]*clusterv1beta1.PlacementDecision, error) { + pdList := &clusterv1beta1.PlacementDecisionList{} + pdPtrList := []*clusterv1beta1.PlacementDecision{} + lopts := &client.ListOptions{ + LabelSelector: selector, + Namespace: namespace, + } + + err := pd.c.List(context.TODO(), pdList, lopts) + if err != nil { + return nil, err + } + + for _, pd := range pdList.Items { + pdPtr := pd + pdPtrList = append(pdPtrList, &pdPtr) + } + + return pdPtrList, nil +} + +// GetRolloutHandler returns a rollout handler from the Placement library to retrieve rollout results +func GetRolloutHandler( + c client.Client, placement *clusterv1beta1.Placement, log logr.Logger, +) (*clusterv1alpha1.RolloutHandler, error) { + pdTracker := clusterv1beta1.NewPlacementDecisionClustersTracker(placement, placementDecisionGetter{c}, nil) + + err := pdTracker.Refresh() + if err != nil { + log.Error(err, "Error retrieving PlacementDecisions from tracker") + } + + return clusterv1alpha1.NewRolloutHandler(pdTracker) +} + +// GetClusterRolloutStatus is the implementation of the cluster ClusterRolloutStatusFunc used to +// specify policy-specific rollout status for a particular cluster +var GetClusterRolloutStatus clusterv1alpha1.ClusterRolloutStatusFunc = func( + clusterName string, +) clusterv1alpha1.ClusterRolloutStatus { + return clusterv1alpha1.ClusterRolloutStatus{} +} + +// GetRolloutClusters returns the clusters for the current rollout (i.e. the rollout result) from +// the Placement or PlacementRule referred to by the PlacementBinding +func GetRolloutClusters( ctx context.Context, c client.Client, pb *policiesv1.PlacementBinding, -) ([]string, error) { +) (clusterv1alpha1.RolloutResult, error) { + rolloutResult := clusterv1alpha1.RolloutResult{} + // If the PlacementRef is invalid, log and return. (This is not recoverable.) if !HasValidPlacementRef(pb) { log.Info(fmt.Sprintf("PlacementBinding %s/%s placementRef is not valid. Ignoring.", pb.Namespace, pb.Name)) - return nil, nil + return rolloutResult, nil } - clusterDecisions := make([]string, 0) refNN := types.NamespacedName{ Namespace: pb.GetNamespace(), Name: pb.PlacementRef.Name, @@ -230,46 +287,53 @@ func GetDecisions( err := c.Get(ctx, refNN, pl) if err != nil && !k8serrors.IsNotFound(err) { - return nil, fmt.Errorf("failed to get Placement '%v': %w", pb.PlacementRef.Name, err) + return rolloutResult, fmt.Errorf("failed to get Placement '%v': %w", pb.PlacementRef.Name, err) } if k8serrors.IsNotFound(err) { - return nil, nil + return rolloutResult, nil } - list := &clusterv1beta1.PlacementDecisionList{} - lopts := &client.ListOptions{Namespace: pb.GetNamespace()} + rolloutHandler, err := GetRolloutHandler(c, pl, log) + if err != nil { + log.Error(err, "Failed to instantiate the cluster rollout handler") - opts := client.MatchingLabels{"cluster.open-cluster-management.io/placement": pl.GetName()} - opts.ApplyToList(lopts) + return rolloutResult, err + } - err = c.List(ctx, list, lopts) - if err != nil && !k8serrors.IsNotFound(err) { - return nil, fmt.Errorf("failed to list the PlacementDecisions for '%v', %w", pb.PlacementRef.Name, err) + // Set the RolloutStrategy to "All" + // (this will be configurable in the future) + defaultRolloutStrategy := clusterv1alpha1.RolloutStrategy{ + Type: clusterv1alpha1.All, } - for _, item := range list.Items { - for _, cluster := range item.Status.Decisions { - clusterDecisions = append(clusterDecisions, cluster.ClusterName) - } + strategy, rolloutResult, err := rolloutHandler.GetRolloutCluster( + defaultRolloutStrategy, GetClusterRolloutStatus) + if err != nil { + log.Error(err, "Failed to retrieve clusters from rollout handler") + + return clusterv1alpha1.RolloutResult{}, err } - return clusterDecisions, nil + log.V(1).Info(fmt.Sprintf("Rolling out policies using rollout strategy %s", strategy.Type)) + + return rolloutResult, nil case "PlacementRule": plr := &appsv1.PlacementRule{} if err := c.Get(ctx, refNN, plr); err != nil && !k8serrors.IsNotFound(err) { - return nil, fmt.Errorf("failed to get PlacementRule '%v': %w", pb.PlacementRef.Name, err) + return rolloutResult, fmt.Errorf("failed to get PlacementRule '%v': %w", pb.PlacementRef.Name, err) } - for _, cluster := range plr.Status.Decisions { - clusterDecisions = append(clusterDecisions, cluster.ClusterName) + rolloutResult.ClustersToRollout = map[string]clusterv1alpha1.ClusterRolloutStatus{} + for _, decision := range plr.Status.Decisions { + rolloutResult.ClustersToRollout[decision.ClusterName] = GetClusterRolloutStatus(decision.ClusterName) } // if the PlacementRule was not found, the decisions will be empty - return clusterDecisions, nil + return rolloutResult, nil } - return nil, fmt.Errorf("placement binding %s/%s reference is not valid", pb.Namespace, pb.Name) + return rolloutResult, fmt.Errorf("placement binding %s/%s reference is not valid", pb.Namespace, pb.Name) } func ParseRootPolicyLabel(rootPlc string) (name, namespace string, err error) { @@ -302,17 +366,17 @@ func FullNameForPolicy(plc *policiesv1.Policy) string { func GetRepPoliciesInPlacementBinding( ctx context.Context, c client.Client, pb *policiesv1.PlacementBinding, ) []reconcile.Request { - decisions, err := GetDecisions(ctx, c, pb) + rolloutResult, err := GetRolloutClusters(ctx, c, pb) if err != nil { return []reconcile.Request{} } // Use this for removing duplicated policies rootPolicyRequest := GetPoliciesInPlacementBinding(ctx, c, pb) - result := make([]reconcile.Request, 0, len(rootPolicyRequest)*len(decisions)) + result := make([]reconcile.Request, 0, len(rootPolicyRequest)*len(rolloutResult.ClustersToRollout)) for _, rp := range rootPolicyRequest { - for _, clusterName := range decisions { + for clusterName := range rolloutResult.ClustersToRollout { result = append(result, reconcile.Request{NamespacedName: types.NamespacedName{ Name: rp.Namespace + "." + rp.Name, Namespace: clusterName, diff --git a/controllers/common/common_status_update.go b/controllers/common/common_status_update.go index 4d9e560c..631ee48f 100644 --- a/controllers/common/common_status_update.go +++ b/controllers/common/common_status_update.go @@ -10,6 +10,7 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" + clusterv1alpha1 "open-cluster-management.io/api/cluster/v1alpha1" clusterv1beta1 "open-cluster-management.io/api/cluster/v1beta1" appsv1 "open-cluster-management.io/multicloud-operators-subscription/pkg/apis/apps/placementrule/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -22,7 +23,7 @@ import ( func RootStatusUpdate(ctx context.Context, c client.Client, rootPolicy *policiesv1.Policy) (DecisionSet, error) { placements, decisions, err := GetClusterDecisions(ctx, c, rootPolicy) if err != nil { - log.Info("Failed to get any placement decisions. Giving up on the request.") + log.Info("Failed to get any clusters from the placement. Giving up on the request.") return nil, err } @@ -63,12 +64,13 @@ func RootStatusUpdate(ctx context.Context, c client.Client, rootPolicy *policies return decisions, nil } -// GetPolicyPlacementDecisions retrieves the placement decisions for a input PlacementBinding when -// the policy is bound within it. It can return an error if the PlacementBinding is invalid, or if -// a required lookup fails. -func GetPolicyPlacementDecisions(ctx context.Context, c client.Client, +// GetPolicyRolloutClusters retrieves the clusters for the current rollout (i.e. the rollout result) +// for a input PlacementBinding when the policy is bound within it. It can return an error if the +// PlacementBinding is invalid, or if a required lookup fails. +func GetPolicyRolloutClusters(ctx context.Context, c client.Client, instance *policiesv1.Policy, pb *policiesv1.PlacementBinding, -) (clusterDecisions []string, placements []*policiesv1.Placement, err error) { +) (rolloutResult clusterv1alpha1.RolloutResult, placements []*policiesv1.Placement, err error) { + rolloutResult = clusterv1alpha1.RolloutResult{} policySubjectFound := false policySetSubjects := make(map[string]struct{}) // a set, to prevent duplicates @@ -102,14 +104,14 @@ func GetPolicyPlacementDecisions(ctx context.Context, c client.Client, if len(placements) == 0 { // None of the subjects in the PlacementBinding were relevant to this Policy. - return nil, nil, nil + return rolloutResult, nil, nil } // If the PlacementRef is invalid, log and return. (This is not recoverable.) if !HasValidPlacementRef(pb) { log.Info(fmt.Sprintf("Placement binding %s/%s placementRef is not valid. Ignoring.", pb.Namespace, pb.Name)) - return nil, nil, nil + return rolloutResult, nil, nil } // If the placementRef exists, then it needs to be added to the placement item @@ -122,7 +124,8 @@ func GetPolicyPlacementDecisions(ctx context.Context, c client.Client, case "PlacementRule": plr := &appsv1.PlacementRule{} if err := c.Get(ctx, refNN, plr); err != nil && !k8serrors.IsNotFound(err) { - return nil, nil, fmt.Errorf("failed to check for PlacementRule '%v': %w", pb.PlacementRef.Name, err) + return rolloutResult, nil, + fmt.Errorf("failed to check for PlacementRule '%v': %w", pb.PlacementRef.Name, err) } for i := range placements { @@ -131,7 +134,7 @@ func GetPolicyPlacementDecisions(ctx context.Context, c client.Client, case "Placement": pl := &clusterv1beta1.Placement{} if err := c.Get(ctx, refNN, pl); err != nil && !k8serrors.IsNotFound(err) { - return nil, nil, fmt.Errorf("failed to check for Placement '%v': %w", pb.PlacementRef.Name, err) + return rolloutResult, nil, fmt.Errorf("failed to check for Placement '%v': %w", pb.PlacementRef.Name, err) } for i := range placements { @@ -141,17 +144,17 @@ func GetPolicyPlacementDecisions(ctx context.Context, c client.Client, // If there are no placements, then the PlacementBinding is not for this Policy. if len(placements) == 0 { - return nil, nil, nil + return rolloutResult, nil, nil } // If the policy is disabled, don't return any decisions, so that the policy isn't put on any clusters if instance.Spec.Disabled { - return nil, placements, nil + return rolloutResult, placements, nil } - clusterDecisions, err = GetDecisions(ctx, c, pb) + rolloutResult, err = GetRolloutClusters(ctx, c, pb) - return clusterDecisions, placements, err + return rolloutResult, placements, err } type DecisionSet map[string]bool @@ -188,18 +191,18 @@ func GetClusterDecisions( continue } - plcDecisions, plcPlacements, err := GetPolicyPlacementDecisions(ctx, c, rootPolicy, &pbList.Items[i]) + plcRolloutClusters, plcPlacements, err := GetPolicyRolloutClusters(ctx, c, rootPolicy, &pbList.Items[i]) if err != nil { return nil, nil, err } - if len(plcDecisions) == 0 { - log.Info("No placement decisions to process for this policy from this non-restricted binding", + if len(plcRolloutClusters.ClustersToRollout) == 0 { + log.Info("No clusters to process from the placement for this policy from this non-restricted binding", "policyName", rootPolicy.GetName(), "bindingName", pb.GetName()) } // Decisions are all unique - for _, clusterName := range plcDecisions { + for clusterName := range plcRolloutClusters.ClustersToRollout { decisions[clusterName] = true } @@ -214,18 +217,18 @@ func GetClusterDecisions( foundInDecisions := false - plcDecisions, plcPlacements, err := GetPolicyPlacementDecisions(ctx, c, rootPolicy, &pbList.Items[i]) + plcRolloutClusters, plcPlacements, err := GetPolicyRolloutClusters(ctx, c, rootPolicy, &pbList.Items[i]) if err != nil { return nil, nil, err } - if len(plcDecisions) == 0 { - log.Info("No placement decisions to process for this policy from this restricted binding", + if len(plcRolloutClusters.ClustersToRollout) == 0 { + log.Info("No clusters to process from the placement for this policy from this restricted binding", "policyName", rootPolicy.GetName(), "bindingName", pb.GetName()) } // Decisions are all unique - for _, clusterName := range plcDecisions { + for clusterName := range plcRolloutClusters.ClustersToRollout { if _, ok := decisions[clusterName]; ok { foundInDecisions = true } diff --git a/controllers/policyset/policyset_controller.go b/controllers/policyset/policyset_controller.go index 601b22eb..b3714786 100644 --- a/controllers/policyset/policyset_controller.go +++ b/controllers/policyset/policyset_controller.go @@ -13,6 +13,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" + clusterv1alpha1 "open-cluster-management.io/api/cluster/v1alpha1" clusterv1beta1 "open-cluster-management.io/api/cluster/v1beta1" appsv1 "open-cluster-management.io/multicloud-operators-subscription/pkg/apis/apps/placementrule/v1" ctrl "sigs.k8s.io/controller-runtime" @@ -189,13 +190,15 @@ func (r *PolicySetReconciler) processPolicySet(ctx context.Context, plcSet *poli log.V(1).Info("Error getting placement binding " + pbName) } - var clusterDecisions []string - clusterDecisions, err = common.GetDecisions(ctx, r.Client, pb) + var rolloutResult clusterv1alpha1.RolloutResult + rolloutResult, err = common.GetRolloutClusters(ctx, r.Client, pb) if err != nil { log.Error(err, "Error getting placement decisions for binding "+pbName) } - clusters = append(clusters, clusterDecisions...) + for clusterName := range rolloutResult.ClustersToRollout { + clusters = append(clusters, clusterName) + } } // aggregate compliance state diff --git a/go.mod b/go.mod index 883e0ad2..2b76e201 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.21 require ( github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 + github.com/go-logr/logr v1.2.4 github.com/go-logr/zapr v1.2.4 github.com/golang-migrate/migrate/v4 v4.16.2 github.com/google/go-cmp v0.6.0 @@ -38,7 +39,6 @@ require ( github.com/evanphx/json-patch v5.7.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.7.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.4 // indirect diff --git a/test/e2e/case10_policyset_propagation_test.go b/test/e2e/case10_policyset_propagation_test.go index f5b4d54a..b0a9c22b 100644 --- a/test/e2e/case10_policyset_propagation_test.go +++ b/test/e2e/case10_policyset_propagation_test.go @@ -424,11 +424,16 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1") + placement := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacement, + case10PolicySetName+"-plm", + testNamespace, + true, + defaultTimeoutSeconds, ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePlacementStatus(placementClient, placement, plm.GetName(), 1) plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -445,11 +450,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed2", true, defaultTimeoutSeconds, @@ -466,11 +467,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1", "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1", "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -518,11 +515,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1", "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1", "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -566,11 +559,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1", "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1", "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -645,11 +634,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicyName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -666,11 +651,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -865,11 +846,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"1-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed1", true, defaultTimeoutSeconds, @@ -886,11 +863,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"2-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName, "managed2", true, defaultTimeoutSeconds, @@ -967,11 +940,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName+"1", "managed1", true, defaultTimeoutSeconds, @@ -997,11 +966,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName+"1", "managed1", false, defaultTimeoutSeconds, @@ -1052,11 +1017,7 @@ var _ = Describe("Test policyset propagation", func() { clientHubDynamic, gvrPlacementDecision, case10PolicySetName+"-plm-decision", testNamespace, true, defaultTimeoutSeconds, ) - plm.Object["status"] = utils.GeneratePldStatus(plm.GetName(), plm.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plm, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plm, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case10PolicyName+"1", "managed1", true, defaultTimeoutSeconds, diff --git a/test/e2e/case19_rep_policy_placement_test.go b/test/e2e/case19_rep_policy_placement_test.go index aa811561..956db67c 100644 --- a/test/e2e/case19_rep_policy_placement_test.go +++ b/test/e2e/case19_rep_policy_placement_test.go @@ -29,7 +29,7 @@ var _ = Describe("Test replicated_policy controller and propagation", Ordered, S Expect(plc).NotTo(BeNil()) }) AfterAll(func() { - By("Creating " + case19PolicyName) + By("Deleting " + case19PolicyName) utils.Kubectl("delete", "-f", case19PolicyYaml, "-n", testNamespace, @@ -47,20 +47,16 @@ var _ = Describe("Test replicated_policy controller and propagation", Ordered, S }) It("should propagate reconcile only managed2", func() { By("Patching test-policy-plr with decision of cluster managed1, managed2") + decisionName := case19PolicyName + "-plr-1" plr := utils.GetWithTimeout( clientHubDynamic, gvrPlacementDecision, - case19PolicyName+"-plr-1", + decisionName, testNamespace, true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1", "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), - plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1", "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case19PolicyName, "managed1", true, defaultTimeoutSeconds, ) @@ -80,17 +76,12 @@ var _ = Describe("Test replicated_policy controller and propagation", Ordered, S plr = utils.GetWithTimeout( clientHubDynamic, gvrPlacementDecision, - case19PolicyName+"-plr-1", + decisionName, testNamespace, true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed2") - _, err = clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), - plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed2") plc = utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case19PolicyName, "managed1", false, defaultTimeoutSeconds, ) @@ -125,12 +116,7 @@ var _ = Describe("Test replicated_policy controller and propagation", Ordered, S true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1") - _, err = clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), - plr, metav1.UpdateOptions{}, - ) - Expect(err).ShouldNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1") By("Patching gvrPlacementBinding placementRef") plb := utils.GetWithTimeout( clientHubDynamic, diff --git a/test/e2e/case20_compliance_api_controller_test.go b/test/e2e/case20_compliance_api_controller_test.go index 4f3577e2..f49e79b5 100644 --- a/test/e2e/case20_compliance_api_controller_test.go +++ b/test/e2e/case20_compliance_api_controller_test.go @@ -94,11 +94,7 @@ var _ = Describe("Test governance-policy-database secret changes and DB annotati true, defaultTimeoutSeconds, ) - pld.Object["status"] = utils.GeneratePldStatus(pld.GetName(), pld.GetNamespace(), "managed1") - _, err = clientHubDynamic.Resource(gvrPlacementDecision).Namespace(nsName).UpdateStatus( - ctx, pld, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(clientHubDynamic.Resource(gvrPlacementDecision).Namespace(nsName), pld, "managed1") By("Waiting for the replicated policy") replicatedPolicy := utils.GetWithTimeout( diff --git a/test/e2e/case4_unexpected_policy_test.go b/test/e2e/case4_unexpected_policy_test.go index c5a2f409..ddf92ee4 100644 --- a/test/e2e/case4_unexpected_policy_test.go +++ b/test/e2e/case4_unexpected_policy_test.go @@ -11,7 +11,7 @@ import ( "open-cluster-management.io/governance-policy-propagator/test/utils" ) -var _ = Describe("Test unexpect policy handling", func() { +var _ = Describe("Test unexpected policy handling", func() { const ( case4PolicyName string = "case4-test-policy" case4PolicyYaml string = "../resources/case4_unexpected_policy/case4-test-policy.yaml" diff --git a/test/e2e/case6_placement_propagation_test.go b/test/e2e/case6_placement_propagation_test.go index c43e8dc0..f5c45569 100644 --- a/test/e2e/case6_placement_propagation_test.go +++ b/test/e2e/case6_placement_propagation_test.go @@ -34,20 +34,25 @@ var _ = Describe("Test policy propagation", func() { }) It("should propagate to cluster ns managed1", func() { By("Patching test-policy-plr with decision of cluster managed1") + decisionName := case6PolicyName + "-plr-1" + placement := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacement, + case6PolicyName+"-plr", + testNamespace, + true, + defaultTimeoutSeconds, + ) + utils.GeneratePlacementStatus(placementClient, placement, decisionName, 1) plr := utils.GetWithTimeout( clientHubDynamic, gvrPlacementDecision, - case6PolicyName+"-plr-1", + decisionName, testNamespace, true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), - plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case6PolicyName, "managed1", true, defaultTimeoutSeconds, ) @@ -59,19 +64,25 @@ var _ = Describe("Test policy propagation", func() { }) It("should propagate to cluster ns managed2", func() { By("Patching test-policy-plr with decision of cluster managed2") + decisionName := case6PolicyName + "-plr-1" + placement := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacement, + case6PolicyName+"-plr", + testNamespace, + true, + defaultTimeoutSeconds, + ) + utils.GeneratePlacementStatus(placementClient, placement, decisionName, 1) plr := utils.GetWithTimeout( clientHubDynamic, gvrPlacementDecision, - case6PolicyName+"-plr-1", + decisionName, testNamespace, true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case6PolicyName, "managed2", true, defaultTimeoutSeconds, ) @@ -83,19 +94,25 @@ var _ = Describe("Test policy propagation", func() { }) It("should propagate to cluster ns managed1 and managed2", func() { By("Patching test-policy-plr with decision of both managed1 and managed2") + decisionName := case6PolicyName + "-plr-1" + placement := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacement, + case6PolicyName+"-plr", + testNamespace, + true, + defaultTimeoutSeconds, + ) + utils.GeneratePlacementStatus(placementClient, placement, decisionName, 2) plr := utils.GetWithTimeout( clientHubDynamic, gvrPlacementDecision, - case6PolicyName+"-plr-1", + decisionName, testNamespace, true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1", "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1", "managed2") opt := metav1.ListOptions{ LabelSelector: common.RootPolicyLabel + "=" + testNamespace + "." + case6PolicyName, } @@ -111,11 +128,16 @@ var _ = Describe("Test policy propagation", func() { true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1") + placement := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacement, + case6PolicyName+"-plr", + testNamespace, + true, + defaultTimeoutSeconds, ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePlacementStatus(placementClient, placement, plr.GetName(), 1) plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case6PolicyName, "managed1", true, defaultTimeoutSeconds, ) @@ -144,11 +166,16 @@ var _ = Describe("Test policy propagation", func() { true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1", "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1", "managed2") + placement := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacement, + case6PolicyName+"-plr", + testNamespace, + true, + defaultTimeoutSeconds, ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePlacementStatus(placementClient, placement, plr.GetName(), 2) opt := metav1.ListOptions{ LabelSelector: common.RootPolicyLabel + "=" + testNamespace + "." + case6PolicyName, } @@ -401,11 +428,7 @@ var _ = Describe("Test policy propagation", func() { true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case6PolicyName, "managed1", true, defaultTimeoutSeconds, ) @@ -482,11 +505,7 @@ var _ = Describe("Test policy propagation", func() { true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, @@ -571,11 +590,7 @@ var _ = Describe("Test policy propagation", func() { true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "test6-extra") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "test6-extra") By("Verifying that the replicated policy is not created") Consistently(func() interface{} { diff --git a/test/e2e/case7_bindings_test.go b/test/e2e/case7_bindings_test.go index d7eedfd0..51011593 100644 --- a/test/e2e/case7_bindings_test.go +++ b/test/e2e/case7_bindings_test.go @@ -95,19 +95,25 @@ var _ = Describe("Test policy propagation", func() { }) It("should propagate to cluster ns managed1", func() { By("Patching test-policy-plr with decision of cluster managed1") - plr := utils.GetWithTimeout( + decisionName := case7PolicyName + "-plr-1" + placement := utils.GetWithTimeout( clientHubDynamic, - gvrPlacementDecision, - case7PolicyName+"-plr-1", + gvrPlacement, + case7PolicyName+"-plr1", testNamespace, true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed1") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, + utils.GeneratePlacementStatus(placementClient, placement, decisionName, 1) + pld := utils.GetWithTimeout( + clientHubDynamic, + gvrPlacementDecision, + decisionName, + testNamespace, + true, + defaultTimeoutSeconds, ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, pld, "managed1") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case7PolicyName, "managed1", true, defaultTimeoutSeconds, ) @@ -127,11 +133,7 @@ var _ = Describe("Test policy propagation", func() { true, defaultTimeoutSeconds, ) - plr.Object["status"] = utils.GeneratePldStatus(plr.GetName(), plr.GetNamespace(), "managed2") - _, err := clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace).UpdateStatus( - context.TODO(), plr, metav1.UpdateOptions{}, - ) - Expect(err).ToNot(HaveOccurred()) + utils.GeneratePldStatus(placementDecisionClient, plr, "managed2") plc := utils.GetWithTimeout( clientHubDynamic, gvrPolicy, testNamespace+"."+case7PolicyName, "managed2", true, defaultTimeoutSeconds, ) diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 8647a810..97de3cf8 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -36,23 +36,25 @@ const ( ) var ( - testNamespace string - clientHub kubernetes.Interface - clientHubDynamic dynamic.Interface - kubeconfigHub string - complianceAPIPort uint - gvrPolicy schema.GroupVersionResource - gvrPolicyAutomation schema.GroupVersionResource - gvrPolicySet schema.GroupVersionResource - gvrPlacementBinding schema.GroupVersionResource - gvrPlacementRule schema.GroupVersionResource - gvrPlacement schema.GroupVersionResource - gvrPlacementDecision schema.GroupVersionResource - gvrSecret schema.GroupVersionResource - gvrAnsibleJob schema.GroupVersionResource - gvrNamespace schema.GroupVersionResource - defaultTimeoutSeconds int - defaultImageRegistry string + testNamespace string + clientHub kubernetes.Interface + clientHubDynamic dynamic.Interface + placementClient dynamic.ResourceInterface + placementDecisionClient dynamic.ResourceInterface + kubeconfigHub string + complianceAPIPort uint + gvrPolicy schema.GroupVersionResource + gvrPolicyAutomation schema.GroupVersionResource + gvrPolicySet schema.GroupVersionResource + gvrPlacementBinding schema.GroupVersionResource + gvrPlacementRule schema.GroupVersionResource + gvrPlacement schema.GroupVersionResource + gvrPlacementDecision schema.GroupVersionResource + gvrSecret schema.GroupVersionResource + gvrAnsibleJob schema.GroupVersionResource + gvrNamespace schema.GroupVersionResource + defaultTimeoutSeconds int + defaultImageRegistry string ) func TestE2e(t *testing.T) { @@ -111,6 +113,8 @@ var _ = BeforeSuite(func() { defaultImageRegistry = "quay.io/open-cluster-management" testNamespace = "policy-propagator-test" defaultTimeoutSeconds = 30 + placementClient = clientHubDynamic.Resource(gvrPlacement).Namespace(testNamespace) + placementDecisionClient = clientHubDynamic.Resource(gvrPlacementDecision).Namespace(testNamespace) By("Create Namespace if needed") namespaces := clientHub.CoreV1().Namespaces() if _, err := namespaces.Get( diff --git a/test/resources/case10_policyset_propagation/case10-test-multiple-policysets-single-pb.yaml b/test/resources/case10_policyset_propagation/case10-test-multiple-policysets-single-pb.yaml index 69268632..bbd3cc32 100644 --- a/test/resources/case10_policyset_propagation/case10-test-multiple-policysets-single-pb.yaml +++ b/test/resources/case10_policyset_propagation/case10-test-multiple-policysets-single-pb.yaml @@ -88,6 +88,7 @@ metadata: name: case10-test-policyset-plm-decision labels: cluster.open-cluster-management.io/placement: case10-test-policyset-plm + cluster.open-cluster-management.io/decision-group-index: "0" status: decisions: - clusterName: managed2 diff --git a/test/resources/case10_policyset_propagation/case10-test-multiple-policysets.yaml b/test/resources/case10_policyset_propagation/case10-test-multiple-policysets.yaml index adbfa3cd..1e9a56f8 100644 --- a/test/resources/case10_policyset_propagation/case10-test-multiple-policysets.yaml +++ b/test/resources/case10_policyset_propagation/case10-test-multiple-policysets.yaml @@ -56,6 +56,7 @@ metadata: name: case10-test-policyset1-plm-decision labels: cluster.open-cluster-management.io/placement: case10-test-policyset1-plm + cluster.open-cluster-management.io/decision-group-index: "0" status: decisions: - clusterName: managed1 @@ -98,6 +99,7 @@ metadata: name: case10-test-policyset2-plm-decision labels: cluster.open-cluster-management.io/placement: case10-test-policyset2-plm + cluster.open-cluster-management.io/decision-group-index: "0" status: decisions: - clusterName: managed2 diff --git a/test/resources/case10_policyset_propagation/case10-test-policyset-placement.yaml b/test/resources/case10_policyset_propagation/case10-test-policyset-placement.yaml index 89e2898e..6053bf9d 100644 --- a/test/resources/case10_policyset_propagation/case10-test-policyset-placement.yaml +++ b/test/resources/case10_policyset_propagation/case10-test-policyset-placement.yaml @@ -56,6 +56,7 @@ metadata: name: case10-test-policyset-plm-decision labels: cluster.open-cluster-management.io/placement: case10-test-policyset-plm + cluster.open-cluster-management.io/decision-group-index: "0" status: decisions: - clusterName: local-cluster diff --git a/test/resources/case10_policyset_propagation/case10-test-policyset-policy-placement.yaml b/test/resources/case10_policyset_propagation/case10-test-policyset-policy-placement.yaml index 5e84d578..517cc28a 100644 --- a/test/resources/case10_policyset_propagation/case10-test-policyset-policy-placement.yaml +++ b/test/resources/case10_policyset_propagation/case10-test-policyset-policy-placement.yaml @@ -48,6 +48,7 @@ metadata: name: case10-test-policy-plm-decision labels: cluster.open-cluster-management.io/placement: case10-test-policy-plm + cluster.open-cluster-management.io/decision-group-index: "0" status: decisions: - clusterName: managed1 @@ -90,6 +91,7 @@ metadata: name: case10-test-policyset-plm-decision labels: cluster.open-cluster-management.io/placement: case10-test-policyset-plm + cluster.open-cluster-management.io/decision-group-index: "0" status: decisions: - clusterName: managed1 diff --git a/test/resources/case19_rep_policy_placement/case19-test-policy.yaml b/test/resources/case19_rep_policy_placement/case19-test-policy.yaml index f3e0d094..eeb9398d 100644 --- a/test/resources/case19_rep_policy_placement/case19-test-policy.yaml +++ b/test/resources/case19_rep_policy_placement/case19-test-policy.yaml @@ -48,6 +48,7 @@ metadata: name: case19-test-policy-plr-1 labels: cluster.open-cluster-management.io/placement: case19-test-policy-plr + cluster.open-cluster-management.io/decision-group-index: "0" --- apiVersion: cluster.open-cluster-management.io/v1beta1 kind: Placement @@ -65,6 +66,7 @@ metadata: name: case19-test-policy-plr-2 labels: cluster.open-cluster-management.io/placement: case19-test-policy-plr-2 + cluster.open-cluster-management.io/decision-group-index: "0" --- apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule diff --git a/test/resources/case6_placement_propagation/case6-test-policy.yaml b/test/resources/case6_placement_propagation/case6-test-policy.yaml index cce92bf4..1900b858 100644 --- a/test/resources/case6_placement_propagation/case6-test-policy.yaml +++ b/test/resources/case6_placement_propagation/case6-test-policy.yaml @@ -48,3 +48,4 @@ metadata: name: case6-test-policy-plr-1 labels: cluster.open-cluster-management.io/placement: case6-test-policy-plr + cluster.open-cluster-management.io/decision-group-index: "0" diff --git a/test/resources/case6_placement_propagation/case6-test-policy2.yaml b/test/resources/case6_placement_propagation/case6-test-policy2.yaml index f6bd6f5a..d33ec778 100644 --- a/test/resources/case6_placement_propagation/case6-test-policy2.yaml +++ b/test/resources/case6_placement_propagation/case6-test-policy2.yaml @@ -53,3 +53,4 @@ metadata: name: case6-test-policy-plr-1 labels: cluster.open-cluster-management.io/placement: case6-test-policy-plr + cluster.open-cluster-management.io/decision-group-index: "0" diff --git a/test/resources/case7_placement_bindings/case7-test-binding1.yaml b/test/resources/case7_placement_bindings/case7-test-binding1.yaml index 3503bb39..43660808 100644 --- a/test/resources/case7_placement_bindings/case7-test-binding1.yaml +++ b/test/resources/case7_placement_bindings/case7-test-binding1.yaml @@ -26,4 +26,5 @@ kind: PlacementDecision metadata: name: case7-test-policy-plr-1 labels: - cluster.open-cluster-management.io/placement: case7-test-policy-plr1 \ No newline at end of file + cluster.open-cluster-management.io/placement: case7-test-policy-plr1 + cluster.open-cluster-management.io/decision-group-index: "0" \ No newline at end of file diff --git a/test/resources/case7_placement_bindings/case7-test-binding2.yaml b/test/resources/case7_placement_bindings/case7-test-binding2.yaml index b229789c..a54f980e 100644 --- a/test/resources/case7_placement_bindings/case7-test-binding2.yaml +++ b/test/resources/case7_placement_bindings/case7-test-binding2.yaml @@ -26,4 +26,5 @@ kind: PlacementDecision metadata: name: case7-test-policy-plr-2 labels: - cluster.open-cluster-management.io/placement: case7-test-policy-plr2 \ No newline at end of file + cluster.open-cluster-management.io/placement: case7-test-policy-plr2 + cluster.open-cluster-management.io/decision-group-index: "0" \ No newline at end of file diff --git a/test/utils/utils.go b/test/utils/utils.go index f0f4cd45..8f34c01f 100644 --- a/test/utils/utils.go +++ b/test/utils/utils.go @@ -41,11 +41,30 @@ func GeneratePlrStatus(clusters ...string) *appsv1.PlacementRuleStatus { return &appsv1.PlacementRuleStatus{Decisions: plrDecision} } +// GeneratePlacementStatus generate plr status with given clusters +func GeneratePlacementStatus( + client dynamic.ResourceInterface, placement *unstructured.Unstructured, pldName string, clusterCount int32, +) { + status := clusterv1beta1.PlacementStatus{} + status.NumberOfSelectedClusters = clusterCount + status.DecisionGroups = []clusterv1beta1.DecisionGroupStatus{ + { + ClustersCount: clusterCount, + Decisions: []string{pldName}, + }, + } + + _, err := client.UpdateStatus(context.TODO(), placement, metav1.UpdateOptions{}) + + ExpectWithOffset(1, err).ToNot(HaveOccurred()) +} + // GeneratePldStatus generate pld status with given clusters func GeneratePldStatus( - _ string, _ string, clusters ...string, -) *clusterv1beta1.PlacementDecisionStatus { + client dynamic.ResourceInterface, decision *unstructured.Unstructured, clusters ...string, +) { plrDecision := []clusterv1beta1.ClusterDecision{} + for _, cluster := range clusters { plrDecision = append(plrDecision, clusterv1beta1.ClusterDecision{ ClusterName: cluster, @@ -53,7 +72,12 @@ func GeneratePldStatus( }) } - return &clusterv1beta1.PlacementDecisionStatus{Decisions: plrDecision} + decision, err := client.Update(context.TODO(), decision, metav1.UpdateOptions{}) + ExpectWithOffset(1, err).ToNot(HaveOccurred()) + + decision.Object["status"] = clusterv1beta1.PlacementDecisionStatus{Decisions: plrDecision} + _, err = client.UpdateStatus(context.TODO(), decision, metav1.UpdateOptions{}) + ExpectWithOffset(1, err).ToNot(HaveOccurred()) } func RemovePolicyTemplateDBAnnotations(plc *unstructured.Unstructured) error {