feat: filter server by recipe

Closes coop-cloud/organising#363
This commit is contained in:
decentral1se 2023-01-23 00:54:22 +01:00
parent d4a42d8378
commit a694c8c20e
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
2 changed files with 37 additions and 26 deletions

View File

@ -23,12 +23,12 @@ var statusFlag = &cli.BoolFlag{
Destination: &status, Destination: &status,
} }
var appRecipe string var recipeFilter string
var recipeFlag = &cli.StringFlag{ var recipeFlag = &cli.StringFlag{
Name: "recipe, r", Name: "recipe, r",
Value: "", Value: "",
Usage: "Show apps of a specific recipe", Usage: "Show apps of a specific recipe",
Destination: &appRecipe, Destination: &recipeFilter,
} }
var listAppServer string var listAppServer string
@ -84,7 +84,7 @@ can take some time.
logrus.Fatal(err) logrus.Fatal(err)
} }
apps, err := config.GetApps(appFiles) apps, err := config.GetApps(appFiles, recipeFilter)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
@ -104,7 +104,7 @@ can take some time.
} }
} }
statuses, err = config.GetAppStatuses(appFiles, internal.MachineReadable) statuses, err = config.GetAppStatuses(apps, internal.MachineReadable)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
@ -124,14 +124,14 @@ can take some time.
var ok bool var ok bool
if stats, ok = allStats[app.Server]; !ok { if stats, ok = allStats[app.Server]; !ok {
stats = serverStatus{} stats = serverStatus{}
if appRecipe == "" { if recipeFilter == "" {
// count server, no filtering // count server, no filtering
totalServersCount++ totalServersCount++
} }
} }
if app.Recipe == appRecipe || appRecipe == "" { if app.Recipe == recipeFilter || recipeFilter == "" {
if appRecipe != "" { if recipeFilter != "" {
// only count server if matches filter // only count server if matches filter
totalServersCount++ totalServersCount++
} }

View File

@ -185,7 +185,7 @@ func newApp(env AppEnv, name string, appFile AppFile) (App, error) {
}, nil }, nil
} }
// LoadAppFiles gets all app files for a given set of servers or all servers // LoadAppFiles gets all app files for a given set of servers or all servers.
func LoadAppFiles(servers ...string) (AppFiles, error) { func LoadAppFiles(servers ...string) (AppFiles, error) {
appFiles := make(AppFiles) appFiles := make(AppFiles)
if len(servers) == 1 { if len(servers) == 1 {
@ -194,7 +194,7 @@ func LoadAppFiles(servers ...string) (AppFiles, error) {
var err error var err error
servers, err = GetAllFoldersInDirectory(SERVERS_DIR) servers, err = GetAllFoldersInDirectory(SERVERS_DIR)
if err != nil { if err != nil {
return nil, err return appFiles, err
} }
} }
} }
@ -205,8 +205,9 @@ func LoadAppFiles(servers ...string) (AppFiles, error) {
serverDir := path.Join(SERVERS_DIR, server) serverDir := path.Join(SERVERS_DIR, server)
files, err := getAllFilesInDirectory(serverDir) files, err := getAllFilesInDirectory(serverDir)
if err != nil { if err != nil {
return nil, fmt.Errorf("server %s doesn't exist? Run \"abra server ls\" to check", server) return appFiles, fmt.Errorf("server %s doesn't exist? Run \"abra server ls\" to check", server)
} }
for _, file := range files { for _, file := range files {
appName := strings.TrimSuffix(file.Name(), ".env") appName := strings.TrimSuffix(file.Name(), ".env")
appFilePath := path.Join(SERVERS_DIR, server, file.Name()) appFilePath := path.Join(SERVERS_DIR, server, file.Name())
@ -216,12 +217,13 @@ func LoadAppFiles(servers ...string) (AppFiles, error) {
} }
} }
} }
return appFiles, nil return appFiles, nil
} }
// GetApp loads an apps settings, reading it from file, in preparation to use it // GetApp loads an apps settings, reading it from file, in preparation to use
// // it. It should only be used when ready to use the env file to keep IO
// ONLY use when ready to use the env file to keep IO down // operations down.
func GetApp(apps AppFiles, name AppName) (App, error) { func GetApp(apps AppFiles, name AppName) (App, error) {
appFile, exists := apps[name] appFile, exists := apps[name]
if !exists { if !exists {
@ -236,8 +238,9 @@ func GetApp(apps AppFiles, name AppName) (App, error) {
return app, nil return app, nil
} }
// GetApps returns a slice of Apps with their env files read from a given slice of AppFiles // GetApps returns a slice of Apps with their env files read from a given
func GetApps(appFiles AppFiles) ([]App, error) { // slice of AppFiles.
func GetApps(appFiles AppFiles, recipeFilter string) ([]App, error) {
var apps []App var apps []App
for name := range appFiles { for name := range appFiles {
@ -245,7 +248,14 @@ func GetApps(appFiles AppFiles) ([]App, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
apps = append(apps, app)
if recipeFilter != "" {
if app.Recipe == recipeFilter {
apps = append(apps, app)
}
} else {
apps = append(apps, app)
}
} }
return apps, nil return apps, nil
@ -292,7 +302,7 @@ func GetAppNames() ([]string, error) {
return appNames, err return appNames, err
} }
apps, err := GetApps(appFiles) apps, err := GetApps(appFiles, "")
if err != nil { if err != nil {
return appNames, err return appNames, err
} }
@ -304,7 +314,8 @@ func GetAppNames() ([]string, error) {
return appNames, nil return appNames, nil
} }
// TemplateAppEnvSample copies the example env file for the app into the users env files // TemplateAppEnvSample copies the example env file for the app into the users
// env files.
func TemplateAppEnvSample(recipeName, appName, server, domain string) error { func TemplateAppEnvSample(recipeName, appName, server, domain string) error {
envSamplePath := path.Join(RECIPES_DIR, recipeName, ".env.sample") envSamplePath := path.Join(RECIPES_DIR, recipeName, ".env.sample")
envSample, err := ioutil.ReadFile(envSamplePath) envSample, err := ioutil.ReadFile(envSamplePath)
@ -339,21 +350,20 @@ func TemplateAppEnvSample(recipeName, appName, server, domain string) error {
return nil return nil
} }
// SanitiseAppName makes a app name usable with Docker by replacing illegal characters // SanitiseAppName makes a app name usable with Docker by replacing illegal
// characters.
func SanitiseAppName(name string) string { func SanitiseAppName(name string) string {
return strings.ReplaceAll(name, ".", "_") return strings.ReplaceAll(name, ".", "_")
} }
// GetAppStatuses queries servers to check the deployment status of given apps // GetAppStatuses queries servers to check the deployment status of given apps.
func GetAppStatuses(appFiles AppFiles, MachineReadable bool) (map[string]map[string]string, error) { func GetAppStatuses(apps []App, MachineReadable bool) (map[string]map[string]string, error) {
statuses := make(map[string]map[string]string) statuses := make(map[string]map[string]string)
var unique []string
servers := make(map[string]struct{}) servers := make(map[string]struct{})
for _, appFile := range appFiles { for _, app := range apps {
if _, ok := servers[appFile.Server]; !ok { if _, ok := servers[app.Server]; !ok {
servers[appFile.Server] = struct{}{} servers[app.Server] = struct{}{}
unique = append(unique, appFile.Server)
} }
} }
@ -362,6 +372,7 @@ func GetAppStatuses(appFiles AppFiles, MachineReadable bool) (map[string]map[str
if !MachineReadable { if !MachineReadable {
bar = formatter.CreateProgressbar(len(servers), "querying remote servers...") bar = formatter.CreateProgressbar(len(servers), "querying remote servers...")
} }
ch := make(chan stack.StackStatus, len(servers)) ch := make(chan stack.StackStatus, len(servers))
for server := range servers { for server := range servers {
go func(s string) { go func(s string) {