forked from toolshed/abra
		
	
							
								
								
									
										166
									
								
								cli/app/list.go
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								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
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user