github.com/loafoe/cli@v7.1.0+incompatible/command/v7/space_command.go (about) 1 package v7 2 3 import ( 4 "sort" 5 "strings" 6 7 "code.cloudfoundry.org/cli/actor/v7action" 8 "code.cloudfoundry.org/cli/command/flag" 9 "code.cloudfoundry.org/cli/resources" 10 "code.cloudfoundry.org/cli/util/ui" 11 ) 12 13 type SpaceCommand struct { 14 BaseCommand 15 16 RequiredArgs flag.Space `positional-args:"yes"` 17 GUID bool `long:"guid" description:"Retrieve and display the given space's guid. All other output for the space is suppressed."` 18 SecurityGroupRules bool `long:"security-group-rules" description:"Retrieve the rules for all the security groups associated with the space."` 19 usage interface{} `usage:"CF_NAME space SPACE [--guid] [--security-group-rules]"` 20 relatedCommands interface{} `related_commands:"set-space-isolation-segment, space-quota, space-users"` 21 } 22 23 func (cmd SpaceCommand) Execute(args []string) error { 24 err := cmd.SharedActor.CheckTarget(true, false) 25 if err != nil { 26 return err 27 } 28 29 spaceName := cmd.RequiredArgs.Space 30 targetedOrg := cmd.Config.TargetedOrganization() 31 32 if cmd.GUID { 33 return cmd.displaySpaceGUID(spaceName, targetedOrg.GUID) 34 } 35 36 user, err := cmd.Config.CurrentUser() 37 if err != nil { 38 return err 39 } 40 41 cmd.UI.DisplayTextWithFlavor("Getting info for space {{.SpaceName}} in org {{.OrgName}} as {{.Username}}...", map[string]interface{}{ 42 "SpaceName": spaceName, 43 "OrgName": targetedOrg.Name, 44 "Username": user.Name, 45 }) 46 cmd.UI.DisplayNewline() 47 48 spaceSummary, warnings, err := cmd.Actor.GetSpaceSummaryByNameAndOrganization(spaceName, targetedOrg.GUID) 49 cmd.UI.DisplayWarnings(warnings) 50 if err != nil { 51 return err 52 } 53 table := [][]string{ 54 {cmd.UI.TranslateText("name:"), spaceSummary.Name}, 55 {cmd.UI.TranslateText("org:"), spaceSummary.OrgName}, 56 {cmd.UI.TranslateText("apps:"), strings.Join(spaceSummary.AppNames, ", ")}, 57 {cmd.UI.TranslateText("services:"), strings.Join(spaceSummary.ServiceInstanceNames, ", ")}, 58 {cmd.UI.TranslateText("isolation segment:"), spaceSummary.IsolationSegmentName}, 59 {cmd.UI.TranslateText("quota:"), spaceSummary.QuotaName}, 60 {cmd.UI.TranslateText("running security groups:"), formatSecurityGroupNames(spaceSummary.RunningSecurityGroups)}, 61 {cmd.UI.TranslateText("staging security groups:"), formatSecurityGroupNames(spaceSummary.StagingSecurityGroups)}, 62 } 63 64 cmd.UI.DisplayKeyValueTable("", table, 3) 65 66 if cmd.SecurityGroupRules { 67 cmd.displaySecurityGroupRulesTable(spaceSummary) 68 } 69 70 return nil 71 } 72 73 func (cmd SpaceCommand) displaySpaceGUID(spaceName string, orgGUID string) error { 74 space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(spaceName, orgGUID) 75 cmd.UI.DisplayWarnings(warnings) 76 if err != nil { 77 return err 78 } 79 80 cmd.UI.DisplayText(space.GUID) 81 return nil 82 } 83 84 func formatSecurityGroupNames(groups []resources.SecurityGroup) string { 85 var names []string 86 87 for _, group := range groups { 88 names = append(names, group.Name) 89 } 90 91 return strings.Join(names, ", ") 92 } 93 94 func (cmd SpaceCommand) displaySecurityGroupRulesTable(spaceSummary v7action.SpaceSummary) { 95 tableHeaders := []string{"security group", "destination", "ports", "protocol", "lifecycle", "description"} 96 table := [][]string{tableHeaders} 97 98 rows := collectSecurityGroupRuleRows(spaceSummary) 99 if len(rows) == 0 { 100 cmd.UI.DisplayNewline() 101 cmd.UI.DisplayText("No security group rules found.") 102 return 103 } 104 105 sort.Slice(rows, func(i, j int) bool { 106 groupNameA := rows[i][0] 107 groupNameB := rows[j][0] 108 return groupNameA < groupNameB 109 }) 110 111 table = append(table, rows...) 112 113 cmd.UI.DisplayNewline() 114 cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding) 115 } 116 117 func collectSecurityGroupRuleRows(spaceSummary v7action.SpaceSummary) [][]string { 118 var rows [][]string 119 120 for _, securityGroup := range spaceSummary.RunningSecurityGroups { 121 for _, rule := range securityGroup.Rules { 122 rows = append(rows, []string{ 123 securityGroup.Name, 124 rule.Destination, 125 nilStringPointer(rule.Ports), 126 rule.Protocol, 127 "running", 128 nilStringPointer(rule.Description), 129 }) 130 } 131 } 132 133 for _, securityGroup := range spaceSummary.StagingSecurityGroups { 134 for _, rule := range securityGroup.Rules { 135 rows = append(rows, []string{ 136 securityGroup.Name, 137 rule.Destination, 138 nilStringPointer(rule.Ports), 139 rule.Protocol, 140 "staging", 141 nilStringPointer(rule.Description), 142 }) 143 } 144 } 145 146 return rows 147 } 148 149 func nilStringPointer(pointer *string) string { 150 if pointer == nil { 151 return "" 152 } 153 return *pointer 154 }