mirror of https://github.com/docker/cli.git
55 lines
1.9 KiB
Go
55 lines
1.9 KiB
Go
package swarm
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/docker/cli/cli/command"
|
|
"github.com/docker/cli/cli/command/service"
|
|
"github.com/docker/cli/cli/command/stack/options"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
)
|
|
|
|
// GetServices is the swarm implementation of listing stack services
|
|
func GetServices(dockerCli command.Cli, opts options.Services) ([]swarm.Service, error) {
|
|
var (
|
|
err error
|
|
ctx = context.Background()
|
|
client = dockerCli.Client()
|
|
)
|
|
|
|
listOpts := types.ServiceListOptions{
|
|
Filters: getStackFilterFromOpt(opts.Namespace, opts.Filter),
|
|
// When not running "quiet", also get service status (number of running
|
|
// and desired tasks). Note that this is only supported on API v1.41 and
|
|
// up; older API versions ignore this option, and we will have to collect
|
|
// the information manually below.
|
|
Status: !opts.Quiet,
|
|
}
|
|
|
|
services, err := client.ServiceList(ctx, listOpts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if listOpts.Status {
|
|
// Now that a request was made, we know what API version was used (either
|
|
// through configuration, or after client and daemon negotiated a version).
|
|
// If API version v1.41 or up was used; the daemon should already have done
|
|
// the legwork for us, and we don't have to calculate the number of desired
|
|
// and running tasks. On older API versions, we need to do some extra requests
|
|
// to get that information.
|
|
//
|
|
// So theoretically, this step can be skipped based on API version, however,
|
|
// some of our unit tests don't set the API version, and there may be other
|
|
// situations where the client uses the "default" version. To account for
|
|
// these situations, we do a quick check for services that do not have
|
|
// a ServiceStatus set, and perform a lookup for those.
|
|
services, err = service.AppendServiceStatus(ctx, client, services)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return services, nil
|
|
}
|