Skip to content

Commit 90d2e62

Browse files
authored
CLOUDP-227570: AKO: add support for resource patching (#2662)
1 parent 788b898 commit 90d2e62

File tree

10 files changed

+330
-36
lines changed

10 files changed

+330
-36
lines changed

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ require (
3030
github.com/mattn/go-isatty v0.0.20
3131
github.com/mongodb-forks/digest v1.0.5
3232
github.com/mongodb-labs/cobra2snooty v0.18.0
33-
github.com/mongodb/mongodb-atlas-kubernetes/v2 v2.0.1
33+
github.com/mongodb/mongodb-atlas-kubernetes/v2 v2.1.0
3434
github.com/pelletier/go-toml v1.9.5
3535
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c
3636
github.com/shirou/gopsutil/v3 v3.24.1
@@ -62,7 +62,7 @@ require (
6262
)
6363

6464
require (
65-
cloud.google.com/go/compute v1.23.3 // indirect
65+
cloud.google.com/go/compute v1.24.0 // indirect
6666
cloud.google.com/go/compute/metadata v0.2.3 // indirect
6767
cloud.google.com/go/iam v1.1.6 // indirect
6868
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
@@ -145,6 +145,7 @@ require (
145145
github.com/xdg-go/stringprep v1.0.4 // indirect
146146
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
147147
github.com/yusufpapurcu/wmi v1.2.3 // indirect
148+
go.mongodb.org/atlas-sdk/v20231115004 v20231115004.1.0 // indirect
148149
go.opencensus.io v0.24.0 // indirect
149150
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect
150151
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect

go.sum

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
22
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
33
cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM=
44
cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4=
5-
cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=
6-
cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
5+
cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
6+
cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40=
77
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
88
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
99
cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc=
@@ -294,17 +294,17 @@ github.com/mongodb-forks/digest v1.0.5 h1:EJu3wtLZcA0HCvsZpX5yuD193/sW9tHiNvrEM5
294294
github.com/mongodb-forks/digest v1.0.5/go.mod h1:rb+EX8zotClD5Dj4NdgxnJXG9nwrlx3NWKJ8xttz1Dg=
295295
github.com/mongodb-labs/cobra2snooty v0.18.0 h1:phyPCrDMTpJxKRXSSbzOH+JQ7cNGzKrq3MDvmsJf4wg=
296296
github.com/mongodb-labs/cobra2snooty v0.18.0/go.mod h1:WnzqCFmx4f72Yj9dL/ulBUqcatfURGdKFf8DLT4h7zQ=
297-
github.com/mongodb/mongodb-atlas-kubernetes/v2 v2.0.1 h1:AHLgNHUaaW9s7MhvGu3BTfWQ6k3aFy1JYMkULgIvYdI=
298-
github.com/mongodb/mongodb-atlas-kubernetes/v2 v2.0.1/go.mod h1:mu77/AtpkJPFTPuxFA1T4ejul4sVLXFIVOCvaKJgaj4=
297+
github.com/mongodb/mongodb-atlas-kubernetes/v2 v2.1.0 h1:7VUkK0LjKCi80A4CFcImiUgAtKWfLDVJKF1QqBtJsBQ=
298+
github.com/mongodb/mongodb-atlas-kubernetes/v2 v2.1.0/go.mod h1:9+sTPWCBcivshJX+FLIJ/Mv91sWqIlL+i+fosvWKdao=
299299
github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU=
300300
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
301301
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
302302
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
303303
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
304-
github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY=
305-
github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw=
306-
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
307-
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
304+
github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY=
305+
github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM=
306+
github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo=
307+
github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0=
308308
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
309309
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
310310
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
@@ -386,6 +386,8 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi
386386
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
387387
go.mongodb.org/atlas v0.36.0 h1:m05S3AO7zkl+bcG1qaNsEKBnAqnKx2FDwLooHpIG3j4=
388388
go.mongodb.org/atlas v0.36.0/go.mod h1:nfPldE9dSama6G2IbIzmEza02Ly7yFZjMMVscaM0uEc=
389+
go.mongodb.org/atlas-sdk/v20231115004 v20231115004.1.0 h1:vOvfk8bPedcphaTHIm6p8UB/ZPeVOqJZ7+MmTuI1eGs=
390+
go.mongodb.org/atlas-sdk/v20231115004 v20231115004.1.0/go.mod h1:FzD5DLz+WPB+z3OGgNBjXMPQJjJ7Y+hKn4iupXZuoOc=
389391
go.mongodb.org/atlas-sdk/v20231115007 v20231115007.0.0 h1:gvUBkSoeNtM9FSBQy8rh6cm6qXn4yXbQGzK09X0eAdk=
390392
go.mongodb.org/atlas-sdk/v20231115007 v20231115007.0.0/go.mod h1:JU7JOUGcv7pfDzbRTwIr8hGy2R1lehdrdfGj9fDjSVY=
391393
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=

internal/cli/atlas/kubernetes/config/apply.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func (opts *ApplyOpts) Run() error {
9393
return err
9494
}
9595

96-
featureValidator, err := features.NewAtlasCRDs(opts.crdsProvider, opts.operatorVersion)
96+
atlasCRDs, err := features.NewAtlasCRDs(opts.crdsProvider, opts.operatorVersion)
9797
if err != nil {
9898
return err
9999
}
@@ -103,7 +103,8 @@ func (opts *ApplyOpts) Run() error {
103103
WithTargetNamespace(opts.targetNamespace).
104104
WithTargetOperatorVersion(opts.operatorVersion).
105105
WithSecretsData(true).
106-
WithFeatureValidator(featureValidator)
106+
WithFeatureValidator(atlasCRDs).
107+
WithPatcher(atlasCRDs)
107108
err = operator.NewConfigApply(
108109
operator.NewConfigApplyParams{
109110
OrgID: opts.OrgID,

internal/cli/atlas/kubernetes/config/generate.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (opts *GenerateOpts) initStores(ctx context.Context) func() error {
7979
}
8080

8181
func (opts *GenerateOpts) Run() error {
82-
featureValidator, err := features.NewAtlasCRDs(opts.crdsProvider, opts.operatorVersion)
82+
atlasCRDs, err := features.NewAtlasCRDs(opts.crdsProvider, opts.operatorVersion)
8383
if err != nil {
8484
return err
8585
}
@@ -88,7 +88,8 @@ func (opts *GenerateOpts) Run() error {
8888
WithTargetNamespace(opts.targetNamespace).
8989
WithSecretsData(opts.includeSecrets).
9090
WithTargetOperatorVersion(opts.operatorVersion).
91-
WithFeatureValidator(featureValidator).
91+
WithFeatureValidator(atlasCRDs).
92+
WithPatcher(atlasCRDs).
9293
WithDataFederationNames(opts.dataFederationName).
9394
Run()
9495
if err != nil {

internal/kubernetes/operator/config_apply.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package operator
1717
import (
1818
"context"
1919
"errors"
20+
"fmt"
2021

2122
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes"
2223
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/features"
@@ -82,6 +83,13 @@ func (apply *ConfigApply) Run() error {
8283

8384
for _, objects := range sortedResources {
8485
for _, object := range objects {
86+
if apply.exporter.patcher != nil {
87+
err = apply.exporter.patcher.Patch(object)
88+
if err != nil {
89+
return fmt.Errorf("error patching %v: %w", object.GetObjectKind().GroupVersionKind(), err)
90+
}
91+
}
92+
8593
ctrlObj, ok := object.(client.Object)
8694
if !ok {
8795
return errors.New("unable to apply resource")

internal/kubernetes/operator/config_exporter.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ import (
2020
"fmt"
2121
"reflect"
2222

23+
atlasv2 "go.mongodb.org/atlas-sdk/v20231115007/admin"
24+
"k8s.io/apimachinery/pkg/runtime"
25+
"k8s.io/apimachinery/pkg/runtime/serializer/json"
26+
"k8s.io/client-go/kubernetes/scheme"
27+
2328
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/datafederation"
2429
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/dbusers"
2530
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/deployment"
@@ -28,10 +33,6 @@ import (
2833
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/resources"
2934
"github.com/mongodb/mongodb-atlas-cli/internal/store"
3035
"github.com/mongodb/mongodb-atlas-cli/internal/store/atlas"
31-
atlasv2 "go.mongodb.org/atlas-sdk/v20231115007/admin"
32-
"k8s.io/apimachinery/pkg/runtime"
33-
"k8s.io/apimachinery/pkg/runtime/serializer/json"
34-
"k8s.io/client-go/kubernetes/scheme"
3536
)
3637

3738
const (
@@ -52,6 +53,11 @@ type ConfigExporter struct {
5253
orgID string
5354
dictionaryForAtlasNames map[string]string
5455
dataFederationNames []string
56+
patcher Patcher
57+
}
58+
59+
type Patcher interface {
60+
Patch(obj runtime.Object) error
5561
}
5662

5763
var (
@@ -103,6 +109,11 @@ func (e *ConfigExporter) WithDataFederationNames(dataFederations []string) *Conf
103109
return e
104110
}
105111

112+
func (e *ConfigExporter) WithPatcher(p Patcher) *ConfigExporter {
113+
e.patcher = p
114+
return e
115+
}
116+
106117
func (e *ConfigExporter) Run() (string, error) {
107118
// TODO: Add REST to OPERATOR entities matcher
108119
output := bytes.NewBufferString(yamlSeparator)
@@ -134,6 +145,13 @@ func (e *ConfigExporter) Run() (string, error) {
134145
r = append(r, dataFederationResource...)
135146

136147
for _, res := range r {
148+
if e.patcher != nil {
149+
err = e.patcher.Patch(res)
150+
if err != nil {
151+
return "", fmt.Errorf("error patching %v: %w", res.GetObjectKind().GroupVersionKind(), err)
152+
}
153+
}
154+
137155
err = serializer.Encode(res, output)
138156
if err != nil {
139157
return "", err

internal/kubernetes/operator/features/crds.go

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ import (
2020
"strings"
2121

2222
"github.com/Masterminds/semver/v3"
23-
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/crds"
2423
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
24+
"k8s.io/apimachinery/pkg/api/meta"
25+
"k8s.io/apimachinery/pkg/runtime"
26+
27+
"github.com/mongodb/mongodb-atlas-cli/internal/kubernetes/operator/crds"
2528
)
2629

2730
const (
@@ -46,25 +49,50 @@ var (
4649
ErrDocumentHasNoSchema = errors.New("document contains no Schema")
4750
ErrDocumentHasNoSpec = errors.New("document contains no Spec")
4851

49-
versionsToResourcesMap = map[string][]string{
52+
versionsToResourcesMap = map[string][]resource{
5053
"2.0.0": {
51-
ResourceAtlasDatabaseUser,
52-
ResourceAtlasProject,
53-
ResourceAtlasDeployment,
54-
ResourceAtlasBackupSchedule,
55-
ResourceAtlasBackupPolicy,
56-
ResourceAtlasTeam,
57-
ResourceAtlasDataFederation,
58-
ResourceAtlasFederatedAuth,
54+
resource{ResourceAtlasDatabaseUser, NopPatcher()},
55+
resource{ResourceAtlasProject, NopPatcher()},
56+
resource{ResourceAtlasDeployment, NopPatcher()},
57+
resource{ResourceAtlasBackupSchedule, NopPatcher()},
58+
resource{ResourceAtlasBackupPolicy, UnknownBackupPolicyFrequencyTypesPruner()},
59+
resource{ResourceAtlasTeam, NopPatcher()},
60+
resource{ResourceAtlasDataFederation, NopPatcher()},
61+
resource{ResourceAtlasFederatedAuth, NopPatcher()},
62+
},
63+
"2.1.0": {
64+
resource{ResourceAtlasDatabaseUser, NopPatcher()},
65+
resource{ResourceAtlasProject, NopPatcher()},
66+
resource{ResourceAtlasDeployment, NopPatcher()},
67+
resource{ResourceAtlasBackupSchedule, NopPatcher()},
68+
resource{ResourceAtlasBackupPolicy, UnknownBackupPolicyFrequencyTypesPruner()},
69+
resource{ResourceAtlasTeam, NopPatcher()},
70+
resource{ResourceAtlasDataFederation, NopPatcher()},
71+
resource{ResourceAtlasFederatedAuth, NopPatcher()},
5972
},
6073
}
6174
)
6275

63-
func GetResourcesForVersion(version string) ([]string, bool) {
76+
type resource struct {
77+
name string
78+
patcher Patcher
79+
}
80+
81+
func majorVersion(version string) string {
6482
v := semver.MustParse(version)
65-
majorVersion := semver.New(v.Major(), v.Minor(), 0, "", "").String()
66-
resources, ok := versionsToResourcesMap[majorVersion]
67-
return resources, ok
83+
return semver.New(v.Major(), v.Minor(), 0, "", "").String()
84+
}
85+
86+
func GetResourcesForVersion(version string) ([]string, bool) {
87+
resources, ok := versionsToResourcesMap[majorVersion(version)]
88+
if !ok {
89+
return nil, false
90+
}
91+
result := make([]string, 0, len(resources))
92+
for i := range resources {
93+
result = append(result, resources[i].name)
94+
}
95+
return result, true
6896
}
6997

7098
func SupportedVersions() []string {
@@ -100,18 +128,37 @@ func CRDCompatibleVersion(operatorVersion string) (string, error) {
100128

101129
type AtlasCRDs struct {
102130
resources map[string]*apiextensions.JSONSchemaProps
131+
patchers map[string]Patcher
132+
}
133+
134+
func (a *AtlasCRDs) Patch(obj runtime.Object) error {
135+
// Despite marked as unsafe this pluralizer works well on our types.
136+
plural, _ := meta.UnsafeGuessKindToResource(obj.GetObjectKind().GroupVersionKind())
137+
138+
crdSpec, ok := a.resources[plural.Resource]
139+
if !ok {
140+
return nil
141+
}
142+
patcher, ok := a.patchers[plural.Resource]
143+
if !ok {
144+
return nil
145+
}
146+
return patcher.Patch(crdSpec, obj)
103147
}
104148

105149
func NewAtlasCRDs(crdProvider crds.AtlasOperatorCRDProvider, version string) (*AtlasCRDs, error) {
106-
resources, versionFound := GetResourcesForVersion(version)
150+
resources, versionFound := versionsToResourcesMap[majorVersion(version)]
107151
if !versionFound {
108152
return nil, fmt.Errorf(ErrVersionNotSupportedFmt, version)
109153
}
110154

111-
result := &AtlasCRDs{resources: map[string]*apiextensions.JSONSchemaProps{}}
155+
result := &AtlasCRDs{
156+
resources: map[string]*apiextensions.JSONSchemaProps{},
157+
patchers: map[string]Patcher{},
158+
}
112159

113160
for _, resource := range resources {
114-
crd, err := crdProvider.GetAtlasOperatorResource(resource, version)
161+
crd, err := crdProvider.GetAtlasOperatorResource(resource.name, version)
115162
if err != nil {
116163
return nil, fmt.Errorf(ErrDownloadResourceFailedFmt, resource, err)
117164
}
@@ -120,7 +167,8 @@ func NewAtlasCRDs(crdProvider crds.AtlasOperatorCRDProvider, version string) (*A
120167
if err != nil {
121168
return nil, fmt.Errorf("failed to process CRD '%s:%s'. err: %w", resource, version, err)
122169
}
123-
result.resources[resource] = root
170+
result.resources[resource.name] = root
171+
result.patchers[resource.name] = resource.patcher
124172
}
125173

126174
return result, nil
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright 2024 MongoDB Inc
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package features
16+
17+
import (
18+
"fmt"
19+
"strings"
20+
21+
akov2 "github.com/mongodb/mongodb-atlas-kubernetes/v2/pkg/api/v1"
22+
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
23+
"k8s.io/apimachinery/pkg/runtime"
24+
)
25+
26+
// Patcher is the type that is able to patch Kubernetes objects using a CRD specification.
27+
type Patcher interface {
28+
Patch(crdSpec *v1.JSONSchemaProps, obj runtime.Object) error
29+
}
30+
31+
// PatcherFunc is a convenience function wrapper around Patcher.
32+
type PatcherFunc func(crdSpec *v1.JSONSchemaProps, obj runtime.Object) error
33+
34+
func (pf PatcherFunc) Patch(crdSpec *v1.JSONSchemaProps, obj runtime.Object) error {
35+
return pf(crdSpec, obj)
36+
}
37+
38+
// NopPatcher does not patch anything.
39+
func NopPatcher() Patcher {
40+
return PatcherFunc(func(*v1.JSONSchemaProps, runtime.Object) error {
41+
return nil
42+
})
43+
}
44+
45+
// UnknownBackupPolicyFrequencyTypesPruner removes backup policy items from a backup policy
46+
// with unknown frequency types.
47+
// It inspects the CRD definition to determine supported frequency types.
48+
func UnknownBackupPolicyFrequencyTypesPruner() Patcher {
49+
return PatcherFunc(func(crdSpec *v1.JSONSchemaProps, obj runtime.Object) error {
50+
// we are not defensive here as this function assumes the invariant
51+
// of a stable CRD definition for a given version of Kubernetes Atlas Operator.
52+
frequencyTypePropsEnum := crdSpec.Properties["items"].Items.Schema.Properties["frequencyType"].Enum
53+
54+
knownFrequencyTypes := make(map[string]struct{})
55+
for i := range frequencyTypePropsEnum {
56+
knownFrequencyType := strings.Trim(string(frequencyTypePropsEnum[i].Raw), `"`)
57+
knownFrequencyTypes[knownFrequencyType] = struct{}{}
58+
}
59+
60+
policy, ok := obj.(*akov2.AtlasBackupPolicy)
61+
if !ok || policy == nil {
62+
return fmt.Errorf("invalid object: %T: %v", obj, obj)
63+
}
64+
65+
prunedItems := make([]akov2.AtlasBackupPolicyItem, 0, len(policy.Spec.Items))
66+
for i := range policy.Spec.Items {
67+
frequencyType := policy.Spec.Items[i].FrequencyType
68+
if _, ok := knownFrequencyTypes[frequencyType]; ok {
69+
prunedItems = append(prunedItems, policy.Spec.Items[i])
70+
}
71+
}
72+
policy.Spec.Items = prunedItems
73+
74+
return nil
75+
})
76+
}

0 commit comments

Comments
 (0)