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  }