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 }