Skip to content

Commit

Permalink
fix: check for unknown fields
Browse files Browse the repository at this point in the history
  • Loading branch information
jspdown committed Mar 12, 2024
1 parent acd725b commit 17f952c
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 12 deletions.
28 changes: 18 additions & 10 deletions pkg/crd/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
hubv1alpha1 "github.com/traefik/hub-crds/pkg/apis/hub/v1alpha1"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
)
Expand Down Expand Up @@ -75,24 +76,31 @@ func NewHubDecoder() (*HubDecoder, error) {
return nil, fmt.Errorf("adding hub.traefik.io/v1alpha1 resources: %w", err)
}

decoder := serializer.NewCodecFactory(scheme).UniversalDeserializer()
decoder := serializer.NewCodecFactory(scheme, serializer.EnableStrict).UniversalDeserializer()

return &HubDecoder{decoder: decoder}, nil
}

// Decode decodes the given YAML/JSON manifest into a runtime object.
// If `into` is nil, a new runtime.Object will be created.
// A nil runtime.Object will be returned if it doesn't match a known resource type of is not a Kubernetes manifest.
func (d *HubDecoder) Decode(document []byte, into runtime.Object) (runtime.Object, error) {
object, _, err := d.decoder.Decode(document, nil, into)
if err != nil {
// Decode decodes the given YAML/JSON.
func (d *HubDecoder) Decode(document []byte, into *unstructured.Unstructured) error {
// Decoding in an Unstructured object doesn't check for unknown fields. Therefore, we must
// decode twice, the first time only for checking this type of error.
if _, _, err := d.decoder.Decode(document, nil, nil); err != nil {
switch {
case runtime.IsMissingKind(err), runtime.IsNotRegisteredError(err):
default:
return fmt.Errorf("decoding: %w", err)
}
}

if _, _, err := d.decoder.Decode(document, nil, into); err != nil {
switch {
case runtime.IsMissingKind(err), runtime.IsNotRegisteredError(err):
return nil, nil
return nil
default:
return nil, fmt.Errorf("decoding: %w", err)
return fmt.Errorf("decoding: %w", err)
}
}

return object, nil
return nil
}
1 change: 1 addition & 0 deletions pkg/crd/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ func loadManifests(filesystem fs.FS) ([]manifest, error) {
if err != nil {
return fmt.Errorf("opening file: %w", err)
}

defer func() { _ = reader.Close() }()

r := yaml.NewYAMLReader(bufio.NewReader(reader))
Expand Down
2 changes: 1 addition & 1 deletion pkg/validation/v1alpha1/access_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ spec:
- name: my-api
namespace: my-ns
apiSelector:
labelSelector:
matchLabels:
key: value
operationFilter:
include:
Expand Down
2 changes: 1 addition & 1 deletion pkg/validation/v1alpha1/validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func checkValidation(t *testing.T, test validationTestCase) {
require.NoError(t, err)

var object unstructured.Unstructured
_, decoderErr := decoder.Decode(test.manifest, &object)
decoderErr := decoder.Decode(test.manifest, &object)
require.NoError(t, decoderErr)

gotErrs := validator.Validate(&object)
Expand Down

0 comments on commit 17f952c

Please sign in to comment.