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