diff --git a/internal/crdschema/crd.go b/internal/crdschema/crd.go index 1d0ef26..6d93011 100644 --- a/internal/crdschema/crd.go +++ b/internal/crdschema/crd.go @@ -280,13 +280,22 @@ func (d *RevisionDiff) GetBreakingChanges() (map[string]*diff.Diff, error) { } diffMap := make(map[string]*diff.Diff, len(baseDocs)) - for i, baseDoc := range baseDocs { + for _, baseDoc := range baseDocs { versionName := baseDoc.Info.Version - if i >= len(revisionDocs) || revisionDocs[i].Info.Version != versionName { + var revisionDoc *openapi3.T + for _, r := range revisionDocs { + if r.Info.Version == versionName { + revisionDoc = r + break + } + } + + if revisionDoc == nil { // no corresponding version to compare in the revision return nil, errors.Errorf("revision has no corresponding version to compare with the base for the version name: %s", versionName) } - sd, err := schemaDiff(baseDoc, revisionDocs[i]) + + sd, err := schemaDiff(baseDoc, revisionDoc) if err != nil { return nil, errors.Wrap(err, errBreakingRevisionChangesCompute) } diff --git a/internal/crdschema/crd_test.go b/internal/crdschema/crd_test.go index 6786f43..b3c5c2c 100644 --- a/internal/crdschema/crd_test.go +++ b/internal/crdschema/crd_test.go @@ -173,6 +173,17 @@ func Test_GetRevisionBreakingChanges(t *testing.T) { }, }, }, + "Unordered": { + reason: "No diff should be reported if the order of versions is different", + args: args{ + basePath: "testdata/base.yaml", + revisionModifiers: []crdModifier{ + func(r *v1.CustomResourceDefinition) { + r.Spec.Versions[0], r.Spec.Versions[1] = r.Spec.Versions[1], r.Spec.Versions[0] + }, + }, + }, + }, "ExistingEnumConstantRemovedInRevision": { reason: "Removing an existing enum constant is a breaking API change", args: args{