nodes.go 2.4 KB

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