diff --git a/cmd/root.go b/cmd/root.go index c64c6124..7d7db1c8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -17,6 +17,7 @@ package cmd import ( + "errors" "fmt" "os" @@ -114,7 +115,10 @@ func initConfig() { // If a config file is found, read it in. if err := viper.ReadInConfig(); err != nil { - fmt.Println(err.Error()) + var e viper.ConfigFileNotFoundError + if !errors.As(err, &e) { + fmt.Println(err.Error()) + } } } diff --git a/internal/core/manifest.go b/internal/core/manifest.go index 5544b09b..82dd79b7 100644 --- a/internal/core/manifest.go +++ b/internal/core/manifest.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "os" + "strings" "github.com/hyperledger/firefly-cli/internal/constants" "github.com/hyperledger/firefly-cli/internal/docker" @@ -123,3 +124,20 @@ func ReadManifestFile(p string) (*types.VersionManifest, error) { } return manifest, err } + +func ValidateVersionUpgrade(oldVersion, newVersion string) error { + oldSemVer := strings.Split(strings.Trim(oldVersion, "v"), ".") + newSemVer := strings.Split(strings.Trim(newVersion, "v"), ".") + if len(oldSemVer) < 3 || len(newSemVer) < 3 { + return fmt.Errorf("FireFly CLI only supports updating local development environments between patch versions") + } + // Only upgrading between patch versions is supported + // e.g. 1.3.0 -> 1.3.1 + if oldSemVer[0] == newSemVer[0] && oldSemVer[1] == newSemVer[1] { + if oldSemVer[2] > newSemVer[2] { + return fmt.Errorf("FireFly CLI does not support downgrading local development environments") + } + return nil + } + return fmt.Errorf("FireFly CLI only supports updating local development environments between patch versions") +} diff --git a/internal/core/manifest_test.go b/internal/core/manifest_test.go index 75bf6971..63a4da19 100644 --- a/internal/core/manifest_test.go +++ b/internal/core/manifest_test.go @@ -45,3 +45,14 @@ func TestGetLatestReleaseManifest(t *testing.T) { assert.NotNil(t, manifest.TokensERC1155) assert.NotNil(t, manifest.TokensERC20ERC721) } + +func TestIsSupportedVersionUpgrade(t *testing.T) { + assert.NoError(t, ValidateVersionUpgrade("v1.2.1", "v1.2.2")) + assert.NoError(t, ValidateVersionUpgrade("v1.2.0", "v1.2.2")) + assert.NoError(t, ValidateVersionUpgrade("1.2.1", "v1.2.2")) + assert.NoError(t, ValidateVersionUpgrade("v1.2.1", "1.2.2")) + + assert.Error(t, ValidateVersionUpgrade("v1.2.2", "v1.3.0")) + assert.Error(t, ValidateVersionUpgrade("latest", "v1.3.0")) + assert.Error(t, ValidateVersionUpgrade("v1.2.2", "latest")) +} diff --git a/internal/stacks/stack_manager.go b/internal/stacks/stack_manager.go index 1610ff52..6c1c101c 100644 --- a/internal/stacks/stack_manager.go +++ b/internal/stacks/stack_manager.go @@ -1049,6 +1049,14 @@ func (s *StackManager) UpgradeStack(version string) error { return err } oldManifest := s.Stack.VersionManifest + oldVersion, err := docker.GetImageLabel(fmt.Sprintf("%s@sha256:%s", oldManifest.FireFly.Image, oldManifest.FireFly.SHA), "tag") + if err != nil { + return err + } + + if err := core.ValidateVersionUpgrade(oldVersion, version); err != nil { + return err + } // get the version manifest for the new version newManifest, err := core.GetManifestForRelease(version) @@ -1091,9 +1099,12 @@ func replaceVersions(oldManifest, newManifest *types.VersionManifest, filename s new = newManifest.Evmconnect.GetDockerImageString() s = strings.ReplaceAll(s, old, new) - old = oldManifest.Tezosconnect.GetDockerImageString() - new = newManifest.Tezosconnect.GetDockerImageString() - s = strings.ReplaceAll(s, old, new) + // v1.2.x stacks may not have had a tezosconnect entry because it's new + if oldManifest.Tezosconnect != nil { + old = oldManifest.Tezosconnect.GetDockerImageString() + new = newManifest.Tezosconnect.GetDockerImageString() + s = strings.ReplaceAll(s, old, new) + } old = oldManifest.Fabconnect.GetDockerImageString() new = newManifest.Fabconnect.GetDockerImageString()