diff --git a/alpha/veneer/semver/semver.go b/alpha/veneer/semver/semver.go index 6b1e484f8..be50a7ba7 100644 --- a/alpha/veneer/semver/semver.go +++ b/alpha/veneer/semver/semver.go @@ -2,18 +2,20 @@ package semver import ( "context" + "encoding/json" "fmt" "io" "sort" "github.com/blang/semver/v4" + "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/apimachinery/pkg/util/sets" + "sigs.k8s.io/yaml" + "github.com/operator-framework/operator-registry/alpha/action" "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/alpha/property" "github.com/operator-framework/operator-registry/pkg/image" - "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/yaml" ) // data passed into this module externally @@ -140,7 +142,10 @@ func readFile(reader io.Reader) (*semverVeneer, error) { GenerateMinorChannels: true, AvoidSkipPatch: false, } - if err := yaml.Unmarshal(data, &sv); err != nil { + if err := yaml.Unmarshal(data, &sv, func(decoder *json.Decoder) *json.Decoder { + decoder.DisallowUnknownFields() + return decoder + }); err != nil { return nil, err } return &sv, nil diff --git a/alpha/veneer/semver/semver_test.go b/alpha/veneer/semver/semver_test.go index 68b2b2988..19d9fd3b3 100644 --- a/alpha/veneer/semver/semver_test.go +++ b/alpha/veneer/semver/semver_test.go @@ -1,12 +1,14 @@ package semver import ( + "strings" "testing" "github.com/blang/semver/v4" + "github.com/stretchr/testify/require" + "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/alpha/property" - "github.com/stretchr/testify/require" ) func TestLinkChannels(t *testing.T) { @@ -615,3 +617,93 @@ func TestBailOnVersionBuildMetadata(t *testing.T) { require.Error(t, err) }) } + +func TestReadFile(t *testing.T) { + type testCase struct { + name string + input string + assertions func(*testing.T, *semverVeneer, error) + } + testCases := []testCase{ + { + name: "valid", + input: `--- +schema: olm.semver +generateMajorChannels: true +generateMinorChannels: true +candidate: + bundles: + - image: quay.io/foo/olm:testoperator.v0.1.0 + - image: quay.io/foo/olm:testoperator.v0.1.1 + - image: quay.io/foo/olm:testoperator.v0.1.2 + - image: quay.io/foo/olm:testoperator.v0.1.3 + - image: quay.io/foo/olm:testoperator.v0.2.0 + - image: quay.io/foo/olm:testoperator.v0.2.1 + - image: quay.io/foo/olm:testoperator.v0.2.2 + - image: quay.io/foo/olm:testoperator.v0.3.0 + - image: quay.io/foo/olm:testoperator.v1.0.0 + - image: quay.io/foo/olm:testoperator.v1.0.1 + - image: quay.io/foo/olm:testoperator.v1.1.0 +fast: + bundles: + - image: quay.io/foo/olm:testoperator.v0.2.1 + - image: quay.io/foo/olm:testoperator.v0.2.2 + - image: quay.io/foo/olm:testoperator.v0.3.0 + - image: quay.io/foo/olm:testoperator.v1.0.1 + - image: quay.io/foo/olm:testoperator.v1.1.0 +stable: + bundles: + - image: quay.io/foo/olm:testoperator.v1.0.1 +`, + assertions: func(t *testing.T, veneer *semverVeneer, err error) { + require.NotNil(t, veneer) + require.NoError(t, err) + }, + }, + { + name: "unknown channel prefix", + input: `--- +schema: olm.semver +generateMajorChannels: true +generateMinorChannels: true +candidate: + bundles: + - image: quay.io/foo/olm:testoperator.v0.1.0 + - image: quay.io/foo/olm:testoperator.v0.1.1 + - image: quay.io/foo/olm:testoperator.v0.1.2 + - image: quay.io/foo/olm:testoperator.v0.1.3 + - image: quay.io/foo/olm:testoperator.v0.2.0 + - image: quay.io/foo/olm:testoperator.v0.2.1 + - image: quay.io/foo/olm:testoperator.v0.2.2 + - image: quay.io/foo/olm:testoperator.v0.3.0 + - image: quay.io/foo/olm:testoperator.v1.0.0 + - image: quay.io/foo/olm:testoperator.v1.0.1 + - image: quay.io/foo/olm:testoperator.v1.1.0 +fast: + bundles: + - image: quay.io/foo/olm:testoperator.v0.2.1 + - image: quay.io/foo/olm:testoperator.v0.2.2 + - image: quay.io/foo/olm:testoperator.v0.3.0 + - image: quay.io/foo/olm:testoperator.v1.0.1 + - image: quay.io/foo/olm:testoperator.v1.1.0 +stable: + bundles: + - image: quay.io/foo/olm:testoperator.v1.0.1 +invalid: + bundles: + - image: quay.io/foo/olm:testoperator.v1.0.1 +`, + assertions: func(t *testing.T, veneer *semverVeneer, err error) { + require.Nil(t, veneer) + require.EqualError(t, err, `error unmarshaling JSON: while decoding JSON: json: unknown field "invalid"`) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + sv, err := readFile(strings.NewReader(tc.input)) + tc.assertions(t, sv, err) + }) + } +}