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  }