forked from toolshed/abra
		
	refactor: move secret- and config-gathering to separate file
This commit is contained in:
		@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"sort"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"coopcloud.tech/abra/cli/internal"
 | 
						"coopcloud.tech/abra/cli/internal"
 | 
				
			||||||
@ -198,66 +197,17 @@ checkout as-is. Recipe commit hashes are also supported as values for
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Gather secrets
 | 
							// Gather secrets
 | 
				
			||||||
 | 
							secretInfo, err := deploy.GatherSecretsForDeploy(cl, app)
 | 
				
			||||||
		secStats, err := secret.PollSecretsStatus(cl, app)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var secretInfo []string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Sort secrets to ensure reproducible output
 | 
					 | 
				
			||||||
		sort.Slice(secStats, func(i, j int) bool {
 | 
					 | 
				
			||||||
			return secStats[i].LocalName < secStats[j].LocalName
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
		for _, secStat := range secStats {
 | 
					 | 
				
			||||||
			secretInfo = append(secretInfo, fmt.Sprintf("%s: %s", secStat.LocalName, secStat.Version))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Gather configs
 | 
							// Gather configs
 | 
				
			||||||
 | 
							configInfo, err := deploy.GatherConfigsForDeploy(cl, app, compose, abraShEnv)
 | 
				
			||||||
		// Get current configs from existing deployment
 | 
					 | 
				
			||||||
		currentConfigNames, err := deploy.GetConfigNamesForStack(cl, app)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		log.Infof("Config names: %v", currentConfigNames)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Create map of current config base names to versions
 | 
					 | 
				
			||||||
		currentConfigs := make(map[string]string)
 | 
					 | 
				
			||||||
		for _, configName := range currentConfigNames {
 | 
					 | 
				
			||||||
			baseName, version := client.GetConfigNameAndVersion(configName, app.StackName())
 | 
					 | 
				
			||||||
			currentConfigs[baseName] = version
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		log.Infof("Configs: %v", currentConfigs)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Get new configs from the compose specification
 | 
					 | 
				
			||||||
		newConfigs := compose.Configs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		var configInfo []string
 | 
					 | 
				
			||||||
		for configName := range newConfigs {
 | 
					 | 
				
			||||||
			log.Debugf("Searching abra.sh for version for %s", configName)
 | 
					 | 
				
			||||||
			versionKey := strings.ToUpper(configName) + "_VERSION"
 | 
					 | 
				
			||||||
			newVersion, exists := abraShEnv[versionKey]
 | 
					 | 
				
			||||||
			if !exists {
 | 
					 | 
				
			||||||
				log.Warnf("No version found for config %s", configName)
 | 
					 | 
				
			||||||
				configInfo = append(configInfo, fmt.Sprintf("%s: ? (missing version)", configName))
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			if currentVersion, exists := currentConfigs[configName]; exists {
 | 
					 | 
				
			||||||
				if currentVersion == newVersion {
 | 
					 | 
				
			||||||
					configInfo = append(configInfo, fmt.Sprintf("%s: %s (unchanged)", configName, newVersion))
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					configInfo = append(configInfo, fmt.Sprintf("%s: %s → %s", configName, currentVersion, newVersion))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				configInfo = append(configInfo, fmt.Sprintf("%s: %s (new)", configName, newVersion))
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Gather images
 | 
							// Gather images
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var imageInfo []string
 | 
							var imageInfo []string
 | 
				
			||||||
 | 
				
			|||||||
@ -2,23 +2,29 @@ package deploy
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	appPkg "coopcloud.tech/abra/pkg/app"
 | 
						appPkg "coopcloud.tech/abra/pkg/app"
 | 
				
			||||||
 | 
						"coopcloud.tech/abra/pkg/client"
 | 
				
			||||||
 | 
						"coopcloud.tech/abra/pkg/log"
 | 
				
			||||||
 | 
						"coopcloud.tech/abra/pkg/secret"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/docker/docker/client"
 | 
					 | 
				
			||||||
	"github.com/docker/docker/api/types"
 | 
					 | 
				
			||||||
	"github.com/docker/docker/api/types/swarm"
 | 
						"github.com/docker/docker/api/types/swarm"
 | 
				
			||||||
 | 
						composetypes "github.com/docker/cli/cli/compose/types"
 | 
				
			||||||
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetConfigNamesForStack retrieves all Docker configs attached to services in a given stack.
 | 
					// GetConfigNamesForStack retrieves all Docker configs attached to services in a given stack.
 | 
				
			||||||
func GetConfigNamesForStack(cl *client.Client, app appPkg.App) ([]string, error) {
 | 
					func GetConfigNamesForStack(cl *dockerClient.Client, app appPkg.App) ([]string, error) {
 | 
				
			||||||
	filters, err := app.Filters(false, false)
 | 
						filters, err := app.Filters(false, false)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// List all services in the stack
 | 
						// List all services in the stack
 | 
				
			||||||
	services, err := cl.ServiceList(context.Background(), types.ServiceListOptions{
 | 
						services, err := cl.ServiceList(context.Background(), swarm.ServiceListOptions{
 | 
				
			||||||
		Filters: filters,
 | 
							Filters: filters,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@ -46,16 +52,67 @@ func GetConfigNamesForStack(cl *client.Client, app appPkg.App) ([]string, error)
 | 
				
			|||||||
	return result, nil
 | 
						return result, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetSecretNamesForStack(cl *client.Client, app appPkg.App) ([]swarm.Secret, error) {
 | 
					func GatherSecretsForDeploy(cl *dockerClient.Client, app appPkg.App) ([]string, error) {
 | 
				
			||||||
	filters, err := app.Filters(false, false)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	secretList, err := cl.SecretList(context.Background(), swarm.SecretListOptions{Filters: filters})
 | 
							secStats, err := secret.PollSecretsStatus(cl, app)
 | 
				
			||||||
	if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
		return nil, err
 | 
								return nil, err
 | 
				
			||||||
	}
 | 
							}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	return secretList, nil
 | 
							var secretInfo []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Sort secrets to ensure reproducible output
 | 
				
			||||||
 | 
							sort.Slice(secStats, func(i, j int) bool {
 | 
				
			||||||
 | 
								return secStats[i].LocalName < secStats[j].LocalName
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							for _, secStat := range secStats {
 | 
				
			||||||
 | 
								secretInfo = append(secretInfo, fmt.Sprintf("%s: %s", secStat.LocalName, secStat.Version))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						return secretInfo, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GatherConfigsForDeploy(cl *dockerClient.Client, app appPkg.App, compose *composetypes.Config, abraShEnv map[string]string) ([]string, error) {
 | 
				
			||||||
 | 
							// Get current configs from existing deployment
 | 
				
			||||||
 | 
							currentConfigNames, err := GetConfigNamesForStack(cl, app)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							log.Infof("Config names: %v", currentConfigNames)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Create map of current config base names to versions
 | 
				
			||||||
 | 
							currentConfigs := make(map[string]string)
 | 
				
			||||||
 | 
							for _, configName := range currentConfigNames {
 | 
				
			||||||
 | 
								baseName, version := client.GetConfigNameAndVersion(configName, app.StackName())
 | 
				
			||||||
 | 
								currentConfigs[baseName] = version
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							log.Infof("Configs: %v", currentConfigs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Get new configs from the compose specification
 | 
				
			||||||
 | 
							newConfigs := compose.Configs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var configInfo []string
 | 
				
			||||||
 | 
							for configName := range newConfigs {
 | 
				
			||||||
 | 
								log.Debugf("Searching abra.sh for version for %s", configName)
 | 
				
			||||||
 | 
								versionKey := strings.ToUpper(configName) + "_VERSION"
 | 
				
			||||||
 | 
								newVersion, exists := abraShEnv[versionKey]
 | 
				
			||||||
 | 
								if !exists {
 | 
				
			||||||
 | 
									log.Warnf("No version found for config %s", configName)
 | 
				
			||||||
 | 
									configInfo = append(configInfo, fmt.Sprintf("%s: ? (missing version)", configName))
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if currentVersion, exists := currentConfigs[configName]; exists {
 | 
				
			||||||
 | 
									if currentVersion == newVersion {
 | 
				
			||||||
 | 
										configInfo = append(configInfo, fmt.Sprintf("%s: %s (unchanged)", configName, newVersion))
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										configInfo = append(configInfo, fmt.Sprintf("%s: %s → %s", configName, currentVersion, newVersion))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									configInfo = append(configInfo, fmt.Sprintf("%s: %s (new)", configName, newVersion))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return configInfo, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user