github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/cloud/defaultcredential.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cloud 5 6 import ( 7 "github.com/juju/cmd" 8 "github.com/juju/errors" 9 10 jujucloud "github.com/juju/juju/cloud" 11 jujucmd "github.com/juju/juju/cmd" 12 "github.com/juju/juju/cmd/juju/common" 13 "github.com/juju/juju/jujuclient" 14 ) 15 16 var usageSetDefaultCredentialSummary = ` 17 Sets local default credentials for a cloud.`[1:] 18 19 var usageSetDefaultCredentialDetails = ` 20 The default credentials are specified with a "credential name". 21 22 A credential name is created during the process of adding credentials either 23 via `[1:] + "`juju add-credential` or `juju autoload-credentials`" + `. 24 Credential names can be listed with ` + "`juju credentials`" + `. 25 26 This command sets a locally stored credential to be used as a default. 27 Default credentials avoid the need to specify a particular set of 28 credentials when more than one are available for a given cloud. 29 30 Examples: 31 juju set-default-credential google credential_name 32 33 See also: 34 credentials 35 add-credential 36 remove-credential 37 autoload-credentials` 38 39 type setDefaultCredentialCommand struct { 40 cmd.CommandBase 41 42 store jujuclient.CredentialStore 43 cloud string 44 credential string 45 } 46 47 // NewSetDefaultCredentialCommand returns a command to set the default credential for a cloud. 48 func NewSetDefaultCredentialCommand() cmd.Command { 49 return &setDefaultCredentialCommand{ 50 store: jujuclient.NewFileCredentialStore(), 51 } 52 } 53 54 func (c *setDefaultCredentialCommand) Info() *cmd.Info { 55 return jujucmd.Info(&cmd.Info{ 56 Name: "set-default-credential", 57 Args: "<cloud name> <credential name>", 58 Purpose: usageSetDefaultCredentialSummary, 59 Doc: usageSetDefaultCredentialDetails, 60 }) 61 } 62 63 func (c *setDefaultCredentialCommand) Init(args []string) (err error) { 64 if len(args) < 2 { 65 return errors.New("Usage: juju set-default-credential <cloud-name> <credential-name>") 66 } 67 c.cloud = args[0] 68 c.credential = args[1] 69 return cmd.CheckEmpty(args[2:]) 70 } 71 72 func hasCredential(credential string, credentials map[string]jujucloud.Credential) bool { 73 for c := range credentials { 74 if c == credential { 75 return true 76 } 77 } 78 return false 79 } 80 81 func (c *setDefaultCredentialCommand) Run(ctxt *cmd.Context) error { 82 if _, err := common.CloudOrProvider(c.cloud, jujucloud.CloudByName); err != nil { 83 return err 84 } 85 cred, err := c.store.CredentialForCloud(c.cloud) 86 if errors.IsNotFound(err) { 87 cred = &jujucloud.CloudCredential{} 88 } else if err != nil { 89 return err 90 } 91 if !hasCredential(c.credential, cred.AuthCredentials) { 92 return errors.NotValidf("credential %q for cloud %s", c.credential, c.cloud) 93 } 94 95 cred.DefaultCredential = c.credential 96 if err := c.store.UpdateCredential(c.cloud, *cred); err != nil { 97 return err 98 } 99 ctxt.Infof("Local credential %q is set to be default for %q for this client.", c.credential, c.cloud) 100 return nil 101 }