github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v2/unbind_security_group_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"github.com/liamawhite/cli-with-i18n/actor/sharedaction"
     5  	"github.com/liamawhite/cli-with-i18n/actor/v2action"
     6  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccv2"
     7  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccversion"
     8  	"github.com/liamawhite/cli-with-i18n/command"
     9  	"github.com/liamawhite/cli-with-i18n/command/flag"
    10  	"github.com/liamawhite/cli-with-i18n/command/translatableerror"
    11  	"github.com/liamawhite/cli-with-i18n/command/v2/shared"
    12  )
    13  
    14  //go:generate counterfeiter . UnbindSecurityGroupActor
    15  
    16  type UnbindSecurityGroupActor interface {
    17  	CloudControllerAPIVersion() string
    18  	UnbindSecurityGroupByNameAndSpace(securityGroupName string, spaceGUID string, lifecycle ccv2.SecurityGroupLifecycle) (v2action.Warnings, error)
    19  	UnbindSecurityGroupByNameOrganizationNameAndSpaceName(securityGroupName string, orgName string, spaceName string, lifecycle ccv2.SecurityGroupLifecycle) (v2action.Warnings, error)
    20  }
    21  
    22  type UnbindSecurityGroupCommand struct {
    23  	RequiredArgs    flag.UnbindSecurityGroupArgs `positional-args:"yes"`
    24  	Lifecycle       flag.SecurityGroupLifecycle  `long:"lifecycle" choice:"running" choice:"staging" default:"running" description:"Lifecycle phase the group applies to"`
    25  	usage           interface{}                  `usage:"CF_NAME unbind-security-group SECURITY_GROUP ORG SPACE [--lifecycle (running | staging)]\n\nTIP: Changes require an app restart (for running) or restage (for staging) to apply to existing applications."`
    26  	relatedCommands interface{}                  `related_commands:"apps, restart, security-groups"`
    27  
    28  	UI          command.UI
    29  	Config      command.Config
    30  	Actor       UnbindSecurityGroupActor
    31  	SharedActor command.SharedActor
    32  }
    33  
    34  func (cmd *UnbindSecurityGroupCommand) 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.NewClients(config, ui, true)
    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 UnbindSecurityGroupCommand) Execute(args []string) error {
    49  	var err error
    50  	if ccv2.SecurityGroupLifecycle(cmd.Lifecycle) == ccv2.SecurityGroupLifecycleStaging {
    51  		err = command.MinimumAPIVersionCheck(cmd.Actor.CloudControllerAPIVersion(), ccversion.MinVersionLifecyleStagingV2)
    52  		if err != nil {
    53  			switch e := err.(type) {
    54  			case translatableerror.MinimumAPIVersionNotMetError:
    55  				return translatableerror.LifecycleMinimumAPIVersionNotMetError{
    56  					CurrentVersion: e.CurrentVersion,
    57  					MinimumVersion: e.MinimumVersion,
    58  				}
    59  			default:
    60  				return err
    61  			}
    62  		}
    63  	}
    64  
    65  	user, err := cmd.Config.CurrentUser()
    66  	if err != nil {
    67  		return shared.HandleError(err)
    68  	}
    69  
    70  	var warnings v2action.Warnings
    71  
    72  	switch {
    73  	case cmd.RequiredArgs.OrganizationName == "" && cmd.RequiredArgs.SpaceName == "":
    74  		err = cmd.SharedActor.CheckTarget(cmd.Config, true, true)
    75  		if err != nil {
    76  			return shared.HandleError(err)
    77  		}
    78  
    79  		space := cmd.Config.TargetedSpace()
    80  		cmd.UI.DisplayTextWithFlavor("Unbinding security group {{.SecurityGroupName}} from org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    81  			"SecurityGroupName": cmd.RequiredArgs.SecurityGroupName,
    82  			"OrgName":           cmd.Config.TargetedOrganization().Name,
    83  			"SpaceName":         space.Name,
    84  			"Username":          user.Name,
    85  		})
    86  		warnings, err = cmd.Actor.UnbindSecurityGroupByNameAndSpace(cmd.RequiredArgs.SecurityGroupName, space.GUID, ccv2.SecurityGroupLifecycle(cmd.Lifecycle))
    87  
    88  	case cmd.RequiredArgs.OrganizationName != "" && cmd.RequiredArgs.SpaceName != "":
    89  		err = cmd.SharedActor.CheckTarget(cmd.Config, false, false)
    90  		if err != nil {
    91  			return shared.HandleError(err)
    92  		}
    93  
    94  		cmd.UI.DisplayTextWithFlavor("Unbinding security group {{.SecurityGroupName}} from org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    95  			"SecurityGroupName": cmd.RequiredArgs.SecurityGroupName,
    96  			"OrgName":           cmd.RequiredArgs.OrganizationName,
    97  			"SpaceName":         cmd.RequiredArgs.SpaceName,
    98  			"Username":          user.Name,
    99  		})
   100  		warnings, err = cmd.Actor.UnbindSecurityGroupByNameOrganizationNameAndSpaceName(cmd.RequiredArgs.SecurityGroupName, cmd.RequiredArgs.OrganizationName, cmd.RequiredArgs.SpaceName, ccv2.SecurityGroupLifecycle(cmd.Lifecycle))
   101  
   102  	default:
   103  		return translatableerror.ThreeRequiredArgumentsError{
   104  			ArgumentName1: "SECURITY_GROUP",
   105  			ArgumentName2: "ORG",
   106  			ArgumentName3: "SPACE"}
   107  	}
   108  
   109  	cmd.UI.DisplayWarnings(warnings)
   110  	if err != nil {
   111  		switch e := err.(type) {
   112  		case v2action.SecurityGroupNotBoundError:
   113  			cmd.UI.DisplayWarning("Security group {{.Name}} not bound to this space for lifecycle phase '{{.Lifecycle}}'.",
   114  				map[string]interface{}{
   115  					"Name":      e.Name,
   116  					"Lifecycle": e.Lifecycle,
   117  				})
   118  			cmd.UI.DisplayOK()
   119  			return nil
   120  		default:
   121  			return shared.HandleError(err)
   122  		}
   123  	}
   124  
   125  	cmd.UI.DisplayOK()
   126  	cmd.UI.DisplayNewline()
   127  	cmd.UI.DisplayText("TIP: Changes require an app restart (for running) or restage (for staging) to apply to existing applications.")
   128  
   129  	return nil
   130  }