github.com/ali-iotechsys/cli@v20.10.0+incompatible/cli/command/stack/swarm/list.go (about)

     1  package swarm
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/docker/cli/cli/command"
     7  	"github.com/docker/cli/cli/command/stack/formatter"
     8  	"github.com/docker/cli/cli/compose/convert"
     9  	"github.com/docker/docker/api/types"
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  // GetStacks lists the swarm stacks.
    14  func GetStacks(dockerCli command.Cli) ([]*formatter.Stack, error) {
    15  	services, err := dockerCli.Client().ServiceList(
    16  		context.Background(),
    17  		types.ServiceListOptions{Filters: getAllStacksFilter()})
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  	m := make(map[string]*formatter.Stack)
    22  	for _, service := range services {
    23  		labels := service.Spec.Labels
    24  		name, ok := labels[convert.LabelNamespace]
    25  		if !ok {
    26  			return nil, errors.Errorf("cannot get label %s for service %s",
    27  				convert.LabelNamespace, service.ID)
    28  		}
    29  		ztack, ok := m[name]
    30  		if !ok {
    31  			m[name] = &formatter.Stack{
    32  				Name:         name,
    33  				Services:     1,
    34  				Orchestrator: "Swarm",
    35  			}
    36  		} else {
    37  			ztack.Services++
    38  		}
    39  	}
    40  	var stacks []*formatter.Stack
    41  	for _, stack := range m {
    42  		stacks = append(stacks, stack)
    43  	}
    44  	return stacks, nil
    45  }