Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 65b5f8c

Browse files
Check current app version vs bundle app version if any and print a warning if it differs on the following commands:
- inspect - pull - rm - run - update - image inspect - image render Signed-off-by: Silvin Lubecki <[email protected]>
1 parent 7265009 commit 65b5f8c

File tree

11 files changed

+62
-9
lines changed

11 files changed

+62
-9
lines changed

internal/commands/image/inspect.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"io/ioutil"
66
"os"
77

8+
"github.com/docker/app/internal/packager"
9+
810
"github.com/deislabs/cnab-go/action"
911
"github.com/docker/app/internal"
1012
"github.com/docker/app/internal/cliopts"
@@ -66,6 +68,9 @@ func runInspect(dockerCli command.Cli, appname string, opts inspectOptions, inst
6668
if err != nil {
6769
return err
6870
}
71+
if err := packager.CheckAppVersion(dockerCli.Err(), bndl.Bundle); err != nil {
72+
return err
73+
}
6974

7075
format := "json"
7176
if opts.pretty {

internal/commands/image/render.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"io"
77
"os"
88

9+
"github.com/docker/app/internal/packager"
10+
911
"github.com/deislabs/cnab-go/driver"
1012

1113
"github.com/deislabs/cnab-go/action"
@@ -91,11 +93,14 @@ func prepareCustomAction(actionName string,
9193
if err != nil {
9294
return nil, nil, nil, err
9395
}
94-
bundle, ref, err := cnab.GetBundle(dockerCli, bundleStore, appname)
96+
bndl, ref, err := cnab.GetBundle(dockerCli, bundleStore, appname)
9597
if err != nil {
9698
return nil, nil, nil, errors.Wrapf(err, "could not render %q: no such App image", appname)
9799
}
98-
installation, err := appstore.NewInstallation("custom-action", ref.String(), bundle)
100+
if err := packager.CheckAppVersion(dockerCli.Err(), bndl.Bundle); err != nil {
101+
return nil, nil, nil, err
102+
}
103+
installation, err := appstore.NewInstallation("custom-action", ref.String(), bndl)
99104
if err != nil {
100105
return nil, nil, nil, err
101106
}

internal/commands/inspect.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/docker/app/internal/cliopts"
1313
"github.com/docker/app/internal/cnab"
1414
"github.com/docker/app/internal/inspect"
15+
"github.com/docker/app/internal/packager"
1516
"github.com/docker/cli/cli"
1617
"github.com/docker/cli/cli/command"
1718
"github.com/spf13/cobra"
@@ -51,7 +52,9 @@ func runInspect(dockerCli command.Cli, appName string, inspectOptions inspectOpt
5152
if err != nil {
5253
return err
5354
}
54-
55+
if err := packager.CheckAppVersion(dockerCli.Err(), installation.Bundle); err != nil {
56+
return err
57+
}
5558
creds, err := prepareCredentialSet(installation.Bundle, inspectOptions.CredentialSetOpts(dockerCli, credentialStore)...)
5659
if err != nil {
5760
return err

internal/commands/pull.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66

77
"github.com/docker/app/internal/cnab"
8+
"github.com/docker/app/internal/packager"
89
"github.com/docker/app/internal/store"
910
"github.com/docker/cli/cli"
1011
"github.com/docker/cli/cli/command"
@@ -46,7 +47,9 @@ func runPull(dockerCli command.Cli, name string) error {
4647
if err != nil {
4748
return errors.Wrap(err, name)
4849
}
49-
50+
if err := packager.CheckAppVersion(dockerCli.Err(), bndl.Bundle); err != nil {
51+
return err
52+
}
5053
fmt.Fprintf(os.Stdout, "Successfully pulled %q (%s) from %s\n", bndl.Name, bndl.Version, ref.String())
5154

5255
return nil

internal/commands/remove.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/docker/app/internal/cliopts"
88
"github.com/docker/app/internal/cnab"
9+
"github.com/docker/app/internal/packager"
910

1011
"github.com/deislabs/cnab-go/driver"
1112

@@ -52,6 +53,10 @@ func runRemove(dockerCli command.Cli, installationName string, opts removeOption
5253
if err != nil {
5354
return err
5455
}
56+
if err := packager.CheckAppVersion(dockerCli.Err(), installation.Bundle); err != nil {
57+
return err
58+
}
59+
5560
if opts.force {
5661
defer func() {
5762
if mainErr == nil {

internal/commands/run.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"os"
66

7+
"github.com/docker/app/internal/packager"
8+
79
"github.com/docker/app/internal/relocated"
810

911
"github.com/deislabs/cnab-go/driver"
@@ -98,6 +100,9 @@ func runDockerApp(dockerCli command.Cli, appname string, opts runOptions, instal
98100
}
99101

100102
func runBundle(dockerCli command.Cli, bndl *relocated.Bundle, opts runOptions, installerContext *cliopts.InstallerContextOptions, ref string) (err error) {
103+
if err := packager.CheckAppVersion(dockerCli.Err(), bndl.Bundle); err != nil {
104+
return err
105+
}
101106
_, installationStore, credentialStore, err := prepareStores(dockerCli.CurrentContext())
102107
if err != nil {
103108
return err

internal/commands/update.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/docker/app/internal/bundle"
1212
"github.com/docker/app/internal/cliopts"
1313
"github.com/docker/app/internal/cnab"
14+
"github.com/docker/app/internal/packager"
1415
"github.com/docker/cli/cli/command"
1516
"github.com/spf13/cobra"
1617
)
@@ -63,6 +64,10 @@ func runUpdate(dockerCli command.Cli, installationName string, opts updateOption
6364
}
6465
installation.Bundle = b.Bundle
6566
}
67+
if err := packager.CheckAppVersion(dockerCli.Err(), installation.Bundle); err != nil {
68+
return err
69+
}
70+
6671
if err := bundle.MergeBundleParameters(installation,
6772
bundle.WithFileParameters(opts.ParametersFiles),
6873
bundle.WithCommandLineParameters(opts.Overrides),

internal/packager/cnab_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestToCNAB(t *testing.T) {
2222
assert.NilError(t, err)
2323
s := golden.Get(t, "bundle-json.golden")
2424
expectedLiteral := regexp.QuoteMeta(string(s))
25-
expected := fmt.Sprintf(expectedLiteral, DockerAppPayloadVersionCurrent, `\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+Z`, internal.Version)
25+
expected := fmt.Sprintf(expectedLiteral, DockerAppPayloadVersionCurrent, internal.Version, `\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+Z`)
2626
matches, err := regexp.Match(expected, actualJSON)
2727
assert.NilError(t, err)
2828
assert.Assert(t, matches)

internal/packager/custom.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package packager
22

33
import (
44
"encoding/json"
5+
"fmt"
6+
"io"
57
"time"
68

79
"github.com/deislabs/cnab-go/bundle"
@@ -37,8 +39,8 @@ type CustomPayloadAppVersion interface {
3739
}
3840

3941
type payloadV1_0 struct {
40-
Created time.Time `json:"created"`
4142
Version string `json:"app-version"`
43+
Created time.Time `json:"created"`
4244
}
4345

4446
func (p payloadV1_0) CreatedTime() time.Time {
@@ -58,6 +60,26 @@ func newCustomPayload() (json.RawMessage, error) {
5860
return j, nil
5961
}
6062

63+
// CheckAppVersion
64+
func CheckAppVersion(stderr io.Writer, bndl *bundle.Bundle) error {
65+
payload, err := CustomPayload(bndl)
66+
if err != nil {
67+
return err
68+
}
69+
if payload == nil {
70+
return nil
71+
}
72+
73+
var version string
74+
if versionPayload, ok := payload.(CustomPayloadAppVersion); ok {
75+
version = versionPayload.AppVersion()
76+
}
77+
if version != internal.Version {
78+
fmt.Fprintf(stderr, "WARNING: App Image has been built with a different version of docker app: %q\n", version)
79+
}
80+
return nil
81+
}
82+
6183
// CustomPayload parses and returns the bundle's custom payload
6284
func CustomPayload(b *bundle.Bundle) (interface{}, error) {
6385
custom, err := parseCustomPayload(b)

internal/packager/custom_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func TestCustomPayloadNil(t *testing.T) {
5858

5959
func TestCustomPayloadV1_0_0(t *testing.T) {
6060
now := time.Now().UTC()
61-
b := createBundle(t, DockerAppPayloadVersion1_0_0, payloadV1_0{now, "version"})
61+
b := createBundle(t, DockerAppPayloadVersion1_0_0, payloadV1_0{"version", now})
6262
payload, err := CustomPayload(&b)
6363
assert.NilError(t, err)
6464
v1, ok := payload.(payloadV1_0)

0 commit comments

Comments
 (0)