forked from toolshed/abra
.gitea
cli
cmd
pkg
app
autocomplete
catalogue
client
compose
config
container
context
dns
git
limit
recipe
secret
server
ssh
upstream
commandconn
container
convert
stack
loader.go
options.go
remove.go
stack.go
web
scripts
tests
.drone.yml
.envrc.sample
.gitignore
.goreleaser.yml
Makefile
README.md
go.mod
go.sum
renovate.json
139 lines
3.5 KiB
Go
139 lines
3.5 KiB
Go
package stack // https://github.com/docker/cli/blob/master/cli/command/stack/remove.go
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
"github.com/docker/docker/api/types/versions"
|
|
apiclient "github.com/docker/docker/client"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// RunRemove is the swarm implementation of docker stack remove
|
|
func RunRemove(ctx context.Context, client *apiclient.Client, opts Remove) error {
|
|
var errs []string
|
|
for _, namespace := range opts.Namespaces {
|
|
services, err := GetStackServices(ctx, client, namespace)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
networks, err := getStackNetworks(ctx, client, namespace)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var secrets []swarm.Secret
|
|
if versions.GreaterThanOrEqualTo(client.ClientVersion(), "1.25") {
|
|
secrets, err = getStackSecrets(ctx, client, namespace)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
var configs []swarm.Config
|
|
if versions.GreaterThanOrEqualTo(client.ClientVersion(), "1.30") {
|
|
configs, err = getStackConfigs(ctx, client, namespace)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if len(services)+len(networks)+len(secrets)+len(configs) == 0 {
|
|
logrus.Warning(fmt.Errorf("nothing found in stack: %s", namespace))
|
|
continue
|
|
}
|
|
|
|
hasError := removeServices(ctx, client, services)
|
|
hasError = removeSecrets(ctx, client, secrets) || hasError
|
|
hasError = removeConfigs(ctx, client, configs) || hasError
|
|
hasError = removeNetworks(ctx, client, networks) || hasError
|
|
|
|
if hasError {
|
|
errs = append(errs, fmt.Sprintf("failed to remove some resources from stack: %s", namespace))
|
|
}
|
|
}
|
|
|
|
if len(errs) > 0 {
|
|
return errors.Errorf(strings.Join(errs, "\n"))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func sortServiceByName(services []swarm.Service) func(i, j int) bool {
|
|
return func(i, j int) bool {
|
|
return services[i].Spec.Name < services[j].Spec.Name
|
|
}
|
|
}
|
|
|
|
func removeServices(
|
|
ctx context.Context,
|
|
client *apiclient.Client,
|
|
services []swarm.Service,
|
|
) bool {
|
|
var hasError bool
|
|
sort.Slice(services, sortServiceByName(services))
|
|
for _, service := range services {
|
|
logrus.Infof("removing service %s\n", service.Spec.Name)
|
|
if err := client.ServiceRemove(ctx, service.ID); err != nil {
|
|
hasError = true
|
|
logrus.Fatalf("failed to remove service %s: %s", service.ID, err)
|
|
}
|
|
}
|
|
return hasError
|
|
}
|
|
|
|
func removeNetworks(
|
|
ctx context.Context,
|
|
client *apiclient.Client,
|
|
networks []types.NetworkResource,
|
|
) bool {
|
|
var hasError bool
|
|
for _, network := range networks {
|
|
logrus.Infof("removing network %s\n", network.Name)
|
|
if err := client.NetworkRemove(ctx, network.ID); err != nil {
|
|
hasError = true
|
|
logrus.Fatalf("failed to remove network %s: %s", network.ID, err)
|
|
}
|
|
}
|
|
return hasError
|
|
}
|
|
|
|
func removeSecrets(
|
|
ctx context.Context,
|
|
client *apiclient.Client,
|
|
secrets []swarm.Secret,
|
|
) bool {
|
|
var hasError bool
|
|
for _, secret := range secrets {
|
|
logrus.Infof("Removing secret %s\n", secret.Spec.Name)
|
|
if err := client.SecretRemove(ctx, secret.ID); err != nil {
|
|
hasError = true
|
|
logrus.Fatalf("Failed to remove secret %s: %s", secret.ID, err)
|
|
}
|
|
}
|
|
return hasError
|
|
}
|
|
|
|
func removeConfigs(
|
|
ctx context.Context,
|
|
client *apiclient.Client,
|
|
configs []swarm.Config,
|
|
) bool {
|
|
var hasError bool
|
|
for _, config := range configs {
|
|
logrus.Infof("removing config %s\n", config.Spec.Name)
|
|
if err := client.ConfigRemove(ctx, config.ID); err != nil {
|
|
hasError = true
|
|
logrus.Fatalf("failed to remove config %s: %s", config.ID, err)
|
|
}
|
|
}
|
|
return hasError
|
|
}
|