Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import java.util.function.Supplier;

import org.cloudfoundry.client.v3.Metadata;
import org.cloudfoundry.multiapps.controller.client.util.ResilientCloudOperationExecutor;
import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback;
import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient;
import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClientImpl;
Expand Down Expand Up @@ -282,8 +281,8 @@ public List<CloudServiceBinding> getAppBindings(UUID applicationGuid) {
}

@Override
public CloudServiceBinding getServiceBindingForApplication(UUID applicationGuid, UUID serviceInstanceGuid) {
return executeWithRetry(() -> delegate.getServiceBindingForApplication(applicationGuid, serviceInstanceGuid));
public List<CloudServiceBinding> getServiceBindingsForApplication(UUID applicationGuid, UUID serviceInstanceGuid) {
return executeWithRetry(() -> delegate.getServiceBindingsForApplication(applicationGuid, serviceInstanceGuid));
}

@Override
Expand Down Expand Up @@ -332,12 +331,12 @@ public void stopApplication(String applicationName) {
}

@Override
public Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName) {
public List<String> unbindServiceInstance(String applicationName, String serviceInstanceName) {
return executeWithRetry(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName));
}

@Override
public Optional<String> unbindServiceInstance(UUID appGuid, UUID serviceGuid) {
public List<String> unbindServiceInstance(UUID appGuid, UUID serviceGuid) {
return executeWithRetry(() -> delegate.unbindServiceInstance(appGuid, serviceGuid));
}

Expand Down Expand Up @@ -553,8 +552,8 @@ public List<CloudBuild> getBuildsForApplication(UUID applicationGuid) {
}

@Override
public Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback) {
public List<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback) {
return executeWithRetry(
() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName, applicationServicesUpdateCallback));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -430,9 +430,9 @@ Optional<String> bindServiceInstance(String bindingName, String applicationName,
*
* @param applicationId the GUID of the application
* @param serviceInstanceGuid the GUID of the service instance
* @return the binding
* @return the bindings
*/
CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid);
List<CloudServiceBinding> getServiceBindingsForApplication(UUID applicationId, UUID serviceInstanceGuid);

/**
* Get all service instance parameters.
Expand Down Expand Up @@ -561,28 +561,28 @@ Optional<String> bindServiceInstance(String bindingName, String applicationName,
* @param applicationName the application name
* @param serviceInstanceName the service instance name
* @param applicationServicesUpdateCallback callback used for error handling
* @return job id for async polling if present
* @return List job ids for async polling if present
*/
Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback);
List<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback);

/**
* Un-associate (unprovision) a service from an application.
*
* @param applicationName the application name
* @param serviceInstanceName the service instance name
* @return job id for async polling if present
* @return List of job ids for async polling if present
*/
Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName);
List<String> unbindServiceInstance(String applicationName, String serviceInstanceName);

/**
* Un-associate (unprovision) a service from an application.
*
* @param applicationGuid the application guid
* @param serviceInstanceGuid the service instance guid
* @return job id for async polling if present
* @return List of job ids for async polling if present
*/
Optional<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid);
List<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid);

/**
* Update application disk quota.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.net.URL;
import java.nio.file.Path;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -364,8 +365,8 @@ public List<CloudServiceBinding> getAppBindings(UUID applicationGuid) {
}

@Override
public CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid) {
return handleExceptions(() -> delegate.getServiceBindingForApplication(applicationId, serviceInstanceGuid));
public List<CloudServiceBinding> getServiceBindingsForApplication(UUID applicationId, UUID serviceInstanceGuid) {
return handleExceptions(() -> delegate.getServiceBindingsForApplication(applicationId, serviceInstanceGuid));
}

@Override
Expand Down Expand Up @@ -464,23 +465,23 @@ public void stopApplication(String applicationName) {
}

@Override
public Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback) {
public List<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback) {
try {
return handleExceptions(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName));
} catch (CloudOperationException e) {
applicationServicesUpdateCallback.onError(e, applicationName, serviceInstanceName);
}
return Optional.empty();
return Collections.emptyList();
}

@Override
public Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName) {
public List<String> unbindServiceInstance(String applicationName, String serviceInstanceName) {
return handleExceptions(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName));
}

@Override
public Optional<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) {
public List<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) {
return handleExceptions(() -> delegate.unbindServiceInstance(applicationGuid, serviceInstanceGuid));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ Optional<String> bindServiceInstance(String bindingName, String applicationName,

List<CloudServiceBinding> getAppBindings(UUID applicationGuid);

CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid);
List<CloudServiceBinding> getServiceBindingsForApplication(UUID applicationId, UUID serviceInstanceGuid);

CloudServiceBroker getServiceBroker(String name);

Expand Down Expand Up @@ -179,9 +179,9 @@ Optional<String> bindServiceInstance(String bindingName, String applicationName,

void stopApplication(String applicationName);

Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName);
List<String> unbindServiceInstance(String applicationName, String serviceInstanceName);

Optional<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid);
List<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid);

void updateApplicationDiskQuota(String applicationName, int disk);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,8 @@
if (serviceKey == null) {
throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service key " + serviceKeyName + " not found.");
}
return doDeleteServiceBinding(serviceKey.getGuid());
return doDeleteServiceBindings(List.of(serviceKey.getGuid())).stream()
.findFirst();
}

@Override
Expand Down Expand Up @@ -912,9 +913,9 @@
}

@Override
public CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid) {
return fetch(() -> getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(applicationId, serviceInstanceGuid),
ImmutableRawCloudServiceBinding::of);
public List<CloudServiceBinding> getServiceBindingsForApplication(UUID applicationId, UUID serviceInstanceGuid) {
return fetchList(() -> getServiceBindingResourcesByApplicationGuidAndServiceInstanceGuid(applicationId, serviceInstanceGuid),
ImmutableRawCloudServiceBinding::of);
}

@Override
Expand Down Expand Up @@ -1257,7 +1258,7 @@
}

@Override
public Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName) {
public List<String> unbindServiceInstance(String applicationName, String serviceInstanceName) {
UUID applicationGuid = getRequiredApplicationGuid(applicationName);
UUID serviceInstanceGuid = getRequiredServiceInstanceGuid(serviceInstanceName);

Expand All @@ -1266,11 +1267,12 @@

@Override
public Optional<String> deleteServiceBinding(UUID serviceBindingGuid) {
return doDeleteServiceBinding(serviceBindingGuid);
return doDeleteServiceBindings(List.of(serviceBindingGuid)).stream()
.findFirst();
}

@Override
public Optional<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) {
public List<String> unbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) {
return doUnbindServiceInstance(applicationGuid, serviceInstanceGuid);
}

Expand Down Expand Up @@ -1736,16 +1738,16 @@
.list(pageRequestSupplier.apply(page)));
}

private Mono<? extends ServiceBindingResource> getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(UUID applicationGuid,
UUID serviceInstanceGuid) {
private Flux<? extends ServiceBindingResource> getServiceBindingResourcesByApplicationGuidAndServiceInstanceGuid(UUID applicationGuid,

Check warning on line 1741 in multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this type parametrization by the 'final' type `ServiceBindingResource`.

See more on https://sonarcloud.io/project/issues?id=cloudfoundry_multiapps-controller&issues=AZ20z1Qo9hZDB1hNc9K6&open=AZ20z1Qo9hZDB1hNc9K6&pullRequest=1820
UUID serviceInstanceGuid) {
IntFunction<ListServiceBindingsRequest> pageRequestSupplier = page -> ListServiceBindingsRequest.builder()
.applicationId(
applicationGuid.toString())
.serviceInstanceId(
serviceInstanceGuid.toString())
.page(page)
.build();
return getApplicationServiceBindingResources(pageRequestSupplier).singleOrEmpty();
return getApplicationServiceBindingResources(pageRequestSupplier);
}

private Flux<? extends ServiceBindingResource> getServiceBindingResourcesByApplicationGuid(UUID applicationGuid) {
Expand Down Expand Up @@ -2035,23 +2037,47 @@
.block();
}

private Optional<String> doUnbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) {
UUID serviceBindingGuid = getServiceBindingGuid(applicationGuid, serviceInstanceGuid);
if (serviceBindingGuid == null) {
private List<String> doUnbindServiceInstance(UUID applicationGuid, UUID serviceInstanceGuid) {
List<UUID> serviceBindingGuids = getServiceBindingGuids(applicationGuid, serviceInstanceGuid);
if (serviceBindingGuids.isEmpty()) {
throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found",
"Service binding between service with GUID " + serviceInstanceGuid
+ " and application with GUID " + applicationGuid + " not found.");
}
return doDeleteServiceBinding(serviceBindingGuid);
return doDeleteServiceBindings(serviceBindingGuids);
}

private Optional<String> doDeleteServiceBinding(UUID guid) {
String jobId = delegate.serviceBindingsV3()
.delete(DeleteServiceBindingRequest.builder()
.serviceBindingId(guid.toString())
.build())
.block();
return Optional.ofNullable(jobId);
private List<String> doDeleteServiceBindings(List<UUID> guids) {
List<String> jobIds = new ArrayList<>();
List<AbstractCloudFoundryException> errors = new ArrayList<>();
for (UUID guid : guids) {
try {
Optional.ofNullable(deleteSingleServiceBinding(guid))
.ifPresent(jobIds::add);
} catch (AbstractCloudFoundryException e) {
errors.add(e);
}
}
throwOnErrors(errors);
return jobIds;
}

private String deleteSingleServiceBinding(UUID guid) {
return delegate.serviceBindingsV3()
.delete(DeleteServiceBindingRequest.builder()
.serviceBindingId(guid.toString())
.build())
.block();
}

private void throwOnErrors(List<AbstractCloudFoundryException> errors) {
if (errors.isEmpty()) {
return;
}
RuntimeException first = errors.get(0);
errors.subList(1, errors.size())
.forEach(first::addSuppressed);
throw first;
}

private CloudDomain findDomainByName(String name, boolean required) {
Expand Down Expand Up @@ -2463,9 +2489,10 @@
return getGuid(routeEntitiesResource.get(0));
}

private UUID getServiceBindingGuid(UUID applicationGuid, UUID serviceInstanceGuid) {
return getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(applicationGuid, serviceInstanceGuid).map(this::getGuid)
.block();
private List<UUID> getServiceBindingGuids(UUID applicationGuid, UUID serviceInstanceGuid) {
return getServiceBindingResourcesByApplicationGuidAndServiceInstanceGuid(applicationGuid, serviceInstanceGuid).map(this::getGuid)
.collectList()
.block();
}

private void processAsyncUploadInBackground(CloudPackage cloudPackage, UploadStatusCallback callback) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,13 @@ public class Messages {
public static final String COULD_NOT_PARSE_APP_STOP_DELAY_VAR = "Could not parse variable for delay after app stop: \"{0}\"";
public static final String DELAY_AFTER_APP_STOP_CANNOT_BE_NEGATIVE = "Delay after app stop cannot be negative: \"{0}\"";
public static final String SERVICE_BINDING_0_EXISTS_IN_BROKEN_STATE_WILL_BE_RECREATED = "Service binding \"{0}\" exists in broken state, will be recreated";
public static final String SERVICE_BINDINGS_EXISTS_IN_BROKEN_STATE_WILL_BE_RECREATED = "Service bindings \"{0}\" exists in broken state, will be recreated";
public static final String ERROR_WHILE_POLLING_SERVICE_BINDING_OPERATION_BETWEEN_APP_AND_OPTIONAL_SERVICE = "Error while polling service binding operation between app \"{0}\" and optional service instance \"{1}\"";
public static final String ERROR_WHILE_POLLING_SERVICE_BINDING_OPERATION_BETWEEN_APP_AND_SERVICE = "Error while polling service binding operation between app \"{0}\" and service instance \"{1}\", error \"{2}\"";
public static final String ERROR_WHILE_POLLING_SERVICE_BINDING_OPERATION_BETWEEN_APP_AND_SERVICE_CHECK_OPERATION_LOGS =
"Error while polling service binding operation between app \"{0}\" and service instance \"{1}\". Multiple bindings error were detected. "
+ DOWNLOAD_APP_LOGS_FOR_MORE_INFO;
public static final String ERROR_WHILE_POLLING_SERVICE_BINDING_GUID = "Error while polling service binding guid: \"{0}\", error \"{1}\"";
public static final String ERROR_WHILE_CREATING_SERVICE_KEY_0_FOR_OPTIONAL_SERVICE_1 = "Error while creating service key \"{0}\" for optional service \"{1}\"";
public static final String ERROR_WHILE_DELETING_SERVICE_KEY_0_FOR_OPTIONAL_SERVICE_1 = "Error while deleting service key \"{0}\" for optional service \"{1}\"";
public static final String SERVICE_KEY_0_IS_ALREADY_DELETED = "Service key \"{0}\" is already deleted";
Expand Down
Loading
Loading