diff --git a/cmd/init.go b/cmd/init.go index 631bb667..6feb3a20 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -245,7 +245,7 @@ func init() { initCmd.Flags().StringVarP(&initOptions.BlockchainNodeProvider, "blockchain-node", "n", "geth", fmt.Sprintf("Blockchain node type to use. Options are: %v", fftypes.FFEnumValues(types.BlockchainNodeProvider))) initCmd.PersistentFlags().StringArrayVarP(&initOptions.TokenProviders, "token-providers", "t", []string{"erc20_erc721"}, fmt.Sprintf("Token providers to use. Options are: %v", fftypes.FFEnumValues(types.TokenProvider))) initCmd.PersistentFlags().IntVarP(&initOptions.ExternalProcesses, "external", "e", 0, "Manage a number of FireFly core processes outside of the docker-compose stack - useful for development and debugging") - initCmd.PersistentFlags().StringVarP(&initOptions.FireFlyVersion, "release", "r", "latest", "Select the FireFly release version to use") + initCmd.PersistentFlags().StringVarP(&initOptions.FireFlyVersion, "release", "r", "latest", fmt.Sprintf("Select the FireFly release version to use. Options are: %v", fftypes.FFEnumValues(types.ReleaseChannelSelection))) initCmd.PersistentFlags().StringVarP(&initOptions.ManifestPath, "manifest", "m", "", "Path to a manifest.json file containing the versions of each FireFly microservice to use. Overrides the --release flag.") initCmd.PersistentFlags().BoolVar(&promptNames, "prompt-names", false, "Prompt for org and node names instead of using the defaults") initCmd.PersistentFlags().BoolVar(&initOptions.PrometheusEnabled, "prometheus-enabled", false, "Enables Prometheus metrics exposition and aggregation to a shared Prometheus server") diff --git a/internal/core/manifest.go b/internal/core/manifest.go index 328cf58d..0a96fc44 100644 --- a/internal/core/manifest.go +++ b/internal/core/manifest.go @@ -27,7 +27,7 @@ import ( "github.com/hyperledger/firefly-common/pkg/fftypes" ) -func GetManifestForReleaseChannel(releaseChannel fftypes.FFEnum) (*types.VersionManifest, error) { +func GetManifestForChannel(releaseChannel fftypes.FFEnum) (*types.VersionManifest, error) { dockerTag := releaseChannel.String() if releaseChannel == types.ReleaseChannelStable { dockerTag = "latest" @@ -40,23 +40,35 @@ func GetManifestForReleaseChannel(releaseChannel fftypes.FFEnum) (*types.Version return nil, err } - manifest, err := GetReleaseManifest(gitCommit) + sha, err := getSHA(constants.FireFlyCoreImageName, dockerTag) if err != nil { return nil, err } + manifest, err := getManifest(gitCommit) + if err != nil { + return nil, err + } + + if manifest.FireFly == nil { + // Fill in the FireFly version number + manifest.FireFly = &types.ManifestEntry{ + Image: "ghcr.io/hyperledger/firefly", + Tag: dockerTag, + SHA: sha, + } + } + return manifest, nil } -func GetReleaseManifest(version string) (*types.VersionManifest, error) { - manifest := &types.VersionManifest{} - if err := request("GET", fmt.Sprintf("https://raw.githubusercontent.com/hyperledger/firefly/%s/manifest.json", version), nil, &manifest); err != nil { +func GetManifestForRelease(version string) (*types.VersionManifest, error) { + sha, err := getSHA(constants.FireFlyCoreImageName, version) + if err != nil { return nil, err } - imageName := fmt.Sprintf("%s:%s", constants.FireFlyCoreImageName, version) - - imageDigest, err := docker.GetImageDigest(imageName) + manifest, err := getManifest(version) if err != nil { return nil, err } @@ -66,13 +78,30 @@ func GetReleaseManifest(version string) (*types.VersionManifest, error) { manifest.FireFly = &types.ManifestEntry{ Image: "ghcr.io/hyperledger/firefly", Tag: version, - SHA: imageDigest[7:], + SHA: sha, } } return manifest, nil } +func getManifest(version string) (*types.VersionManifest, error) { + manifest := &types.VersionManifest{} + if err := request("GET", fmt.Sprintf("https://raw.githubusercontent.com/hyperledger/firefly/%s/manifest.json", version), nil, &manifest); err != nil { + return nil, err + } + return manifest, nil +} + +func getSHA(imageName, imageTag string) (string, error) { + digest, err := docker.GetImageDigest(fmt.Sprintf("%s:%s", imageName, imageTag)) + if err != nil { + return "", err + } else { + return digest[7:], nil + } +} + func ReadManifestFile(p string) (*types.VersionManifest, error) { d, err := ioutil.ReadFile(p) if err != nil { diff --git a/internal/core/manifest_test.go b/internal/core/manifest_test.go index 91f9671e..42424c7a 100644 --- a/internal/core/manifest_test.go +++ b/internal/core/manifest_test.go @@ -24,7 +24,7 @@ import ( ) func TestGetFireFlyManifest(T *testing.T) { - manifest, err := GetReleaseManifest("main") + manifest, err := GetManifestForRelease("main") assert.NoError(T, err) assert.NotNil(T, manifest) assert.NotNil(T, manifest.FireFly) @@ -36,7 +36,7 @@ func TestGetFireFlyManifest(T *testing.T) { } func TestGetLatestReleaseManifest(T *testing.T) { - manifest, err := GetManifestForReleaseChannel(types.ReleaseChannelStable) + manifest, err := GetManifestForChannel(types.ReleaseChannelStable) assert.NoError(T, err) assert.NotNil(T, manifest) assert.NotNil(T, manifest.FireFly) diff --git a/internal/stacks/stack_manager.go b/internal/stacks/stack_manager.go index 216c0298..a979884d 100644 --- a/internal/stacks/stack_manager.go +++ b/internal/stacks/stack_manager.go @@ -146,12 +146,12 @@ func (s *StackManager) InitStack(options *types.InitOptions) (err error) { } else { // Otherwise, fetch the manifest file from GitHub for the specified version if options.FireFlyVersion == "" || strings.ToLower(options.FireFlyVersion) == "latest" { - manifest, err = core.GetManifestForReleaseChannel(fftypes.FFEnum(options.ReleaseChannel)) + manifest, err = core.GetManifestForChannel(fftypes.FFEnum(options.ReleaseChannel)) if err != nil { return err } } else { - manifest, err = core.GetReleaseManifest(options.FireFlyVersion) + manifest, err = core.GetManifestForRelease(options.FireFlyVersion) if err != nil { return err } diff --git a/pkg/types/options.go b/pkg/types/options.go index 48d85675..49af5872 100644 --- a/pkg/types/options.go +++ b/pkg/types/options.go @@ -114,6 +114,7 @@ const ReleaseChannelSelection = "release_channel" var ( ReleaseChannelStable = fftypes.FFEnumValue(ReleaseChannelSelection, "stable") + ReleaseChannelHead = fftypes.FFEnumValue(ReleaseChannelSelection, "head") ReleaseChannelAlpha = fftypes.FFEnumValue(ReleaseChannelSelection, "alpha") ReleaseChannelBeta = fftypes.FFEnumValue(ReleaseChannelSelection, "beta") ReleaseChannelRC = fftypes.FFEnumValue(ReleaseChannelSelection, "rc")