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  )