pool.go 2.8 KB

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