github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/cmd/swarmctl/network/inspect.go (about) 1 package network 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 "text/tabwriter" 8 9 "github.com/docker/swarmkit/api" 10 "github.com/docker/swarmkit/cmd/swarmctl/common" 11 "github.com/spf13/cobra" 12 ) 13 14 var ( 15 inspectCmd = &cobra.Command{ 16 Use: "inspect <network ID>", 17 Short: "Inspect a network", 18 RunE: func(cmd *cobra.Command, args []string) error { 19 if len(args) == 0 { 20 return errors.New("network ID missing") 21 } 22 23 if len(args) > 1 { 24 return errors.New("inspect command takes exactly 1 argument") 25 } 26 27 c, err := common.Dial(cmd) 28 if err != nil { 29 return err 30 } 31 network, err := GetNetwork(common.Context(cmd), c, args[0]) 32 if err != nil { 33 return err 34 } 35 36 printNetworkSummary(network) 37 38 return nil 39 }, 40 } 41 ) 42 43 func printNetworkSummary(network *api.Network) { 44 w := tabwriter.NewWriter(os.Stdout, 8, 8, 8, ' ', 0) 45 defer func() { 46 // Ignore flushing errors - there's nothing we can do. 47 _ = w.Flush() 48 }() 49 50 spec := &network.Spec 51 common.FprintfIfNotEmpty(w, "ID\t: %s\n", network.ID) 52 common.FprintfIfNotEmpty(w, "Name\t: %s\n", spec.Annotations.Name) 53 54 fmt.Fprintln(w, "Spec:\t") 55 if len(spec.Annotations.Labels) > 0 { 56 fmt.Fprintln(w, " Labels:\t") 57 for k, v := range spec.Annotations.Labels { 58 fmt.Fprintf(w, " %s = %s\n", k, v) 59 } 60 } 61 fmt.Fprintf(w, " IPv6Enabled\t: %t\n", spec.Ipv6Enabled) 62 fmt.Fprintf(w, " Internal\t: %t\n", spec.Internal) 63 64 driver := network.DriverState 65 if driver != nil { 66 fmt.Fprintln(w, "Driver:\t") 67 common.FprintfIfNotEmpty(w, " Name\t: %s\n", driver.Name) 68 if len(driver.Options) > 0 { 69 fmt.Fprintln(w, " Options:\t") 70 for k, v := range driver.Options { 71 fmt.Fprintf(w, " %s = %s\n", k, v) 72 } 73 } 74 } 75 76 ipam := network.IPAM 77 if ipam != nil { 78 fmt.Fprintln(w, "IPAM:\t") 79 if ipam.Driver != nil { 80 fmt.Fprintln(w, " Driver:\t") 81 common.FprintfIfNotEmpty(w, " Name\t: %s\n", ipam.Driver.Name) 82 if len(ipam.Driver.Options) > 0 { 83 fmt.Fprintln(w, " Options:\t") 84 for k, v := range ipam.Driver.Options { 85 fmt.Fprintf(w, " %s = %s\n", k, v) 86 } 87 } 88 } 89 90 if len(ipam.Configs) > 0 { 91 for _, config := range ipam.Configs { 92 fmt.Fprintln(w, " IPAM Config:\t") 93 common.FprintfIfNotEmpty(w, " Family\t: %s\n", config.Family.String()) 94 common.FprintfIfNotEmpty(w, " Subnet\t: %s\n", config.Subnet) 95 common.FprintfIfNotEmpty(w, " Range\t: %s\n", config.Range) 96 common.FprintfIfNotEmpty(w, " Range\t: %s\n", config.Range) 97 common.FprintfIfNotEmpty(w, " Gateway\t: %s\n", config.Gateway) 98 if len(config.Reserved) > 0 { 99 fmt.Fprintln(w, " Reserved:\t") 100 for k, v := range config.Reserved { 101 fmt.Fprintf(w, " %s = %s\n", k, v) 102 } 103 } 104 } 105 } 106 } 107 }