list.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package network
  2. import (
  3. "fmt"
  4. "sort"
  5. "text/tabwriter"
  6. "golang.org/x/net/context"
  7. "github.com/docker/docker/api/client"
  8. "github.com/docker/docker/cli"
  9. "github.com/docker/docker/pkg/stringid"
  10. "github.com/docker/engine-api/types"
  11. "github.com/docker/engine-api/types/filters"
  12. "github.com/spf13/cobra"
  13. )
  14. type byNetworkName []types.NetworkResource
  15. func (r byNetworkName) Len() int { return len(r) }
  16. func (r byNetworkName) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
  17. func (r byNetworkName) Less(i, j int) bool { return r[i].Name < r[j].Name }
  18. type listOptions struct {
  19. quiet bool
  20. noTrunc bool
  21. filter []string
  22. }
  23. func newListCommand(dockerCli *client.DockerCli) *cobra.Command {
  24. var opts listOptions
  25. cmd := &cobra.Command{
  26. Use: "ls [OPTIONS]",
  27. Aliases: []string{"list"},
  28. Short: "List networks",
  29. Args: cli.NoArgs,
  30. RunE: func(cmd *cobra.Command, args []string) error {
  31. return runList(dockerCli, opts)
  32. },
  33. }
  34. flags := cmd.Flags()
  35. flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display volume names")
  36. flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output")
  37. flags.StringSliceVarP(&opts.filter, "filter", "f", []string{}, "Provide filter values (i.e. 'dangling=true')")
  38. return cmd
  39. }
  40. func runList(dockerCli *client.DockerCli, opts listOptions) error {
  41. client := dockerCli.Client()
  42. netFilterArgs := filters.NewArgs()
  43. for _, f := range opts.filter {
  44. var err error
  45. netFilterArgs, err = filters.ParseFlag(f, netFilterArgs)
  46. if err != nil {
  47. return err
  48. }
  49. }
  50. options := types.NetworkListOptions{
  51. Filters: netFilterArgs,
  52. }
  53. networkResources, err := client.NetworkList(context.Background(), options)
  54. if err != nil {
  55. return err
  56. }
  57. w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0)
  58. if !opts.quiet {
  59. fmt.Fprintf(w, "NETWORK ID\tNAME\tDRIVER\tSCOPE")
  60. fmt.Fprintf(w, "\n")
  61. }
  62. sort.Sort(byNetworkName(networkResources))
  63. for _, networkResource := range networkResources {
  64. ID := networkResource.ID
  65. netName := networkResource.Name
  66. driver := networkResource.Driver
  67. scope := networkResource.Scope
  68. if !opts.noTrunc {
  69. ID = stringid.TruncateID(ID)
  70. }
  71. if opts.quiet {
  72. fmt.Fprintln(w, ID)
  73. continue
  74. }
  75. fmt.Fprintf(w, "%s\t%s\t%s\t%s\t",
  76. ID,
  77. netName,
  78. driver,
  79. scope)
  80. fmt.Fprint(w, "\n")
  81. }
  82. w.Flush()
  83. return nil
  84. }