11package commands
22
33import (
4+ "bytes"
45 "fmt"
56 "io/ioutil"
67 "os"
78
89 "github.com/deislabs/cnab-go/claim"
10+ "github.com/deislabs/cnab-go/driver"
911 "github.com/docker/app/internal"
12+ "github.com/docker/app/internal/cnab"
1013 "github.com/docker/app/internal/commands/build"
1114 "github.com/docker/app/internal/commands/image"
1215 "github.com/docker/app/internal/store"
1316 appstore "github.com/docker/app/internal/store"
1417 "github.com/docker/cli/cli/command"
1518 "github.com/docker/cli/cli/config"
19+ "github.com/docker/cli/cli/flags"
20+ "github.com/pkg/errors"
21+ "github.com/sirupsen/logrus"
1622 "github.com/spf13/cobra"
1723 "github.com/spf13/pflag"
1824)
@@ -110,21 +116,76 @@ func prepareBundleStore() (store.BundleStore, error) {
110116 return bundleStore , nil
111117}
112118
113- type targetContextOptions struct {
114- targetContext string
119+ func setupDriver (installation * store.Installation , dockerCli command.Cli , opts installerContextOptions ) (driver.Driver , * bytes.Buffer , error ) {
120+ dockerCli , err := opts .setInstallerContext (dockerCli )
121+ if err != nil {
122+ return nil , nil , err
123+ }
124+ bind , err := cnab .RequiredClaimBindMount (installation .Claim , dockerCli )
125+ if err != nil {
126+ return nil , nil , err
127+ }
128+ driverImpl , errBuf := cnab .PrepareDriver (dockerCli , bind , nil )
129+ return driverImpl , errBuf , nil
115130}
116131
117- func (o * targetContextOptions ) SetDefaultTargetContext (dockerCli command.Cli ) {
118- o .targetContext = getTargetContext (o .targetContext , dockerCli .CurrentContext ())
132+ type parametersOptions struct {
133+ parametersFiles []string
134+ overrides []string
135+ }
136+
137+ func (o * parametersOptions ) addFlags (flags * pflag.FlagSet ) {
138+ flags .StringArrayVar (& o .parametersFiles , "parameters-file" , []string {}, "Override parameters file" )
139+ flags .StringArrayVarP (& o .overrides , "set" , "s" , []string {}, "Override parameter value" )
140+ }
141+
142+ type installerContextOptions struct {
143+ installerContext string
144+ }
145+
146+ func (o * installerContextOptions ) addFlag (flags * pflag.FlagSet ) {
147+ flags .StringVar (& o .installerContext , "installer-context" , "" , "Context on which the installer image is ran (default: <current-context>)" )
148+ }
149+
150+ func (o * installerContextOptions ) setInstallerContext (dockerCli command.Cli ) (command.Cli , error ) {
151+ o .installerContext = getTargetContext (o .installerContext , dockerCli .CurrentContext ())
152+ if o .installerContext != dockerCli .CurrentContext () {
153+ if _ , err := dockerCli .ContextStore ().GetMetadata (o .installerContext ); err != nil {
154+ return nil , errors .Wrapf (err , "Unknown docker context %s" , o .installerContext )
155+ }
156+ fmt .Fprintf (dockerCli .Out (), "Using context %q to run installer image" , o .installerContext )
157+ cli , err := command .NewDockerCli ()
158+ if err != nil {
159+ return nil , err
160+ }
161+ opts := flags.ClientOptions {
162+ Common : & flags.CommonOptions {
163+ Context : o .installerContext ,
164+ LogLevel : logrus .GetLevel ().String (),
165+ },
166+ ConfigDir : config .Dir (),
167+ }
168+ if err = cli .Apply (
169+ command .WithInputStream (dockerCli .In ()),
170+ command .WithOutputStream (dockerCli .Out ()),
171+ command .WithErrorStream (dockerCli .Err ())); err != nil {
172+ return nil , err
173+ }
174+ if err = cli .Initialize (& opts ); err != nil {
175+ return nil , err
176+ }
177+ return cli , nil
178+ }
179+ return dockerCli , nil
119180}
120181
121182func getTargetContext (optstargetContext , currentContext string ) string {
122183 var targetContext string
123184 switch {
124185 case optstargetContext != "" :
125186 targetContext = optstargetContext
126- case os .Getenv ("DOCKER_TARGET_CONTEXT " ) != "" :
127- targetContext = os .Getenv ("DOCKER_TARGET_CONTEXT " )
187+ case os .Getenv ("INSTALLER_TARGET_CONTEXT " ) != "" :
188+ targetContext = os .Getenv ("INSTALLER_TARGET_CONTEXT " )
128189 }
129190 if targetContext == "" {
130191 targetContext = currentContext
@@ -133,7 +194,6 @@ func getTargetContext(optstargetContext, currentContext string) string {
133194}
134195
135196type credentialOptions struct {
136- targetContextOptions
137197 credentialsets []string
138198 credentials []string
139199 sendRegistryAuth bool
@@ -149,7 +209,7 @@ func (o *credentialOptions) CredentialSetOpts(dockerCli command.Cli, credentialS
149209 return []credentialSetOpt {
150210 addNamedCredentialSets (credentialStore , o .credentialsets ),
151211 addCredentials (o .credentials ),
152- addDockerCredentials (o . targetContext , dockerCli .ContextStore ()),
212+ addDockerCredentials (dockerCli . CurrentContext () , dockerCli .ContextStore ()),
153213 addRegistryCredentials (o .sendRegistryAuth , dockerCli ),
154214 }
155215}
0 commit comments