Skip to content

Commit 38dedfa

Browse files
committed
Add NewPerVersionTraslators function
1 parent 0a24d10 commit 38dedfa

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

internal/crapi/crapi_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2010,8 +2010,10 @@ func testToAPI[T any](t *testing.T, kind string, input client.Object, objs []cli
20102010
crdsYML := bytes.NewBuffer(testdata.SampleCRDs)
20112011
crd, err := extractCRD(kind, bufio.NewScanner(crdsYML))
20122012
require.NoError(t, err)
2013-
tr, err := crapi.NewTranslator(crd, version, sdkVersion)
2013+
trs, err := crapi.NewPerVersionTranslators(crd, version, sdkVersion)
20142014
require.NoError(t, err)
2015+
tr := trs[sdkVersion]
2016+
require.NotNil(t, tr)
20152017
r := crapi.Request{Translator: tr, Dependencies: objs}
20162018
require.NoError(t, crapi.ToAPI(&r, target, input))
20172019
assert.Equal(t, want, target)

internal/crapi/translator.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,45 @@ func NewTranslator(crd *apiextensionsv1.CustomResourceDefinition, crdVersion str
9393
mappingSchema: &openapi3.SchemaRef{Value: &mappingSchema},
9494
}, nil
9595
}
96+
97+
// NewPerVersionTranslators creates a set of translators indexed by SDK versions
98+
//
99+
// Given the following example resource:
100+
//
101+
// apiVersion: atlas.generated.mongodb.com/v1
102+
// kind: SearchIndex
103+
// metadata:
104+
// name: search-index
105+
// spec:
106+
// v20250312:
107+
// ...
108+
// v20250810:
109+
//
110+
// In the above case crdVersion is "v1" and versions can be "v20250312"
111+
// and/or "v20250810".
112+
func NewPerVersionTranslators(crd *apiextensionsv1.CustomResourceDefinition, crdVersion string, versions ...string) (map[string]Translator, error) {
113+
translators := map[string]Translator{}
114+
specVersion := crds.SelectVersion(&crd.Spec, crdVersion)
115+
for _, version := range versions {
116+
if err := crds.AssertMajorVersion(specVersion, crd.Spec.Names.Kind, version); err != nil {
117+
return nil, fmt.Errorf("failed to assert major version %s in CRD: %w", version, err)
118+
}
119+
var mappingSchema openapi3.Schema
120+
mappingString, ok := crd.Annotations["api-mappings"]
121+
if ok && mappingString != "" {
122+
jsonBytes, err := yaml.YAMLToJSON([]byte(mappingString))
123+
if err != nil {
124+
return nil, fmt.Errorf("failed to convert 'api-mappings' YAML to JSON: %w", err)
125+
}
126+
if err := json.Unmarshal(jsonBytes, &mappingSchema); err != nil {
127+
return nil, fmt.Errorf("failed to unmarshal 'api-mappings' JSON into schema: %w", err)
128+
}
129+
}
130+
131+
translators[version] = &translator{
132+
majorVersion: version,
133+
mappingSchema: &openapi3.SchemaRef{Value: &mappingSchema},
134+
}
135+
}
136+
return translators, nil
137+
}

0 commit comments

Comments
 (0)