mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
06f8cd5f31
This fix is an extension to last commit to expand the partial
filter to node and task searches.
Additional integration tests have been added to cover the changes.
This fix fixes 24270.
This fix fixes 24112.
Note: A separate pull request will be opened on swarmkit.
Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
(cherry picked from commit e734fa58ea
)
Signed-off-by: Tibor Vass <tibor@docker.com>
98 lines
2.7 KiB
Go
98 lines
2.7 KiB
Go
package cluster
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
runconfigopts "github.com/docker/docker/runconfig/opts"
|
|
"github.com/docker/engine-api/types/filters"
|
|
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 newListServicesFilters(filter filters.Args) (*swarmapi.ListServicesRequest_Filters, error) {
|
|
accepted := map[string]bool{
|
|
"name": true,
|
|
"id": true,
|
|
"label": true,
|
|
}
|
|
if err := filter.Validate(accepted); err != nil {
|
|
return nil, err
|
|
}
|
|
return &swarmapi.ListServicesRequest_Filters{
|
|
NamePrefixes: filter.Get("name"),
|
|
IDPrefixes: filter.Get("id"),
|
|
Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")),
|
|
}, 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
|
|
}
|