github.com/go-chef/chef@v0.30.1/user.go (about) 1 package chef 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type UserService struct { 9 client *Client 10 } 11 12 // User represents the native Go version of the deserialized User type 13 type User struct { 14 UserName string `json:"username,omitempty"` // V1 uses username instead of V0 name 15 DisplayName string `json:"display_name,omitempty"` 16 Email string `json:"email,omitempty"` 17 ExternalAuthenticationUid string `json:"external_authentication_uid,omitempty"` // Specify this or password 18 FirstName string `json:"first_name,omitempty"` 19 LastName string `json:"last_name,omitempty"` 20 MiddleName string `json:"middle_name,omitempty"` 21 Password string `json:"password,omitempty"` // Valid password 22 CreateKey bool `json:"create_key,omitempty"` // Cannot be passed with PublicKey 23 PublicKey string `json:"public_key,omitempty"` // Cannot be passed with CreateKey 24 RecoveryAuthenticationEnabled bool `json:"recovery_authentication_enabled,omitempty"` 25 } 26 27 type UserResult struct { 28 Uri string `json:"uri,omitempty"` 29 ChefKey ChefKey `json:"chef_key,omitempty"` 30 } 31 32 type UserVerboseResult struct { 33 Email string `json:"email,omitempty"` 34 FirstName string `json:"first_name,omitempty"` 35 LastName string `json:"last_name,omitempty"` 36 } 37 38 // List lists the users in the Chef server. 39 // /users GET 40 // Chef API docs: https://docs.chef.io/api_chef_server.html#users 41 func (e *UserService) List(filters ...string) (userlist map[string]string, err error) { 42 url := "users" 43 if len(filters) > 0 { 44 url += "?" + strings.Join(filters, "&") 45 } 46 err = e.client.magicRequestDecoder("GET", url, nil, &userlist) 47 return 48 } 49 50 // VerboseList lists the users in the Chef server in verbose format. 51 // /users GET 52 // Chef API docs: https://docs.chef.io/api_chef_server.html#users 53 func (e *UserService) VerboseList(filters ...string) (userlist map[string]UserVerboseResult, err error) { 54 url := "users" 55 filters = append(filters, "verbose=true") 56 if len(filters) > 0 { 57 url += "?" + strings.Join(filters, "&") 58 } 59 err = e.client.magicRequestDecoder("GET", url, nil, &userlist) 60 return 61 } 62 63 // Create Creates a User on the chef server 64 // /users POST 65 // 66 // 201 = success 67 // 400 - invalid (missing display_name, email,( password or external) among other things) 68 // username must be lower case without spaces 69 // 403 - unauthorized 70 // 409 - already exists 71 // 72 // Chef API docs: https://docs.chef.io/api_chef_server.html#users 73 func (e *UserService) Create(user User) (data UserResult, err error) { 74 body, err := JSONReader(user) 75 if err != nil { 76 return 77 } 78 79 err = e.client.magicRequestDecoder("POST", "users", body, &data) 80 return 81 } 82 83 // Delete removes a user on the Chef server 84 // /users/USERNAME DELETE 85 // 86 // 200 - deleted 87 // 401 - not authenticated 88 // 403 - not authorized 89 // 404 - not found 90 // 91 // Chef API docs: https://docs.chef.io/api_chef_server.html#users-name 92 func (e *UserService) Delete(name string) (err error) { 93 err = e.client.magicRequestDecoder("DELETE", "users/"+name, nil, nil) 94 return 95 } 96 97 // Get gets a user from the Chef server. 98 // /users/USERNAME GET 99 // 200 - got it 100 // 401 - not authenticated 101 // 403 - not authorized 102 // 404 - user doesn't exist 103 // 104 // Chef API docs: https://docs.chef.io/api_chef_server.html#users-name 105 func (e *UserService) Get(name string) (user User, err error) { 106 url := fmt.Sprintf("users/%s", name) 107 err = e.client.magicRequestDecoder("GET", url, nil, &user) 108 return 109 } 110 111 // Update updates a user on the Chef server. 112 // /users/USERNAME PUT 113 // 200 - updated 114 // 401 - not authenticated 115 // 403 - not authorized 116 // 404 - user doesn't exist 117 // 409 - new user name is already in use 118 // 119 // Chef API docs: https://docs.chef.io/api_chef_server.html#users-name 120 func (e *UserService) Update(name string, user User) (userUpdate UserResult, err error) { 121 url := fmt.Sprintf("users/%s", name) 122 body, err := JSONReader(user) 123 err = e.client.magicRequestDecoder("PUT", url, body, &userUpdate) 124 return 125 } 126 127 // ListKeys gets all the keys for a user. 128 // /users/USERNAME/keys GET 129 // 200 - successful 130 // 401 - not authenticated 131 // 403 - not authorized 132 // 404 - user doesn't exist 133 // 134 // Chef API docs: https://docs.chef.io/api_chef_server/#usersuserkeys 135 func (e *UserService) ListKeys(name string) (userkeys []KeyItem, err error) { 136 url := fmt.Sprintf("users/%s/keys", name) 137 err = e.client.magicRequestDecoder("GET", url, nil, &userkeys) 138 return 139 } 140 141 // AddKey add a key for a user on the Chef server. 142 // /users/USERNAME/keys POST 143 // 201 - created 144 // 401 - not authenticated 145 // 403 - not authorized 146 // 404 - user doesn't exist 147 // 409 - new name is already in use 148 // 149 // Chef API docs: https://docs.chef.io/api_chef_server.html#users-name 150 func (e *UserService) AddKey(name string, keyadd AccessKey) (key KeyItem, err error) { 151 url := fmt.Sprintf("users/%s/keys", name) 152 body, err := JSONReader(keyadd) 153 err = e.client.magicRequestDecoder("POST", url, body, &key) 154 return 155 } 156 157 // DeleteKey delete a key for a user. 158 // /users/USERNAME/keys/KEYNAME DELETE 159 // 200 - successful 160 // 401 - not authenticated 161 // 403 - not authorized 162 // 404 - user doesn't exist 163 // 164 // Chef API docs: https://docs.chef.io/api_chef_server/#usersuserkeys 165 func (e *UserService) DeleteKey(name string, keyname string) (key AccessKey, err error) { 166 url := fmt.Sprintf("users/%s/keys/%s", name, keyname) 167 err = e.client.magicRequestDecoder("DELETE", url, nil, &key) 168 return 169 } 170 171 // GetKey gets a key for a user. 172 // /users/USERNAME/keys/KEYNAME GET 173 // 200 - successful 174 // 401 - not authenticated 175 // 403 - not authorized 176 // 404 - user doesn't exist 177 // 178 // Chef API docs: https://docs.chef.io/api_chef_server/#usersuserkeys 179 func (e *UserService) GetKey(name string, keyname string) (key AccessKey, err error) { 180 url := fmt.Sprintf("users/%s/keys/%s", name, keyname) 181 err = e.client.magicRequestDecoder("GET", url, nil, &key) 182 return 183 } 184 185 // UpdateKey updates a key for a user. 186 // /users/USERNAME/keys/KEYNAME PUT 187 // 200 - successful 188 // 401 - not authenticated 189 // 403 - not authorized 190 // 404 - user doesn't exist 191 // 192 // Chef API docs: https://docs.chef.io/api_chef_server/#usersuserkeys 193 func (e *UserService) UpdateKey(username string, keyname string, keyUp AccessKey) (userkey AccessKey, err error) { 194 url := fmt.Sprintf("users/%s/keys/%s", username, keyname) 195 body, err := JSONReader(keyUp) 196 err = e.client.magicRequestDecoder("PUT", url, body, &userkey) 197 return 198 }