From 7bc74f9ddfd8aae37dd872aea9fe0ded0b31a29f 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 | 20 ++++++------- .../testdata/porter-with-deps.yaml | 4 +-- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/pkg/cnab/config-adapter/adapter.go b/pkg/cnab/config-adapter/adapter.go index e8a5eb7bc..917a875c6 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 67174c054..208f36261 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{ @@ -556,21 +557,17 @@ func TestManifestConverter_generateDependencies(t *testing.T) { Bundle: "getporter/azure-blob-storage", Version: &cnab.DependencyVersion{ Ranges: []string{ - "1.x - 2", - "2.1 - 3.x", + "1.x - 2,2.1 - 3.x", }, }, }}, - {"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 +578,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 b738bff2b..0590b59c2 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