From 37ab9a9c08d5f9eb9abb9969bf7432ce93ce8ef6 Mon Sep 17 00:00:00 2001 From: cellarspoon Date: Sun, 12 Dec 2021 17:51:58 +0100 Subject: [PATCH] fix: improve ls output Closes https://git.coopcloud.tech/coop-cloud/organising/issues/252. --- cli/app/list.go | 166 +++++++++++++++++++++++++++++++----------------- 1 file changed, 108 insertions(+), 58 deletions(-) diff --git a/cli/app/list.go b/cli/app/list.go index ef8a5325..56081312 100644 --- a/cli/app/list.go +++ b/cli/app/list.go @@ -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 },