Skip to content

Commit f90964e

Browse files
Merge pull request #1098 from carolynvs/fix-dep-tag-parse
Parse dependency references using docker library
2 parents 7055777 + cc011db commit f90964e

File tree

2 files changed

+38
-21
lines changed

2 files changed

+38
-21
lines changed

pkg/cnab/extensions/solver.go

+22-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package extensions
22

33
import (
4-
"fmt"
54
"sort"
6-
"strings"
75

86
"github.com/Masterminds/semver"
97
"github.com/cnabio/cnab-go/bundle"
8+
"github.com/docker/distribution/reference"
109
"github.com/google/go-containerregistry/pkg/crane"
1110
"github.com/pkg/errors"
1211
)
@@ -30,33 +29,44 @@ func (s *DependencySolver) ResolveDependencies(bun *bundle.Bundle) ([]Dependency
3029

3130
q := make([]DependencyLock, 0, len(deps.Requires))
3231
for alias, dep := range deps.Requires {
33-
bundle := strings.Split(dep.Bundle, ":")[0]
34-
version, err := s.ResolveVersion(alias, dep)
32+
ref, err := s.ResolveVersion(alias, dep)
3533
if err != nil {
3634
return nil, err
3735
}
36+
3837
lock := DependencyLock{
3938
Alias: alias,
40-
Tag: fmt.Sprintf("%s:%s", bundle, version),
39+
Tag: reference.FamiliarString(ref),
4140
}
4241
q = append(q, lock)
4342
}
4443

4544
return q, nil
4645
}
4746

48-
func (s *DependencySolver) ResolveVersion(alias string, dep Dependency) (string, error) {
47+
// ResolveVersion returns the bundle name, its version and any error.
48+
func (s *DependencySolver) ResolveVersion(alias string, dep Dependency) (reference.NamedTagged, error) {
49+
ref, err := reference.ParseNormalizedNamed(dep.Bundle)
50+
if err != nil {
51+
return nil, errors.Wrapf(err, "error parsing dependency (%s) bundle %q as OCI reference", alias, dep.Bundle)
52+
}
53+
4954
// Here is where we could split out this logic into multiple strategy funcs / structs if necessary
5055
if dep.Version == nil || len(dep.Version.Ranges) == 0 {
51-
parts := strings.Split(dep.Bundle, ":")
52-
if len(parts) > 1 {
53-
return strings.Join(parts[1:], ""), nil
54-
} else {
55-
return s.determineDefaultTag(dep)
56+
// Check if they specified an explicit tag in referenced bundle already
57+
if taggedRef, ok := ref.(reference.NamedTagged); ok {
58+
return taggedRef, nil
5659
}
60+
61+
tag, err := s.determineDefaultTag(dep)
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
return reference.WithTag(ref, tag)
5767
}
5868

59-
return "", errors.Errorf("not implemented: dependency version range specified for %s", alias)
69+
return nil, errors.Errorf("not implemented: dependency version range specified for %s", alias)
6070
}
6171

6272
func (s *DependencySolver) determineDefaultTag(dep Dependency) (string, error) {

pkg/cnab/extensions/solver_test.go

+16-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ func TestDependencySolver_ResolveDependencies(t *testing.T) {
1818
"mysql": {
1919
Bundle: "getporter/mysql:5.7",
2020
},
21+
"nginx": {
22+
Bundle: "localhost:5000/nginx:1.19",
23+
},
2124
},
2225
},
2326
},
@@ -27,11 +30,15 @@ func TestDependencySolver_ResolveDependencies(t *testing.T) {
2730
locks, err := s.ResolveDependencies(bun)
2831
require.NoError(t, err)
2932

30-
require.Len(t, locks, 1)
33+
require.Len(t, locks, 2)
34+
35+
mysql := locks[0]
36+
assert.Equal(t, "mysql", mysql.Alias)
37+
assert.Equal(t, "getporter/mysql:5.7", mysql.Tag)
3138

32-
lock := locks[0]
33-
assert.Equal(t, "mysql", lock.Alias)
34-
assert.Equal(t, "getporter/mysql:5.7", lock.Tag)
39+
nginx := locks[1]
40+
assert.Equal(t, "nginx", nginx.Alias)
41+
assert.Equal(t, "localhost:5000/nginx:1.19", nginx.Tag)
3542
}
3643

3744
func TestDependencySolver_ResolveVersion(t *testing.T) {
@@ -42,10 +49,10 @@ func TestDependencySolver_ResolveVersion(t *testing.T) {
4249
wantError string
4350
}{
4451
{name: "pinned version",
45-
dep: Dependency{"mysql:5.7", nil},
52+
dep: Dependency{Bundle: "mysql:5.7"},
4653
wantVersion: "5.7"},
4754
{name: "unimplemented range",
48-
dep: Dependency{"mysql", &DependencyVersion{Ranges: []string{"1 - 1.5"}}},
55+
dep: Dependency{Bundle: "mysql", Version: &DependencyVersion{Ranges: []string{"1 - 1.5"}}},
4956
wantError: "not implemented"},
5057
{name: "default tag to latest",
5158
dep: Dependency{Bundle: "getporterci/porter-test-only-latest"},
@@ -54,10 +61,10 @@ func TestDependencySolver_ResolveVersion(t *testing.T) {
5461
dep: Dependency{Bundle: "getporterci/porter-test-no-default-tag"},
5562
wantError: "no tag was specified"},
5663
{name: "default tag to highest semver",
57-
dep: Dependency{"getporterci/porter-test-with-versions", &DependencyVersion{Ranges: nil, AllowPrereleases: true}},
64+
dep: Dependency{Bundle: "getporterci/porter-test-with-versions", Version: &DependencyVersion{Ranges: nil, AllowPrereleases: true}},
5865
wantVersion: "v1.3-beta1"},
5966
{name: "default tag to highest semver, explicitly excluding prereleases",
60-
dep: Dependency{"getporterci/porter-test-with-versions", &DependencyVersion{Ranges: nil, AllowPrereleases: false}},
67+
dep: Dependency{Bundle: "getporterci/porter-test-with-versions", Version: &DependencyVersion{Ranges: nil, AllowPrereleases: false}},
6168
wantVersion: "v1.2"},
6269
{name: "default tag to highest semver, excluding prereleases by default",
6370
dep: Dependency{Bundle: "getporterci/porter-test-with-versions"},
@@ -75,7 +82,7 @@ func TestDependencySolver_ResolveVersion(t *testing.T) {
7582
} else {
7683
require.NoError(t, err, "ResolveVersion should not have returned an error")
7784

78-
assert.Equal(t, tc.wantVersion, version, "incorrect version resolved")
85+
assert.Equal(t, tc.wantVersion, version.Tag(), "incorrect version resolved")
7986
}
8087
})
8188
}

0 commit comments

Comments
 (0)