github.com/sleungcy/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  }