Skip to content

Commit a6738b4

Browse files
authored
Merge pull request #106 from awslabs/simpleschema
refactor(schema): remove unused custom types from `SimpleSchema`
2 parents ae3742b + 0973482 commit a6738b4

File tree

7 files changed

+62
-41
lines changed

7 files changed

+62
-41
lines changed

api/v1alpha1/resource_group.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ type Schema struct {
6666
// that the resourcegroup is managing. This is adhering to the
6767
// SimpleSchema spec.
6868
Status runtime.RawExtension `json:"status,omitempty"`
69-
// Types are custom types that are used to simplify the spec and
70-
// status.
71-
Types runtime.RawExtension `json:"types,omitempty"`
7269
// Validation is a list of validation rules that are applied to the
7370
// resourcegroup.
7471
// Not implemented yet.

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/kro.run_resourcegroups.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,6 @@ spec:
119119
SimpleSchema spec.
120120
type: object
121121
x-kubernetes-preserve-unknown-fields: true
122-
types:
123-
description: |-
124-
Types are custom types that are used to simplify the spec and
125-
status.
126-
type: object
127-
x-kubernetes-preserve-unknown-fields: true
128122
validation:
129123
description: |-
130124
Validation is a list of validation rules that are applied to the

internal/graph/builder.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -509,22 +509,16 @@ func (b *Builder) buildInstanceResource(
509509
// used to generate the CRD for the instance resource. The instance spec
510510
// schema is expected to be defined using the "SimpleSchema" format.
511511
func buildInstanceSpecSchema(rgSchema *v1alpha1.Schema) (*extv1.JSONSchemaProps, error) {
512-
customTypes := map[string]interface{}{}
513-
err := yaml.UnmarshalStrict(rgSchema.Types.Raw, &customTypes)
514-
if err != nil {
515-
return nil, fmt.Errorf("failed to unmarshal types schema: %w", err)
516-
}
517-
518512
// We need to unmarshal the instance schema to a map[string]interface{} to
519513
// make it easier to work with.
520-
unstructuredInstance := map[string]interface{}{}
521-
err = yaml.UnmarshalStrict(rgSchema.Spec.Raw, &unstructuredInstance)
514+
instanceSpec := map[string]interface{}{}
515+
err := yaml.UnmarshalStrict(rgSchema.Spec.Raw, &instanceSpec)
522516
if err != nil {
523517
return nil, fmt.Errorf("failed to unmarshal spec schema: %w", err)
524518
}
525519

526520
// The instance resource has a schema defined using the "SimpleSchema" format.
527-
instanceSchema, err := simpleschema.NewTransformer().BuildOpenAPISchema(unstructuredInstance)
521+
instanceSchema, err := simpleschema.ToOpenAPISpec(instanceSpec)
528522
if err != nil {
529523
return nil, fmt.Errorf("failed to build OpenAPI schema for instance: %v", err)
530524
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"). You may
4+
// not use this file except in compliance with the License. A copy of the
5+
// License is located at
6+
//
7+
// http://aws.amazon.com/apache2.0/
8+
//
9+
// or in the "license" file accompanying this file. This file is distributed
10+
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11+
// express or implied. See the License for the specific language governing
12+
// permissions and limitations under the License.
13+
14+
package simpleschema
15+
16+
import (
17+
"fmt"
18+
19+
extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
20+
)
21+
22+
// ToOpenAPISpec converts a SimpleSchema object to an OpenAPI schema.
23+
//
24+
// The input object is a map[string]interface{} where the key is the field name
25+
// and the value is the field type.
26+
func ToOpenAPISpec(obj map[string]interface{}) (*extv1.JSONSchemaProps, error) {
27+
tf := newTransformer()
28+
return tf.buildOpenAPISchema(obj)
29+
}
30+
31+
// FromOpenAPISpec converts an OpenAPI schema to a SimpleSchema object.
32+
func FromOpenAPISpec(schema *extv1.JSONSchemaProps) (map[string]interface{}, error) {
33+
return nil, fmt.Errorf("not implemented")
34+
}

internal/simpleschema/transform.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,27 @@ import (
1919
extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2020
)
2121

22-
// Transformer is a transformer for OpenAPI schemas
23-
type Transformer struct {
22+
// transformer is a transformer for OpenAPI schemas
23+
type transformer struct {
2424
preDefinedTypes map[string]extv1.JSONSchemaProps
2525
}
2626

27-
// NewTransformer creates a new transformer
28-
func NewTransformer() *Transformer {
29-
return &Transformer{
27+
// newTransformer creates a new transformer
28+
func newTransformer() *transformer {
29+
return &transformer{
3030
preDefinedTypes: make(map[string]extv1.JSONSchemaProps),
3131
}
3232
}
3333

34-
// LoadPreDefinedTypes loads pre-defined types into the transformer.
34+
// loadPreDefinedTypes loads pre-defined types into the transformer.
3535
// The pre-defined types are used to resolve references in the schema.
36-
func (t *Transformer) LoadPreDefinedTypes(obj map[string]interface{}) error {
36+
//
37+
// As of today, KRO doesn't support custom types in the schema - do
38+
// not use this function.
39+
func (t *transformer) loadPreDefinedTypes(obj map[string]interface{}) error {
3740
t.preDefinedTypes = make(map[string]extv1.JSONSchemaProps)
3841

39-
jsonSchemaProps, err := t.BuildOpenAPISchema(obj)
42+
jsonSchemaProps, err := t.buildOpenAPISchema(obj)
4043
if err != nil {
4144
return fmt.Errorf("failed to build pre-defined types schema: %w", err)
4245
}
@@ -47,9 +50,9 @@ func (t *Transformer) LoadPreDefinedTypes(obj map[string]interface{}) error {
4750
return nil
4851
}
4952

50-
// BuildOpenAPISchema builds an OpenAPI schema from the given object
53+
// buildOpenAPISchema builds an OpenAPI schema from the given object
5154
// of a SimpleSchema.
52-
func (tf *Transformer) BuildOpenAPISchema(obj map[string]interface{}) (*extv1.JSONSchemaProps, error) {
55+
func (tf *transformer) buildOpenAPISchema(obj map[string]interface{}) (*extv1.JSONSchemaProps, error) {
5356
schema := &extv1.JSONSchemaProps{
5457
Type: "object",
5558
Properties: map[string]extv1.JSONSchemaProps{},
@@ -65,25 +68,25 @@ func (tf *Transformer) BuildOpenAPISchema(obj map[string]interface{}) (*extv1.JS
6568

6669
return schema, nil
6770
}
68-
func (tf *Transformer) transformField(
71+
func (tf *transformer) transformField(
6972
key string, value interface{},
7073
// parentSchema is used to add the key to the required list
7174
parentSchema *extv1.JSONSchemaProps,
7275
) (*extv1.JSONSchemaProps, error) {
7376
switch v := value.(type) {
7477
case map[interface{}]interface{}:
7578
nMap := transformMap(v)
76-
return tf.BuildOpenAPISchema(nMap)
79+
return tf.buildOpenAPISchema(nMap)
7780
case map[string]interface{}:
78-
return tf.BuildOpenAPISchema(v)
81+
return tf.buildOpenAPISchema(v)
7982
case string:
8083
return tf.parseFieldSchema(key, v, parentSchema)
8184
default:
8285
return nil, fmt.Errorf("unknown type in schema: key: %s, value: %v", key, value)
8386
}
8487
}
8588

86-
func (tf *Transformer) parseFieldSchema(key, fieldValue string, parentSchema *extv1.JSONSchemaProps) (*extv1.JSONSchemaProps, error) {
89+
func (tf *transformer) parseFieldSchema(key, fieldValue string, parentSchema *extv1.JSONSchemaProps) (*extv1.JSONSchemaProps, error) {
8790
fieldType, markers, err := parseFieldSchema(fieldValue)
8891
if err != nil {
8992
return nil, fmt.Errorf("failed to parse field schema for %s: %v", key, err)
@@ -117,7 +120,7 @@ func (tf *Transformer) parseFieldSchema(key, fieldValue string, parentSchema *ex
117120
return fieldJSONSchemaProps, nil
118121
}
119122

120-
func (tf *Transformer) handleMapType(key, fieldType string) (*extv1.JSONSchemaProps, error) {
123+
func (tf *transformer) handleMapType(key, fieldType string) (*extv1.JSONSchemaProps, error) {
121124
keyType, valueType, err := parseMapType(fieldType)
122125
if err != nil {
123126
return nil, fmt.Errorf("failed to parse map type for %s: %w", key, err)
@@ -150,7 +153,7 @@ func (tf *Transformer) handleMapType(key, fieldType string) (*extv1.JSONSchemaPr
150153
return fieldJSONSchemaProps, nil
151154
}
152155

153-
func (tf *Transformer) handleSliceType(key, fieldType string) (*extv1.JSONSchemaProps, error) {
156+
func (tf *transformer) handleSliceType(key, fieldType string) (*extv1.JSONSchemaProps, error) {
154157
elementType, err := parseSliceType(fieldType)
155158
if err != nil {
156159
return nil, fmt.Errorf("failed to parse slice type for %s: %w", key, err)
@@ -180,7 +183,7 @@ func (tf *Transformer) handleSliceType(key, fieldType string) (*extv1.JSONSchema
180183
return fieldJSONSchemaProps, nil
181184
}
182185

183-
func (tf *Transformer) applyMarkers(schema *extv1.JSONSchemaProps, markers []*Marker, key string, parentSchema *extv1.JSONSchemaProps) {
186+
func (tf *transformer) applyMarkers(schema *extv1.JSONSchemaProps, markers []*Marker, key string, parentSchema *extv1.JSONSchemaProps) {
184187
for _, marker := range markers {
185188
switch marker.MarkerType {
186189
case MarkerTypeRequired:

internal/simpleschema/transform_test.go

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

2323
func TestBuildOpenAPISchema(t *testing.T) {
24-
transformer := NewTransformer()
24+
transformer := newTransformer()
2525

2626
// Load pre-defined types
27-
err := transformer.LoadPreDefinedTypes(map[string]interface{}{
27+
err := transformer.loadPreDefinedTypes(map[string]interface{}{
2828
"Address": map[string]interface{}{
2929
"street": "string",
3030
"city": "string",
@@ -283,7 +283,7 @@ func TestBuildOpenAPISchema(t *testing.T) {
283283

284284
for _, tt := range tests {
285285
t.Run(tt.name, func(t *testing.T) {
286-
got, err := transformer.BuildOpenAPISchema(tt.obj)
286+
got, err := transformer.buildOpenAPISchema(tt.obj)
287287
if (err != nil) != tt.wantErr {
288288
t.Errorf("BuildOpenAPISchema() error = %v, wantErr %v", err, tt.wantErr)
289289
return
@@ -296,7 +296,7 @@ func TestBuildOpenAPISchema(t *testing.T) {
296296
}
297297

298298
func TestLoadPreDefinedTypes(t *testing.T) {
299-
transformer := NewTransformer()
299+
transformer := newTransformer()
300300

301301
preDefinedTypes := map[string]interface{}{
302302
"Person": map[string]interface{}{
@@ -313,7 +313,7 @@ func TestLoadPreDefinedTypes(t *testing.T) {
313313
},
314314
}
315315

316-
err := transformer.LoadPreDefinedTypes(preDefinedTypes)
316+
err := transformer.loadPreDefinedTypes(preDefinedTypes)
317317
if err != nil {
318318
t.Fatalf("LoadPreDefinedTypes() error = %v", err)
319319
}

0 commit comments

Comments
 (0)