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  }