github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/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  func (client *Client) CreateServiceInstance(serviceInstance resources.ServiceInstance) (JobURL, Warnings, error) {
    77  	return client.MakeRequest(RequestParams{
    78  		RequestName: internal.PostServiceInstanceRequest,
    79  		RequestBody: serviceInstance,
    80  	})
    81  }
    82  
    83  func (client *Client) UpdateServiceInstance(serviceInstanceGUID string, serviceInstanceUpdates resources.ServiceInstance) (JobURL, Warnings, error) {
    84  	return client.MakeRequest(RequestParams{
    85  		RequestName: internal.PatchServiceInstanceRequest,
    86  		URIParams:   internal.Params{"service_instance_guid": serviceInstanceGUID},
    87  		RequestBody: serviceInstanceUpdates,
    88  	})
    89  }
    90  
    91  func (client *Client) DeleteServiceInstance(serviceInstanceGUID string, query ...Query) (JobURL, Warnings, error) {
    92  	return client.MakeRequest(RequestParams{
    93  		RequestName: internal.DeleteServiceInstanceRequest,
    94  		URIParams:   internal.Params{"service_instance_guid": serviceInstanceGUID},
    95  		Query:       query,
    96  	})
    97  }
    98  
    99  // ShareServiceInstanceToSpaces will create a sharing relationship between
   100  // the service instance and the shared-to space for each space provided.
   101  func (client *Client) ShareServiceInstanceToSpaces(serviceInstanceGUID string, spaceGUIDs []string) (resources.RelationshipList, Warnings, error) {
   102  	var responseBody resources.RelationshipList
   103  
   104  	_, warnings, err := client.MakeRequest(RequestParams{
   105  		RequestName:  internal.PostServiceInstanceRelationshipsSharedSpacesRequest,
   106  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   107  		RequestBody:  resources.RelationshipList{GUIDs: spaceGUIDs},
   108  		ResponseBody: &responseBody,
   109  	})
   110  
   111  	return responseBody, warnings, err
   112  }
   113  
   114  // UnshareServiceInstanceFromSpace will delete the sharing relationship
   115  // between the service instance and the shared-to space provided.
   116  func (client *Client) UnshareServiceInstanceFromSpace(serviceInstanceGUID string, spaceGUID string) (Warnings, error) {
   117  	_, warnings, err := client.MakeRequest(RequestParams{
   118  		RequestName: internal.DeleteServiceInstanceRelationshipsSharedSpaceRequest,
   119  		URIParams:   internal.Params{"service_instance_guid": serviceInstanceGUID, "space_guid": spaceGUID},
   120  	})
   121  
   122  	return warnings, err
   123  }
   124  
   125  // GetServiceInstanceSharedSpaces will fetch relationships between
   126  // a service instance and the shared-to spaces for that service.
   127  func (client *Client) GetServiceInstanceSharedSpaces(serviceInstanceGUID string) ([]SpaceWithOrganization, Warnings, error) {
   128  	var responseBody resources.SharedToSpacesListWrapper
   129  	query := []Query{
   130  		{
   131  			Key:    FieldsSpace,
   132  			Values: []string{"guid", "name", "relationships.organization"},
   133  		},
   134  		{
   135  			Key:    FieldsSpaceOrganization,
   136  			Values: []string{"guid", "name"},
   137  		},
   138  	}
   139  	_, warnings, err := client.MakeRequest(RequestParams{
   140  		RequestName:  internal.GetServiceInstanceRelationshipsSharedSpacesRequest,
   141  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   142  		Query:        query,
   143  		ResponseBody: &responseBody,
   144  	})
   145  	return mapRelationshipsToSpaces(responseBody), warnings, err
   146  }
   147  
   148  func (client *Client) GetServiceInstanceUsageSummary(serviceInstanceGUID string) ([]resources.ServiceInstanceUsageSummary, Warnings, error) {
   149  	var result resources.ServiceInstanceUsageSummaryList
   150  
   151  	_, warnings, err := client.MakeRequest(RequestParams{
   152  		RequestName:  internal.GetServiceInstanceSharedSpacesUsageSummaryRequest,
   153  		URIParams:    internal.Params{"service_instance_guid": serviceInstanceGUID},
   154  		ResponseBody: &result,
   155  	})
   156  	return result.UsageSummary, warnings, err
   157  }
   158  
   159  func mapRelationshipsToSpaces(sharedToSpaces resources.SharedToSpacesListWrapper) []SpaceWithOrganization {
   160  	var spacesToReturn []SpaceWithOrganization
   161  
   162  	guidToOrgNameLookup := lookuptable.NameFromGUID(sharedToSpaces.Organizations)
   163  
   164  	for _, s := range sharedToSpaces.Spaces {
   165  		org := s.Relationships[constant.RelationshipTypeOrganization]
   166  		space := SpaceWithOrganization{SpaceGUID: s.GUID, SpaceName: s.Name, OrganizationName: guidToOrgNameLookup[org.GUID]}
   167  		spacesToReturn = append(spacesToReturn, space)
   168  	}
   169  
   170  	return spacesToReturn
   171  }