123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package storageos
- import (
- "context"
- "encoding/json"
- "errors"
- "fmt"
- "net/http"
- "net/url"
- "github.com/storageos/go-api/types"
- )
- var (
- // UserAPIPrefix is a partial path to the HTTP endpoint.
- UserAPIPrefix = "users"
- // ErrNoSuchUser is the error returned when the user does not exist.
- ErrNoSuchUser = errors.New("no such user")
- )
- // UserList returns the list of available users.
- func (c *Client) UserList(opts types.ListOptions) ([]*types.User, error) {
- listOpts := doOptions{
- fieldSelector: opts.FieldSelector,
- labelSelector: opts.LabelSelector,
- namespace: opts.Namespace,
- context: opts.Context,
- }
- if opts.LabelSelector != "" {
- query := url.Values{}
- query.Add("labelSelector", opts.LabelSelector)
- listOpts.values = query
- }
- resp, err := c.do("GET", UserAPIPrefix, listOpts)
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
- users := make([]*types.User, 0)
- if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
- return nil, err
- }
- return users, nil
- }
- // User returns a user by its username/id.
- func (c *Client) User(username string) (*types.User, error) {
- path := fmt.Sprintf("%s/%s", UserAPIPrefix, username)
- resp, err := c.do("GET", path, doOptions{})
- if err != nil {
- if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
- return nil, ErrNoSuchUser
- }
- return nil, err
- }
- defer resp.Body.Close()
- var user *types.User
- if err := json.NewDecoder(resp.Body).Decode(&user); err != nil {
- return nil, err
- }
- return user, nil
- }
- // UserCreate creates a user on the server.
- func (c *Client) UserCreate(opts types.UserCreateOptions) error {
- _, err := c.do("POST", UserAPIPrefix, doOptions{
- data: opts,
- context: opts.Context,
- })
- return err
- }
- // UserUpdate updates a user on the server.
- func (c *Client) UserUpdate(user *types.User, ctx context.Context) error {
- var ref string
- switch {
- case user.UUID != "":
- ref = user.UUID
- case user.Username != "":
- ref = user.Username
- default:
- return ErrNoSuchUser
- }
- path := fmt.Sprintf("%s/%s", UserAPIPrefix, ref)
- resp, err := c.do("POST", path, doOptions{
- data: user,
- context: ctx,
- })
- if err != nil {
- if e, ok := err.(*Error); ok && e.Status == http.StatusNotFound {
- return ErrNoSuchUser
- }
- return err
- }
- defer resp.Body.Close()
- return nil
- }
- // UserDelete removes a user by its reference.
- func (c *Client) UserDelete(opts types.DeleteOptions) error {
- resp, err := c.do("DELETE", UserAPIPrefix+"/"+opts.Name, doOptions{})
- if err != nil {
- if e, ok := err.(*Error); ok {
- if e.Status == http.StatusNotFound {
- return ErrNoSuchUser
- }
- }
- return err
- }
- defer resp.Body.Close()
- return nil
- }
|