github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/cloud/defaultregion.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  	"fmt"
     8  	"strings"
     9  
    10  	"github.com/juju/cmd"
    11  	"github.com/juju/errors"
    12  
    13  	jujucloud "github.com/juju/juju/cloud"
    14  	jujucmd "github.com/juju/juju/cmd"
    15  	"github.com/juju/juju/cmd/juju/common"
    16  	"github.com/juju/juju/jujuclient"
    17  )
    18  
    19  type setDefaultRegionCommand struct {
    20  	cmd.CommandBase
    21  
    22  	store  jujuclient.CredentialStore
    23  	cloud  string
    24  	region string
    25  }
    26  
    27  var usageSetDefaultRegionSummary = `
    28  Sets the default region for a cloud.`[1:]
    29  
    30  var usageSetDefaultRegionDetails = `
    31  The default region is specified directly as an argument.
    32  
    33  Examples:
    34      juju set-default-region azure-china chinaeast
    35  
    36  See also:
    37      add-credential`[1:]
    38  
    39  // NewSetDefaultRegionCommand returns a command to set the default region for a cloud.
    40  func NewSetDefaultRegionCommand() cmd.Command {
    41  	return &setDefaultRegionCommand{
    42  		store: jujuclient.NewFileCredentialStore(),
    43  	}
    44  }
    45  
    46  func (c *setDefaultRegionCommand) Info() *cmd.Info {
    47  	return jujucmd.Info(&cmd.Info{
    48  		Name:    "set-default-region",
    49  		Args:    "<cloud name> <region>",
    50  		Purpose: usageSetDefaultRegionSummary,
    51  		Doc:     usageSetDefaultRegionDetails,
    52  	})
    53  }
    54  
    55  func (c *setDefaultRegionCommand) Init(args []string) (err error) {
    56  	if len(args) < 2 {
    57  		return errors.New("Usage: juju set-default-region <cloud-name> <region>")
    58  	}
    59  	c.cloud = args[0]
    60  	c.region = args[1]
    61  	return cmd.CheckEmpty(args[2:])
    62  }
    63  
    64  func getRegion(region string, regions []jujucloud.Region) string {
    65  	for _, r := range regions {
    66  		if strings.EqualFold(r.Name, region) {
    67  			return r.Name
    68  		}
    69  	}
    70  	return ""
    71  }
    72  
    73  func (c *setDefaultRegionCommand) Run(ctxt *cmd.Context) error {
    74  	cloudDetails, err := common.CloudOrProvider(c.cloud, jujucloud.CloudByName)
    75  	if err != nil {
    76  		return err
    77  	}
    78  	if len(cloudDetails.Regions) == 0 {
    79  		return errors.Errorf("cloud %s has no regions", c.cloud)
    80  	}
    81  	if region := getRegion(c.region, cloudDetails.Regions); region == "" {
    82  		var regionNames []string
    83  		for _, r := range cloudDetails.Regions {
    84  			regionNames = append(regionNames, r.Name)
    85  		}
    86  		return errors.NewNotValid(
    87  			nil,
    88  			fmt.Sprintf("region %q for cloud %s not valid, valid regions are %s",
    89  				c.region, c.cloud, strings.Join(regionNames, ", ")))
    90  	} else {
    91  		c.region = region
    92  	}
    93  	var cred *jujucloud.CloudCredential
    94  	cred, err = c.store.CredentialForCloud(c.cloud)
    95  	if errors.IsNotFound(err) {
    96  		cred = &jujucloud.CloudCredential{}
    97  	} else if err != nil {
    98  		return err
    99  	}
   100  	cred.DefaultRegion = c.region
   101  	if err := c.store.UpdateCredential(c.cloud, *cred); err != nil {
   102  		return err
   103  	}
   104  	ctxt.Infof("Default region in %s set to %q.", c.cloud, c.region)
   105  	return nil
   106  }