github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/command/v2/shared/application_info.go (about)

     1  package shared
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/actor/v2action"
     9  	"code.cloudfoundry.org/cli/command"
    10  	"github.com/cloudfoundry/bytefmt"
    11  )
    12  
    13  // DisplayAppSummary displays the application summary to the UI, and optionally
    14  // the command to start the app.
    15  func DisplayAppSummary(ui command.UI, appSummary v2action.ApplicationSummary, displayStartCommand bool) {
    16  	instances := fmt.Sprintf("%d/%d", appSummary.StartingOrRunningInstanceCount(), appSummary.Instances)
    17  
    18  	usage := ui.TranslateText(
    19  		"{{.MemorySize}} x {{.NumInstances}} instances",
    20  		map[string]interface{}{
    21  			"MemorySize":   bytefmt.ByteSize(uint64(appSummary.Memory) * bytefmt.MEGABYTE),
    22  			"NumInstances": appSummary.Instances,
    23  		})
    24  
    25  	formattedRoutes := []string{}
    26  	for _, route := range appSummary.Routes {
    27  		formattedRoutes = append(formattedRoutes, route.String())
    28  	}
    29  	routes := strings.Join(formattedRoutes, ", ")
    30  
    31  	table := [][]string{
    32  		{ui.TranslateText("name:"), appSummary.Name},
    33  		{ui.TranslateText("requested state:"), strings.ToLower(string(appSummary.State))},
    34  		{ui.TranslateText("instances:"), instances},
    35  		{ui.TranslateText("usage:"), usage},
    36  		{ui.TranslateText("routes:"), routes},
    37  		{ui.TranslateText("last uploaded:"), ui.UserFriendlyDate(appSummary.PackageUpdatedAt)},
    38  		{ui.TranslateText("stack:"), appSummary.Stack.Name},
    39  		{ui.TranslateText("buildpack:"), appSummary.Application.CalculatedBuildpack()},
    40  	}
    41  
    42  	if displayStartCommand {
    43  		table = append(table, []string{ui.TranslateText("start command:"), appSummary.Application.DetectedStartCommand})
    44  	}
    45  
    46  	if appSummary.IsolationSegment != "" {
    47  		table = append(table[:3], append([][]string{
    48  			{ui.TranslateText("isolation segment:"), appSummary.IsolationSegment},
    49  		}, table[3:]...)...)
    50  	}
    51  
    52  	ui.DisplayKeyValueTableForApp(table)
    53  	ui.DisplayNewline()
    54  
    55  	if len(appSummary.RunningInstances) == 0 {
    56  		ui.DisplayText("There are no running instances of this app.")
    57  	} else {
    58  		displayAppInstances(ui, appSummary.RunningInstances)
    59  	}
    60  }
    61  
    62  func displayAppInstances(ui command.UI, instances []v2action.ApplicationInstanceWithStats) {
    63  	table := [][]string{
    64  		{
    65  			"",
    66  			ui.TranslateText("state"),
    67  			ui.TranslateText("since"),
    68  			ui.TranslateText("cpu"),
    69  			ui.TranslateText("memory"),
    70  			ui.TranslateText("disk"),
    71  			ui.TranslateText("details"),
    72  		},
    73  	}
    74  
    75  	for _, instance := range instances {
    76  		table = append(
    77  			table,
    78  			[]string{
    79  				fmt.Sprintf("#%d", instance.ID),
    80  				ui.TranslateText(strings.ToLower(string(instance.State))),
    81  				zuluDate(instance.TimeSinceCreation()),
    82  				fmt.Sprintf("%.1f%%", instance.CPU*100),
    83  				fmt.Sprintf("%s of %s", bytefmt.ByteSize(uint64(instance.Memory)), bytefmt.ByteSize(uint64(instance.MemoryQuota))),
    84  				fmt.Sprintf("%s of %s", bytefmt.ByteSize(uint64(instance.Disk)), bytefmt.ByteSize(uint64(instance.DiskQuota))),
    85  				instance.Details,
    86  			})
    87  	}
    88  
    89  	ui.DisplayInstancesTableForApp(table)
    90  }
    91  
    92  // zuluDate converts the time to UTC and then formats it to ISO8601.
    93  func zuluDate(input time.Time) string {
    94  	// "2006-01-02T15:04:05Z07:00"
    95  	return input.UTC().Format(time.RFC3339)
    96  }