github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/cmd/juju/space/add.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package space 5 6 import ( 7 "fmt" 8 "strings" 9 10 "github.com/juju/cmd" 11 "github.com/juju/errors" 12 "github.com/juju/utils/set" 13 14 "github.com/juju/juju/cmd/modelcmd" 15 ) 16 17 // NewAddCommand returns a command used to add a network space. 18 func NewAddCommand() cmd.Command { 19 return modelcmd.Wrap(&addCommand{}) 20 } 21 22 // addCommand calls the API to add a new network space. 23 type addCommand struct { 24 SpaceCommandBase 25 Name string 26 CIDRs set.Strings 27 } 28 29 const addCommandDoc = ` 30 Adds a new space with the given name and associates the given 31 (optional) list of existing subnet CIDRs with it.` 32 33 // Info is defined on the cmd.Command interface. 34 func (c *addCommand) Info() *cmd.Info { 35 return &cmd.Info{ 36 Name: "add-space", 37 Args: "<name> [<CIDR1> <CIDR2> ...]", 38 Purpose: "Add a new network space", 39 Doc: strings.TrimSpace(addCommandDoc), 40 } 41 } 42 43 // Init is defined on the cmd.Command interface. It checks the 44 // arguments for sanity and sets up the command to run. 45 func (c *addCommand) Init(args []string) error { 46 var err error 47 c.Name, c.CIDRs, err = ParseNameAndCIDRs(args, true) 48 return err 49 } 50 51 // Run implements Command.Run. 52 func (c *addCommand) Run(ctx *cmd.Context) error { 53 return c.RunWithAPI(ctx, func(api SpaceAPI, ctx *cmd.Context) error { 54 // Prepare a nicer message and proper arguments to use in case 55 // there are not CIDRs given. 56 var subnetIds []string 57 msgSuffix := "no subnets" 58 if !c.CIDRs.IsEmpty() { 59 subnetIds = c.CIDRs.SortedValues() 60 msgSuffix = fmt.Sprintf("subnets %s", strings.Join(subnetIds, ", ")) 61 } 62 63 // Add the new space. 64 // TODO(dimitern): Accept --public|--private and pass it here. 65 err := api.AddSpace(c.Name, subnetIds, true) 66 if err != nil { 67 if errors.IsNotSupported(err) { 68 ctx.Infof("cannot add space %q: %v", c.Name, err) 69 } 70 return errors.Annotatef(err, "cannot add space %q", c.Name) 71 } 72 73 ctx.Infof("added space %q with %s", c.Name, msgSuffix) 74 return nil 75 }) 76 }