package client import ( "context" "errors" "strings" "coopcloud.tech/abra/pkg/i18n" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/client" ) func GetConfigs(cl *client.Client, ctx context.Context, server string, fs filters.Args) ([]swarm.Config, error) { configList, err := cl.ConfigList(ctx, swarm.ConfigListOptions{Filters: fs}) if err != nil { return configList, err } return configList, nil } func GetConfigNames(configs []swarm.Config) []string { var confNames []string for _, conf := range configs { confNames = append(confNames, conf.Spec.Name) } return confNames } func RemoveConfigs(cl *client.Client, ctx context.Context, configNames []string, force bool) error { for _, confName := range configNames { if err := cl.ConfigRemove(context.Background(), confName); err != nil { return errors.New(i18n.G("conf %s: %s", confName, err)) } } return nil } func GetConfigNameAndVersion(fullName string, stackName string) (string, string) { name := strings.TrimPrefix(fullName, stackName + "_") if lastUnderscore := strings.LastIndex(name, "_"); lastUnderscore != -1 { return name[0:lastUnderscore], name[lastUnderscore+1:] } return name, "" } // GetConfigNamesForStack retrieves all Docker configs attached to services in a given stack. func GetConfigNamesForStack(cl *client.Client, ctx context.Context, stackName string) ([]string, error) { // Create filter to get services for the specific stack filter := filters.NewArgs() filter.Add("label", "com.docker.stack.namespace="+stackName) // List all services in the stack services, err := cl.ServiceList(ctx, types.ServiceListOptions{ Filters: filter, }) if err != nil { return nil, err } // Collect unique config names from all services configNames := make(map[string]bool) for _, service := range services { if service.Spec.TaskTemplate.ContainerSpec != nil { for _, configRef := range service.Spec.TaskTemplate.ContainerSpec.Configs { if configRef.ConfigName != "" { configNames[configRef.ConfigName] = true } } } } // Convert map to slice result := make([]string, 0, len(configNames)) for name := range configNames { result = append(result, name) } return result, nil }