85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
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
|
|
}
|