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

Commit bd3b894

Browse files
Add upgrade command to modify a CNAB installation.
Signed-off-by: Silvin Lubecki <silvin.lubecki@docker.com>
1 parent 76b4d3c commit bd3b894

2 files changed

Lines changed: 95 additions & 0 deletions

File tree

cmd/docker-app/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func newRootCmd(dockerCli *command.DockerCli) *cobra.Command {
4545
func addCommands(cmd *cobra.Command, dockerCli command.Cli) {
4646
cmd.AddCommand(
4747
installCmd(dockerCli),
48+
upgradeCmd(dockerCli),
4849
uninstallCmd(dockerCli),
4950
initCmd(),
5051
inspectCmd(dockerCli),

cmd/docker-app/upgrade.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/deislabs/duffle/pkg/action"
7+
"github.com/deislabs/duffle/pkg/bundle"
8+
"github.com/deislabs/duffle/pkg/claim"
9+
"github.com/deislabs/duffle/pkg/credentials"
10+
"github.com/deislabs/duffle/pkg/utils/crud"
11+
"github.com/docker/cli/cli/command"
12+
"github.com/spf13/cobra"
13+
)
14+
15+
type upgradeOptions struct {
16+
parametersOptions
17+
targetContext string
18+
credentialsets []string
19+
bundleOrDockerApp string
20+
namespace string
21+
insecure bool
22+
}
23+
24+
func upgradeCmd(dockerCli command.Cli) *cobra.Command {
25+
var opts upgradeOptions
26+
cmd := &cobra.Command{
27+
Use: "upgrade <installation-name> [options]",
28+
Short: "Upgrade an installed application",
29+
Args: cobra.ExactArgs(1),
30+
RunE: func(cmd *cobra.Command, args []string) error {
31+
return runUpgrade(dockerCli, args[0], opts)
32+
},
33+
}
34+
opts.parametersOptions.addFlags(cmd.Flags())
35+
cmd.Flags().StringVar(&opts.targetContext, "target-context", "", "Context on which to upgrade the application")
36+
cmd.Flags().StringArrayVarP(&opts.credentialsets, "credential-set", "c", []string{}, "Use a duffle credentialset (either a YAML file, or a credential set present in the duffle credential store)")
37+
cmd.Flags().StringVar(&opts.bundleOrDockerApp, "bundle", "", "Override with new bundle or Docker App")
38+
cmd.Flags().StringVar(&opts.namespace, "namespace", "", "Namespace to use (default: namespace in metadata)")
39+
cmd.Flags().BoolVar(&opts.insecure, "insecure", false, "Use insecure registry, without SSL")
40+
41+
return cmd
42+
}
43+
44+
func runUpgrade(dockerCli command.Cli, installationName string, opts upgradeOptions) error {
45+
muteDockerCli(dockerCli)
46+
targetContext := getTargetContext(opts.targetContext)
47+
parameterValues, err := prepareParameters(opts.parametersOptions)
48+
if err != nil {
49+
return err
50+
}
51+
h := duffleHome()
52+
claimStore := claim.NewClaimStore(crud.NewFileSystemStore(h.Claims(), "json"))
53+
c, err := claimStore.Read(installationName)
54+
if err != nil {
55+
return err
56+
}
57+
58+
if opts.bundleOrDockerApp != "" {
59+
b, err := resolveBundle(dockerCli, opts.namespace, opts.bundleOrDockerApp, opts.insecure)
60+
if err != nil {
61+
return err
62+
}
63+
c.Bundle = b
64+
}
65+
driverImpl, err := prepareDriver(dockerCli)
66+
if err != nil {
67+
return err
68+
}
69+
creds, err := prepareCredentialSet(targetContext, dockerCli.ContextStore(), c.Bundle, opts.credentialsets)
70+
if err != nil {
71+
return err
72+
}
73+
if err := credentials.Validate(creds, c.Bundle.Credentials); err != nil {
74+
return err
75+
}
76+
convertedParamValues := c.Parameters
77+
if err := applyParameterValues(parameterValues, c.Bundle.Parameters, convertedParamValues); err != nil {
78+
return err
79+
}
80+
81+
c.Parameters, err = bundle.ValuesOrDefaults(convertedParamValues, c.Bundle)
82+
if err != nil {
83+
return err
84+
}
85+
u := &action.Upgrade{
86+
Driver: driverImpl,
87+
}
88+
err = u.Run(&c, creds, dockerCli.Out())
89+
err2 := claimStore.Store(c)
90+
if err != nil {
91+
return fmt.Errorf("upgrade failed: %v", err)
92+
}
93+
return err2
94+
}

0 commit comments

Comments
 (0)