github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv3/service_instance.go (about)

     1  package ccv3
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/internal"
     7  	"code.cloudfoundry.org/cli/resources"
     8  	"code.cloudfoundry.org/cli/types"
     9  	"code.cloudfoundry.org/cli/util/lookuptable"
    10  )
    11  
    12  type SpaceWithOrganization struct {
    13  	SpaceGUID        string
    14  	SpaceName        string
    15  	OrganizationName string
    16  }
    17  
    18  // GetServiceInstances lists service instances with optional filters.
    19  func (client *Client) GetServiceInstances(query ...Query) ([]resources.ServiceInstance, IncludedResources, Warnings, error) {
    20  	var result []resources.ServiceInstance
    21  
    22  	included, warnings, err := client.MakeListRequest(RequestParams{
    23  		RequestName:  internal.GetServiceInstancesRequest,
    24  		Query:        query,
    25  		ResponseBody: resources.ServiceInstance{},
    26  		AppendToList: func(item interface{}) error {
    27  			result = append(result, item.(resources.ServiceInstance))
    28  			return nil
    29  		},
    30  	})
    31  
    32  	return result, included, warnings, err
    33  }
    34  
    35  func (client *Client) GetServiceInstanceByNameAndSpace(name, spaceGUID string, query ...Query) (resources.ServiceInstance, IncludedResources, Warnings, error) {
    36  	query = append(query,
    37  		Query{
    38  			Key:    NameFilter,
    39  			Values: []string{name},
    40  		},
    41  		Query{
    42  			Key:    SpaceGUIDFilter,
    43  			Values: []string{spaceGUID},
    44  		},
    45  	)
    46  
    47  	instances, included, warnings, err := client.GetServiceInstances(query...)
    48  
    49  	if err != nil {
    50  		return resources.ServiceInstance{}, IncludedResources{}, warnings, err
    51  	}
    52  
    53  	if len(instances) == 0 {
    54  		return resources.ServiceInstance{},
    55  			IncludedResources{},
    56  			warnings,
    57  			ccerror.ServiceInstanceNotFoundError{
    58  				Name:      name,
    59  				SpaceGUID: spaceGUID,
    60  			}
    61  	}
    62  
    63  	return instances[0], included, warnings, nil
    64  }
    65  
    66  func (client *Client) GetServiceInstanceParameters(serviceInstanceGUID string) (parameters types.JSONObject, warnings Warnings, err error) {
    67  	_, warnings, err = client.MakeRequest(RequestParams{
    68  		RequestName:  internal.GetServiceInstanceParametersRequest,
    69  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
    70  		ResponseBody: &parameters,
    71  	})
    72  
    73  	return
    74  }
    75  
    76  // GetUserProvidedServiceInstanceCredentails get credentials for a user-provided service instance only
    77  // Does not return async job url
    78  func (client *Client) GetUserProvidedServiceInstanceCredentails(serviceInstanceGUID string) (types.JSONObject, Warnings, error) {
    79  	var creds types.JSONObject
    80  	_, warnings, err := client.MakeRequest(RequestParams{
    81  		RequestName:  internal.GetServiceInstanceCredentialsRequest,
    82  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
    83  		ResponseBody: &creds,
    84  	})
    85  
    86  	return creds, warnings, err
    87  }
    88  
    89  func (client *Client) CreateServiceInstance(serviceInstance resources.ServiceInstance) (JobURL, Warnings, error) {
    90  	return client.MakeRequest(RequestParams{
    91  		RequestName: internal.PostServiceInstanceRequest,
    92  		RequestBody: serviceInstance,
    93  	})
    94  }
    95  
    96  // CreateUserProvidedServiceInstance return the service instance in response body because create requests for User-provided service instances don't return jobURLs
    97  func (client *Client) CreateUserProvidedServiceInstance(serviceInstance resources.ServiceInstance) (resources.ServiceInstance, Warnings, error) {
    98  	var responseBody resources.ServiceInstance
    99  	_, warnings, err := client.MakeRequest(RequestParams{
   100  		RequestName:  internal.PostServiceInstanceRequest,
   101  		RequestBody:  serviceInstance,
   102  		ResponseBody: &responseBody,
   103  	})
   104  
   105  	return responseBody, warnings, err
   106  }
   107  
   108  // UpdateUserProvidedServiceInstance return the service instance in response body instead of jobURLs
   109  func (client *Client) UpdateUserProvidedServiceInstance(serviceInstanceGUID string, serviceInstanceUpdates resources.ServiceInstance) (resources.ServiceInstance, Warnings, error) {
   110  	var responseBody resources.ServiceInstance
   111  
   112  	_, warnings, err := client.MakeRequest(RequestParams{
   113  		RequestName:  internal.PatchServiceInstanceRequest,
   114  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   115  		RequestBody:  serviceInstanceUpdates,
   116  		ResponseBody: &responseBody,
   117  	})
   118  
   119  	return responseBody, warnings, err
   120  }
   121  
   122  func (client *Client) UpdateServiceInstance(serviceInstanceGUID string, serviceInstanceUpdates resources.ServiceInstance) (JobURL, Warnings, error) {
   123  	return client.MakeRequest(RequestParams{
   124  		RequestName: internal.PatchServiceInstanceRequest,
   125  		URIParams:   internal.Params{"service_instance_guid": serviceInstanceGUID},
   126  		RequestBody: serviceInstanceUpdates,
   127  	})
   128  }
   129  
   130  func (client *Client) DeleteServiceInstance(serviceInstanceGUID string, query ...Query) (JobURL, Warnings, error) {
   131  	return client.MakeRequest(RequestParams{
   132  		RequestName: internal.DeleteServiceInstanceRequest,
   133  		URIParams:   internal.Params{"service_instance_guid": serviceInstanceGUID},
   134  		Query:       query,
   135  	})
   136  }
   137  
   138  // ShareServiceInstanceToSpaces will create a sharing relationship between
   139  // the service instance and the shared-to space for each space provided.
   140  func (client *Client) ShareServiceInstanceToSpaces(serviceInstanceGUID string, spaceGUIDs []string) (resources.RelationshipList, Warnings, error) {
   141  	var responseBody resources.RelationshipList
   142  
   143  	_, warnings, err := client.MakeRequest(RequestParams{
   144  		RequestName:  internal.PostServiceInstanceRelationshipsSharedSpacesRequest,
   145  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   146  		RequestBody:  resources.RelationshipList{GUIDs: spaceGUIDs},
   147  		ResponseBody: &responseBody,
   148  	})
   149  
   150  	return responseBody, warnings, err
   151  }
   152  
   153  // UnshareServiceInstanceFromSpace will delete the sharing relationship
   154  // between the service instance and the shared-to space provided.
   155  func (client *Client) UnshareServiceInstanceFromSpace(serviceInstanceGUID string, spaceGUID string) (Warnings, error) {
   156  	_, warnings, err := client.MakeRequest(RequestParams{
   157  		RequestName: internal.DeleteServiceInstanceRelationshipsSharedSpaceRequest,
   158  		URIParams:   internal.Params{"service_instance_guid": serviceInstanceGUID, "space_guid": spaceGUID},
   159  	})
   160  
   161  	return warnings, err
   162  }
   163  
   164  // GetServiceInstanceSharedSpaces will fetch relationships between
   165  // a service instance and the shared-to spaces for that service.
   166  func (client *Client) GetServiceInstanceSharedSpaces(serviceInstanceGUID string) ([]SpaceWithOrganization, Warnings, error) {
   167  	var responseBody resources.SharedToSpacesListWrapper
   168  	query := []Query{
   169  		{
   170  			Key:    FieldsSpace,
   171  			Values: []string{"guid", "name", "relationships.organization"},
   172  		},
   173  		{
   174  			Key:    FieldsSpaceOrganization,
   175  			Values: []string{"guid", "name"},
   176  		},
   177  	}
   178  	_, warnings, err := client.MakeRequest(RequestParams{
   179  		RequestName:  internal.GetServiceInstanceRelationshipsSharedSpacesRequest,
   180  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   181  		Query:        query,
   182  		ResponseBody: &responseBody,
   183  	})
   184  	return mapRelationshipsToSpaces(responseBody), warnings, err
   185  }
   186  
   187  func (client *Client) GetServiceInstanceUsageSummary(serviceInstanceGUID string) ([]resources.ServiceInstanceUsageSummary, Warnings, error) {
   188  	var result resources.ServiceInstanceUsageSummaryList
   189  
   190  	_, warnings, err := client.MakeRequest(RequestParams{
   191  		RequestName:  internal.GetServiceInstanceSharedSpacesUsageSummaryRequest,
   192  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   193  		ResponseBody: &result,
   194  	})
   195  	return result.UsageSummary, warnings, err
   196  }
   197  
   198  func mapRelationshipsToSpaces(sharedToSpaces resources.SharedToSpacesListWrapper) []SpaceWithOrganization {
   199  	var spacesToReturn []SpaceWithOrganization
   200  
   201  	guidToOrgNameLookup := lookuptable.NameFromGUID(sharedToSpaces.Organizations)
   202  
   203  	for _, s := range sharedToSpaces.Spaces {
   204  		org := s.Relationships[constant.RelationshipTypeOrganization]
   205  		space := SpaceWithOrganization{SpaceGUID: s.GUID, SpaceName: s.Name, OrganizationName: guidToOrgNameLookup[org.GUID]}
   206  		spacesToReturn = append(spacesToReturn, space)
   207  	}
   208  
   209  	return spacesToReturn
   210  }