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 }