feat: implement resource:report

This commit is contained in:
Jose Diaz-Gonzalez
2019-03-18 16:43:31 -04:00
parent c9bbddcfcb
commit e8134f9c2c
6 changed files with 193 additions and 52 deletions

View File

@@ -2,8 +2,8 @@ include ../../common.mk
GO_ARGS ?= -a
SUBCOMMANDS = subcommands/limit subcommands/limit-clear subcommands/reserve subcommands/reserve-clear
TRIGGERS = triggers/install triggers/post-delete
SUBCOMMANDS = subcommands/limit subcommands/limit-clear subcommands/report subcommands/reserve subcommands/reserve-clear
TRIGGERS = triggers/install triggers/post-delete triggers/report
build-in-docker: clean
docker run --rm \
-v $$PWD/../..:$(GO_REPO_ROOT) \
@@ -23,7 +23,7 @@ subcommands/%: src/subcommands/*/%.go
go build $(GO_ARGS) -o $@ $<
clean:
rm -rf commands subcommands triggers install post-delete
rm -rf commands subcommands triggers install post-delete report
src-clean:
rm -rf .gitignore src triggers vendor Makefile *.go

View File

@@ -1,5 +1,15 @@
package resource
import (
"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"`
@@ -9,3 +19,61 @@ type Resource struct {
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 {
common.LogFail(err.Error())
}
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, ", ")))
}
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))
}

View File

@@ -0,0 +1,33 @@
package main
import (
"flag"
"strings"
"github.com/dokku/dokku/plugins/common"
"github.com/dokku/dokku/plugins/resource"
)
// displays a resource report for one or more apps
func main() {
flag.Parse()
appName := flag.Arg(1)
infoFlag := flag.Arg(2)
if strings.HasPrefix(appName, "--") {
common.LogFail("The resource:report command does not support flags without an app name")
}
if len(appName) == 0 {
apps, err := common.DokkuApps()
if err != nil {
return
}
for _, appName := range apps {
resource.ReportSingleApp(appName, infoFlag)
}
return
}
resource.ReportSingleApp(appName, infoFlag)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"flag"
"github.com/dokku/dokku/plugins/resource"
)
// displays a buildpacks report for one or more apps
func main() {
flag.Parse()
appName := flag.Arg(0)
resource.ReportSingleApp(appName, "")
}