list.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package network
  2. import (
  3. "sort"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/api/client"
  6. "github.com/docker/docker/api/client/formatter"
  7. "github.com/docker/docker/cli"
  8. "github.com/docker/engine-api/types"
  9. "github.com/docker/engine-api/types/filters"
  10. "github.com/spf13/cobra"
  11. )
  12. type byNetworkName []types.NetworkResource
  13. func (r byNetworkName) Len() int { return len(r) }
  14. func (r byNetworkName) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
  15. func (r byNetworkName) Less(i, j int) bool { return r[i].Name < r[j].Name }
  16. type listOptions struct {
  17. quiet bool
  18. noTrunc bool
  19. format string
  20. filter []string
  21. }
  22. func newListCommand(dockerCli *client.DockerCli) *cobra.Command {
  23. var opts listOptions
  24. cmd := &cobra.Command{
  25. Use: "ls [OPTIONS]",
  26. Aliases: []string{"list"},
  27. Short: "List networks",
  28. Args: cli.NoArgs,
  29. RunE: func(cmd *cobra.Command, args []string) error {
  30. return runList(dockerCli, opts)
  31. },
  32. }
  33. flags := cmd.Flags()
  34. flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display volume names")
  35. flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output")
  36. flags.StringVar(&opts.format, "format", "", "Pretty-print networks using a Go template")
  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. f := opts.format
  58. if len(f) == 0 {
  59. if len(dockerCli.NetworksFormat()) > 0 && !opts.quiet {
  60. f = dockerCli.NetworksFormat()
  61. } else {
  62. f = "table"
  63. }
  64. }
  65. sort.Sort(byNetworkName(networkResources))
  66. networksCtx := formatter.NetworkContext{
  67. Context: formatter.Context{
  68. Output: dockerCli.Out(),
  69. Format: f,
  70. Quiet: opts.quiet,
  71. Trunc: !opts.noTrunc,
  72. },
  73. Networks: networkResources,
  74. }
  75. networksCtx.Write()
  76. return nil
  77. }