Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mixin version when building the bundle #1952

Merged
14 changes: 7 additions & 7 deletions pkg/cnab/config-adapter/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ const SchemaVersion = "v1.0.0"
// ManifestConverter converts from a porter manifest to a CNAB bundle definition.
type ManifestConverter struct {
*portercontext.Context
Manifest *manifest.Manifest
ImageDigests map[string]string
Mixins []mixin.Metadata
Manifest *manifest.Manifest
ImageDigests map[string]string
InstalledMixins []mixin.Metadata
}

func NewManifestConverter(
Expand All @@ -31,10 +31,10 @@ func NewManifestConverter(
mixins []mixin.Metadata,
) *ManifestConverter {
return &ManifestConverter{
Context: cxt,
Manifest: manifest,
ImageDigests: imageDigests,
Mixins: mixins,
Context: cxt,
Manifest: manifest,
ImageDigests: imageDigests,
InstalledMixins: mixins,
}
}

Expand Down
20 changes: 13 additions & 7 deletions pkg/cnab/config-adapter/adapter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (
"get.porter.sh/porter/pkg/cnab"
"get.porter.sh/porter/pkg/config"
"get.porter.sh/porter/pkg/manifest"
"get.porter.sh/porter/pkg/mixin"
"get.porter.sh/porter/pkg/pkgmgmt"
"github.com/cnabio/cnab-go/bundle"
"github.com/cnabio/cnab-go/bundle/definition"
"github.com/pkg/errors"
Expand All @@ -24,10 +26,14 @@ func TestManifestConverter(t *testing.T) {
c := config.NewTestConfig(t)
c.TestContext.AddTestFileFromRoot("tests/testdata/mybuns/porter.yaml", config.Name)

m, err := manifest.LoadManifestFrom(context.Background(), c.Config, config.Name)
m, err := manifest.LoadManifestFrom(context.Background(), c.Config, config.Name)
require.NoError(t, err, "could not load manifest")

a := NewManifestConverter(c.Context, m, nil, nil)
installedMixins := []mixin.Metadata{
{Name: "exec", VersionInfo: pkgmgmt.VersionInfo{Version: "v1.2.3"}},
}

a := NewManifestConverter(c.Context, m, nil, installedMixins)

bun, err := a.ToBundle()
require.NoError(t, err, "ToBundle failed")
Expand Down Expand Up @@ -55,7 +61,7 @@ func TestManifestConverter_ToBundle(t *testing.T) {
c := config.NewTestConfig(t)
c.TestContext.AddTestFile("testdata/porter.yaml", config.Name)

m, err := manifest.LoadManifestFrom(context.Background(), c.Config, config.Name)
m, err := manifest.LoadManifestFrom(context.Background(), c.Config, config.Name)
require.NoError(t, err, "could not load manifest")

a := NewManifestConverter(c.Context, m, nil, nil)
Expand Down Expand Up @@ -800,10 +806,10 @@ func TestManifestConverter_generateDefaultAction(t *testing.T) {
}},
{
"help", bundle.Action{
Description: "Print a help message to the standard output",
Modifies: false,
Stateless: true,
}},
Description: "Print a help message to the standard output",
Modifies: false,
Stateless: true,
}},
{"log", bundle.Action{
Description: "Print logs of the installed system to the standard output",
Modifies: false,
Expand Down
33 changes: 27 additions & 6 deletions pkg/cnab/config-adapter/stamp.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@ func (s Stamp) WriteManifest(cxt *portercontext.Context, path string) error {

// MixinRecord contains information about a mixin used in a bundle
// For now it is a placeholder for data that we would like to include in the future.
type MixinRecord struct{}
type MixinRecord struct {
// Version of the mixin used in the bundle.
Version string `json:"version"`
}

func (c *ManifestConverter) GenerateStamp() (Stamp, error) {
stamp := Stamp{}
Expand All @@ -74,10 +77,12 @@ func (c *ManifestConverter) GenerateStamp() (Stamp, error) {
}
stamp.EncodedManifest = base64.StdEncoding.EncodeToString(rawManifest)

// Remember the mixins used in the bundle
stamp.Mixins = make(map[string]MixinRecord, len(c.Manifest.Mixins))
for _, m := range c.Manifest.Mixins {
stamp.Mixins[m.Name] = MixinRecord{}
usedMixinsVersion := c.getUsedMixinsVersion()
for usedMixinName, usedMixinVersion := range usedMixinsVersion {
stamp.Mixins[usedMixinName] = MixinRecord{
Version: usedMixinVersion,
}
}

digest, err := c.DigestManifest()
Expand Down Expand Up @@ -109,8 +114,9 @@ func (c *ManifestConverter) DigestManifest() (string, error) {
v := pkg.Version
data = append(data, v...)

for _, m := range c.Mixins {
data = append(append(data, m.Name...), m.Version...)
usedMixinsVersion := c.getUsedMixinsVersion()
for usedMixinName, usedMixinVersion := range usedMixinsVersion {
data = append(append(data, usedMixinName...), usedMixinVersion...)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the way we are concatenating these bytes is already pretty odd but I don't want to have you try to fix that in this PR since it's unrelated. Once your PR is in, I'll submit a PR to clean that up.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it because it was appended byte by byte? Should we transform everything to string first, append it one by one, then cast the finished version of it to []byte at the end?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's just hard to read and when thinking about the digest as a whole, hard to follow what we are hashing here.

}

digest := sha256.Sum256(data)
Expand All @@ -137,3 +143,18 @@ func LoadStamp(bun cnab.ExtendedBundle) (Stamp, error) {

return stamp, nil
}

// getUsedMixinsVersion compare the mixins defined in the manifest and the ones installed and then retrieve the mixin's version info
func (c *ManifestConverter) getUsedMixinsVersion() map[string]string {
usedMixinsVersion := make(map[string]string)

for _, usedMixin := range c.Manifest.Mixins {
for _, installedMixin := range c.InstalledMixins {
if usedMixin.Name == installedMixin.Name {
usedMixinsVersion[usedMixin.Name] = installedMixin.GetVersionInfo().Version
}
}
}

return usedMixinsVersion
}
14 changes: 11 additions & 3 deletions pkg/cnab/config-adapter/stamp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@ import (
"get.porter.sh/porter/pkg/cnab"
"get.porter.sh/porter/pkg/config"
"get.porter.sh/porter/pkg/manifest"
"get.porter.sh/porter/pkg/mixin"
"get.porter.sh/porter/pkg/pkgmgmt"
"github.com/cnabio/cnab-go/bundle"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

var simpleManifestDigest = "7b2a4adbd1df55d080c316c97d9080aec2476c50b6fcd3a06f1e2506a439b583"

func TestConfig_GenerateStamp(t *testing.T) {
// Do not run this test in parallel
// Still need to figure out what is introducing flakey-ness
Expand All @@ -23,11 +27,15 @@ func TestConfig_GenerateStamp(t *testing.T) {
m, err := manifest.LoadManifestFrom(context.Background(), c.Config, config.Name)
require.NoError(t, err, "could not load manifest")

a := NewManifestConverter(c.Context, m, nil, nil)
installedMixins := []mixin.Metadata{
{Name: "exec", VersionInfo: pkgmgmt.VersionInfo{Version: "v1.2.3"}},
}

a := NewManifestConverter(c.Context, m, nil, installedMixins)
stamp, err := a.GenerateStamp()
require.NoError(t, err, "DigestManifest failed")
assert.NotEmpty(t, stamp.ManifestDigest)
assert.Equal(t, map[string]MixinRecord{"exec": {}}, stamp.Mixins, "Stamp.Mixins was not populated properly")
assert.Equal(t, simpleManifestDigest, stamp.ManifestDigest)
assert.Equal(t, map[string]MixinRecord{"exec": {Version: "v1.2.3"}}, stamp.Mixins, "Stamp.Mixins was not populated properly")
assert.Equal(t, pkg.Version, stamp.Version)
assert.Equal(t, pkg.Commit, stamp.Commit)

Expand Down
4 changes: 3 additions & 1 deletion pkg/cnab/config-adapter/testdata/mybuns.bundle.json
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,9 @@
"sh.porter": {
"manifestDigest": "",
"mixins": {
"exec": {}
"exec": {
"version": "v1.2.3"
}
},
"manifest": "IyBUaGlzIGlzIGEgdGVzdCBidW5kbGUgdGhhdCBtYWtlcyBubyBsb2dpY2FsIHNlbnNlLCBidXQgaXQgZG9lcyBleGVyY2lzZSBsb3RzIG9mIGRpZmZlcmVudCBidW5kbGUgZmVhdHVyZXMKCnNjaGVtYVZlcnNpb246IDEuMC4wLWFscGhhLjEKbmFtZTogbXlidW5zCnZlcnNpb246IDAuMS4yCmRlc2NyaXB0aW9uOiAiQSB2ZXJ5IHRob3JvdWdoIHRlc3QgYnVuZGxlIgpyZWdpc3RyeTogbG9jYWxob3N0OjUwMDAKZG9ja2VyZmlsZTogRG9ja2VyZmlsZS50bXBsCgpjcmVkZW50aWFsczoKICAtIG5hbWU6IHVzZXJuYW1lCiAgICBkZXNjcmlwdGlvbjogIlRoZSBuYW1lIHlvdSB3YW50IG9uIHRoZSBhdWRpdCBsb2ciCiAgICBlbnY6IFVTRVJOQU1FCgpwYXJhbWV0ZXJzOgogIC0gbmFtZTogbG9nX2xldmVsCiAgICBkZXNjcmlwdGlvbjogIkhvdyB1bmhlbHBmdWwgd291bGQgeW91IGxpa2UgdGhlIGxvZ3MgdG8gYmU/IgogICAgdHlwZTogaW50ZWdlcgogICAgbWluaW11bTogMQogICAgbWF4aW11bTogMTEKICAgIGRlZmF1bHQ6IDUKICAtIG5hbWU6IHBhc3N3b3JkCiAgICBkZXNjcmlwdGlvbjogIlRoZSBzdXBlciBzZWNyZXQgZGF0YSIKICAgIHR5cGU6IHN0cmluZwogICAgZGVmYXVsdDogImRlZmF1dGwtc2VjcmV0IgogICAgc2Vuc2l0aXZlOiB0cnVlCiAgLSBuYW1lOiBjaGFvc19tb25rZXkKICAgIGRlc2NyaXB0aW9uOiAiU2V0IHRvIHRydWUgdG8gbWFrZSB0aGUgYnVuZGxlIGZhaWwiCiAgICB0eXBlOiBib29sZWFuCiAgICBkZWZhdWx0OiBmYWxzZQogIC0gbmFtZTogY2ZnCiAgICBkZXNjcmlwdGlvbjogIkEganNvbiBjb25maWcgZmlsZSIKICAgIHR5cGU6IGZpbGUKICAgIGRlZmF1bHQ6ICcnCiAgICBwYXRoOiBidW5jZmcuanNvbgoKb3V0cHV0czoKICAtIG5hbWU6IG15bG9ncwogICAgYXBwbHlUbzoKICAgICAgLSBpbnN0YWxsCiAgICAgIC0gdXBncmFkZQogIC0gbmFtZTogcmVzdWx0CiAgICBhcHBseVRvOgogICAgICAtIGluc3RhbGwKICAgICAgLSB1cGdyYWRlCiAgICBzZW5zaXRpdmU6IHRydWUKCnN0YXRlOgogIC0gbmFtZTogbWFnaWNfZmlsZQogICAgcGF0aDogbWFnaWMudHh0CgpkZXBlbmRlbmNpZXM6CiAgcmVxdWlyZWQ6CiAgICAtIG5hbWU6IGRiCiAgICAgIHJlZmVyZW5jZTogImxvY2FsaG9zdDo1MDAwL215ZGI6djAuMS4wIgogICAgICBwYXJhbWV0ZXJzOgogICAgICAgIGRhdGFiYXNlOiBiaWdkYgoKbWl4aW5zOgogIC0gZXhlYwoKY3VzdG9tQWN0aW9uczoKICBkcnktcnVuOgogICAgZGVzY3JpcHRpb246ICJNYWtlIHN1cmUgaXQgd2lsbCB3b3JrIGJlZm9yZSB5b3UgcnVuIGl0IgogICAgc3RhdGVsZXNzOiB0cnVlCiAgICBtb2RpZmllczogZmFsc2UKICBzdGF0dXM6CiAgICBkZXNjcmlwdGlvbjogIlByaW50IHRoZSBpbnN0YWxsYXRpb24gc3RhdHVzIgogICAgc3RhdGVsZXNzOiBmYWxzZQogICAgbW9kaWZpZXM6IGZhbHNlCgppbnN0YWxsOgogIC0gZXhlYzoKICAgICAgZGVzY3JpcHRpb246ICJMZXQncyBtYWtlIHNvbWUgbWFnaWMiCiAgICAgIGNvbW1hbmQ6IC4vaGVscGVycy5zaAogICAgICBhcmd1bWVudHM6CiAgICAgICAgLSBtYWtlTWFnaWMKICAgICAgICAtICIne3sgYnVuZGxlLmNyZWRlbnRpYWxzLnVzZXJuYW1lIH19IGlzIGEgdW5pY29ybiB3aXRoIHt7IGJ1bmRsZS5wYXJhbWV0ZXJzLnBhc3N3b3JkIH19IHNlY3JldC4nIgogIC0gZXhlYzoKICAgICAgZGVzY3JpcHRpb246ICJpbnN0YWxsIgogICAgICBjb21tYW5kOiAuL2hlbHBlcnMuc2gKICAgICAgYXJndW1lbnRzOgogICAgICAgIC0gaW5zdGFsbAogICAgICBvdXRwdXRzOgogICAgICAgIC0gbmFtZTogbXlsb2dzCiAgICAgICAgICByZWdleDogIiguKikiCiAgLSBleGVjOgogICAgICBkZXNjcmlwdGlvbjogInJvbGwgdGhlIGRpY2Ugd2l0aCB5b3VyIGNoYW9zIG1vbmtleSIKICAgICAgY29tbWFuZDogLi9oZWxwZXJzLnNoCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtIGNoYW9zX21vbmtleQogICAgICAgIC0gInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLmNoYW9zX21vbmtleSB9fSIKICAgICAgb3V0cHV0czoKICAgICAgICAtIG5hbWU6IHJlc3VsdAogICAgICAgICAgcmVnZXg6ICIoLiopIgoKCmRyeS1ydW46CiAgLSBleGVjOgogICAgICBkZXNjcmlwdGlvbjogIkNoZWNrIHNvbWUgdGhpbmdzIgogICAgICBjb21tYW5kOiBlY2hvCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtICJBbGwgY2xlYXIhIgoKc3RhdHVzOgogIC0gZXhlYzoKICAgICAgZGVzY3JpcHRpb246ICJQcmludCBjb25maWciCiAgICAgIGNvbW1hbmQ6IGNhdAogICAgICBhcmd1bWVudHM6CiAgICAgICAgLSAie3sgYnVuZGxlLnBhcmFtZXRlcnMuY2ZnIH19IgogIC0gZXhlYzoKICAgICAgZGVzY3JpcHRpb246ICJQcmludCBtYWdpYyIKICAgICAgY29tbWFuZDogY2F0CiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtIG1hZ2ljLnR4dAoKYm9vbToKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAibW9kaWZ5IHRoZSBidW5kbGUgaW4gdW5rbm93YWJsZSB3YXlzIgogICAgICBjb21tYW5kOiBlY2hvCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtICJZT0xPIgoKdXBncmFkZToKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAiRW5zdXJlIG1hZ2ljIgogICAgICBjb21tYW5kOiAuL2hlbHBlcnMuc2gKICAgICAgYXJndW1lbnRzOgogICAgICAgIC0gZW5zdXJlTWFnaWMKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAidXBncmFkZSIKICAgICAgY29tbWFuZDogLi9oZWxwZXJzLnNoCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtIHVwZ3JhZGUKICAgICAgb3V0cHV0czoKICAgICAgICAtIG5hbWU6IG15bG9ncwogICAgICAgICAgcmVnZXg6ICIoLiopIgogIC0gZXhlYzoKICAgICAgZGVzY3JpcHRpb246ICJyb2xsIHRoZSBkaWNlIHdpdGggeW91ciBjaGFvcyBtb25rZXkiCiAgICAgIGNvbW1hbmQ6IC4vaGVscGVycy5zaAogICAgICBhcmd1bWVudHM6CiAgICAgICAgLSBjaGFvc19tb25rZXkKICAgICAgICAtICJ7eyBidW5kbGUucGFyYW1ldGVycy5jaGFvc19tb25rZXkgfX0iCiAgICAgIG91dHB1dHM6CiAgICAgICAgLSBuYW1lOiByZXN1bHQKICAgICAgICAgIHJlZ2V4OiAiKC4qKSIKCnVuaW5zdGFsbDoKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAiRW5zdXJlIE1hZ2ljIgogICAgICBjb21tYW5kOiAuL2hlbHBlcnMuc2gKICAgICAgYXJndW1lbnRzOgogICAgICAgIC0gZW5zdXJlTWFnaWMKICAtIGV4ZWM6CiAgICAgIGRlc2NyaXB0aW9uOiAidW5pbnN0YWxsIgogICAgICBjb21tYW5kOiAuL2hlbHBlcnMuc2gKICAgICAgYXJndW1lbnRzOgogICAgICAgIC0gdW5pbnN0YWxsCiAgLSBleGVjOgogICAgICBkZXNjcmlwdGlvbjogInJvbGwgdGhlIGRpY2Ugd2l0aCB5b3VyIGNoYW9zIG1vbmtleSIKICAgICAgY29tbWFuZDogLi9oZWxwZXJzLnNoCiAgICAgIGFyZ3VtZW50czoKICAgICAgICAtIGNoYW9zX21vbmtleQogICAgICAgIC0gInt7IGJ1bmRsZS5wYXJhbWV0ZXJzLmNoYW9zX21vbmtleSB9fSIK",
"version": "",
Expand Down