github.com/orange-cloudfoundry/cli@v7.1.0+incompatible/command/v7/shared/quota_displayer.go (about) 1 package shared 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 8 "code.cloudfoundry.org/cli/command" 9 "code.cloudfoundry.org/cli/resources" 10 "code.cloudfoundry.org/cli/types" 11 "code.cloudfoundry.org/cli/util/ui" 12 ) 13 14 const ( 15 MEGABYTE = 1024 * 1024 16 GIGABYTE = 1024 * MEGABYTE 17 TERABYTE = 1024 * GIGABYTE 18 ) 19 20 type QuotaDisplayer struct { 21 ui command.UI 22 } 23 24 func NewQuotaDisplayer(ui command.UI) QuotaDisplayer { 25 return QuotaDisplayer{ui: ui} 26 } 27 28 func (displayer QuotaDisplayer) DisplayQuotasTable(quotas []resources.Quota, emptyMessage string) { 29 if len(quotas) == 0 { 30 displayer.ui.DisplayText(emptyMessage) 31 return 32 } 33 34 var keyValueTable = [][]string{ 35 {"name", "total memory", "instance memory", "routes", "service instances", "paid service plans", "app instances", "route ports"}, 36 } 37 38 for _, quota := range quotas { 39 keyValueTable = append(keyValueTable, []string{ 40 quota.Name, 41 displayer.presentQuotaMemoryValue(*quota.Apps.TotalMemory), 42 displayer.presentQuotaMemoryValue(*quota.Apps.InstanceMemory), 43 displayer.presentQuotaValue(*quota.Routes.TotalRoutes), 44 displayer.presentQuotaValue(*quota.Services.TotalServiceInstances), 45 displayer.presentBooleanValue(*quota.Services.PaidServicePlans), 46 displayer.presentQuotaValue(*quota.Apps.TotalAppInstances), 47 displayer.presentQuotaValue(*quota.Routes.TotalReservedPorts), 48 }) 49 } 50 51 displayer.ui.DisplayTableWithHeader("", keyValueTable, ui.DefaultTableSpacePadding) 52 } 53 54 func (displayer QuotaDisplayer) DisplaySingleQuota(quota resources.Quota) { 55 quotaTable := [][]string{ 56 {displayer.ui.TranslateText("total memory:"), displayer.presentQuotaMemoryValue(*quota.Apps.TotalMemory)}, 57 {displayer.ui.TranslateText("instance memory:"), displayer.presentQuotaMemoryValue(*quota.Apps.InstanceMemory)}, 58 {displayer.ui.TranslateText("routes:"), displayer.presentQuotaValue(*quota.Routes.TotalRoutes)}, 59 {displayer.ui.TranslateText("service instances:"), displayer.presentQuotaValue(*quota.Services.TotalServiceInstances)}, 60 {displayer.ui.TranslateText("paid service plans:"), displayer.presentBooleanValue(*quota.Services.PaidServicePlans)}, 61 {displayer.ui.TranslateText("app instances:"), displayer.presentQuotaValue(*quota.Apps.TotalAppInstances)}, 62 {displayer.ui.TranslateText("route ports:"), displayer.presentQuotaValue(*quota.Routes.TotalReservedPorts)}, 63 } 64 65 displayer.ui.DisplayKeyValueTable("", quotaTable, 3) 66 } 67 68 func (displayer QuotaDisplayer) presentBooleanValue(limit bool) string { 69 if limit { 70 return "allowed" 71 } else { 72 return "disallowed" 73 } 74 } 75 76 func (displayer QuotaDisplayer) presentQuotaValue(limit types.NullInt) string { 77 if !limit.IsSet { 78 return "unlimited" 79 } else { 80 return strconv.Itoa(limit.Value) 81 } 82 } 83 84 func (displayer QuotaDisplayer) presentQuotaMemoryValue(limit types.NullInt) string { 85 if !limit.IsSet { 86 return "unlimited" 87 } else { 88 return addMemoryUnits(float64(limit.Value) * MEGABYTE) 89 } 90 } 91 92 func addMemoryUnits(bytes float64) string { 93 unit := "" 94 value := bytes 95 96 switch { 97 case bytes >= TERABYTE: 98 unit = "T" 99 value /= TERABYTE 100 case bytes >= GIGABYTE: 101 unit = "G" 102 value /= GIGABYTE 103 case bytes >= MEGABYTE: 104 unit = "M" 105 value /= MEGABYTE 106 case bytes == 0: 107 return "0" 108 } 109 110 stringValue := fmt.Sprintf("%.1f", value) 111 stringValue = strings.TrimSuffix(stringValue, ".0") 112 return fmt.Sprintf("%s%s", stringValue, unit) 113 }