diff --git a/pkg/admin/prerun/version.go b/pkg/admin/prerun/version.go index c057d8f645..d3c995d7e4 100644 --- a/pkg/admin/prerun/version.go +++ b/pkg/admin/prerun/version.go @@ -105,6 +105,8 @@ func getVersionOfData() (versionMetadata, error) { return versionMetadataFromString(string(versionFileContents)) } +// checkVersionDiff compares versions of executable and existing data for purposes of data migration. +// It returns true if the migration should be performed. func checkVersionDiff(execVer, dataVer versionMetadata) (bool, error) { if execVer == dataVer { return false, nil @@ -118,5 +120,13 @@ func checkVersionDiff(execVer, dataVer versionMetadata) (bool, error) { return false, fmt.Errorf("executable (%s) is older than existing data (%s): migrating data to older version is not supported", execVer.String(), dataVer.String()) } + if execVer.Minor > dataVer.Minor { + if execVer.Minor-1 == dataVer.Minor { + return true, nil + } else { + return false, fmt.Errorf("executable (%s) is too recent compared to existing data (%s): maximum minor version difference is 1", execVer.String(), dataVer.String()) + } + } + return false, nil } diff --git a/pkg/admin/prerun/version_test.go b/pkg/admin/prerun/version_test.go index 93584a5bcc..e8bb978729 100644 --- a/pkg/admin/prerun/version_test.go +++ b/pkg/admin/prerun/version_test.go @@ -35,6 +35,20 @@ func TestCheckVersionDiff(t *testing.T) { expectedMigrationRequired: false, errExpected: true, }, + { + name: "binary must be newer only by one minor version", + execVer: versionMetadata{Major: 4, Minor: 15}, + dataVer: versionMetadata{Major: 4, Minor: 14}, + expectedMigrationRequired: true, + errExpected: false, + }, + { + name: "binary newer more than one minor version is not supported", + execVer: versionMetadata{Major: 4, Minor: 15}, + dataVer: versionMetadata{Major: 4, Minor: 13}, + expectedMigrationRequired: false, + errExpected: true, + }, } for _, td := range testData {