github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/space/space.go (about)

     1  package space
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/cloudfoundry/cli/cf/command_registry"
     8  	. "github.com/cloudfoundry/cli/cf/i18n"
     9  	"github.com/cloudfoundry/cli/cf/models"
    10  	"github.com/cloudfoundry/cli/flags"
    11  	"github.com/cloudfoundry/cli/flags/flag"
    12  	"github.com/cloudfoundry/cli/plugin/models"
    13  
    14  	"github.com/cloudfoundry/cli/cf/api/space_quotas"
    15  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    16  	"github.com/cloudfoundry/cli/cf/formatters"
    17  	"github.com/cloudfoundry/cli/cf/requirements"
    18  	"github.com/cloudfoundry/cli/cf/terminal"
    19  )
    20  
    21  type ShowSpace struct {
    22  	ui          terminal.UI
    23  	config      core_config.Reader
    24  	spaceReq    requirements.SpaceRequirement
    25  	quotaRepo   space_quotas.SpaceQuotaRepository
    26  	pluginModel *plugin_models.GetSpace_Model
    27  	pluginCall  bool
    28  }
    29  
    30  func init() {
    31  	command_registry.Register(&ShowSpace{})
    32  }
    33  
    34  func (cmd *ShowSpace) MetaData() command_registry.CommandMetadata {
    35  	fs := make(map[string]flags.FlagSet)
    36  	fs["guid"] = &cliFlags.BoolFlag{Name: "guid", Usage: T("Retrieve and display the given space's guid.  All other output for the space is suppressed.")}
    37  	fs["security-group-rules"] = &cliFlags.BoolFlag{Name: "security-group-rules", Usage: T("Retreive the rules for all the security groups associated with the space")}
    38  	return command_registry.CommandMetadata{
    39  		Name:        "space",
    40  		Description: T("Show space info"),
    41  		Usage:       T("CF_NAME space SPACE"),
    42  		Flags:       fs,
    43  	}
    44  }
    45  
    46  func (cmd *ShowSpace) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
    47  	if len(fc.Args()) != 1 {
    48  		cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + command_registry.Commands.CommandUsage("space"))
    49  	}
    50  
    51  	cmd.spaceReq = requirementsFactory.NewSpaceRequirement(fc.Args()[0])
    52  	reqs = []requirements.Requirement{
    53  		requirementsFactory.NewLoginRequirement(),
    54  		requirementsFactory.NewTargetedOrgRequirement(),
    55  		cmd.spaceReq,
    56  	}
    57  	return
    58  }
    59  
    60  func (cmd *ShowSpace) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command {
    61  	cmd.ui = deps.Ui
    62  	cmd.config = deps.Config
    63  	cmd.quotaRepo = deps.RepoLocator.GetSpaceQuotaRepository()
    64  	cmd.pluginCall = pluginCall
    65  	cmd.pluginModel = deps.PluginModels.Space
    66  	return cmd
    67  }
    68  
    69  func (cmd *ShowSpace) Execute(c flags.FlagContext) {
    70  	space := cmd.spaceReq.GetSpace()
    71  	if cmd.pluginCall {
    72  		cmd.populatePluginModel(space)
    73  		return
    74  	}
    75  	if c.Bool("guid") {
    76  		cmd.ui.Say(space.Guid)
    77  	} else {
    78  		cmd.ui.Say(T("Getting info for space {{.TargetSpace}} in org {{.OrgName}} as {{.CurrentUser}}...",
    79  			map[string]interface{}{
    80  				"TargetSpace": terminal.EntityNameColor(space.Name),
    81  				"OrgName":     terminal.EntityNameColor(space.Organization.Name),
    82  				"CurrentUser": terminal.EntityNameColor(cmd.config.Username()),
    83  			}))
    84  
    85  		quotaString := cmd.quotaString(space)
    86  		cmd.ui.Ok()
    87  		cmd.ui.Say("")
    88  		table := terminal.NewTable(cmd.ui, []string{terminal.EntityNameColor(space.Name), "", ""})
    89  		table.Add("", T("Org:"), terminal.EntityNameColor(space.Organization.Name))
    90  
    91  		apps := []string{}
    92  		for _, app := range space.Applications {
    93  			apps = append(apps, terminal.EntityNameColor(app.Name))
    94  		}
    95  		table.Add("", T("Apps:"), strings.Join(apps, ", "))
    96  
    97  		domains := []string{}
    98  		for _, domain := range space.Domains {
    99  			domains = append(domains, terminal.EntityNameColor(domain.Name))
   100  		}
   101  		table.Add("", T("Domains:"), strings.Join(domains, ", "))
   102  
   103  		services := []string{}
   104  		for _, service := range space.ServiceInstances {
   105  			services = append(services, terminal.EntityNameColor(service.Name))
   106  		}
   107  		table.Add("", T("Services:"), strings.Join(services, ", "))
   108  
   109  		securityGroups := []string{}
   110  		for _, group := range space.SecurityGroups {
   111  			securityGroups = append(securityGroups, terminal.EntityNameColor(group.Name))
   112  		}
   113  		table.Add("", T("Security Groups:"), strings.Join(securityGroups, ", "))
   114  
   115  		table.Add("", T("Space Quota:"), quotaString)
   116  
   117  		table.Print()
   118  	}
   119  	if c.Bool("security-group-rules") {
   120  		cmd.ui.Say("")
   121  		for _, group := range space.SecurityGroups {
   122  			cmd.ui.Say(T("Getting rules for the security group  : {{.SecurityGroupName}}...",
   123  				map[string]interface{}{"SecurityGroupName": terminal.EntityNameColor(group.Name)}))
   124  			table := terminal.NewTable(cmd.ui, []string{"", "", "", ""})
   125  			for _, rules := range group.Rules {
   126  				for ruleName, ruleValue := range rules {
   127  					table.Add("", ruleName, ":", fmt.Sprintf("%v", ruleValue))
   128  				}
   129  				table.Add("", "", "", "")
   130  			}
   131  			table.Print()
   132  		}
   133  	}
   134  
   135  }
   136  
   137  func (cmd *ShowSpace) quotaString(space models.Space) string {
   138  	var instance_memory string
   139  
   140  	if space.SpaceQuotaGuid == "" {
   141  		return ""
   142  	}
   143  
   144  	quota, err := cmd.quotaRepo.FindByGuid(space.SpaceQuotaGuid)
   145  	if err != nil {
   146  		cmd.ui.Failed(err.Error())
   147  		return ""
   148  	}
   149  
   150  	if quota.InstanceMemoryLimit == -1 {
   151  		instance_memory = "-1"
   152  	} else {
   153  		instance_memory = formatters.ByteSize(quota.InstanceMemoryLimit * formatters.MEGABYTE)
   154  	}
   155  	memory := formatters.ByteSize(quota.MemoryLimit * formatters.MEGABYTE)
   156  
   157  	spaceQuota := fmt.Sprintf("%s (%s memory limit, %s instance memory limit, %d routes, %d services, paid services %s)", quota.Name, memory, instance_memory, quota.RoutesLimit, quota.ServicesLimit, formatters.Allowed(quota.NonBasicServicesAllowed))
   158  	//	spaceQuota := fmt.Sprintf(T("{{.QuotaName}} ({{.MemoryLimit}} memory limit, {{.InstanceMemoryLimit}} instance memory limit, {{.RoutesLimit}} routes, {{.ServicesLimit}} services, paid services {{.NonBasicServicesAllowed}})",
   159  	//		map[string]interface{}{
   160  	//			"QuotaName":               quota.Name,
   161  	//			"MemoryLimit":             memory,
   162  	//			"InstanceMemoryLimit":     instance_memory,
   163  	//			"RoutesLimit":             quota.RoutesLimit,
   164  	//			"ServicesLimit":           quota.ServicesLimit,
   165  	//			"NonBasicServicesAllowed": formatters.Allowed(quota.NonBasicServicesAllowed)}))
   166  
   167  	return spaceQuota
   168  }
   169  
   170  func (cmd *ShowSpace) populatePluginModel(space models.Space) {
   171  	cmd.pluginModel.Name = space.Name
   172  	cmd.pluginModel.Guid = space.Guid
   173  
   174  	cmd.pluginModel.Organization.Name = space.Organization.Name
   175  	cmd.pluginModel.Organization.Guid = space.Organization.Guid
   176  
   177  	for _, app := range space.Applications {
   178  		a := plugin_models.GetSpace_Apps{
   179  			Name: app.Name,
   180  			Guid: app.Guid,
   181  		}
   182  		cmd.pluginModel.Applications = append(cmd.pluginModel.Applications, a)
   183  	}
   184  
   185  	for _, domain := range space.Domains {
   186  		d := plugin_models.GetSpace_Domains{
   187  			Name: domain.Name,
   188  			Guid: domain.Guid,
   189  			OwningOrganizationGuid: domain.OwningOrganizationGuid,
   190  			Shared:                 domain.Shared,
   191  		}
   192  		cmd.pluginModel.Domains = append(cmd.pluginModel.Domains, d)
   193  	}
   194  
   195  	for _, service := range space.ServiceInstances {
   196  		si := plugin_models.GetSpace_ServiceInstance{
   197  			Name: service.Name,
   198  			Guid: service.Guid,
   199  		}
   200  		cmd.pluginModel.ServiceInstances = append(cmd.pluginModel.ServiceInstances, si)
   201  	}
   202  	for _, group := range space.SecurityGroups {
   203  		sg := plugin_models.GetSpace_SecurityGroup{
   204  			Name:  group.Name,
   205  			Guid:  group.Guid,
   206  			Rules: group.Rules,
   207  		}
   208  		cmd.pluginModel.SecurityGroups = append(cmd.pluginModel.SecurityGroups, sg)
   209  	}
   210  
   211  	quota, err := cmd.quotaRepo.FindByGuid(space.SpaceQuotaGuid)
   212  	if err == nil {
   213  		cmd.pluginModel.SpaceQuota.Name = quota.Name
   214  		cmd.pluginModel.SpaceQuota.Guid = quota.Guid
   215  		cmd.pluginModel.SpaceQuota.MemoryLimit = quota.MemoryLimit
   216  		cmd.pluginModel.SpaceQuota.InstanceMemoryLimit = quota.InstanceMemoryLimit
   217  		cmd.pluginModel.SpaceQuota.RoutesLimit = quota.RoutesLimit
   218  		cmd.pluginModel.SpaceQuota.ServicesLimit = quota.ServicesLimit
   219  		cmd.pluginModel.SpaceQuota.NonBasicServicesAllowed = quota.NonBasicServicesAllowed
   220  	}
   221  }