mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
43a1bd564b
This fix tries to address the request in 31325 by adding `--filter mode=global|replicated` to `docker service ls`. As `docker service ls` has a `MODE` column by default, it is natural to support `--filter mode=global|replicated` for `docker service ls`. There are multiple ways to address the issue. One way is to pass the filter of mode to SwarmKit, another way is to process the filter of mode in the daemon. This fix process the filter in the daemon. Related docs has been updated. An integration test has been added. This fix fixes 31325. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package cluster
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/docker/docker/api/types/filters"
|
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
|
swarmapi "github.com/docker/swarmkit/api"
|
|
)
|
|
|
|
func newListNodesFilters(filter filters.Args) (*swarmapi.ListNodesRequest_Filters, error) {
|
|
accepted := map[string]bool{
|
|
"name": true,
|
|
"id": true,
|
|
"label": true,
|
|
"role": true,
|
|
"membership": true,
|
|
}
|
|
if err := filter.Validate(accepted); err != nil {
|
|
return nil, err
|
|
}
|
|
f := &swarmapi.ListNodesRequest_Filters{
|
|
NamePrefixes: filter.Get("name"),
|
|
IDPrefixes: filter.Get("id"),
|
|
Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
|
|
}
|
|
|
|
for _, r := range filter.Get("role") {
|
|
if role, ok := swarmapi.NodeRole_value[strings.ToUpper(r)]; ok {
|
|
f.Roles = append(f.Roles, swarmapi.NodeRole(role))
|
|
} else if r != "" {
|
|
return nil, fmt.Errorf("Invalid role filter: '%s'", r)
|
|
}
|
|
}
|
|
|
|
for _, a := range filter.Get("membership") {
|
|
if membership, ok := swarmapi.NodeSpec_Membership_value[strings.ToUpper(a)]; ok {
|
|
f.Memberships = append(f.Memberships, swarmapi.NodeSpec_Membership(membership))
|
|
} else if a != "" {
|
|
return nil, fmt.Errorf("Invalid membership filter: '%s'", a)
|
|
}
|
|
}
|
|
|
|
return f, nil
|
|
}
|
|
|
|
func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) error) (*swarmapi.ListTasksRequest_Filters, error) {
|
|
accepted := map[string]bool{
|
|
"name": true,
|
|
"id": true,
|
|
"label": true,
|
|
"service": true,
|
|
"node": true,
|
|
"desired-state": true,
|
|
}
|
|
if err := filter.Validate(accepted); err != nil {
|
|
return nil, err
|
|
}
|
|
if transformFunc != nil {
|
|
if err := transformFunc(filter); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
f := &swarmapi.ListTasksRequest_Filters{
|
|
NamePrefixes: filter.Get("name"),
|
|
IDPrefixes: filter.Get("id"),
|
|
Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
|
|
ServiceIDs: filter.Get("service"),
|
|
NodeIDs: filter.Get("node"),
|
|
}
|
|
|
|
for _, s := range filter.Get("desired-state") {
|
|
if state, ok := swarmapi.TaskState_value[strings.ToUpper(s)]; ok {
|
|
f.DesiredStates = append(f.DesiredStates, swarmapi.TaskState(state))
|
|
} else if s != "" {
|
|
return nil, fmt.Errorf("Invalid desired-state filter: '%s'", s)
|
|
}
|
|
}
|
|
|
|
return f, nil
|
|
}
|
|
|
|
func newListSecretsFilters(filter filters.Args) (*swarmapi.ListSecretsRequest_Filters, error) {
|
|
accepted := map[string]bool{
|
|
"names": true,
|
|
"name": true,
|
|
"id": true,
|
|
"label": true,
|
|
}
|
|
if err := filter.Validate(accepted); err != nil {
|
|
return nil, err
|
|
}
|
|
return &swarmapi.ListSecretsRequest_Filters{
|
|
Names: filter.Get("names"),
|
|
NamePrefixes: filter.Get("name"),
|
|
IDPrefixes: filter.Get("id"),
|
|
Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
|
|
}, nil
|
|
}
|