2017-11-20 09:30:52 -05:00
|
|
|
package swarm
|
2016-09-08 13:11:39 -04:00
|
|
|
|
|
|
|
import (
|
2018-05-03 21:02:44 -04:00
|
|
|
"context"
|
2016-09-08 13:11:39 -04:00
|
|
|
|
2017-04-17 18:07:56 -04:00
|
|
|
"github.com/docker/cli/cli/command"
|
|
|
|
"github.com/docker/cli/cli/command/service"
|
2017-12-04 06:30:39 -05:00
|
|
|
"github.com/docker/cli/cli/command/stack/options"
|
2016-09-08 13:11:39 -04:00
|
|
|
"github.com/docker/docker/api/types"
|
2019-10-10 08:22:20 -04:00
|
|
|
"github.com/docker/docker/api/types/swarm"
|
2016-09-08 13:11:39 -04:00
|
|
|
)
|
|
|
|
|
2019-10-10 08:22:20 -04:00
|
|
|
// GetServices is the swarm implementation of listing stack services
|
2023-09-09 18:27:44 -04:00
|
|
|
func GetServices(ctx context.Context, dockerCli command.Cli, opts options.Services) ([]swarm.Service, error) {
|
2019-10-23 18:16:35 -04:00
|
|
|
var (
|
|
|
|
err error
|
|
|
|
client = dockerCli.Client()
|
|
|
|
)
|
2016-09-08 13:11:39 -04:00
|
|
|
|
2019-10-23 18:16:35 -04:00
|
|
|
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)
|
2016-09-08 13:11:39 -04:00
|
|
|
if err != nil {
|
2019-10-10 08:22:20 -04:00
|
|
|
return nil, err
|
2016-09-08 13:11:39 -04:00
|
|
|
}
|
|
|
|
|
2019-10-23 18:16:35 -04:00
|
|
|
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)
|
2016-09-08 13:11:39 -04:00
|
|
|
if err != nil {
|
2019-10-10 08:22:20 -04:00
|
|
|
return nil, err
|
2016-09-08 13:11:39 -04:00
|
|
|
}
|
2017-01-26 16:08:07 -05:00
|
|
|
}
|
2019-10-10 08:22:20 -04:00
|
|
|
return services, nil
|
2016-09-08 13:11:39 -04:00
|
|
|
}
|