github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/command/v2/bind_security_group_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/sharedaction"
     5  	"code.cloudfoundry.org/cli/actor/v2action"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant"
     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/translatableerror"
    11  	"code.cloudfoundry.org/cli/command/v2/shared"
    12  )
    13  
    14  //go:generate counterfeiter . BindSecurityGroupActor
    15  
    16  type BindSecurityGroupActor interface {
    17  	BindSecurityGroupToSpace(securityGroupGUID string, spaceGUID string, lifecycle constant.SecurityGroupLifecycle) (v2action.Warnings, error)
    18  	CloudControllerAPIVersion() string
    19  	GetOrganizationByName(orgName string) (v2action.Organization, v2action.Warnings, error)
    20  	GetOrganizationSpaces(orgGUID string) ([]v2action.Space, v2action.Warnings, error)
    21  	GetSecurityGroupByName(securityGroupName string) (v2action.SecurityGroup, v2action.Warnings, error)
    22  	GetSpaceByOrganizationAndName(orgGUID string, spaceName string) (v2action.Space, v2action.Warnings, error)
    23  }
    24  
    25  type BindSecurityGroupCommand struct {
    26  	RequiredArgs    flag.BindSecurityGroupArgs  `positional-args:"yes"`
    27  	Lifecycle       flag.SecurityGroupLifecycle `long:"lifecycle" choice:"running" choice:"staging" default:"running" description:"Lifecycle phase the group applies to"`
    28  	usage           interface{}                 `usage:"CF_NAME bind-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."`
    29  	relatedCommands interface{}                 `related_commands:"apps, bind-running-security-group, bind-staging-security-group, restart, security-groups"`
    30  
    31  	UI          command.UI
    32  	Config      command.Config
    33  	SharedActor command.SharedActor
    34  	Actor       BindSecurityGroupActor
    35  }
    36  
    37  func (cmd *BindSecurityGroupCommand) Setup(config command.Config, ui command.UI) error {
    38  	cmd.UI = ui
    39  	cmd.Config = config
    40  	cmd.SharedActor = sharedaction.NewActor(config)
    41  
    42  	ccClient, uaaClient, err := shared.NewClients(config, ui, true)
    43  	if err != nil {
    44  		return err
    45  	}
    46  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    47  
    48  	return nil
    49  }
    50  
    51  func (cmd BindSecurityGroupCommand) Execute(args []string) error {
    52  	var err error
    53  	if constant.SecurityGroupLifecycle(cmd.Lifecycle) == constant.SecurityGroupLifecycleStaging {
    54  		err = command.MinimumAPIVersionCheck(cmd.Actor.CloudControllerAPIVersion(), ccversion.MinVersionLifecyleStagingV2)
    55  		if err != nil {
    56  			switch e := err.(type) {
    57  			case translatableerror.MinimumAPIVersionNotMetError:
    58  				return translatableerror.LifecycleMinimumAPIVersionNotMetError{
    59  					CurrentVersion: e.CurrentVersion,
    60  					MinimumVersion: e.MinimumVersion,
    61  				}
    62  			default:
    63  				return err
    64  			}
    65  		}
    66  	}
    67  
    68  	err = cmd.SharedActor.CheckTarget(false, false)
    69  	if err != nil {
    70  		return err
    71  	}
    72  
    73  	user, err := cmd.Config.CurrentUser()
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	securityGroup, warnings, err := cmd.Actor.GetSecurityGroupByName(cmd.RequiredArgs.SecurityGroupName)
    79  	cmd.UI.DisplayWarnings(warnings)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.RequiredArgs.OrganizationName)
    85  	cmd.UI.DisplayWarnings(warnings)
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	spacesToBind := []v2action.Space{}
    91  	if cmd.RequiredArgs.SpaceName != "" {
    92  		var space v2action.Space
    93  		space, warnings, err = cmd.Actor.GetSpaceByOrganizationAndName(org.GUID, cmd.RequiredArgs.SpaceName)
    94  		cmd.UI.DisplayWarnings(warnings)
    95  		if err != nil {
    96  			return err
    97  		}
    98  		spacesToBind = append(spacesToBind, space)
    99  	} else {
   100  		var spaces []v2action.Space
   101  		spaces, warnings, err = cmd.Actor.GetOrganizationSpaces(org.GUID)
   102  		cmd.UI.DisplayWarnings(warnings)
   103  		if err != nil {
   104  			return err
   105  		}
   106  		spacesToBind = append(spacesToBind, spaces...)
   107  	}
   108  
   109  	for _, space := range spacesToBind {
   110  		cmd.UI.DisplayTextWithFlavor("Assigning security group {{.security_group}} to space {{.space}} in org {{.organization}} as {{.username}}...", map[string]interface{}{
   111  			"security_group": securityGroup.Name,
   112  			"space":          space.Name,
   113  			"organization":   org.Name,
   114  			"username":       user.Name,
   115  		})
   116  
   117  		warnings, err = cmd.Actor.BindSecurityGroupToSpace(securityGroup.GUID, space.GUID, constant.SecurityGroupLifecycle(cmd.Lifecycle))
   118  		cmd.UI.DisplayWarnings(warnings)
   119  		if err != nil {
   120  			return err
   121  		}
   122  
   123  		cmd.UI.DisplayOK()
   124  	}
   125  
   126  	cmd.UI.DisplayText("TIP: Changes require an app restart (for running) or restage (for staging) to apply to existing applications.")
   127  
   128  	return nil
   129  }