Files
abra/pkg/client/configs.go

87 lines
2.2 KiB
Go

package client
import (
"context"
"errors"
"strings"
"coopcloud.tech/abra/pkg/i18n"
appPkg "coopcloud.tech/abra/pkg/app"
"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, app appPkg.App) ([]string, error) {
filters, err := app.Filters(false, false)
if err != nil {
return nil, err
}
// List all services in the stack
services, err := cl.ServiceList(context.Background(), types.ServiceListOptions{
Filters: filters,
})
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
}