namespace.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. // NamespaceAPIPrefix is a partial path to the HTTP endpoint.
  11. NamespaceAPIPrefix = "namespaces"
  12. // ErrNoSuchNamespace is the error returned when the namespace does not exist.
  13. ErrNoSuchNamespace = errors.New("no such namespace")
  14. // ErrNamespaceInUse is the error returned when the namespace requested to be removed is still in use.
  15. ErrNamespaceInUse = errors.New("namespace in use and cannot be removed")
  16. )
  17. // NamespaceList returns the list of available namespaces.
  18. func (c *Client) NamespaceList(opts types.ListOptions) ([]*types.Namespace, error) {
  19. listOpts := doOptions{
  20. fieldSelector: opts.FieldSelector,
  21. labelSelector: opts.LabelSelector,
  22. namespace: opts.Namespace,
  23. context: opts.Context,
  24. }
  25. if opts.LabelSelector != "" {
  26. query := url.Values{}
  27. query.Add("labelSelector", opts.LabelSelector)
  28. listOpts.values = query
  29. }
  30. resp, err := c.do("GET", NamespaceAPIPrefix, listOpts)
  31. if err != nil {
  32. return nil, err
  33. }
  34. defer resp.Body.Close()
  35. var namespaces []*types.Namespace
  36. if err := json.NewDecoder(resp.Body).Decode(&namespaces); err != nil {
  37. return nil, err
  38. }
  39. return namespaces, nil
  40. }
  41. // Namespace returns a namespace by its reference.
  42. func (c *Client) Namespace(ref string) (*types.Namespace, error) {
  43. resp, err := c.do("GET", NamespaceAPIPrefix+"/"+ref, doOptions{})
  44. if err != nil {
  45. if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
  46. return nil, ErrNoSuchNamespace
  47. }
  48. return nil, err
  49. }
  50. defer resp.Body.Close()
  51. var namespace types.Namespace
  52. if err := json.NewDecoder(resp.Body).Decode(&namespace); err != nil {
  53. return nil, err
  54. }
  55. return &namespace, nil
  56. }
  57. // NamespaceCreate creates a namespace on the server and returns the new object.
  58. func (c *Client) NamespaceCreate(opts types.NamespaceCreateOptions) (*types.Namespace, error) {
  59. resp, err := c.do("POST", NamespaceAPIPrefix, doOptions{
  60. data: opts,
  61. context: opts.Context,
  62. })
  63. if err != nil {
  64. return nil, err
  65. }
  66. var namespace types.Namespace
  67. if err := json.NewDecoder(resp.Body).Decode(&namespace); err != nil {
  68. return nil, err
  69. }
  70. return &namespace, nil
  71. }
  72. // NamespaceUpdate updates a namespace on the server and returns the updated object.
  73. func (c *Client) NamespaceUpdate(opts types.NamespaceCreateOptions) (*types.Namespace, error) {
  74. resp, err := c.do("PUT", NamespaceAPIPrefix+"/"+opts.Name, doOptions{
  75. data: opts,
  76. context: opts.Context,
  77. })
  78. if err != nil {
  79. return nil, err
  80. }
  81. var namespace types.Namespace
  82. if err := json.NewDecoder(resp.Body).Decode(&namespace); err != nil {
  83. return nil, err
  84. }
  85. return &namespace, nil
  86. }
  87. // NamespaceDelete removes a namespace by its reference.
  88. func (c *Client) NamespaceDelete(opts types.DeleteOptions) error {
  89. deleteOpts := doOptions{
  90. force: opts.Force,
  91. context: opts.Context,
  92. }
  93. resp, err := c.do("DELETE", NamespaceAPIPrefix+"/"+opts.Name, deleteOpts)
  94. if err != nil {
  95. if e, ok := err.(*Error); ok {
  96. if e.Status == http.StatusNotFound {
  97. return ErrNoSuchNamespace
  98. }
  99. if e.Status == http.StatusConflict {
  100. return ErrNamespaceInUse
  101. }
  102. // namespace can't be deleted yet, unless force is supplied
  103. if e.Status == http.StatusPreconditionFailed {
  104. return err
  105. }
  106. }
  107. return err
  108. }
  109. defer resp.Body.Close()
  110. return nil
  111. }