blob: ae2acde643c0eb69eb0bf6e4d9cf5ac3433ec060 [file] [log] [blame]
Jamie Hannaford6e4d7952014-10-29 16:18:29 +01001package users
2
3import (
4 "errors"
5
6 "github.com/racker/perigee"
7 "github.com/rackspace/gophercloud"
8 os "github.com/rackspace/gophercloud/openstack/identity/v2/users"
9 "github.com/rackspace/gophercloud/pagination"
10)
11
12// List returns a pager that allows traversal over a collection of users.
13func List(client *gophercloud.ServiceClient) pagination.Pager {
14 return os.List(client)
15}
16
Alex Gaynor7b017d12014-10-31 11:13:41 -070017// CommonOpts are the options which are shared between CreateOpts and
18// UpdateOpts
19type CommonOpts struct {
Jamie Hannaford6e4d7952014-10-29 16:18:29 +010020 // Required. The username to assign to the user. When provided, the username
21 // must:
22 // - start with an alphabetical (A-Za-z) character
23 // - have a minimum length of 1 character
24 //
25 // The username may contain upper and lowercase characters, as well as any of
26 // the following special character: . - @ _
27 Username string
28
29 // Required. Email address for the user account.
30 Email string
31
32 // Required. Indicates whether the user can authenticate after the user
33 // account is created. If no value is specified, the default value is true.
34 Enabled os.EnabledState
35
36 // Optional. The password to assign to the user. If provided, the password
37 // must:
38 // - start with an alphabetical (A-Za-z) character
39 // - have a minimum length of 8 characters
40 // - contain at least one uppercase character, one lowercase character, and
41 // one numeric character.
42 //
43 // The password may contain any of the following special characters: . - @ _
44 Password string
45}
46
47// CreateOpts represents the options needed when creating new users.
Alex Gaynor7b017d12014-10-31 11:13:41 -070048type CreateOpts CommonOpts
Jamie Hannaford6e4d7952014-10-29 16:18:29 +010049
50// ToUserCreateMap assembles a request body based on the contents of a CreateOpts.
51func (opts CreateOpts) ToUserCreateMap() (map[string]interface{}, error) {
52 m := make(map[string]interface{})
53
54 if opts.Username == "" {
55 return m, errors.New("Username is a required field")
56 }
57 if opts.Enabled == nil {
58 return m, errors.New("Enabled is a required field")
59 }
60 if opts.Email == "" {
61 return m, errors.New("Email is a required field")
62 }
63
64 if opts.Username != "" {
65 m["username"] = opts.Username
66 }
67 if opts.Email != "" {
68 m["email"] = opts.Email
69 }
70 if opts.Enabled != nil {
71 m["enabled"] = opts.Enabled
72 }
73 if opts.Password != "" {
74 m["OS-KSADM:password"] = opts.Password
75 }
76
77 return map[string]interface{}{"user": m}, nil
78}
79
80// Create is the operation responsible for creating new users.
81func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) CreateResult {
82 return CreateResult{os.Create(client, opts)}
83}
84
85// Get requests details on a single user, either by ID.
86func Get(client *gophercloud.ServiceClient, id string) GetResult {
87 return GetResult{os.Get(client, id)}
88}
89
Alex Gaynorc6cc18f2014-10-31 13:48:58 -070090// UpdateOptsBuilder allows extensions to add additional attributes to the Update request.
Jamie Hannaford6e4d7952014-10-29 16:18:29 +010091type UpdateOptsBuilder interface {
92 ToUserUpdateMap() map[string]interface{}
93}
94
95// UpdateOpts specifies the base attributes that may be updated on an existing server.
Alex Gaynor7b017d12014-10-31 11:13:41 -070096type UpdateOpts CommonOpts
Jamie Hannaford6e4d7952014-10-29 16:18:29 +010097
98// ToUserUpdateMap formats an UpdateOpts structure into a request body.
99func (opts UpdateOpts) ToUserUpdateMap() map[string]interface{} {
100 m := make(map[string]interface{})
101
102 if opts.Username != "" {
103 m["username"] = opts.Username
104 }
105 if opts.Enabled != nil {
106 m["enabled"] = &opts.Enabled
107 }
108 if opts.Email != "" {
109 m["email"] = opts.Email
110 }
111
112 return map[string]interface{}{"user": m}
113}
114
115// Update is the operation responsible for updating exist users by their UUID.
116func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
117 var result UpdateResult
118
119 _, result.Err = perigee.Request("POST", os.ResourceURL(client, id), perigee.Options{
120 Results: &result.Body,
121 ReqBody: opts.ToUserUpdateMap(),
122 MoreHeaders: client.AuthenticatedHeaders(),
123 OkCodes: []int{200},
124 })
125
126 return result
127}
128
129// Delete is the operation responsible for permanently deleting an API user.
130func Delete(client *gophercloud.ServiceClient, id string) os.DeleteResult {
131 return os.Delete(client, id)
132}
Paul Quernafdc369a2014-10-31 11:50:20 -0700133
134// ResetAPIKey resets the User's API key.
135func ResetAPIKey(client *gophercloud.ServiceClient, id string) ResetAPIKeyResult {
136 var result ResetAPIKeyResult
137
138 _, result.Err = perigee.Request("POST", resetAPIKeyURL(client, id), perigee.Options{
139 Results: &result.Body,
140 MoreHeaders: client.AuthenticatedHeaders(),
141 OkCodes: []int{200},
142 })
143
144 return result
145}