mirror of
https://github.com/dokku/dokku.git
synced 2025-12-29 00:25:08 +01:00
118 lines
2.9 KiB
Go
118 lines
2.9 KiB
Go
package resource
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"reflect"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/dokku/dokku/plugins/common"
|
|
)
|
|
|
|
// Resource is a collection of resource constraints for apps
|
|
type Resource struct {
|
|
CPU string `json:"cpu"`
|
|
Memory string `json:"memory"`
|
|
MemorySwap string `json:"memory-swap"`
|
|
Network string `json:"network"`
|
|
NetworkIngress string `json:"network-ingress"`
|
|
NetworkEgress string `json:"network-egress"`
|
|
}
|
|
|
|
// ReportSingleApp is an internal function that displays the app report for one or more apps
|
|
func ReportSingleApp(appName, infoFlag string) {
|
|
if err := common.VerifyAppName(appName); err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
|
|
resources, err := common.PropertyGetAll("resource", appName)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
flags := []string{}
|
|
infoFlags := map[string]string{}
|
|
for key, value := range resources {
|
|
flag := fmt.Sprintf("--resource-%v", key)
|
|
flags = append(flags, flag)
|
|
infoFlags[flag] = value
|
|
}
|
|
sort.Strings(flags)
|
|
|
|
if len(infoFlag) == 0 {
|
|
common.LogInfo2Quiet(fmt.Sprintf("%s resource information", appName))
|
|
for _, k := range flags {
|
|
v := infoFlags[k]
|
|
key := strings.Replace(strings.Replace(strings.TrimPrefix(k, "--resource-"), "-", " ", -1), ".", " ", -1)
|
|
common.LogVerbose(fmt.Sprintf("%s%s", Right(fmt.Sprintf("%s:", key), 31, " "), v))
|
|
}
|
|
return
|
|
}
|
|
|
|
for _, k := range flags {
|
|
v := infoFlags[k]
|
|
if infoFlag == k {
|
|
fmt.Fprintln(os.Stdout, v)
|
|
return
|
|
}
|
|
}
|
|
|
|
keys := reflect.ValueOf(infoFlags).MapKeys()
|
|
strkeys := make([]string, len(keys))
|
|
for i := 0; i < len(keys); i++ {
|
|
strkeys[i] = keys[i].String()
|
|
}
|
|
common.LogFail(fmt.Sprintf("Invalid flag passed, valid flags: %s", strings.Join(strkeys, ", ")))
|
|
}
|
|
|
|
// GetResourceValue fetches a single value for a given app/process/request/key combination
|
|
func GetResourceValue(appName string, processType string, resourceType string, key string) (string, error) {
|
|
resources, err := common.PropertyGetAll("resource", appName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
defaultValue := ""
|
|
for k, value := range resources {
|
|
if k == propertyKey("_default_", resourceType, key) {
|
|
defaultValue = value
|
|
}
|
|
if k == propertyKey(processType, resourceType, key) {
|
|
return value, nil
|
|
}
|
|
}
|
|
|
|
return defaultValue, nil
|
|
}
|
|
|
|
func times(str string, n int) (out string) {
|
|
for i := 0; i < n; i++ {
|
|
out += str
|
|
}
|
|
return
|
|
}
|
|
|
|
// Right right-pads the string with pad up to len runes
|
|
func Right(str string, length int, pad string) string {
|
|
return str + times(pad, length-len(str))
|
|
}
|
|
|
|
func propertyKey(processType string, resourceType string, key string) string {
|
|
return fmt.Sprintf("%v.%v.%v", processType, resourceType, key)
|
|
}
|
|
|
|
func getAppName(args []string) (string, error) {
|
|
if len(args) < 1 {
|
|
return "", errors.New("Please specify an app to run the command on")
|
|
}
|
|
|
|
appName := args[0]
|
|
if err := common.VerifyAppName(appName); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return appName, nil
|
|
}
|