mirror of https://github.com/docker/cli.git
service ps: Truncate Task IDs
- Refactored to move resolution code into the idresolver - Made `ps` output more bearable by shortening service IDs in task names Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
parent
a3d806f0bb
commit
5834d378e0
|
@ -7,6 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/docker/docker/api/types/swarm"
|
"github.com/docker/docker/api/types/swarm"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/docker/docker/pkg/stringid"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IDResolver provides ID to Name resolution.
|
// IDResolver provides ID to Name resolution.
|
||||||
|
@ -26,7 +27,7 @@ func New(client client.APIClient, noResolve bool) *IDResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *IDResolver) get(ctx context.Context, t interface{}, id string) (string, error) {
|
func (r *IDResolver) get(ctx context.Context, t interface{}, id string) (string, error) {
|
||||||
switch t.(type) {
|
switch t := t.(type) {
|
||||||
case swarm.Node:
|
case swarm.Node:
|
||||||
node, _, err := r.client.NodeInspectWithRaw(ctx, id)
|
node, _, err := r.client.NodeInspectWithRaw(ctx, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -45,6 +46,25 @@ func (r *IDResolver) get(ctx context.Context, t interface{}, id string) (string,
|
||||||
return id, nil
|
return id, nil
|
||||||
}
|
}
|
||||||
return service.Spec.Annotations.Name, nil
|
return service.Spec.Annotations.Name, nil
|
||||||
|
case swarm.Task:
|
||||||
|
// If the caller passes the full task there's no need to do a lookup.
|
||||||
|
if t.ID == "" {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
t, _, err = r.client.TaskInspectWithRaw(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return id, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taskID := stringid.TruncateID(t.ID)
|
||||||
|
if t.ServiceID == "" {
|
||||||
|
return taskID, nil
|
||||||
|
}
|
||||||
|
service, err := r.Resolve(ctx, swarm.Service{}, t.ServiceID)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s.%d.%s", service, t.Slot, taskID), nil
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("unsupported type")
|
return "", fmt.Errorf("unsupported type")
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,38 +74,24 @@ func PrintQuiet(dockerCli *command.DockerCli, tasks []swarm.Task) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func print(out io.Writer, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, noTrunc bool) error {
|
func print(out io.Writer, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, noTrunc bool) error {
|
||||||
prevServiceName := ""
|
prevService := ""
|
||||||
prevSlot := 0
|
prevSlot := 0
|
||||||
for _, task := range tasks {
|
for _, task := range tasks {
|
||||||
serviceName, err := resolver.Resolve(ctx, swarm.Service{}, task.ServiceID)
|
name, err := resolver.Resolve(ctx, task, task.ID)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
nodeValue, err := resolver.Resolve(ctx, swarm.Node{}, task.NodeID)
|
nodeValue, err := resolver.Resolve(ctx, swarm.Node{}, task.NodeID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
name := task.Annotations.Name
|
|
||||||
// TODO: This is the fallback <ServiceName>.<Slot>.<taskID> in case task name is not present in
|
|
||||||
// Annotations (upgraded from 1.12).
|
|
||||||
// We may be able to remove the following in the future.
|
|
||||||
if name == "" {
|
|
||||||
if task.Slot != 0 {
|
|
||||||
name = fmt.Sprintf("%v.%v.%v", serviceName, task.Slot, task.ID)
|
|
||||||
} else {
|
|
||||||
name = fmt.Sprintf("%v.%v.%v", serviceName, task.NodeID, task.ID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Indent the name if necessary
|
// Indent the name if necessary
|
||||||
indentedName := name
|
indentedName := name
|
||||||
// Since the new format of the task name is <ServiceName>.<Slot>.<taskID>, we should only compare
|
// Since the new format of the task name is <ServiceName>.<Slot>.<taskID>, we should only compare
|
||||||
// <ServiceName> and <Slot> here.
|
// <ServiceName> and <Slot> here.
|
||||||
if prevServiceName == serviceName && prevSlot == task.Slot {
|
if prevService == task.ServiceID && prevSlot == task.Slot {
|
||||||
indentedName = fmt.Sprintf(" \\_ %s", indentedName)
|
indentedName = fmt.Sprintf(" \\_ %s", indentedName)
|
||||||
}
|
}
|
||||||
prevServiceName = serviceName
|
prevService = task.ServiceID
|
||||||
prevSlot = task.Slot
|
prevSlot = task.Slot
|
||||||
|
|
||||||
// Trim and quote the error message.
|
// Trim and quote the error message.
|
||||||
|
|
Loading…
Reference in New Issue