github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/cmd/swarmctl/task/inspect.go (about) 1 package task 2 3 import ( 4 "errors" 5 "fmt" 6 "io" 7 "os" 8 "strings" 9 "text/tabwriter" 10 11 "github.com/docker/swarmkit/api" 12 "github.com/docker/swarmkit/cmd/swarmctl/common" 13 gogotypes "github.com/gogo/protobuf/types" 14 "github.com/spf13/cobra" 15 ) 16 17 func printTaskStatus(w io.Writer, t *api.Task) { 18 fmt.Fprintln(w, "Status\t") 19 fmt.Fprintf(w, " Desired State\t: %s\n", t.DesiredState.String()) 20 fmt.Fprintf(w, " Last State\t: %s\n", t.Status.State.String()) 21 if t.Status.Timestamp != nil { 22 fmt.Fprintf(w, " Timestamp\t: %s\n", gogotypes.TimestampString(t.Status.Timestamp)) 23 } 24 if t.Status.Message != "" { 25 fmt.Fprintf(w, " Message\t: %s\n", t.Status.Message) 26 } 27 if t.Status.Err != "" { 28 fmt.Fprintf(w, " Error\t: %s\n", t.Status.Err) 29 } 30 ctnr := t.Status.GetContainer() 31 if ctnr == nil { 32 return 33 } 34 if ctnr.ContainerID != "" { 35 fmt.Fprintf(w, " ContainerID:\t: %s\n", ctnr.ContainerID) 36 } 37 if ctnr.PID != 0 { 38 fmt.Fprintf(w, " Pid\t: %d\n", ctnr.PID) 39 } 40 if t.Status.State > api.TaskStateRunning { 41 fmt.Fprintf(w, " ExitCode\t: %d\n", ctnr.ExitCode) 42 } 43 44 if t.Status.PortStatus != nil && len(t.Status.PortStatus.Ports) > 0 { 45 ports := []string{} 46 for _, port := range t.Status.PortStatus.Ports { 47 ports = append(ports, fmt.Sprintf("0.0.0.0:%d->%d/%s", 48 port.PublishedPort, port.TargetPort, strings.ToLower(port.Protocol.String()))) 49 } 50 51 fmt.Fprintf(w, "Ports\t: %s\n", strings.Join(ports, ", ")) 52 } 53 } 54 55 func printTaskSummary(task *api.Task, res *common.Resolver) { 56 w := tabwriter.NewWriter(os.Stdout, 8, 8, 8, ' ', 0) 57 defer w.Flush() 58 59 fmt.Fprintf(w, "ID\t: %s\n", task.ID) 60 fmt.Fprintf(w, "Slot\t: %d\n", task.Slot) 61 fmt.Fprintf(w, "Service\t: %s\n", res.Resolve(api.Service{}, task.ServiceID)) 62 printTaskStatus(w, task) 63 fmt.Fprintf(w, "Node\t: %s\n", res.Resolve(api.Node{}, task.NodeID)) 64 65 fmt.Fprintln(w, "Spec\t") 66 ctr := task.Spec.GetContainer() 67 common.FprintfIfNotEmpty(w, " Image\t: %s\n", ctr.Image) 68 common.FprintfIfNotEmpty(w, " Command\t: %q\n", strings.Join(ctr.Command, " ")) 69 common.FprintfIfNotEmpty(w, " Args\t: [%s]\n", strings.Join(ctr.Args, ", ")) 70 common.FprintfIfNotEmpty(w, " Env\t: [%s]\n", strings.Join(ctr.Env, ", ")) 71 if len(ctr.Secrets) > 0 { 72 fmt.Fprintln(w, " Secrets:") 73 for _, sr := range ctr.Secrets { 74 var targetName, mode string 75 if sr.GetFile() != nil { 76 targetName = sr.GetFile().Name 77 mode = "FILE" 78 } 79 fmt.Fprintf(w, " [%s] %s:%s\n", mode, sr.SecretName, targetName) 80 } 81 } 82 if len(ctr.Configs) > 0 { 83 fmt.Fprintln(w, " Configs:") 84 for _, cr := range ctr.Configs { 85 var targetName, mode string 86 if cr.GetFile() != nil { 87 targetName = cr.GetFile().Name 88 mode = "FILE" 89 } 90 fmt.Fprintf(w, " [%s] %s:%s\n", mode, cr.ConfigName, targetName) 91 } 92 } 93 } 94 95 var ( 96 inspectCmd = &cobra.Command{ 97 Use: "inspect <task ID>", 98 Short: "Inspect a task", 99 RunE: func(cmd *cobra.Command, args []string) error { 100 if len(args) == 0 { 101 return errors.New("task ID missing") 102 } 103 104 if len(args) > 1 { 105 return errors.New("inspect command takes exactly 1 argument") 106 } 107 108 c, err := common.Dial(cmd) 109 if err != nil { 110 return err 111 } 112 113 t, err := c.GetTask(common.Context(cmd), &api.GetTaskRequest{TaskID: args[0]}) 114 if err != nil { 115 return err 116 } 117 task := t.Task 118 119 r, err := c.ListTasks(common.Context(cmd), 120 &api.ListTasksRequest{ 121 Filters: &api.ListTasksRequest_Filters{ 122 ServiceIDs: []string{task.ServiceID}, 123 }, 124 }) 125 if err != nil { 126 return err 127 } 128 previous := []*api.Task{} 129 for _, t := range r.Tasks { 130 if t.Slot == task.Slot { 131 previous = append(previous, t) 132 } 133 } 134 135 res := common.NewResolver(cmd, c) 136 137 printTaskSummary(task, res) 138 if len(previous) > 0 { 139 fmt.Println("\n===> Task Parents") 140 Print(previous, true, res) 141 } 142 143 return nil 144 }, 145 } 146 )