diff --git a/docs/command/atlas-kubernetes-config-generate.txt b/docs/command/atlas-kubernetes-config-generate.txt index 20e14130b8..7ce4d3cad9 100644 --- a/docs/command/atlas-kubernetes-config-generate.txt +++ b/docs/command/atlas-kubernetes-config-generate.txt @@ -56,7 +56,7 @@ Options * - --operatorVersion - string - false - - Version of Atlas Kubernetes Operator to generate resources for. This value defaults to "2.0.0". + - Version of Atlas Kubernetes Operator to generate resources for. This value defaults to "2.2.0". * - --orgId - string - false diff --git a/internal/kubernetes/operator/features/crds.go b/internal/kubernetes/operator/features/crds.go index 24c03ac157..11c2d10a79 100644 --- a/internal/kubernetes/operator/features/crds.go +++ b/internal/kubernetes/operator/features/crds.go @@ -27,7 +27,7 @@ import ( ) const ( - LatestOperatorMajorVersion = "2.0.0" + LatestOperatorMajorVersion = "2.2.0" maxDepth = 100 ResourceVersion = "mongodb.com/atlas-resource-version" ResourceAtlasProject = "atlasprojects" @@ -54,7 +54,7 @@ var ( resource{ResourceAtlasProject, NopPatcher()}, resource{ResourceAtlasDeployment, NopPatcher()}, resource{ResourceAtlasBackupSchedule, NopPatcher()}, - resource{ResourceAtlasBackupPolicy, UnknownBackupPolicyFrequencyTypesPruner()}, + resource{ResourceAtlasBackupPolicy, PatcherFunc(UnknownBackupPolicyFrequencyTypesPruner)}, resource{ResourceAtlasTeam, NopPatcher()}, resource{ResourceAtlasDataFederation, NopPatcher()}, resource{ResourceAtlasFederatedAuth, NopPatcher()}, @@ -64,7 +64,17 @@ var ( resource{ResourceAtlasProject, NopPatcher()}, resource{ResourceAtlasDeployment, NopPatcher()}, resource{ResourceAtlasBackupSchedule, NopPatcher()}, - resource{ResourceAtlasBackupPolicy, UnknownBackupPolicyFrequencyTypesPruner()}, + resource{ResourceAtlasBackupPolicy, PatcherFunc(UnknownBackupPolicyFrequencyTypesPruner)}, + resource{ResourceAtlasTeam, NopPatcher()}, + resource{ResourceAtlasDataFederation, NopPatcher()}, + resource{ResourceAtlasFederatedAuth, NopPatcher()}, + }, + "2.2.0": { + resource{ResourceAtlasDatabaseUser, NopPatcher()}, + resource{ResourceAtlasProject, NopPatcher()}, + resource{ResourceAtlasDeployment, NopPatcher()}, + resource{ResourceAtlasBackupSchedule, NopPatcher()}, + resource{ResourceAtlasBackupPolicy, NopPatcher()}, resource{ResourceAtlasTeam, NopPatcher()}, resource{ResourceAtlasDataFederation, NopPatcher()}, resource{ResourceAtlasFederatedAuth, NopPatcher()}, diff --git a/internal/kubernetes/operator/features/patcher.go b/internal/kubernetes/operator/features/patcher.go index b1e8c2a4e3..42df38bb7e 100644 --- a/internal/kubernetes/operator/features/patcher.go +++ b/internal/kubernetes/operator/features/patcher.go @@ -45,32 +45,30 @@ func NopPatcher() Patcher { // UnknownBackupPolicyFrequencyTypesPruner removes backup policy items from a backup policy // with unknown frequency types. // It inspects the CRD definition to determine supported frequency types. -func UnknownBackupPolicyFrequencyTypesPruner() Patcher { - return PatcherFunc(func(crdSpec *v1.JSONSchemaProps, obj runtime.Object) error { - // we are not defensive here as this function assumes the invariant - // of a stable CRD definition for a given version of Kubernetes Atlas Operator. - frequencyTypePropsEnum := crdSpec.Properties["items"].Items.Schema.Properties["frequencyType"].Enum +func UnknownBackupPolicyFrequencyTypesPruner(crdSpec *v1.JSONSchemaProps, obj runtime.Object) error { + // we are not defensive here as this function assumes the invariant + // of a stable CRD definition for a given version of Kubernetes Atlas Operator. + frequencyTypePropsEnum := crdSpec.Properties["items"].Items.Schema.Properties["frequencyType"].Enum - knownFrequencyTypes := make(map[string]struct{}) - for i := range frequencyTypePropsEnum { - knownFrequencyType := strings.Trim(string(frequencyTypePropsEnum[i].Raw), `"`) - knownFrequencyTypes[knownFrequencyType] = struct{}{} - } + knownFrequencyTypes := make(map[string]struct{}) + for i := range frequencyTypePropsEnum { + knownFrequencyType := strings.Trim(string(frequencyTypePropsEnum[i].Raw), `"`) + knownFrequencyTypes[knownFrequencyType] = struct{}{} + } - policy, ok := obj.(*akov2.AtlasBackupPolicy) - if !ok || policy == nil { - return fmt.Errorf("invalid object: %T: %v", obj, obj) - } + policy, ok := obj.(*akov2.AtlasBackupPolicy) + if !ok || policy == nil { + return fmt.Errorf("invalid object: %T: %v", obj, obj) + } - prunedItems := make([]akov2.AtlasBackupPolicyItem, 0, len(policy.Spec.Items)) - for i := range policy.Spec.Items { - frequencyType := policy.Spec.Items[i].FrequencyType - if _, ok := knownFrequencyTypes[frequencyType]; ok { - prunedItems = append(prunedItems, policy.Spec.Items[i]) - } + prunedItems := make([]akov2.AtlasBackupPolicyItem, 0, len(policy.Spec.Items)) + for i := range policy.Spec.Items { + frequencyType := policy.Spec.Items[i].FrequencyType + if _, ok := knownFrequencyTypes[frequencyType]; ok { + prunedItems = append(prunedItems, policy.Spec.Items[i]) } - policy.Spec.Items = prunedItems + } + policy.Spec.Items = prunedItems - return nil - }) + return nil } diff --git a/internal/kubernetes/operator/features/patcher_test.go b/internal/kubernetes/operator/features/patcher_test.go index 052c4fe796..47d5047d42 100644 --- a/internal/kubernetes/operator/features/patcher_test.go +++ b/internal/kubernetes/operator/features/patcher_test.go @@ -118,10 +118,8 @@ func TestUnkownBackupPolicyFrequencyTypesPruner(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - patcher := UnknownBackupPolicyFrequencyTypesPruner() - gotErr := "" - if err := patcher.Patch(tt.crdSpec, tt.atlasBackupPolicy); err != nil { + if err := UnknownBackupPolicyFrequencyTypesPruner(tt.crdSpec, tt.atlasBackupPolicy); err != nil { gotErr = err.Error() } diff --git a/test/e2e/atlas/kubernetes_config_apply_test.go b/test/e2e/atlas/kubernetes_config_apply_test.go index eee1ee8bb2..0bb57265c3 100644 --- a/test/e2e/atlas/kubernetes_config_apply_test.go +++ b/test/e2e/atlas/kubernetes_config_apply_test.go @@ -395,6 +395,12 @@ func referenceExportedBackupPolicy() *akov2.AtlasBackupPolicy { RetentionUnit: "months", RetentionValue: 12, }, + { + FrequencyType: "yearly", + FrequencyInterval: 12, + RetentionUnit: "years", + RetentionValue: 1, + }, }, }, } diff --git a/test/e2e/atlas/kubernetes_config_generate_test.go b/test/e2e/atlas/kubernetes_config_generate_test.go index faf6cf698c..2e124c9975 100644 --- a/test/e2e/atlas/kubernetes_config_generate_test.go +++ b/test/e2e/atlas/kubernetes_config_generate_test.go @@ -1093,7 +1093,10 @@ func referenceSharedCluster(name, region, namespace, projectName string, labels cluster.Spec.DeploymentSpec.ReplicationSpecs[0].RegionConfigs[0].BackingProviderName = string(akov2provider.ProviderAWS) cluster.Spec.DeploymentSpec.ReplicationSpecs[0].RegionConfigs[0].ProviderName = string(akov2provider.ProviderTenant) - cluster.Spec.DeploymentSpec.PitEnabled = pointer.Get(false) + cluster.Spec.DeploymentSpec.BackupEnabled = nil + cluster.Spec.DeploymentSpec.BiConnector = nil + cluster.Spec.DeploymentSpec.EncryptionAtRestProvider = "" + cluster.Spec.DeploymentSpec.PitEnabled = nil cluster.Spec.BackupScheduleRef = akov2common.ResourceRefNamespaced{} return cluster } @@ -1215,6 +1218,12 @@ func referenceBackupPolicy(namespace, projectName, clusterName string, labels ma RetentionUnit: "months", RetentionValue: 12, }, + { + FrequencyType: "yearly", + FrequencyInterval: 12, + RetentionUnit: "years", + RetentionValue: 1, + }, }, }, }