Skip to content

Commit

Permalink
Set AllowPrerelease on deps v1 extension
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
carolynvs committed Jul 6, 2022
1 parent 5baac51 commit 977de0e
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 22 deletions.
29 changes: 21 additions & 8 deletions pkg/cnab/config-adapter/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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{
Expand All @@ -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 {
Expand Down Expand Up @@ -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{}{},
}
Expand All @@ -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
}
Expand All @@ -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 {
Expand Down
20 changes: 9 additions & 11 deletions pkg/cnab/config-adapter/adapter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -544,33 +544,30 @@ 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{
Name: "storage",
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)
Expand All @@ -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 {
Expand Down
4 changes: 1 addition & 3 deletions pkg/cnab/config-adapter/testdata/porter-with-deps.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 977de0e

Please sign in to comment.