nodes.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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, cancel := c.getRequestContext()
  24. defer cancel()
  25. r, err := state.controlClient.ListNodes(
  26. ctx,
  27. &swarmapi.ListNodesRequest{Filters: filters},
  28. grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse),
  29. )
  30. if err != nil {
  31. return nil, err
  32. }
  33. nodes := make([]types.Node, 0, len(r.Nodes))
  34. for _, node := range r.Nodes {
  35. nodes = append(nodes, convert.NodeFromGRPC(*node))
  36. }
  37. return nodes, nil
  38. }
  39. // GetNode returns a node based on an ID.
  40. func (c *Cluster) GetNode(input string) (types.Node, error) {
  41. var node *swarmapi.Node
  42. if err := c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  43. n, err := getNode(ctx, state.controlClient, input)
  44. if err != nil {
  45. return err
  46. }
  47. node = n
  48. return nil
  49. }); err != nil {
  50. return types.Node{}, err
  51. }
  52. return convert.NodeFromGRPC(*node), nil
  53. }
  54. // UpdateNode updates existing nodes properties.
  55. func (c *Cluster) UpdateNode(input string, version uint64, spec types.NodeSpec) error {
  56. return c.lockedManagerAction(func(_ context.Context, state nodeState) error {
  57. nodeSpec, err := convert.NodeSpecToGRPC(spec)
  58. if err != nil {
  59. return errdefs.InvalidParameter(err)
  60. }
  61. ctx, cancel := c.getRequestContext()
  62. defer cancel()
  63. currentNode, err := getNode(ctx, state.controlClient, input)
  64. if err != nil {
  65. return err
  66. }
  67. _, err = state.controlClient.UpdateNode(
  68. ctx,
  69. &swarmapi.UpdateNodeRequest{
  70. NodeID: currentNode.ID,
  71. Spec: &nodeSpec,
  72. NodeVersion: &swarmapi.Version{
  73. Index: version,
  74. },
  75. },
  76. )
  77. return err
  78. })
  79. }
  80. // RemoveNode removes a node from a cluster
  81. func (c *Cluster) RemoveNode(input string, force bool) error {
  82. return c.lockedManagerAction(func(ctx context.Context, state nodeState) error {
  83. node, err := getNode(ctx, state.controlClient, input)
  84. if err != nil {
  85. return err
  86. }
  87. _, err = state.controlClient.RemoveNode(ctx, &swarmapi.RemoveNodeRequest{NodeID: node.ID, Force: force})
  88. return err
  89. })
  90. }