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  }