user.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package storageos
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "net/http"
  8. "net/url"
  9. "github.com/storageos/go-api/types"
  10. )
  11. var (
  12. // UserAPIPrefix is a partial path to the HTTP endpoint.
  13. UserAPIPrefix = "users"
  14. // ErrNoSuchUser is the error returned when the user does not exist.
  15. ErrNoSuchUser = errors.New("no such user")
  16. )
  17. // UserList returns the list of available users.
  18. func (c *Client) UserList(opts types.ListOptions) ([]*types.User, 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", UserAPIPrefix, listOpts)
  31. if err != nil {
  32. return nil, err
  33. }
  34. defer resp.Body.Close()
  35. users := make([]*types.User, 0)
  36. if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
  37. return nil, err
  38. }
  39. return users, nil
  40. }
  41. // User returns a user by its username/id.
  42. func (c *Client) User(username string) (*types.User, error) {
  43. path := fmt.Sprintf("%s/%s", UserAPIPrefix, username)
  44. resp, err := c.do("GET", path, doOptions{})
  45. if err != nil {
  46. if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
  47. return nil, ErrNoSuchUser
  48. }
  49. return nil, err
  50. }
  51. defer resp.Body.Close()
  52. var user *types.User
  53. if err := json.NewDecoder(resp.Body).Decode(&user); err != nil {
  54. return nil, err
  55. }
  56. return user, nil
  57. }
  58. // UserCreate creates a user on the server.
  59. func (c *Client) UserCreate(opts types.UserCreateOptions) error {
  60. _, err := c.do("POST", UserAPIPrefix, doOptions{
  61. data: opts,
  62. context: opts.Context,
  63. })
  64. return err
  65. }
  66. // UserUpdate updates a user on the server.
  67. func (c *Client) UserUpdate(user *types.User, ctx context.Context) error {
  68. var ref string
  69. switch {
  70. case user.UUID != "":
  71. ref = user.UUID
  72. case user.Username != "":
  73. ref = user.Username
  74. default:
  75. return ErrNoSuchUser
  76. }
  77. path := fmt.Sprintf("%s/%s", UserAPIPrefix, ref)
  78. resp, err := c.do("POST", path, doOptions{
  79. data: user,
  80. context: ctx,
  81. })
  82. if err != nil {
  83. if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
  84. return ErrNoSuchUser
  85. }
  86. return err
  87. }
  88. defer resp.Body.Close()
  89. return nil
  90. }
  91. // UserDelete removes a user by its reference.
  92. func (c *Client) UserDelete(opts types.DeleteOptions) error {
  93. resp, err := c.do("DELETE", UserAPIPrefix+"/"+opts.Name, doOptions{})
  94. if err != nil {
  95. if e, ok := err.(*Error); ok {
  96. if e.Status == http.StatusNotFound {
  97. return ErrNoSuchUser
  98. }
  99. }
  100. return err
  101. }
  102. defer resp.Body.Close()
  103. return nil
  104. }