nodes.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package cluster // import "github.com/docker/docker/daemon/cluster"
  2. import (
  3. "context"
  4. apitypes "github.com/docker/docker/api/types"
  5. types "github.com/docker/docker/api/types/swarm"
  6. "github.com/docker/docker/daemon/cluster/convert"
  7. "github.com/docker/docker/errdefs"
  8. swarmapi "github.com/moby/swarmkit/v2/api"
  9. "google.golang.org/grpc"
  10. )
  11. // GetNodes returns a list of all nodes known to a cluster.
  12. func (c *Cluster) GetNodes(options apitypes.NodeListOptions) ([]types.Node, error) {
  13. c.mu.RLock()
  14. defer c.mu.RUnlock()
  15. state := c.currentNodeState()
  16. if !state.IsActiveManager() {
  17. return nil, c.errNoManager(state)
  18. }
  19. filters, err := newListNodesFilters(options.Filters)
  20. if err != nil {
  21. return nil, err
  22. }
  23. ctx := context.TODO()
  24. ctx, cancel := c.getRequestContext(ctx)
  25. defer cancel()
  26. r, err := state.controlClient.ListNodes(
  27. ctx,
  28. &swarmapi.ListNodesRequest{Filters: filters},
  29. grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse),
  30. )
  31. if err != nil {
  32. return nil, err
  33. }
  34. nodes := make([]types.Node, 0, len(r.Nodes))
  35. for _, node := range r.Nodes {
  36. nodes = append(nodes, convert.NodeFromGRPC(*node))
  37. }
  38. return nodes, nil
  39. }
  40. // GetNode returns a node based on an ID.
  41. func (c *Cluster) GetNode(input string) (types.Node, error) {
  42. var node *swarmapi.Node
  43. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  44. n, err := getNode(ctx, state.controlClient, input)
  45. if err != nil {
  46. return err
  47. }
  48. node = n
  49. return nil
  50. }); err != nil {
  51. return types.Node{}, err
  52. }
  53. return convert.NodeFromGRPC(*node), nil
  54. }
  55. // UpdateNode updates existing nodes properties.
  56. func (c *Cluster) UpdateNode(input string, version uint64, spec types.NodeSpec) error {
  57. return c.lockedManagerAction(func(_ context.Context, state nodeState) error {
  58. nodeSpec, err := convert.NodeSpecToGRPC(spec)
  59. if err != nil {
  60. return errdefs.InvalidParameter(err)
  61. }
  62. ctx := context.TODO()
  63. ctx, cancel := c.getRequestContext(ctx)
  64. defer cancel()
  65. currentNode, err := getNode(ctx, state.controlClient, input)
  66. if err != nil {
  67. return err
  68. }
  69. _, err = state.controlClient.UpdateNode(
  70. ctx,
  71. &swarmapi.UpdateNodeRequest{
  72. NodeID: currentNode.ID,
  73. Spec: &nodeSpec,
  74. NodeVersion: &swarmapi.Version{
  75. Index: version,
  76. },
  77. },
  78. )
  79. return err
  80. })
  81. }
  82. // RemoveNode removes a node from a cluster
  83. func (c *Cluster) RemoveNode(input string, force bool) error {
  84. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  85. node, err := getNode(ctx, state.controlClient, input)
  86. if err != nil {
  87. return err
  88. }
  89. _, err = state.controlClient.RemoveNode(ctx, &swarmapi.RemoveNodeRequest{NodeID: node.ID, Force: force})
  90. return err
  91. })
  92. }