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  }