From d78859a564e08f84150f1db2bc1bc1b224556d1f Mon Sep 17 00:00:00 2001 From: Carolyn Van Slyck Date: Wed, 6 Jul 2022 16:43:47 -0500 Subject: [PATCH] Set AllowPrerelease on deps v1 extension When we are converting a porter.yaml to a bundle.json and populating the v1 dependencies extension metadata, we accidentally stopped populating AllowPrerelease (which was in use previously). Before we updated the dependency schema in preparation for a v2 of the dependency extension this value was set explicitly in the porter.yaml. When we removed it, we decided to use the mastermind/semver convention of "if a version constraint includes a prerelease, then we will match against releases", i.e. 1.0.0-0 would allow prereleases, but we missed updating the conversion logic to explicitly set AllowPrerelease in that situation. I've updated our testdata to work with the new logic and verified that we are now properly setting AllowPrerelease again. Signed-off-by: Carolyn Van Slyck --- pkg/cnab/config-adapter/adapter.go | 29 ++++++++++++++----- pkg/cnab/config-adapter/adapter_test.go | 17 +++++------ .../testdata/porter-with-deps.yaml | 4 +-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/pkg/cnab/config-adapter/adapter.go b/pkg/cnab/config-adapter/adapter.go index e8a5eb7bcf..917a875c6c 100644 --- a/pkg/cnab/config-adapter/adapter.go +++ b/pkg/cnab/config-adapter/adapter.go @@ -11,6 +11,7 @@ import ( "get.porter.sh/porter/pkg/manifest" "get.porter.sh/porter/pkg/mixin" "get.porter.sh/porter/pkg/tracing" + "github.com/Masterminds/semver/v3" "github.com/cnabio/cnab-go/bundle" "github.com/cnabio/cnab-go/bundle/definition" ) @@ -71,7 +72,11 @@ func (c *ManifestConverter) ToBundle(ctx context.Context) (cnab.ExtendedBundle, b.Outputs = c.generateBundleOutputs(ctx, &b.Definitions) b.Credentials = c.generateBundleCredentials() b.Images = c.generateBundleImages() - b.Custom = c.generateCustomExtensions(&b) + custom, err := c.generateCustomExtensions(&b) + if err != nil { + return cnab.ExtendedBundle{}, err + } + b.Custom = custom b.RequiredExtensions = c.generateRequiredExtensions(b) b.Custom[config.CustomPorterKey] = stamp @@ -401,10 +406,9 @@ func (c *ManifestConverter) generateBundleImages() map[string]bundle.Image { return images } -func (c *ManifestConverter) generateDependencies() *cnab.Dependencies { - +func (c *ManifestConverter) generateDependencies() (*cnab.Dependencies, error) { if len(c.Manifest.Dependencies.RequiredDependencies) == 0 { - return nil + return nil, nil } deps := &cnab.Dependencies{ @@ -421,12 +425,18 @@ func (c *ManifestConverter) generateDependencies() *cnab.Dependencies { dependencyRef.Version = &cnab.DependencyVersion{ Ranges: []string{dep.Bundle.Version}, } + + // If we can detect that prereleases are used in the version, then set AllowPrereleases to true + v, err := semver.NewVersion(dep.Bundle.Version) + if err == nil { + dependencyRef.Version.AllowPrereleases = v.Prerelease() != "" + } } deps.Sequence = append(deps.Sequence, dep.Name) deps.Requires[dep.Name] = dependencyRef } - return deps + return deps, nil } func (c *ManifestConverter) generateParameterSources(b *cnab.ExtendedBundle) cnab.ParameterSources { @@ -576,7 +586,7 @@ func toFloat(v float64) *float64 { return &v } -func (c *ManifestConverter) generateCustomExtensions(b *cnab.ExtendedBundle) map[string]interface{} { +func (c *ManifestConverter) generateCustomExtensions(b *cnab.ExtendedBundle) (map[string]interface{}, error) { customExtensions := map[string]interface{}{ cnab.FileParameterExtensionKey: struct{}{}, } @@ -587,7 +597,10 @@ func (c *ManifestConverter) generateCustomExtensions(b *cnab.ExtendedBundle) map } // Add the dependency extension - deps := c.generateDependencies() + deps, err := c.generateDependencies() + if err != nil { + return nil, err + } if deps != nil && len(deps.Requires) > 0 { customExtensions[cnab.DependenciesExtensionKey] = deps } @@ -603,7 +616,7 @@ func (c *ManifestConverter) generateCustomExtensions(b *cnab.ExtendedBundle) map customExtensions[lookupExtensionKey(ext.Name)] = ext.Config } - return customExtensions + return customExtensions, nil } func (c *ManifestConverter) generateRequiredExtensions(b cnab.ExtendedBundle) []string { diff --git a/pkg/cnab/config-adapter/adapter_test.go b/pkg/cnab/config-adapter/adapter_test.go index 67174c0549..6387a0ec47 100644 --- a/pkg/cnab/config-adapter/adapter_test.go +++ b/pkg/cnab/config-adapter/adapter_test.go @@ -544,11 +544,12 @@ func TestManifestConverter_generateDependencies(t *testing.T) { Name: "mysql", Bundle: "getporter/azure-mysql:5.7", }}, - {"no-ranges", cnab.Dependency{ + {"no-ranges, uses prerelease", cnab.Dependency{ Name: "ad", Bundle: "getporter/azure-active-directory", Version: &cnab.DependencyVersion{ AllowPrereleases: true, + Ranges: []string{"1.0.0-0"}, }, }}, {"with-ranges", cnab.Dependency{ @@ -561,16 +562,13 @@ func TestManifestConverter_generateDependencies(t *testing.T) { }, }, }}, - {"with-tag", cnab.Dependency{ - Name: "dep-with-tag", - Bundle: "getporter/dep-bun:v0.1.0", - }}, } for _, tc := range testcases { + tc := tc + t.Run(tc.name, func(t *testing.T) { t.Parallel() - tc := tc c := config.NewTestConfig(t) c.TestContext.AddTestFile("testdata/porter-with-deps.yaml", config.Name) @@ -581,9 +579,10 @@ func TestManifestConverter_generateDependencies(t *testing.T) { a := NewManifestConverter(c.Config, m, nil, nil) - deps := a.generateDependencies() - require.Len(t, deps.Requires, 4, "incorrect number of dependencies were generated") - require.Equal(t, []string{"mysql", "ad", "storage", "dep-with-tag"}, deps.Sequence, "incorrect sequence was generated") + deps, err := a.generateDependencies() + require.NoError(t, err, "generateDependencies failed") + require.Len(t, deps.Requires, 3, "incorrect number of dependencies were generated") + require.Equal(t, []string{"mysql", "ad", "storage"}, deps.Sequence, "incorrect sequence was generated") var dep *cnab.Dependency for _, d := range deps.Requires { diff --git a/pkg/cnab/config-adapter/testdata/porter-with-deps.yaml b/pkg/cnab/config-adapter/testdata/porter-with-deps.yaml index b738bff2bf..0590b59c2e 100644 --- a/pkg/cnab/config-adapter/testdata/porter-with-deps.yaml +++ b/pkg/cnab/config-adapter/testdata/porter-with-deps.yaml @@ -12,13 +12,11 @@ dependencies: - name: ad bundle: reference: "getporter/azure-active-directory" + version: 1.0.0-0 - name: storage bundle: reference: "getporter/azure-blob-storage" version: 1.x - 2,2.1 - 3.x - - name: dep-with-tag - bundle: - reference: "getporter/dep-bun:v0.1.0" mixins: - exec