github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv2/organization.go (about) 1 package ccv2 2 3 import ( 4 "bytes" 5 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant" 6 "encoding/json" 7 "fmt" 8 "net/url" 9 10 "code.cloudfoundry.org/cli/api/cloudcontroller" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 12 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/internal" 13 ) 14 15 // Organization represents a Cloud Controller Organization. 16 type Organization struct { 17 // GUID is the unique Organization identifier. 18 GUID string 19 20 // Name is the organization's name. 21 Name string 22 23 // QuotaDefinitionGUID is unique identifier of the quota assigned to this 24 // organization. 25 QuotaDefinitionGUID string 26 27 // DefaultIsolationSegmentGUID is the unique identifier of the isolation 28 // segment this organization is tagged with. 29 DefaultIsolationSegmentGUID string 30 } 31 32 // UnmarshalJSON helps unmarshal a Cloud Controller Organization response. 33 func (org *Organization) UnmarshalJSON(data []byte) error { 34 var ccOrg struct { 35 Metadata internal.Metadata `json:"metadata"` 36 Entity struct { 37 Name string `json:"name"` 38 QuotaDefinitionGUID string `json:"quota_definition_guid,omitempty"` 39 DefaultIsolationSegmentGUID string `json:"default_isolation_segment_guid"` 40 } `json:"entity"` 41 } 42 err := cloudcontroller.DecodeJSON(data, &ccOrg) 43 if err != nil { 44 return err 45 } 46 47 org.GUID = ccOrg.Metadata.GUID 48 org.Name = ccOrg.Entity.Name 49 org.QuotaDefinitionGUID = ccOrg.Entity.QuotaDefinitionGUID 50 org.DefaultIsolationSegmentGUID = ccOrg.Entity.DefaultIsolationSegmentGUID 51 return nil 52 } 53 54 type createOrganizationRequestBody struct { 55 Name string `json:"name,omitempty"` 56 QuotaDefinitionGUID string `json:"quota_definition_guid,omitempty"` 57 } 58 59 func (client *Client) CreateOrganization(orgName string, quotaGUID string) (Organization, Warnings, error) { 60 requestBody := createOrganizationRequestBody{ 61 Name: orgName, 62 QuotaDefinitionGUID: quotaGUID, 63 } 64 65 bodyBytes, err := json.Marshal(requestBody) 66 if err != nil { 67 return Organization{}, nil, err 68 } 69 70 request, err := client.newHTTPRequest(requestOptions{ 71 RequestName: internal.PostOrganizationRequest, 72 Body: bytes.NewReader(bodyBytes), 73 }) 74 75 if err != nil { 76 return Organization{}, nil, err 77 } 78 79 var org Organization 80 response := cloudcontroller.Response{ 81 DecodeJSONResponseInto: &org, 82 } 83 84 err = client.connection.Make(request, &response) 85 return org, response.Warnings, err 86 } 87 88 // DeleteOrganization deletes the Organization associated with the provided 89 // GUID. It will return the Cloud Controller job that is assigned to the 90 // Organization deletion. 91 func (client *Client) DeleteOrganization(guid string) (Job, Warnings, error) { 92 request, err := client.newHTTPRequest(requestOptions{ 93 RequestName: internal.DeleteOrganizationRequest, 94 URIParams: Params{"organization_guid": guid}, 95 Query: url.Values{ 96 "recursive": {"true"}, 97 "async": {"true"}, 98 }, 99 }) 100 if err != nil { 101 return Job{}, nil, err 102 } 103 104 var job Job 105 response := cloudcontroller.Response{ 106 DecodeJSONResponseInto: &job, 107 } 108 109 err = client.connection.Make(request, &response) 110 return job, response.Warnings, err 111 } 112 113 // GetOrganization returns an Organization associated with the provided GUID. 114 func (client *Client) GetOrganization(guid string) (Organization, Warnings, error) { 115 request, err := client.newHTTPRequest(requestOptions{ 116 RequestName: internal.GetOrganizationRequest, 117 URIParams: Params{"organization_guid": guid}, 118 }) 119 if err != nil { 120 return Organization{}, nil, err 121 } 122 123 var org Organization 124 response := cloudcontroller.Response{ 125 DecodeJSONResponseInto: &org, 126 } 127 128 err = client.connection.Make(request, &response) 129 return org, response.Warnings, err 130 } 131 132 // GetOrganizations returns back a list of Organizations based off of the 133 // provided filters. 134 func (client *Client) GetOrganizations(filters ...Filter) ([]Organization, Warnings, error) { 135 allQueries := ConvertFilterParameters(filters) 136 allQueries.Add("order-by", "name") 137 request, err := client.newHTTPRequest(requestOptions{ 138 RequestName: internal.GetOrganizationsRequest, 139 Query: allQueries, 140 }) 141 142 if err != nil { 143 return nil, nil, err 144 } 145 146 var fullOrgsList []Organization 147 warnings, err := client.paginate(request, Organization{}, func(item interface{}) error { 148 if org, ok := item.(Organization); ok { 149 fullOrgsList = append(fullOrgsList, org) 150 } else { 151 return ccerror.UnknownObjectInListError{ 152 Expected: Organization{}, 153 Unexpected: item, 154 } 155 } 156 return nil 157 }) 158 159 return fullOrgsList, warnings, err 160 } 161 162 type updateOrgManagerByUsernameRequestBody struct { 163 Username string `json:"username"` 164 } 165 166 // UpdateOrganizationManager assigns the org manager role to the UAA user or client with the provided ID. 167 func (client *Client) UpdateOrganizationManager(guid string, uaaID string) (Warnings, error) { 168 request, err := client.newHTTPRequest(requestOptions{ 169 RequestName: internal.PutOrganizationManagerRequest, 170 URIParams: Params{"organization_guid": guid, "manager_guid": uaaID}, 171 }) 172 if err != nil { 173 return nil, err 174 } 175 176 response := cloudcontroller.Response{} 177 err = client.connection.Make(request, &response) 178 179 return response.Warnings, err 180 } 181 182 // UpdateOrganizationManagerByUsername assigns the org manager role to the user with the provided name. 183 func (client *Client) UpdateOrganizationManagerByUsername(guid string, username string) (Warnings, error) { 184 requestBody := updateOrgManagerByUsernameRequestBody{ 185 Username: username, 186 } 187 188 body, err := json.Marshal(requestBody) 189 if err != nil { 190 return nil, err 191 } 192 193 request, err := client.newHTTPRequest(requestOptions{ 194 RequestName: internal.PutOrganizationManagerByUsernameRequest, 195 Body: bytes.NewReader(body), 196 URIParams: Params{"organization_guid": guid}, 197 }) 198 if err != nil { 199 return nil, err 200 } 201 202 response := cloudcontroller.Response{} 203 err = client.connection.Make(request, &response) 204 205 return response.Warnings, err 206 } 207 208 // UpdateOrganizationBillingManagerByUsername assigns the org manager role to the user with the provided name. 209 func (client *Client) UpdateOrganizationBillingManagerByUsername(guid string, username string) (Warnings, error) { 210 requestBody := updateOrgManagerByUsernameRequestBody{ 211 Username: username, 212 } 213 214 body, err := json.Marshal(requestBody) 215 if err != nil { 216 return nil, err 217 } 218 219 request, err := client.newHTTPRequest(requestOptions{ 220 RequestName: internal.PutOrganizationBillingManagerByUsernameRequest, 221 Body: bytes.NewReader(body), 222 URIParams: Params{"organization_guid": guid}, 223 }) 224 if err != nil { 225 return nil, err 226 } 227 228 response := cloudcontroller.Response{} 229 err = client.connection.Make(request, &response) 230 231 return response.Warnings, err 232 } 233 234 // UpdateOrganizationAuditorByUsername assigns the org manager role to the user with the provided name. 235 func (client *Client) UpdateOrganizationAuditorByUsername(guid string, username string) (Warnings, error) { 236 requestBody := updateOrgManagerByUsernameRequestBody{ 237 Username: username, 238 } 239 240 body, err := json.Marshal(requestBody) 241 if err != nil { 242 return nil, err 243 } 244 245 request, err := client.newHTTPRequest(requestOptions{ 246 RequestName: internal.PutOrganizationAuditorByUsernameRequest, 247 Body: bytes.NewReader(body), 248 URIParams: Params{"organization_guid": guid}, 249 }) 250 if err != nil { 251 return nil, err 252 } 253 254 response := cloudcontroller.Response{} 255 err = client.connection.Make(request, &response) 256 257 return response.Warnings, err 258 } 259 260 // UpdateOrganizationUser makes the user or client with the given UAA ID a 261 // member of the org. 262 func (client *Client) UpdateOrganizationUser(guid string, uaaID string) (Warnings, error) { 263 request, err := client.newHTTPRequest(requestOptions{ 264 RequestName: internal.PutOrganizationUserRequest, 265 URIParams: Params{"organization_guid": guid, "user_guid": uaaID}, 266 }) 267 if err != nil { 268 return nil, err 269 } 270 271 response := cloudcontroller.Response{} 272 err = client.connection.Make(request, &response) 273 274 return response.Warnings, err 275 } 276 277 type updateOrgUserByUsernameRequestBody struct { 278 Username string `json:"username"` 279 } 280 281 // UpdateOrganizationUserByUsername makes the user with the given username a member of 282 // the org. 283 func (client Client) UpdateOrganizationUserByUsername(orgGUID string, username string) (Warnings, error) { 284 requestBody := updateOrgUserByUsernameRequestBody{ 285 Username: username, 286 } 287 288 body, err := json.Marshal(requestBody) 289 if err != nil { 290 return Warnings{}, err 291 } 292 293 request, err := client.newHTTPRequest(requestOptions{ 294 RequestName: internal.PutOrganizationUserByUsernameRequest, 295 Body: bytes.NewReader(body), 296 URIParams: Params{"organization_guid": orgGUID}, 297 }) 298 if err != nil { 299 return Warnings{}, err 300 } 301 302 response := cloudcontroller.Response{} 303 err = client.connection.Make(request, &response) 304 305 return response.Warnings, err 306 } 307 308 // UpdateOrganization updates the organization with the given GUID. 309 func (client *Client) UpdateOrganization(orgGuid, orgName, quotaGUID string) (Organization, Warnings, error) { 310 requestBody := createOrganizationRequestBody{ 311 Name: orgName, 312 QuotaDefinitionGUID: quotaGUID, 313 } 314 315 bodyBytes, err := json.Marshal(requestBody) 316 if err != nil { 317 return Organization{}, nil, err 318 } 319 320 request, err := client.newHTTPRequest(requestOptions{ 321 RequestName: internal.PutOrganizationRequest, 322 URIParams: Params{"organization_guid": orgGuid}, 323 Body: bytes.NewReader(bodyBytes), 324 }) 325 if err != nil { 326 return Organization{}, nil, err 327 } 328 329 var updatedObj Organization 330 response := cloudcontroller.Response{ 331 DecodeJSONResponseInto: &updatedObj, 332 } 333 334 err = client.connection.Make(request, &response) 335 return updatedObj, response.Warnings, err 336 } 337 338 // GetOrganizationUsersByRole find all users for an org by role . 339 // (Only available roles: OrgManager, BillingManager and OrgAuditor) 340 func (client *Client) GetOrganizationUsersByRole(role constant.UserRole, guid string) ([]User, Warnings, error) { 341 requestName := "" 342 switch role { 343 case constant.OrgManager: 344 requestName = internal.GetOrganizationManagersRequest 345 case constant.BillingManager: 346 requestName = internal.GetOrganizationBillingManagersRequest 347 case constant.OrgAuditor: 348 requestName = internal.GetOrganizationAuditorsRequest 349 case constant.OrgUser: 350 requestName = internal.GetOrganizationUsersRequest 351 default: 352 return []User{}, Warnings{}, fmt.Errorf("Not a valid role, it must be one of OrgManager, BillingManager and OrgAuditor") 353 } 354 request, err := client.newHTTPRequest(requestOptions{ 355 RequestName: requestName, 356 URIParams: Params{"organization_guid": guid}, 357 }) 358 if err != nil { 359 return []User{}, nil, err 360 } 361 362 var fullUsersList []User 363 warnings, err := client.paginate(request, User{}, func(item interface{}) error { 364 if user, ok := item.(User); ok { 365 fullUsersList = append(fullUsersList, user) 366 } else { 367 return ccerror.UnknownObjectInListError{ 368 Expected: User{}, 369 Unexpected: item, 370 } 371 } 372 return nil 373 }) 374 375 return fullUsersList, warnings, err 376 } 377 378 // GetOrganizationUsers find all users for an org . 379 func (client *Client) GetOrganizationUsers(guid string) ([]User, Warnings, error) { 380 request, err := client.newHTTPRequest(requestOptions{ 381 RequestName: internal.GetOrganizationUsersRequest, 382 URIParams: Params{"organization_guid": guid}, 383 }) 384 if err != nil { 385 return []User{}, nil, err 386 } 387 388 var fullUsersList []User 389 warnings, err := client.paginate(request, User{}, func(item interface{}) error { 390 if user, ok := item.(User); ok { 391 fullUsersList = append(fullUsersList, user) 392 } else { 393 return ccerror.UnknownObjectInListError{ 394 Expected: User{}, 395 Unexpected: item, 396 } 397 } 398 return nil 399 }) 400 401 return fullUsersList, warnings, err 402 } 403 404 // UpdateOrganizationUserByRole makes the user or client with the given UAA ID a 405 // member of this role in the org . (Only available: OrgManager, BillingManager and OrgAuditor) 406 func (client *Client) UpdateOrganizationUserByRole(role constant.UserRole, guid string, uaaID string) (Warnings, error) { 407 paramUserKey := "" 408 requestName := "" 409 switch role { 410 case constant.OrgManager: 411 paramUserKey = "manager_guid" 412 requestName = internal.PutOrganizationManagerRequest 413 case constant.BillingManager: 414 paramUserKey = "billing_manager_guid" 415 requestName = internal.PutOrganizationBillingManagerRequest 416 case constant.OrgAuditor: 417 paramUserKey = "auditor_guid" 418 requestName = internal.PutOrganizationAuditorRequest 419 case constant.OrgUser: 420 paramUserKey = "user_guid" 421 requestName = internal.PutOrganizationUserRequest 422 default: 423 return Warnings{}, fmt.Errorf("Not a valid role, it must be one of OrgManager, BillingManager, OrgAuditor and OrgUser") 424 } 425 request, err := client.newHTTPRequest(requestOptions{ 426 RequestName: requestName, 427 URIParams: Params{"organization_guid": guid, paramUserKey: uaaID}, 428 }) 429 if err != nil { 430 return nil, err 431 } 432 433 response := cloudcontroller.Response{} 434 err = client.connection.Make(request, &response) 435 436 return response.Warnings, err 437 } 438 439 // DeleteOrganizationUserByRole remove the user or client with the given UAA ID a 440 // member of this role in the org . (Only available: OrgManager, BillingManager and OrgAuditor) 441 func (client *Client) DeleteOrganizationUserByRole(role constant.UserRole, guid string, uaaID string) (Warnings, error) { 442 paramUserKey := "" 443 requestName := "" 444 switch role { 445 case constant.OrgManager: 446 paramUserKey = "manager_guid" 447 requestName = internal.DeleteOrganizationManagerRequest 448 case constant.BillingManager: 449 paramUserKey = "billing_manager_guid" 450 requestName = internal.DeleteOrganizationBillingManagerRequest 451 case constant.OrgAuditor: 452 paramUserKey = "auditor_guid" 453 requestName = internal.DeleteOrganizationAuditorRequest 454 case constant.OrgUser: 455 paramUserKey = "user_guid" 456 requestName = internal.DeleteOrganizationUserRequest 457 default: 458 return Warnings{}, fmt.Errorf("Not a valid role, it must be one of OrgManager, BillingManager and OrgAuditor") 459 } 460 request, err := client.newHTTPRequest(requestOptions{ 461 RequestName: requestName, 462 URIParams: Params{"organization_guid": guid, paramUserKey: uaaID}, 463 }) 464 if err != nil { 465 return nil, err 466 } 467 468 response := cloudcontroller.Response{} 469 err = client.connection.Make(request, &response) 470 471 return response.Warnings, err 472 } 473 474 // DeleteOrganizationUserByUsername revoke the user with the given username a member of 475 // the org. 476 func (client Client) DeleteOrganizationUserByUsername(orgGUID string, username string) (Warnings, error) { 477 requestBody := updateOrgUserByUsernameRequestBody{ 478 Username: username, 479 } 480 481 body, err := json.Marshal(requestBody) 482 if err != nil { 483 return Warnings{}, err 484 } 485 486 request, err := client.newHTTPRequest(requestOptions{ 487 RequestName: internal.DeleteOrganizationUserByUsernameRequest, 488 Body: bytes.NewReader(body), 489 URIParams: Params{"organization_guid": orgGUID}, 490 }) 491 if err != nil { 492 return Warnings{}, err 493 } 494 495 response := cloudcontroller.Response{} 496 err = client.connection.Make(request, &response) 497 498 return response.Warnings, err 499 } 500 501 // DeleteOrganizationBillingManagerByUsername revoke the user with the given username a member of 502 // the org. 503 func (client Client) DeleteOrganizationBillingManagerByUsername(orgGUID string, username string) (Warnings, error) { 504 requestBody := updateOrgUserByUsernameRequestBody{ 505 Username: username, 506 } 507 508 body, err := json.Marshal(requestBody) 509 if err != nil { 510 return Warnings{}, err 511 } 512 513 request, err := client.newHTTPRequest(requestOptions{ 514 RequestName: internal.DeleteOrganizationBillingManagerByUsernameRequest, 515 Body: bytes.NewReader(body), 516 URIParams: Params{"organization_guid": orgGUID}, 517 }) 518 if err != nil { 519 return Warnings{}, err 520 } 521 522 response := cloudcontroller.Response{} 523 err = client.connection.Make(request, &response) 524 525 return response.Warnings, err 526 } 527 528 // DeleteOrganizationAuditorByUsername revoke the user with the given username a member of 529 // the org. 530 func (client Client) DeleteOrganizationAuditorByUsername(orgGUID string, username string) (Warnings, error) { 531 requestBody := updateOrgUserByUsernameRequestBody{ 532 Username: username, 533 } 534 535 body, err := json.Marshal(requestBody) 536 if err != nil { 537 return Warnings{}, err 538 } 539 540 request, err := client.newHTTPRequest(requestOptions{ 541 RequestName: internal.DeleteOrganizationAuditorByUsernameRequest, 542 Body: bytes.NewReader(body), 543 URIParams: Params{"organization_guid": orgGUID}, 544 }) 545 if err != nil { 546 return Warnings{}, err 547 } 548 549 response := cloudcontroller.Response{} 550 err = client.connection.Make(request, &response) 551 552 return response.Warnings, err 553 } 554 555 // DeleteOrganizationManagerByUsername revoke the user with the given username a member of 556 // the org. 557 func (client Client) DeleteOrganizationManagerByUsername(orgGUID string, username string) (Warnings, error) { 558 requestBody := updateOrgUserByUsernameRequestBody{ 559 Username: username, 560 } 561 562 body, err := json.Marshal(requestBody) 563 if err != nil { 564 return Warnings{}, err 565 } 566 567 request, err := client.newHTTPRequest(requestOptions{ 568 RequestName: internal.DeleteOrganizationManagerByUsernameRequest, 569 Body: bytes.NewReader(body), 570 URIParams: Params{"organization_guid": orgGUID}, 571 }) 572 if err != nil { 573 return Warnings{}, err 574 } 575 576 response := cloudcontroller.Response{} 577 err = client.connection.Make(request, &response) 578 579 return response.Warnings, err 580 }