fix: improve ls output
continuous-integration/drone/push Build is passing Details

Closes coop-cloud/organising#252.
This commit is contained in:
decentral1se 2021-12-12 17:51:58 +01:00
parent 48dd9cdeed
commit 37ab9a9c08
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
1 changed files with 108 additions and 58 deletions

View File

@ -42,6 +42,25 @@ var listAppServerFlag = &cli.StringFlag{
Destination: &listAppServer, Destination: &listAppServer,
} }
type appStatus struct {
server string
recipe string
appName string
domain string
status string
version string
upgrade string
}
type serverStatus struct {
apps []appStatus
appCount int
versionCount int
unversionedCount int
latestCount int
upgradeCount int
}
var appListCommand = &cli.Command{ var appListCommand = &cli.Command{
Name: "list", Name: "list",
Usage: "List all managed apps", Usage: "List all managed apps",
@ -69,8 +88,12 @@ can take some time.
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
sort.Sort(config.ByServerAndType(apps)) sort.Sort(config.ByServerAndType(apps))
statuses := make(map[string]map[string]string)
var catl catalogue.RecipeCatalogue
if status {
alreadySeen := make(map[string]bool) alreadySeen := make(map[string]bool)
for _, app := range apps { for _, app := range apps {
if _, ok := alreadySeen[app.Server]; !ok { if _, ok := alreadySeen[app.Server]; !ok {
@ -81,39 +104,34 @@ can take some time.
} }
} }
statuses := make(map[string]map[string]string)
tableCol := []string{"Server", "Type", "App Name", "Domain"}
if status {
tableCol = append(tableCol, "Status", "Version", "Updates")
statuses, err = config.GetAppStatuses(appFiles) statuses, err = config.GetAppStatuses(appFiles)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
}
table := abraFormatter.CreateTable(tableCol) var err error
table.SetAutoMergeCellsByColumnIndex([]int{0}) catl, err = catalogue.ReadRecipeCatalogue()
var (
versionedAppsCount int
unversionedAppsCount int
onLatestCount int
canUpgradeCount int
)
catl, err := catalogue.ReadRecipeCatalogue()
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
}
var appsCount int var totalServersCount int
var totalAppsCount int
allStats := make(map[string]serverStatus)
for _, app := range apps { for _, app := range apps {
var tableRow []string var stats serverStatus
if app.Type == appType || appType == "" { var ok bool
appsCount++ if stats, ok = allStats[app.Server]; !ok {
stats = serverStatus{}
totalServersCount++
}
if app.Type == appType || appType == "" {
appStats := appStatus{}
stats.appCount++
totalAppsCount++
// If type flag is set, check for it, if not, Type == ""
tableRow = []string{app.Server, app.Type, app.StackName(), app.Domain}
if status { if status {
stackName := app.StackName() stackName := app.StackName()
status := "unknown" status := "unknown"
@ -125,16 +143,16 @@ can take some time.
if statusMeta["status"] != "" { if statusMeta["status"] != "" {
status = statusMeta["status"] status = statusMeta["status"]
} }
tableRow = append(tableRow, status, version) stats.versionCount++
versionedAppsCount++
} else { } else {
tableRow = append(tableRow, status, version) stats.unversionedCount++
unversionedAppsCount++
} }
appStats.status = status
appStats.version = version
var newUpdates []string var newUpdates []string
if version != "unknown" { if version != "unknown" {
updates, err := catalogue.GetRecipeCatalogueVersions(app.Type, catl) updates, err := catalogue.GetRecipeCatalogueVersions(app.Type, catl)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
@ -159,40 +177,72 @@ can take some time.
if len(newUpdates) == 0 { if len(newUpdates) == 0 {
if version == "unknown" { if version == "unknown" {
tableRow = append(tableRow, "unknown") appStats.upgrade = "unknown"
} else { } else {
tableRow = append(tableRow, "on latest") appStats.upgrade = "latest"
onLatestCount++ stats.latestCount++
} }
} else { } else {
// FIXME: jeezus golang why do you not have a list reverse function // FIXME: jeezus golang why do you not have a list reverse function
for i, j := 0, len(newUpdates)-1; i < j; i, j = i+1, j-1 { for i, j := 0, len(newUpdates)-1; i < j; i, j = i+1, j-1 {
newUpdates[i], newUpdates[j] = newUpdates[j], newUpdates[i] newUpdates[i], newUpdates[j] = newUpdates[j], newUpdates[i]
} }
tableRow = append(tableRow, strings.Join(newUpdates, "\n")) appStats.upgrade = strings.Join(newUpdates, "\n")
canUpgradeCount++ stats.upgradeCount++
} }
} }
appStats.server = app.Server
appStats.recipe = app.Type
appStats.appName = app.StackName()
appStats.domain = app.Domain
stats.apps = append(stats.apps, appStats)
}
allStats[app.Server] = stats
}
for serverName, serverStat := range allStats {
tableCol := []string{"recipe", "app name", "domain"}
if status {
tableCol = append(tableCol, []string{"status", "version", "upgrade"}...)
}
table := abraFormatter.CreateTable(tableCol)
for _, appStat := range serverStat.apps {
tableRow := []string{appStat.recipe, appStat.appName, appStat.domain}
if status {
tableRow = append(tableRow, []string{appStat.status, appStat.version, appStat.upgrade}...)
} }
table.Append(tableRow) table.Append(tableRow)
} }
var stats string table.Render()
if status { if status {
stats = fmt.Sprintf( fmt.Println(fmt.Sprintf(
"Total apps: %v | Versioned: %v | Unversioned: %v | On latest: %v | Can upgrade: %v", "server: %s | total apps: %v | versioned: %v | unversioned: %v | latest: %v | upgrade: %v",
appsCount, serverName,
versionedAppsCount, serverStat.appCount,
unversionedAppsCount, serverStat.versionCount,
onLatestCount, serverStat.unversionedCount,
canUpgradeCount, serverStat.latestCount,
) serverStat.upgradeCount,
))
} else { } else {
stats = fmt.Sprintf("Total apps: %v", appsCount) fmt.Println(fmt.Sprintf("server: %s | total apps: %v", serverName, serverStat.appCount))
} }
table.SetCaption(true, stats) if len(allStats) > 1 {
table.Render() fmt.Println() // newline separator for multiple servers
}
}
if len(allStats) > 1 {
fmt.Println(fmt.Sprintf("total servers: %v | total apps: %v ", totalServersCount, totalAppsCount))
}
return nil return nil
}, },