github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/bind_security_group_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/LukasHeimann/cloudfoundrycli/v8/api/cloudcontroller/ccv3/constant"
     7  	"github.com/LukasHeimann/cloudfoundrycli/v8/command/flag"
     8  	"github.com/LukasHeimann/cloudfoundrycli/v8/resources"
     9  	"github.com/LukasHeimann/cloudfoundrycli/v8/util/configv3"
    10  )
    11  
    12  type BindSecurityGroupCommand struct {
    13  	BaseCommand
    14  
    15  	RequiredArgs    flag.BindSecurityGroupV7Args `positional-args:"yes"`
    16  	Lifecycle       flag.SecurityGroupLifecycle  `long:"lifecycle" choice:"running" choice:"staging" default:"running" description:"Lifecycle phase the group applies to."`
    17  	Space           string                       `long:"space" description:"Space to bind the security group to. (Default: all existing spaces in org)"`
    18  	usage           interface{}                  `usage:"CF_NAME bind-security-group SECURITY_GROUP ORG [--lifecycle (running | staging)] [--space SPACE]\n\nTIP: If Dynamic ASG's are enabled, changes will automatically apply for running and staging applications. Otherwise, changes will require an app restart (for running) or restage (for staging) to apply to existing applications."`
    19  	relatedCommands interface{}                  `related_commands:"apps, bind-running-security-group, bind-staging-security-group, restart, security-groups"`
    20  }
    21  
    22  func (cmd BindSecurityGroupCommand) Execute(args []string) error {
    23  	var err error
    24  
    25  	err = cmd.SharedActor.CheckTarget(false, false)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	user, err := cmd.Actor.GetCurrentUser()
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	if cmd.Space == "" {
    36  		cmd.UI.DisplayTextWithFlavor("Assigning {{.lifecycle}} security group {{.security_group}} to all spaces in org {{.organization}} as {{.username}}...", map[string]interface{}{
    37  			"lifecycle":      constant.SecurityGroupLifecycle(cmd.Lifecycle),
    38  			"security_group": cmd.RequiredArgs.SecurityGroupName,
    39  			"organization":   cmd.RequiredArgs.OrganizationName,
    40  			"username":       user.Name,
    41  		})
    42  		cmd.UI.DisplayNewline()
    43  	} else {
    44  		cmd.UI.DisplayTextWithFlavor("Assigning {{.lifecycle}} security group {{.security_group}} to space {{.space}} in org {{.organization}} as {{.username}}...", map[string]interface{}{
    45  			"lifecycle":      constant.SecurityGroupLifecycle(cmd.Lifecycle),
    46  			"security_group": cmd.RequiredArgs.SecurityGroupName,
    47  			"space":          cmd.Space,
    48  			"organization":   cmd.RequiredArgs.OrganizationName,
    49  			"username":       user.Name,
    50  		})
    51  	}
    52  
    53  	securityGroup, warnings, err := cmd.Actor.GetSecurityGroup(cmd.RequiredArgs.SecurityGroupName)
    54  	cmd.UI.DisplayWarnings(warnings)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.RequiredArgs.OrganizationName)
    60  	cmd.UI.DisplayWarnings(warnings)
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	spacesToBind := []resources.Space{}
    66  	if cmd.Space != "" {
    67  		var space resources.Space
    68  		space, warnings, err = cmd.Actor.GetSpaceByNameAndOrganization(cmd.Space, org.GUID)
    69  		cmd.UI.DisplayWarnings(warnings)
    70  		if err != nil {
    71  			return err
    72  		}
    73  		spacesToBind = append(spacesToBind, space)
    74  	} else {
    75  		var spaces []resources.Space
    76  		spaces, warnings, err = cmd.Actor.GetOrganizationSpaces(org.GUID)
    77  		cmd.UI.DisplayWarnings(warnings)
    78  		if err != nil {
    79  			return err
    80  		}
    81  		spacesToBind = append(spacesToBind, spaces...)
    82  	}
    83  
    84  	if len(spacesToBind) == 0 {
    85  		cmd.UI.DisplayText("No spaces in org {{.organization}}.", map[string]interface{}{
    86  			"organization": org.Name,
    87  		})
    88  	} else {
    89  
    90  		if cmd.Space == "" {
    91  			cmd.announceBinding(spacesToBind, user)
    92  		}
    93  
    94  		warnings, err = cmd.Actor.BindSecurityGroupToSpaces(securityGroup.GUID, spacesToBind, constant.SecurityGroupLifecycle(cmd.Lifecycle))
    95  		cmd.UI.DisplayWarnings(warnings)
    96  		if err != nil {
    97  			return err
    98  		}
    99  
   100  		cmd.UI.DisplayOK()
   101  
   102  		cmd.UI.DisplayText("TIP: If Dynamic ASG's are enabled, changes will automatically apply for running and staging applications. Otherwise, changes will require an app restart (for running) or restage (for staging) to apply to existing applications.")
   103  	}
   104  
   105  	return nil
   106  }
   107  
   108  func (cmd BindSecurityGroupCommand) announceBinding(spaces []resources.Space, user configv3.User) {
   109  
   110  	var spacenames []string
   111  
   112  	for _, space := range spaces {
   113  		spacenames = append(spacenames, space.Name)
   114  	}
   115  
   116  	tokens := map[string]interface{}{
   117  		"lifecycle":      constant.SecurityGroupLifecycle(cmd.Lifecycle),
   118  		"security_group": cmd.RequiredArgs.SecurityGroupName,
   119  		"spaces":         strings.Join(spacenames, ", "),
   120  		"organization":   cmd.RequiredArgs.OrganizationName,
   121  		"username":       user.Name,
   122  	}
   123  	singular := "Assigning {{.lifecycle}} security group {{.security_group}} to space {{.spaces}} in org {{.organization}} as {{.username}}..."
   124  	plural := "Assigning {{.lifecycle}} security group {{.security_group}} to spaces {{.spaces}} in org {{.organization}} as {{.username}}..."
   125  
   126  	if len(spaces) == 1 {
   127  		cmd.UI.DisplayTextWithFlavor(singular, tokens)
   128  	} else {
   129  		cmd.UI.DisplayTextWithFlavor(plural, tokens)
   130  	}
   131  }