node.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package storageos
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "net/url"
  7. "github.com/storageos/go-api/types"
  8. )
  9. var (
  10. // NodeAPIPrefix is a partial path to the HTTP endpoint.
  11. NodeAPIPrefix = "nodes"
  12. // ErrNoSuchNode is the error returned when the node does not exist.
  13. ErrNoSuchNode = errors.New("no such node")
  14. // ErrNodeInUse is the error returned when the node requested to be removed is still in use.
  15. ErrNodeInUse = errors.New("node in use and cannot be removed")
  16. )
  17. // NodeList returns the list of available nodes.
  18. func (c *Client) NodeList(opts types.ListOptions) ([]*types.Node, error) {
  19. listOpts := doOptions{
  20. fieldSelector: opts.FieldSelector,
  21. labelSelector: opts.LabelSelector,
  22. context: opts.Context,
  23. }
  24. if opts.LabelSelector != "" {
  25. query := url.Values{}
  26. query.Add("labelSelector", opts.LabelSelector)
  27. listOpts.values = query
  28. }
  29. resp, err := c.do("GET", NodeAPIPrefix, listOpts)
  30. if err != nil {
  31. return nil, err
  32. }
  33. defer resp.Body.Close()
  34. var nodes []*types.Node
  35. if err := json.NewDecoder(resp.Body).Decode(&nodes); err != nil {
  36. return nil, err
  37. }
  38. return nodes, nil
  39. }
  40. // Node returns a node by its reference.
  41. func (c *Client) Node(ref string) (*types.Node, error) {
  42. resp, err := c.do("GET", NodeAPIPrefix+"/"+ref, doOptions{})
  43. if err != nil {
  44. if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
  45. return nil, ErrNoSuchNode
  46. }
  47. return nil, err
  48. }
  49. defer resp.Body.Close()
  50. var node types.Node
  51. if err := json.NewDecoder(resp.Body).Decode(&node); err != nil {
  52. return nil, err
  53. }
  54. return &node, nil
  55. }
  56. // NodeUpdate updates a node on the server.
  57. func (c *Client) NodeUpdate(opts types.NodeUpdateOptions) (*types.Node, error) {
  58. ref := opts.Name
  59. if IsUUID(opts.ID) {
  60. ref = opts.ID
  61. }
  62. resp, err := c.do("PUT", NodeAPIPrefix+"/"+ref, doOptions{
  63. data: opts,
  64. context: opts.Context,
  65. })
  66. if err != nil {
  67. return nil, err
  68. }
  69. defer resp.Body.Close()
  70. var node types.Node
  71. if err := json.NewDecoder(resp.Body).Decode(&node); err != nil {
  72. return nil, err
  73. }
  74. return &node, nil
  75. }
  76. // NodeDelete removes a node by its reference.
  77. func (c *Client) NodeDelete(opts types.DeleteOptions) error {
  78. deleteOpts := doOptions{
  79. namespace: opts.Namespace,
  80. force: opts.Force,
  81. context: opts.Context,
  82. }
  83. resp, err := c.do("DELETE", NodeAPIPrefix+"/"+opts.Name, deleteOpts)
  84. if err != nil {
  85. if e, ok := err.(*Error); ok {
  86. if e.Status == http.StatusNotFound {
  87. return ErrNoSuchNode
  88. }
  89. if e.Status == http.StatusConflict {
  90. return ErrNodeInUse
  91. }
  92. }
  93. return err
  94. }
  95. defer resp.Body.Close()
  96. return nil
  97. }