Skip to content

Commit 4d1a1b4

Browse files
authored
openapi2crd: fix duplicate major versions, filtered parameters (#2957)
* fix filtering parameters * regenerate crds * remove unused majorVersions function
1 parent 8d11043 commit 4d1a1b4

File tree

6 files changed

+63
-113
lines changed

6 files changed

+63
-113
lines changed

config/openapi2crd.yaml

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -136,51 +136,6 @@ spec:
136136
- $.tags
137137
- $.terminationProtectionEnabled
138138
- $.versionReleaseSystem
139-
- majorVersion: v20250312
140-
openAPIRef:
141-
name: v20250312
142-
parameters:
143-
path:
144-
name: '/api/atlas/v2/groups/{groupId}/clusters'
145-
verb: post
146-
references:
147-
- *groupRef
148-
entry:
149-
schema: 'ClusterDescription20240805'
150-
filters:
151-
skipProperties:
152-
- $.connectionStrings
153-
- $.createDate
154-
- $.groupId
155-
- $.id
156-
- $.links
157-
- $.mongoDBVersion
158-
- $.replicationSpecs[*].id
159-
- $.stateName
160-
status:
161-
schema: 'ClusterDescription20240805'
162-
filters:
163-
skipProperties:
164-
- $.acceptDataRisksAndForceReplicaSetReconfig
165-
- $.backupEnabled
166-
- $.biConnector
167-
- $.clusterType
168-
- $.diskSizeGB
169-
- $.diskWarmingMode
170-
- $.encryptionAtRestProvider
171-
- $.labels
172-
- $.links
173-
- $.mongoDBMajorVersion
174-
- $.name
175-
- $.paused
176-
- $.pitEnabled
177-
- $.replicationSpecs[*].numShards
178-
- $.replicationSpecs[*].regionConfigs
179-
- $.replicationSpecs[*].zoneName
180-
- $.rootCertType
181-
- $.tags
182-
- $.terminationProtectionEnabled
183-
- $.versionReleaseSystem
184139

185140
- gvk:
186141
version: v1

internal/generated/crds/crds.yaml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ spec:
244244
description: |-
245245
Specification of the cluster supporting the following versions:
246246
247-
- v20250312
248247
- v20250312
249248
250249
At most one versioned spec can be specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
@@ -942,14 +941,6 @@ spec:
942941
&& has(self.groupRef))
943942
type: object
944943
x-kubernetes-validations:
945-
- message: 'Only one of the following entries can be set: "v20250312,
946-
v20250312"'
947-
rule: '!has(self.v20250312) && has(self.v20250312) || has(self.v20250312)
948-
&& !has(self.v20250312)'
949-
- message: spec.connectionSecretRef must be set if spec.v20250312.groupId
950-
is set.
951-
rule: (has(self.v20250312.groupId) && has(self.connectionSecretRef))
952-
|| (!has(self.v20250312.groupId))
953944
- message: spec.connectionSecretRef must be set if spec.v20250312.groupId
954945
is set.
955946
rule: (has(self.v20250312.groupId) && has(self.connectionSecretRef))

tools/openapi2crd/pkg/generator/generator.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ import (
2121
"log"
2222

2323
"github.com/getkin/kin-openapi/openapi3"
24-
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
25-
"sigs.k8s.io/yaml"
26-
2724
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/apis/config/v1alpha1"
2825
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/config"
2926
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/plugins"
27+
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
28+
"k8s.io/apimachinery/pkg/util/sets"
29+
"sigs.k8s.io/yaml"
3030
)
3131

3232
type Generator struct {
@@ -66,7 +66,14 @@ func (g *Generator) Generate(ctx context.Context, crdConfig *v1alpha1.CRDConfig)
6666
}
6767
}
6868

69+
majorVersions := sets.New[string]()
6970
for _, mapping := range crdConfig.Mappings {
71+
if majorVersions.Has(mapping.MajorVersion) {
72+
return nil, fmt.Errorf("duplicate mapping for major version %q for %v", mapping.MajorVersion, crdConfig.GVK)
73+
}
74+
75+
majorVersions.Insert(mapping.MajorVersion)
76+
7077
def, ok := g.definitions[mapping.OpenAPIRef.Name]
7178
if !ok {
7279
return nil, fmt.Errorf("no OpenAPI definition named %q found", mapping.OpenAPIRef.Name)
@@ -136,15 +143,6 @@ func (g *Generator) Generate(ctx context.Context, crdConfig *v1alpha1.CRDConfig)
136143
return crd, nil
137144
}
138145

139-
func (g *Generator) majorVersions(config v1alpha1.CRDConfig) []string {
140-
result := make([]string, 0, len(config.Mappings))
141-
for _, m := range config.Mappings {
142-
result = append(result, "- "+m.MajorVersion)
143-
}
144-
145-
return result
146-
}
147-
148146
func clearPropertiesWithoutExtensions(schema *openapi3.Schema) bool {
149147
if schema == nil {
150148
return false

tools/openapi2crd/pkg/generator/generator_test.go

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,54 +20,15 @@ import (
2020
"testing"
2121

2222
"github.com/getkin/kin-openapi/openapi3"
23+
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/apis/config/v1alpha1"
24+
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/config"
25+
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/plugins"
2326
"github.com/stretchr/testify/assert"
2427
"github.com/stretchr/testify/mock"
2528
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
2629
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27-
28-
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/apis/config/v1alpha1"
29-
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/config"
30-
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/plugins"
3130
)
3231

33-
func TestGeneratorMajorVersions(t *testing.T) {
34-
tests := map[string]struct {
35-
config v1alpha1.CRDConfig
36-
expectedResult []string
37-
}{
38-
"mapping with single version": {
39-
config: v1alpha1.CRDConfig{
40-
Mappings: []v1alpha1.CRDMapping{
41-
{
42-
MajorVersion: "v1",
43-
},
44-
},
45-
},
46-
expectedResult: []string{"- v1"},
47-
},
48-
"mapping with multiple versions": {
49-
config: v1alpha1.CRDConfig{
50-
Mappings: []v1alpha1.CRDMapping{
51-
{
52-
MajorVersion: "v1",
53-
},
54-
{
55-
MajorVersion: "v2",
56-
},
57-
},
58-
},
59-
expectedResult: []string{"- v1", "- v2"},
60-
},
61-
}
62-
for name, tt := range tests {
63-
t.Run(name, func(t *testing.T) {
64-
g := &Generator{}
65-
result := g.majorVersions(tt.config)
66-
assert.Equal(t, tt.expectedResult, result)
67-
})
68-
}
69-
}
70-
7132
func TestClearPropertiesWithoutExtensions(t *testing.T) {
7233
tests := map[string]struct {
7334
schema *openapi3.Schema
@@ -233,6 +194,31 @@ func TestGeneratorGenerate(t *testing.T) {
233194
},
234195
},
235196
},
197+
"duplicate major versions": {
198+
apiDefinitions: map[string]v1alpha1.OpenAPIDefinition{
199+
"Pet": {
200+
Name: "Pet",
201+
Path: "testdata/openapi.yaml",
202+
},
203+
},
204+
config: &v1alpha1.CRDConfig{
205+
Mappings: []v1alpha1.CRDMapping{
206+
{
207+
OpenAPIRef: v1alpha1.LocalObjectReference{
208+
Name: "Pet",
209+
},
210+
MajorVersion: "v1",
211+
},
212+
{
213+
OpenAPIRef: v1alpha1.LocalObjectReference{
214+
Name: "Pet",
215+
},
216+
MajorVersion: "v1",
217+
},
218+
},
219+
},
220+
expectError: true,
221+
},
236222
}
237223
for name, tt := range tests {
238224
t.Run(name, func(t *testing.T) {

tools/openapi2crd/pkg/plugins/parameters.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ import (
1919
"fmt"
2020

2121
"github.com/getkin/kin-openapi/openapi3"
22-
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
23-
2422
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/converter"
23+
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
2524
)
2625

2726
// Parameters adds parameters from the OpenAPI spec to the CRD schema.
@@ -71,6 +70,12 @@ func (p *Parameters) Process(req *MappingProcessorRequest) error {
7170
Path: []string{"$", param.Value.Name},
7271
},
7372
)
73+
74+
// may have been filtered out by other plugins
75+
if props == nil {
76+
continue
77+
}
78+
7479
props.Description = param.Value.Description
7580
props.XValidations = apiextensions.ValidationRules{
7681
{

tools/openapi2crd/pkg/plugins/parameters_test.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ import (
2121
"testing"
2222

2323
"github.com/getkin/kin-openapi/openapi3"
24+
configv1alpha1 "github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/apis/config/v1alpha1"
25+
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/converter"
2426
"github.com/stretchr/testify/assert"
2527
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
2628
"k8s.io/utils/ptr"
27-
28-
configv1alpha1 "github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/apis/config/v1alpha1"
29-
"github.com/mongodb/mongodb-atlas-kubernetes/tools/openapi2crd/pkg/converter"
3029
)
3130

3231
func TestParameterName(t *testing.T) {
@@ -40,6 +39,14 @@ func TestParameterProcess(t *testing.T) {
4039
expectedVersionSpec apiextensions.JSONSchemaProps
4140
expectedErr error
4241
}{
42+
"parameter filtered out": {
43+
request: groupMappingRequest(t, groupBaseCRDWithMajorVersion(t), entryInitialExtensionsSchema(t), parameterConverterNilMock(t)),
44+
expectedVersionSpec: apiextensions.JSONSchemaProps{
45+
Description: "The spec of the group resource for version v20250312.",
46+
Type: "object",
47+
Properties: map[string]apiextensions.JSONSchemaProps{},
48+
},
49+
},
4350
"add parameter schema to the CRD": {
4451
request: groupMappingRequest(t, groupBaseCRDWithMajorVersion(t), entryInitialExtensionsSchema(t), parameterConverterMock(t)),
4552
expectedVersionSpec: apiextensions.JSONSchemaProps{
@@ -399,6 +406,14 @@ func parameterConverterMock(t *testing.T) converterFuncMock {
399406
}
400407
}
401408

409+
func parameterConverterNilMock(t *testing.T) converterFuncMock {
410+
t.Helper()
411+
412+
return func(input converter.PropertyConvertInput) *apiextensions.JSONSchemaProps {
413+
return nil
414+
}
415+
}
416+
402417
type converterFuncMock func(input converter.PropertyConvertInput) *apiextensions.JSONSchemaProps
403418

404419
type dummyConverter struct {

0 commit comments

Comments
 (0)