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