github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/cf/commands/application/app.go (about) 1 package application 2 3 import ( 4 "fmt" 5 "strings" 6 7 . "github.com/cloudfoundry/cli/cf/i18n" 8 9 "github.com/cloudfoundry/cli/cf/api" 10 "github.com/cloudfoundry/cli/cf/api/app_instances" 11 "github.com/cloudfoundry/cli/cf/command_metadata" 12 "github.com/cloudfoundry/cli/cf/configuration/core_config" 13 "github.com/cloudfoundry/cli/cf/errors" 14 "github.com/cloudfoundry/cli/cf/formatters" 15 "github.com/cloudfoundry/cli/cf/models" 16 "github.com/cloudfoundry/cli/cf/requirements" 17 "github.com/cloudfoundry/cli/cf/terminal" 18 "github.com/cloudfoundry/cli/cf/ui_helpers" 19 "github.com/codegangsta/cli" 20 ) 21 22 type ShowApp struct { 23 ui terminal.UI 24 config core_config.Reader 25 appSummaryRepo api.AppSummaryRepository 26 appInstancesRepo app_instances.AppInstancesRepository 27 appReq requirements.ApplicationRequirement 28 } 29 30 type ApplicationDisplayer interface { 31 ShowApp(app models.Application, orgName string, spaceName string) 32 } 33 34 func NewShowApp(ui terminal.UI, config core_config.Reader, appSummaryRepo api.AppSummaryRepository, appInstancesRepo app_instances.AppInstancesRepository) (cmd *ShowApp) { 35 cmd = new(ShowApp) 36 cmd.ui = ui 37 cmd.config = config 38 cmd.appSummaryRepo = appSummaryRepo 39 cmd.appInstancesRepo = appInstancesRepo 40 return 41 } 42 43 func (cmd *ShowApp) Metadata() command_metadata.CommandMetadata { 44 return command_metadata.CommandMetadata{ 45 Name: "app", 46 Description: T("Display health and status for app"), 47 Usage: T("CF_NAME app APP_NAME"), 48 Flags: []cli.Flag{ 49 cli.BoolFlag{Name: "guid", Usage: T("Retrieve and display the given app's guid. All other health and status output for the app is suppressed.")}, 50 }, 51 } 52 } 53 54 func (cmd *ShowApp) GetRequirements(requirementsFactory requirements.Factory, c *cli.Context) (reqs []requirements.Requirement, err error) { 55 if len(c.Args()) != 1 { 56 cmd.ui.FailWithUsage(c) 57 } 58 59 cmd.appReq = requirementsFactory.NewApplicationRequirement(c.Args()[0]) 60 61 reqs = []requirements.Requirement{ 62 requirementsFactory.NewLoginRequirement(), 63 requirementsFactory.NewTargetedSpaceRequirement(), 64 cmd.appReq, 65 } 66 return 67 } 68 69 func (cmd *ShowApp) Run(c *cli.Context) { 70 app := cmd.appReq.GetApplication() 71 72 if c.Bool("guid") { 73 cmd.ui.Say(app.Guid) 74 } else { 75 cmd.ShowApp(app, cmd.config.OrganizationFields().Name, cmd.config.SpaceFields().Name) 76 } 77 } 78 79 func (cmd *ShowApp) ShowApp(app models.Application, orgName, spaceName string) { 80 cmd.ui.Say(T("Showing health and status for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", 81 map[string]interface{}{ 82 "AppName": terminal.EntityNameColor(app.Name), 83 "OrgName": terminal.EntityNameColor(orgName), 84 "SpaceName": terminal.EntityNameColor(spaceName), 85 "Username": terminal.EntityNameColor(cmd.config.Username())})) 86 87 application, apiErr := cmd.appSummaryRepo.GetSummary(app.Guid) 88 89 appIsStopped := (application.State == "stopped") 90 if err, ok := apiErr.(errors.HttpError); ok { 91 if err.ErrorCode() == errors.APP_STOPPED || err.ErrorCode() == errors.APP_NOT_STAGED { 92 appIsStopped = true 93 } 94 } 95 96 if apiErr != nil && !appIsStopped { 97 cmd.ui.Failed(apiErr.Error()) 98 return 99 } 100 101 var instances []models.AppInstanceFields 102 instances, apiErr = cmd.appInstancesRepo.GetInstances(app.Guid) 103 if apiErr != nil && !appIsStopped { 104 cmd.ui.Failed(apiErr.Error()) 105 return 106 } 107 108 cmd.ui.Ok() 109 cmd.ui.Say("\n%s %s", terminal.HeaderColor(T("requested state:")), ui_helpers.ColoredAppState(application.ApplicationFields)) 110 cmd.ui.Say("%s %s", terminal.HeaderColor(T("instances:")), ui_helpers.ColoredAppInstances(application.ApplicationFields)) 111 cmd.ui.Say(T("{{.Usage}} {{.FormattedMemory}} x {{.InstanceCount}} instances", 112 map[string]interface{}{ 113 "Usage": terminal.HeaderColor(T("usage:")), 114 "FormattedMemory": formatters.ByteSize(application.Memory * formatters.MEGABYTE), 115 "InstanceCount": application.InstanceCount})) 116 117 var urls []string 118 for _, route := range application.Routes { 119 urls = append(urls, route.URL()) 120 } 121 122 cmd.ui.Say("%s %s", terminal.HeaderColor(T("urls:")), strings.Join(urls, ", ")) 123 var lastUpdated string 124 if application.PackageUpdatedAt != nil { 125 lastUpdated = application.PackageUpdatedAt.Format("Mon Jan 2 15:04:05 MST 2006") 126 } else { 127 lastUpdated = "unknown" 128 } 129 cmd.ui.Say("%s %s\n", terminal.HeaderColor(T("last uploaded:")), lastUpdated) 130 131 if appIsStopped { 132 cmd.ui.Say(T("There are no running instances of this app.")) 133 return 134 } 135 136 table := terminal.NewTable(cmd.ui, []string{"", T("state"), T("since"), T("cpu"), T("memory"), T("disk")}) 137 138 for index, instance := range instances { 139 table.Add( 140 fmt.Sprintf("#%d", index), 141 ui_helpers.ColoredInstanceState(instance), 142 instance.Since.Format("2006-01-02 03:04:05 PM"), 143 fmt.Sprintf("%.1f%%", instance.CpuUsage*100), 144 fmt.Sprintf(T("{{.MemUsage}} of {{.MemQuota}}", 145 map[string]interface{}{ 146 "MemUsage": formatters.ByteSize(instance.MemUsage), 147 "MemQuota": formatters.ByteSize(instance.MemQuota)})), 148 fmt.Sprintf(T("{{.DiskUsage}} of {{.DiskQuota}}", 149 map[string]interface{}{ 150 "DiskUsage": formatters.ByteSize(instance.DiskUsage), 151 "DiskQuota": formatters.ByteSize(instance.DiskQuota)})), 152 ) 153 } 154 155 table.Print() 156 }