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: ¶meters, 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 }