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 }