nodes.go 2.5 KB

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