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,51 +88,50 @@ 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))
alreadySeen := make(map[string]bool)
for _, app := range apps {
if _, ok := alreadySeen[app.Server]; !ok {
if err := ssh.EnsureHostKey(app.Server); err != nil {
logrus.Fatal(fmt.Sprintf(internal.SSHFailMsg, app.Server))
}
alreadySeen[app.Server] = true
}
}
statuses := make(map[string]map[string]string) statuses := make(map[string]map[string]string)
tableCol := []string{"Server", "Type", "App Name", "Domain"} var catl catalogue.RecipeCatalogue
if status { if status {
tableCol = append(tableCol, "Status", "Version", "Updates") alreadySeen := make(map[string]bool)
for _, app := range apps {
if _, ok := alreadySeen[app.Server]; !ok {
if err := ssh.EnsureHostKey(app.Server); err != nil {
logrus.Fatal(fmt.Sprintf(internal.SSHFailMsg, app.Server))
}
alreadySeen[app.Server] = true
}
}
statuses, err = config.GetAppStatuses(appFiles) statuses, err = config.GetAppStatuses(appFiles)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
var err error
catl, err = catalogue.ReadRecipeCatalogue()
if err != nil {
logrus.Fatal(err)
}
} }
table := abraFormatter.CreateTable(tableCol) var totalServersCount int
table.SetAutoMergeCellsByColumnIndex([]int{0}) var totalAppsCount int
allStats := make(map[string]serverStatus)
var (
versionedAppsCount int
unversionedAppsCount int
onLatestCount int
canUpgradeCount int
)
catl, err := catalogue.ReadRecipeCatalogue()
if err != nil {
logrus.Fatal(err)
}
var appsCount int
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)
} }
table.Append(tableRow)
allStats[app.Server] = stats
} }
var stats string for serverName, serverStat := range allStats {
if status { tableCol := []string{"recipe", "app name", "domain"}
stats = fmt.Sprintf( if status {
"Total apps: %v | Versioned: %v | Unversioned: %v | On latest: %v | Can upgrade: %v", tableCol = append(tableCol, []string{"status", "version", "upgrade"}...)
appsCount, }
versionedAppsCount,
unversionedAppsCount, table := abraFormatter.CreateTable(tableCol)
onLatestCount,
canUpgradeCount, for _, appStat := range serverStat.apps {
) tableRow := []string{appStat.recipe, appStat.appName, appStat.domain}
} else { if status {
stats = fmt.Sprintf("Total apps: %v", appsCount) tableRow = append(tableRow, []string{appStat.status, appStat.version, appStat.upgrade}...)
}
table.Append(tableRow)
}
table.Render()
if status {
fmt.Println(fmt.Sprintf(
"server: %s | total apps: %v | versioned: %v | unversioned: %v | latest: %v | upgrade: %v",
serverName,
serverStat.appCount,
serverStat.versionCount,
serverStat.unversionedCount,
serverStat.latestCount,
serverStat.upgradeCount,
))
} else {
fmt.Println(fmt.Sprintf("server: %s | total apps: %v", serverName, serverStat.appCount))
}
if len(allStats) > 1 {
fmt.Println() // newline separator for multiple servers
}
} }
table.SetCaption(true, stats) if len(allStats) > 1 {
table.Render() fmt.Println(fmt.Sprintf("total servers: %v | total apps: %v ", totalServersCount, totalAppsCount))
}
return nil return nil
}, },