github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/rename_buildpack_command.go (about)

     1  package v6
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/actor/sharedaction"
     6  	"code.cloudfoundry.org/cli/actor/v2action"
     7  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccversion"
     8  	"code.cloudfoundry.org/cli/command"
     9  	"code.cloudfoundry.org/cli/command/flag"
    10  	"code.cloudfoundry.org/cli/command/v6/shared"
    11  	"fmt"
    12  	"strings"
    13  )
    14  
    15  //go:generate counterfeiter . RenameBuildpackActor
    16  
    17  type RenameBuildpackActor interface {
    18  	CloudControllerAPIVersion() string
    19  	RenameBuildpack(oldName string, newName string, stackName string) (v2action.Warnings, error)
    20  }
    21  
    22  type RenameBuildpackCommand struct {
    23  	RequiredArgs    flag.RenameBuildpackArgs `positional-args:"yes"`
    24  	Stack           string                   `short:"s" description:"Specify which buildpack to rename by stack"`
    25  	usage           interface{}              `usage:"CF_NAME rename-buildpack BUILDPACK_NAME NEW_BUILDPACK_NAME [-s STACK]"`
    26  	relatedCommands interface{}              `related_commands:"update-buildpack"`
    27  
    28  	UI          command.UI
    29  	Config      command.Config
    30  	SharedActor command.SharedActor
    31  	Actor       RenameBuildpackActor
    32  }
    33  
    34  func (cmd *RenameBuildpackCommand) Setup(config command.Config, ui command.UI) error {
    35  	cmd.UI = ui
    36  	cmd.Config = config
    37  	cmd.SharedActor = sharedaction.NewActor(config)
    38  
    39  	ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    44  
    45  	return nil
    46  }
    47  
    48  func (cmd RenameBuildpackCommand) Execute(args []string) error {
    49  	if err := cmd.SharedActor.CheckTarget(false, false); err != nil {
    50  		return err
    51  	}
    52  
    53  	user, err := cmd.Config.CurrentUser()
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	if cmd.stackSpecified() {
    59  		err = command.MinimumCCAPIVersionCheck(cmd.Actor.CloudControllerAPIVersion(), ccversion.MinVersionBuildpackStackAssociationV2, "Option '-s'")
    60  		if err != nil {
    61  			return err
    62  		}
    63  		cmd.UI.DisplayTextWithFlavor("Renaming buildpack {{.OldName}} to {{.NewName}} with stack {{.Stack}} as {{.CurrentUser}}...", map[string]interface{}{
    64  			"OldName":     cmd.RequiredArgs.OldBuildpackName,
    65  			"NewName":     cmd.RequiredArgs.NewBuildpackName,
    66  			"Stack":       cmd.Stack,
    67  			"CurrentUser": user.Name,
    68  		})
    69  	} else {
    70  		cmd.UI.DisplayTextWithFlavor("Renaming buildpack {{.OldName}} to {{.NewName}} as {{.CurrentUser}}...", map[string]interface{}{
    71  			"OldName":     cmd.RequiredArgs.OldBuildpackName,
    72  			"NewName":     cmd.RequiredArgs.NewBuildpackName,
    73  			"CurrentUser": user.Name,
    74  		})
    75  	}
    76  
    77  	warnings, err := cmd.Actor.RenameBuildpack(cmd.RequiredArgs.OldBuildpackName, cmd.RequiredArgs.NewBuildpackName, cmd.Stack)
    78  	cmd.UI.DisplayWarnings(warnings)
    79  	if err != nil {
    80  		return filterError(cmd.RequiredArgs.NewBuildpackName, err)
    81  	}
    82  
    83  	cmd.UI.DisplayOK()
    84  
    85  	return nil
    86  }
    87  
    88  func filterError(newBuildpackName string, err error) error {
    89  	if _, ok := err.(actionerror.BuildpackInvalidError); !ok {
    90  		return err
    91  	}
    92  	if strings.Index(err.Error(), "stack unique") == -1 {
    93  		return err
    94  	}
    95  	return fmt.Errorf("Buildpack %s already exists without a stack", newBuildpackName)
    96  }
    97  
    98  func (cmd RenameBuildpackCommand) stackSpecified() bool {
    99  	return len(cmd.Stack) > 0
   100  }