github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/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 KILOBYTE = 1024 16 MEGABYTE = 1024 * KILOBYTE 17 GIGABYTE = 1024 * MEGABYTE 18 TERABYTE = 1024 * GIGABYTE 19 ) 20 21 type QuotaDisplayer struct { 22 ui command.UI 23 } 24 25 func NewQuotaDisplayer(ui command.UI) QuotaDisplayer { 26 return QuotaDisplayer{ui: ui} 27 } 28 29 func (displayer QuotaDisplayer) DisplayQuotasTable(quotas []resources.Quota, emptyMessage string) { 30 if len(quotas) == 0 { 31 displayer.ui.DisplayText(emptyMessage) 32 return 33 } 34 35 var keyValueTable = [][]string{ 36 {"name", "total memory", "instance memory", "routes", "service instances", "paid service plans", "app instances", "route ports", "log volume per second"}, 37 } 38 39 for _, quota := range quotas { 40 keyValueTable = append(keyValueTable, []string{ 41 quota.Name, 42 displayer.presentQuotaMemoryValue(*quota.Apps.TotalMemory), 43 displayer.presentQuotaMemoryValue(*quota.Apps.InstanceMemory), 44 displayer.presentQuotaValue(*quota.Routes.TotalRoutes), 45 displayer.presentQuotaValue(*quota.Services.TotalServiceInstances), 46 displayer.presentBooleanValue(*quota.Services.PaidServicePlans), 47 displayer.presentQuotaValue(*quota.Apps.TotalAppInstances), 48 displayer.presentQuotaValue(*quota.Routes.TotalReservedPorts), 49 displayer.presentQuotaBytesValue(*quota.Apps.TotalLogVolume), 50 }) 51 } 52 53 displayer.ui.DisplayTableWithHeader("", keyValueTable, ui.DefaultTableSpacePadding) 54 } 55 56 func (displayer QuotaDisplayer) DisplaySingleQuota(quota resources.Quota) { 57 quotaTable := [][]string{ 58 {displayer.ui.TranslateText("total memory:"), displayer.presentQuotaMemoryValue(*quota.Apps.TotalMemory)}, 59 {displayer.ui.TranslateText("instance memory:"), displayer.presentQuotaMemoryValue(*quota.Apps.InstanceMemory)}, 60 {displayer.ui.TranslateText("routes:"), displayer.presentQuotaValue(*quota.Routes.TotalRoutes)}, 61 {displayer.ui.TranslateText("service instances:"), displayer.presentQuotaValue(*quota.Services.TotalServiceInstances)}, 62 {displayer.ui.TranslateText("paid service plans:"), displayer.presentBooleanValue(*quota.Services.PaidServicePlans)}, 63 {displayer.ui.TranslateText("app instances:"), displayer.presentQuotaValue(*quota.Apps.TotalAppInstances)}, 64 {displayer.ui.TranslateText("route ports:"), displayer.presentQuotaValue(*quota.Routes.TotalReservedPorts)}, 65 {displayer.ui.TranslateText("log volume per second:"), displayer.presentQuotaBytesValue(*quota.Apps.TotalLogVolume)}, 66 } 67 68 displayer.ui.DisplayKeyValueTable("", quotaTable, 3) 69 } 70 71 func (displayer QuotaDisplayer) presentBooleanValue(limit bool) string { 72 if limit { 73 return "allowed" 74 } else { 75 return "disallowed" 76 } 77 } 78 79 func (displayer QuotaDisplayer) presentQuotaValue(limit types.NullInt) string { 80 if !limit.IsSet { 81 return "unlimited" 82 } else { 83 return strconv.Itoa(limit.Value) 84 } 85 } 86 87 func (displayer QuotaDisplayer) presentQuotaBytesValue(limit types.NullInt) string { 88 if !limit.IsSet { 89 return "unlimited" 90 } else { 91 return addMemoryUnits(float64(limit.Value)) 92 } 93 } 94 95 func (displayer QuotaDisplayer) presentQuotaMemoryValue(limit types.NullInt) string { 96 if !limit.IsSet { 97 return "unlimited" 98 } else { 99 return addMemoryUnits(float64(limit.Value) * MEGABYTE) 100 } 101 } 102 103 func addMemoryUnits(bytes float64) string { 104 unit := "" 105 value := bytes 106 107 switch { 108 case bytes >= TERABYTE: 109 unit = "T" 110 value /= TERABYTE 111 case bytes >= GIGABYTE: 112 unit = "G" 113 value /= GIGABYTE 114 case bytes >= MEGABYTE: 115 unit = "M" 116 value /= MEGABYTE 117 case bytes >= KILOBYTE: 118 unit = "K" 119 value /= KILOBYTE 120 case bytes >= 1: 121 unit = "B" 122 case bytes == 0: 123 return "0" 124 } 125 126 stringValue := fmt.Sprintf("%.1f", value) 127 stringValue = strings.TrimSuffix(stringValue, ".0") 128 return fmt.Sprintf("%s%s", stringValue, unit) 129 }