diff --git a/pkg/utils/validator/clusterresourceplacement.go b/pkg/utils/validator/clusterresourceplacement.go index 461bc4620..3151e7e93 100644 --- a/pkg/utils/validator/clusterresourceplacement.go +++ b/pkg/utils/validator/clusterresourceplacement.go @@ -7,6 +7,7 @@ Licensed under the MIT license. package validator import ( + "errors" "fmt" corev1 "k8s.io/api/core/v1" @@ -336,5 +337,12 @@ func validateRolloutStrategy(rolloutStrategy placementv1beta1.RolloutStrategy) e } } + // server-side apply strategy type is only valid for server-side apply strategy type + if rolloutStrategy.ApplyStrategy != nil { + if rolloutStrategy.ApplyStrategy.Type != placementv1beta1.ApplyStrategyTypeServerSideApply && rolloutStrategy.ApplyStrategy.ServerSideApplyConfig != nil { + allErr = append(allErr, errors.New("serverSideApplyConfig is only valid for ServerSideApply strategy type")) + } + } + return apiErrors.NewAggregate(allErr) } diff --git a/pkg/utils/validator/clusterresourceplacement_test.go b/pkg/utils/validator/clusterresourceplacement_test.go index 93f410ece..32f28670c 100644 --- a/pkg/utils/validator/clusterresourceplacement_test.go +++ b/pkg/utils/validator/clusterresourceplacement_test.go @@ -349,6 +349,19 @@ func TestValidateClusterResourcePlacement_RolloutStrategy(t *testing.T) { wantErr: true, wantErrMsg: "maxSurge must be greater than or equal to 0, got `-10`", }, + "invalid rollout strategy - ServerSideApplyConfig not valid when type is not serversideApply": { + strategy: placementv1beta1.RolloutStrategy{ + Type: placementv1beta1.RollingUpdateRolloutStrategyType, + ApplyStrategy: &placementv1beta1.ApplyStrategy{ + Type: placementv1beta1.ApplyStrategyTypeFailIfExists, + ServerSideApplyConfig: &placementv1beta1.ServerSideApplyConfig{ + ForceConflicts: false, + }, + }, + }, + wantErr: true, + wantErrMsg: "serverSideApplyConfig is only valid for ServerSideApply strategy type", + }, } for testName, testCase := range tests {