| package users |
| |
| import ( |
| "github.com/gophercloud/gophercloud" |
| "github.com/gophercloud/gophercloud/pagination" |
| ) |
| |
| // List lists the existing users. |
| func List(client *gophercloud.ServiceClient) pagination.Pager { |
| createPage := func(r pagination.PageResult) pagination.Page { |
| return UserPage{pagination.SinglePageBase(r)} |
| } |
| |
| return pagination.NewPager(client, rootURL(client), createPage) |
| } |
| |
| // EnabledState represents whether the user is enabled or not. |
| type EnabledState *bool |
| |
| // Useful variables to use when creating or updating users. |
| var ( |
| iTrue = true |
| iFalse = false |
| |
| Enabled EnabledState = &iTrue |
| Disabled EnabledState = &iFalse |
| ) |
| |
| // CommonOpts are the parameters that are shared between CreateOpts and |
| // UpdateOpts |
| type CommonOpts struct { |
| // Either a name or username is required. When provided, the value must be |
| // unique or a 409 conflict error will be returned. If you provide a name but |
| // omit a username, the latter will be set to the former; and vice versa. |
| Name, Username string |
| |
| // The ID of the tenant to which you want to assign this user. |
| TenantID string |
| |
| // Indicates whether this user is enabled or not. |
| Enabled EnabledState |
| |
| // The email address of this user. |
| Email string |
| } |
| |
| // CreateOpts represents the options needed when creating new users. |
| type CreateOpts CommonOpts |
| |
| // CreateOptsBuilder describes struct types that can be accepted by the Create call. |
| type CreateOptsBuilder interface { |
| ToUserCreateMap() (map[string]interface{}, error) |
| } |
| |
| // ToUserCreateMap assembles a request body based on the contents of a CreateOpts. |
| func (opts CreateOpts) ToUserCreateMap() (map[string]interface{}, error) { |
| m := make(map[string]interface{}) |
| |
| if opts.Name == "" && opts.Username == "" { |
| err := gophercloud.ErrMissingInput{} |
| err.Function = "users.ToUserCreateMap" |
| err.Argument = "users.CreateOpts.Name/users.CreateOpts.Username" |
| err.Info = "Either a Name or Username must be provided" |
| return m, err |
| } |
| |
| if opts.Name != "" { |
| m["name"] = opts.Name |
| } |
| if opts.Username != "" { |
| m["username"] = opts.Username |
| } |
| if opts.Enabled != nil { |
| m["enabled"] = &opts.Enabled |
| } |
| if opts.Email != "" { |
| m["email"] = opts.Email |
| } |
| if opts.TenantID != "" { |
| m["tenant_id"] = opts.TenantID |
| } |
| |
| return map[string]interface{}{"user": m}, nil |
| } |
| |
| // Create is the operation responsible for creating new users. |
| func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult { |
| var res CreateResult |
| |
| reqBody, err := opts.ToUserCreateMap() |
| if err != nil { |
| res.Err = err |
| return res |
| } |
| |
| _, res.Err = client.Post(rootURL(client), reqBody, &res.Body, &gophercloud.RequestOpts{ |
| OkCodes: []int{200, 201}, |
| }) |
| |
| return res |
| } |
| |
| // Get requests details on a single user, either by ID. |
| func Get(client *gophercloud.ServiceClient, id string) GetResult { |
| var result GetResult |
| _, result.Err = client.Get(ResourceURL(client, id), &result.Body, nil) |
| return result |
| } |
| |
| // UpdateOptsBuilder allows extensions to add additional attributes to the Update request. |
| type UpdateOptsBuilder interface { |
| ToUserUpdateMap() map[string]interface{} |
| } |
| |
| // UpdateOpts specifies the base attributes that may be updated on an existing server. |
| type UpdateOpts CommonOpts |
| |
| // ToUserUpdateMap formats an UpdateOpts structure into a request body. |
| func (opts UpdateOpts) ToUserUpdateMap() map[string]interface{} { |
| m := make(map[string]interface{}) |
| |
| if opts.Name != "" { |
| m["name"] = opts.Name |
| } |
| if opts.Username != "" { |
| m["username"] = opts.Username |
| } |
| if opts.Enabled != nil { |
| m["enabled"] = &opts.Enabled |
| } |
| if opts.Email != "" { |
| m["email"] = opts.Email |
| } |
| if opts.TenantID != "" { |
| m["tenant_id"] = opts.TenantID |
| } |
| |
| return map[string]interface{}{"user": m} |
| } |
| |
| // Update is the operation responsible for updating exist users by their UUID. |
| func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult { |
| var result UpdateResult |
| reqBody := opts.ToUserUpdateMap() |
| _, result.Err = client.Put(ResourceURL(client, id), reqBody, &result.Body, &gophercloud.RequestOpts{ |
| OkCodes: []int{200}, |
| }) |
| return result |
| } |
| |
| // Delete is the operation responsible for permanently deleting an API user. |
| func Delete(client *gophercloud.ServiceClient, id string) DeleteResult { |
| var result DeleteResult |
| _, result.Err = client.Delete(ResourceURL(client, id), nil) |
| return result |
| } |
| |
| // ListRoles lists the existing roles that can be assigned to users. |
| func ListRoles(client *gophercloud.ServiceClient, tenantID, userID string) pagination.Pager { |
| createPage := func(r pagination.PageResult) pagination.Page { |
| return RolePage{pagination.SinglePageBase(r)} |
| } |
| |
| return pagination.NewPager(client, listRolesURL(client, tenantID, userID), createPage) |
| } |