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