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,
}
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{
Name: "list",
Usage: "List all managed apps",
@ -69,51 +88,50 @@ can take some time.
if err != nil {
logrus.Fatal(err)
}
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)
tableCol := []string{"Server", "Type", "App Name", "Domain"}
var catl catalogue.RecipeCatalogue
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)
if err != nil {
logrus.Fatal(err)
}
var err error
catl, err = catalogue.ReadRecipeCatalogue()
if err != nil {
logrus.Fatal(err)
}
}
table := abraFormatter.CreateTable(tableCol)
table.SetAutoMergeCellsByColumnIndex([]int{0})
var (
versionedAppsCount int
unversionedAppsCount int
onLatestCount int
canUpgradeCount int
)
catl, err := catalogue.ReadRecipeCatalogue()
if err != nil {
logrus.Fatal(err)
}
var appsCount int
var totalServersCount int
var totalAppsCount int
allStats := make(map[string]serverStatus)
for _, app := range apps {
var tableRow []string
if app.Type == appType || appType == "" {
appsCount++
var stats serverStatus
var ok bool
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 {
stackName := app.StackName()
status := "unknown"
@ -125,16 +143,16 @@ can take some time.
if statusMeta["status"] != "" {
status = statusMeta["status"]
}
tableRow = append(tableRow, status, version)
versionedAppsCount++
stats.versionCount++
} else {
tableRow = append(tableRow, status, version)
unversionedAppsCount++
stats.unversionedCount++
}
appStats.status = status
appStats.version = version
var newUpdates []string
if version != "unknown" {
updates, err := catalogue.GetRecipeCatalogueVersions(app.Type, catl)
if err != nil {
logrus.Fatal(err)
@ -159,40 +177,72 @@ can take some time.
if len(newUpdates) == 0 {
if version == "unknown" {
tableRow = append(tableRow, "unknown")
appStats.upgrade = "unknown"
} else {
tableRow = append(tableRow, "on latest")
onLatestCount++
appStats.upgrade = "latest"
stats.latestCount++
}
} else {
// 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 {
newUpdates[i], newUpdates[j] = newUpdates[j], newUpdates[i]
}
tableRow = append(tableRow, strings.Join(newUpdates, "\n"))
canUpgradeCount++
appStats.upgrade = strings.Join(newUpdates, "\n")
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
if status {
stats = fmt.Sprintf(
"Total apps: %v | Versioned: %v | Unversioned: %v | On latest: %v | Can upgrade: %v",
appsCount,
versionedAppsCount,
unversionedAppsCount,
onLatestCount,
canUpgradeCount,
)
} else {
stats = fmt.Sprintf("Total apps: %v", appsCount)
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.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)
table.Render()
if len(allStats) > 1 {
fmt.Println(fmt.Sprintf("total servers: %v | total apps: %v ", totalServersCount, totalAppsCount))
}
return nil
},