github.com/sleungcy/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  }