github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/cmd/juju/space/rename.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  	"strings"
     8  
     9  	"github.com/juju/cmd"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/names"
    12  	"launchpad.net/gnuflag"
    13  
    14  	"github.com/juju/juju/cmd/modelcmd"
    15  )
    16  
    17  // NewRenameCommand returns a command used to rename an existing space.
    18  func NewRenameCommand() cmd.Command {
    19  	return modelcmd.Wrap(&renameCommand{})
    20  }
    21  
    22  // renameCommand calls the API to rename an existing network space.
    23  type renameCommand struct {
    24  	SpaceCommandBase
    25  	Name    string
    26  	NewName string
    27  }
    28  
    29  const renameCommandDoc = `
    30  Renames an existing space from "old-name" to "new-name". Does not change the
    31  associated subnets and "new-name" must not match another existing space.
    32  `
    33  
    34  func (c *renameCommand) SetFlags(f *gnuflag.FlagSet) {
    35  	c.SpaceCommandBase.SetFlags(f)
    36  	f.StringVar(&c.NewName, "rename", "", "the new name for the network space")
    37  }
    38  
    39  // Info is defined on the cmd.Command interface.
    40  func (c *renameCommand) Info() *cmd.Info {
    41  	return &cmd.Info{
    42  		Name:    "rename-space",
    43  		Args:    "<old-name> <new-name>",
    44  		Purpose: "Rename a network space",
    45  		Doc:     strings.TrimSpace(renameCommandDoc),
    46  	}
    47  }
    48  
    49  // Init is defined on the cmd.Command interface. It checks the
    50  // arguments for sanity and sets up the command to run.
    51  func (c *renameCommand) Init(args []string) (err error) {
    52  	defer errors.DeferredAnnotatef(&err, "invalid arguments specified")
    53  
    54  	switch len(args) {
    55  	case 0:
    56  		return errors.New("old-name is required")
    57  	case 1:
    58  		return errors.New("new-name is required")
    59  	}
    60  	for _, name := range args {
    61  		if !names.IsValidSpace(name) {
    62  			return errors.Errorf("%q is not a valid space name", name)
    63  		}
    64  	}
    65  	c.Name = args[0]
    66  	c.NewName = args[1]
    67  
    68  	if c.Name == c.NewName {
    69  		return errors.New("old-name and new-name are the same")
    70  	}
    71  
    72  	return cmd.CheckEmpty(args[2:])
    73  }
    74  
    75  // Run implements Command.Run.
    76  func (c *renameCommand) Run(ctx *cmd.Context) error {
    77  	return c.RunWithAPI(ctx, func(api SpaceAPI, ctx *cmd.Context) error {
    78  		err := api.RenameSpace(c.Name, c.NewName)
    79  		if err != nil {
    80  			return errors.Annotatef(err, "cannot rename space %q", c.Name)
    81  		}
    82  
    83  		ctx.Infof("renamed space %q to %q", c.Name, c.NewName)
    84  		return nil
    85  	})
    86  }