
com.sap.cloudfoundry.client.facade.rest.CloudControllerRestClientImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of cloudfoundry-client-facade Show documentation
Show all versions of cloudfoundry-client-facade Show documentation
A facade of the official Cloud Foundry Java client
package com.sap.cloudfoundry.client.facade.rest;
import java.nio.file.Path;
import java.text.MessageFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.cloudfoundry.AbstractCloudFoundryException;
import org.cloudfoundry.client.CloudFoundryClient;
import org.cloudfoundry.client.v3.BuildpackData;
import org.cloudfoundry.client.v3.DockerData;
import org.cloudfoundry.client.v3.Lifecycle;
import org.cloudfoundry.client.v3.LifecycleType;
import org.cloudfoundry.client.v3.Metadata;
import org.cloudfoundry.client.v3.Relationship;
import org.cloudfoundry.client.v3.Resource;
import org.cloudfoundry.client.v3.ToOneRelationship;
import org.cloudfoundry.client.v3.applications.Application;
import org.cloudfoundry.client.v3.applications.ApplicationRelationships;
import org.cloudfoundry.client.v3.applications.ApplicationState;
import org.cloudfoundry.client.v3.applications.CreateApplicationRequest;
import org.cloudfoundry.client.v3.applications.CreateApplicationResponse;
import org.cloudfoundry.client.v3.applications.DeleteApplicationRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationCurrentDropletRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationCurrentDropletResponse;
import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentVariablesRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationEnvironmentVariablesResponse;
import org.cloudfoundry.client.v3.applications.GetApplicationProcessRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationProcessResponse;
import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationProcessStatisticsResponse;
import org.cloudfoundry.client.v3.applications.GetApplicationRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledRequest;
import org.cloudfoundry.client.v3.applications.GetApplicationSshEnabledResponse;
import org.cloudfoundry.client.v3.applications.ListApplicationBuildsRequest;
import org.cloudfoundry.client.v3.applications.ListApplicationPackagesRequest;
import org.cloudfoundry.client.v3.applications.ListApplicationRoutesRequest;
import org.cloudfoundry.client.v3.applications.ListApplicationsRequest;
import org.cloudfoundry.client.v3.applications.ScaleApplicationRequest;
import org.cloudfoundry.client.v3.applications.SetApplicationCurrentDropletRequest;
import org.cloudfoundry.client.v3.applications.StartApplicationRequest;
import org.cloudfoundry.client.v3.applications.StopApplicationRequest;
import org.cloudfoundry.client.v3.applications.UpdateApplicationEnvironmentVariablesRequest;
import org.cloudfoundry.client.v3.applications.UpdateApplicationFeatureRequest;
import org.cloudfoundry.client.v3.applications.UpdateApplicationRequest;
import org.cloudfoundry.client.v3.applications.UpdateApplicationResponse;
import org.cloudfoundry.client.v3.auditevents.AuditEventResource;
import org.cloudfoundry.client.v3.auditevents.ListAuditEventsRequest;
import org.cloudfoundry.client.v3.builds.Build;
import org.cloudfoundry.client.v3.builds.CreateBuildRequest;
import org.cloudfoundry.client.v3.builds.GetBuildRequest;
import org.cloudfoundry.client.v3.builds.ListBuildsRequest;
import org.cloudfoundry.client.v3.domains.CreateDomainRequest;
import org.cloudfoundry.client.v3.domains.DeleteDomainRequest;
import org.cloudfoundry.client.v3.domains.Domain;
import org.cloudfoundry.client.v3.domains.DomainRelationships;
import org.cloudfoundry.client.v3.domains.DomainResource;
import org.cloudfoundry.client.v3.domains.ListDomainsRequest;
import org.cloudfoundry.client.v3.jobs.GetJobRequest;
import org.cloudfoundry.client.v3.organizations.GetOrganizationDefaultDomainRequest;
import org.cloudfoundry.client.v3.organizations.ListOrganizationDomainsRequest;
import org.cloudfoundry.client.v3.packages.CreatePackageRequest;
import org.cloudfoundry.client.v3.packages.CreatePackageResponse;
import org.cloudfoundry.client.v3.packages.GetPackageRequest;
import org.cloudfoundry.client.v3.packages.Package;
import org.cloudfoundry.client.v3.packages.PackageRelationships;
import org.cloudfoundry.client.v3.packages.PackageResource;
import org.cloudfoundry.client.v3.packages.PackageType;
import org.cloudfoundry.client.v3.packages.UploadPackageRequest;
import org.cloudfoundry.client.v3.processes.Data;
import org.cloudfoundry.client.v3.processes.HealthCheck;
import org.cloudfoundry.client.v3.processes.HealthCheckType;
import org.cloudfoundry.client.v3.processes.UpdateProcessRequest;
import org.cloudfoundry.client.v3.roles.ListRolesRequest;
import org.cloudfoundry.client.v3.roles.RoleResource;
import org.cloudfoundry.client.v3.roles.RoleType;
import org.cloudfoundry.client.v3.routes.CreateRouteRequest;
import org.cloudfoundry.client.v3.routes.CreateRouteResponse;
import org.cloudfoundry.client.v3.routes.DeleteRouteRequest;
import org.cloudfoundry.client.v3.routes.Destination;
import org.cloudfoundry.client.v3.routes.InsertRouteDestinationsRequest;
import org.cloudfoundry.client.v3.routes.ListRoutesRequest;
import org.cloudfoundry.client.v3.routes.RemoveRouteDestinationsRequest;
import org.cloudfoundry.client.v3.routes.RouteRelationships;
import org.cloudfoundry.client.v3.routes.RouteResource;
import org.cloudfoundry.client.v3.servicebindings.CreateServiceBindingRequest;
import org.cloudfoundry.client.v3.servicebindings.CreateServiceBindingResponse;
import org.cloudfoundry.client.v3.servicebindings.DeleteServiceBindingRequest;
import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingDetailsRequest;
import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingDetailsResponse;
import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingParametersRequest;
import org.cloudfoundry.client.v3.servicebindings.GetServiceBindingParametersResponse;
import org.cloudfoundry.client.v3.servicebindings.ListServiceBindingsRequest;
import org.cloudfoundry.client.v3.servicebindings.ServiceBindingRelationships;
import org.cloudfoundry.client.v3.servicebindings.ServiceBindingResource;
import org.cloudfoundry.client.v3.servicebindings.ServiceBindingType;
import org.cloudfoundry.client.v3.servicebindings.UpdateServiceBindingRequest;
import org.cloudfoundry.client.v3.servicebrokers.BasicAuthentication;
import org.cloudfoundry.client.v3.servicebrokers.CreateServiceBrokerRequest;
import org.cloudfoundry.client.v3.servicebrokers.DeleteServiceBrokerRequest;
import org.cloudfoundry.client.v3.servicebrokers.ListServiceBrokersRequest;
import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerRelationships;
import org.cloudfoundry.client.v3.servicebrokers.ServiceBrokerResource;
import org.cloudfoundry.client.v3.servicebrokers.UpdateServiceBrokerRequest;
import org.cloudfoundry.client.v3.serviceinstances.CreateServiceInstanceRequest;
import org.cloudfoundry.client.v3.serviceinstances.DeleteServiceInstanceRequest;
import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersRequest;
import org.cloudfoundry.client.v3.serviceinstances.GetManagedServiceParametersResponse;
import org.cloudfoundry.client.v3.serviceinstances.GetServiceInstanceRequest;
import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsRequest;
import org.cloudfoundry.client.v3.serviceinstances.GetUserProvidedCredentialsResponse;
import org.cloudfoundry.client.v3.serviceinstances.ListServiceInstancesRequest;
import org.cloudfoundry.client.v3.serviceinstances.ServiceInstance;
import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceRelationships;
import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceResource;
import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType;
import org.cloudfoundry.client.v3.serviceinstances.UpdateServiceInstanceRequest;
import org.cloudfoundry.client.v3.serviceofferings.GetServiceOfferingRequest;
import org.cloudfoundry.client.v3.serviceofferings.ListServiceOfferingsRequest;
import org.cloudfoundry.client.v3.serviceofferings.ServiceOffering;
import org.cloudfoundry.client.v3.serviceofferings.ServiceOfferingResource;
import org.cloudfoundry.client.v3.serviceplans.GetServicePlanRequest;
import org.cloudfoundry.client.v3.serviceplans.ListServicePlansRequest;
import org.cloudfoundry.client.v3.serviceplans.ServicePlan;
import org.cloudfoundry.client.v3.serviceplans.ServicePlanResource;
import org.cloudfoundry.client.v3.serviceplans.UpdateServicePlanVisibilityRequest;
import org.cloudfoundry.client.v3.serviceplans.Visibility;
import org.cloudfoundry.client.v3.spaces.DeleteUnmappedRoutesRequest;
import org.cloudfoundry.client.v3.stacks.ListStacksRequest;
import org.cloudfoundry.client.v3.stacks.Stack;
import org.cloudfoundry.client.v3.tasks.CancelTaskRequest;
import org.cloudfoundry.client.v3.tasks.CreateTaskRequest;
import org.cloudfoundry.client.v3.tasks.GetTaskRequest;
import org.cloudfoundry.client.v3.tasks.ListTasksRequest;
import org.cloudfoundry.client.v3.tasks.Task;
import org.cloudfoundry.util.PaginationUtils;
import org.springframework.http.HttpStatus;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import com.sap.cloudfoundry.client.facade.CloudOperationException;
import com.sap.cloudfoundry.client.facade.Constants;
import com.sap.cloudfoundry.client.facade.Messages;
import com.sap.cloudfoundry.client.facade.UploadStatusCallback;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudApplication;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudAsyncJob;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudBuild;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudDomain;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudEvent;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudPackage;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudProcess;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudRoute;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceBinding;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceBroker;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceInstance;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceKey;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServiceOffering;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudServicePlan;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudStack;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawCloudTask;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawInstancesInfo;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawUserRole;
import com.sap.cloudfoundry.client.facade.adapters.ImmutableRawV3CloudServiceInstance;
import com.sap.cloudfoundry.client.facade.domain.BitsData;
import com.sap.cloudfoundry.client.facade.domain.CloudApplication;
import com.sap.cloudfoundry.client.facade.domain.CloudAsyncJob;
import com.sap.cloudfoundry.client.facade.domain.CloudBuild;
import com.sap.cloudfoundry.client.facade.domain.CloudDomain;
import com.sap.cloudfoundry.client.facade.domain.CloudEntity;
import com.sap.cloudfoundry.client.facade.domain.CloudEvent;
import com.sap.cloudfoundry.client.facade.domain.CloudMetadata;
import com.sap.cloudfoundry.client.facade.domain.CloudPackage;
import com.sap.cloudfoundry.client.facade.domain.CloudProcess;
import com.sap.cloudfoundry.client.facade.domain.CloudRoute;
import com.sap.cloudfoundry.client.facade.domain.CloudServiceBinding;
import com.sap.cloudfoundry.client.facade.domain.CloudServiceBroker;
import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance;
import com.sap.cloudfoundry.client.facade.domain.CloudServiceKey;
import com.sap.cloudfoundry.client.facade.domain.CloudServiceOffering;
import com.sap.cloudfoundry.client.facade.domain.CloudServicePlan;
import com.sap.cloudfoundry.client.facade.domain.CloudSpace;
import com.sap.cloudfoundry.client.facade.domain.CloudStack;
import com.sap.cloudfoundry.client.facade.domain.CloudTask;
import com.sap.cloudfoundry.client.facade.domain.Derivable;
import com.sap.cloudfoundry.client.facade.domain.DockerCredentials;
import com.sap.cloudfoundry.client.facade.domain.DockerInfo;
import com.sap.cloudfoundry.client.facade.domain.DropletInfo;
import com.sap.cloudfoundry.client.facade.domain.ErrorDetails;
import com.sap.cloudfoundry.client.facade.domain.ImmutableDropletInfo;
import com.sap.cloudfoundry.client.facade.domain.ImmutableErrorDetails;
import com.sap.cloudfoundry.client.facade.domain.ImmutableInstancesInfo;
import com.sap.cloudfoundry.client.facade.domain.ImmutableUpload;
import com.sap.cloudfoundry.client.facade.domain.InstancesInfo;
import com.sap.cloudfoundry.client.facade.domain.RouteDestination;
import com.sap.cloudfoundry.client.facade.domain.ServicePlanVisibility;
import com.sap.cloudfoundry.client.facade.domain.Staging;
import com.sap.cloudfoundry.client.facade.domain.Status;
import com.sap.cloudfoundry.client.facade.domain.Upload;
import com.sap.cloudfoundry.client.facade.domain.UserRole;
import com.sap.cloudfoundry.client.facade.dto.ApplicationToCreateDto;
import com.sap.cloudfoundry.client.facade.util.JobV3Util;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
* Abstract implementation of the CloudControllerClient intended to serve as the base.
*/
public class CloudControllerRestClientImpl implements CloudControllerRestClient {
private static final long PACKAGE_UPLOAD_JOB_POLLING_PERIOD = TimeUnit.SECONDS.toMillis(5);
private static final Duration DELETE_JOB_TIMEOUT = Duration.ofMinutes(5);
private static final Duration BINDING_OPERATIONS_TIMEOUT = Duration.ofMinutes(10);
private static final int MAX_CHAR_LENGTH_FOR_PARAMS_IN_REQUEST = 4000;
private CloudSpace target; // optional, as some operations do not require a targeted space
private CloudFoundryClient delegate;
/**
* Only for unit tests. This works around the fact that the initialize method is called within the constructor and hence can not be
* overloaded, making it impossible to write unit tests that don't trigger network calls.
*/
protected CloudControllerRestClientImpl() {
}
public CloudControllerRestClientImpl(CloudFoundryClient delegate) {
this(delegate, null);
}
public CloudControllerRestClientImpl(CloudFoundryClient delegate, CloudSpace target) {
this.target = target;
this.delegate = delegate;
}
@Override
public CloudSpace getTarget() {
return target;
}
@Override
public void addDomain(String domainName) {
assertSpaceProvided("add domain");
CloudDomain domain = findDomainByName(domainName);
if (domain == null) {
doCreateDomain(domainName);
}
}
@Override
public void addRoute(String host, String domainName, String path) {
assertSpaceProvided("add route for domain");
UUID domainGuid = getRequiredDomainGuid(domainName);
doAddRoute(domainGuid, host, path);
}
@Override
public Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName) {
return bindServiceInstance(bindingName, applicationName, serviceInstanceName, null);
}
@Override
public Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName,
Map parameters) {
UUID applicationGuid = getRequiredApplicationGuid(applicationName);
UUID serviceInstanceGuid = getRequiredServiceInstanceGuid(serviceInstanceName);
var createBindingRequest = CreateServiceBindingRequest.builder()
.name(bindingName)
.type(ServiceBindingType.APPLICATION)
.relationships(ServiceBindingRelationships.builder()
.application(buildToOneRelationship(applicationGuid))
.serviceInstance(buildToOneRelationship(serviceInstanceGuid))
.build());
if (!CollectionUtils.isEmpty(parameters)) {
createBindingRequest.parameters(parameters);
}
return delegate.serviceBindingsV3()
.create(createBindingRequest.build())
.map(CreateServiceBindingResponse::getJobId)
.block();
}
@Override
public void createApplication(ApplicationToCreateDto applicationToCreateDto) {
assertSpaceProvided("create application");
CreateApplicationRequest createApplicationRequest = CreateApplicationRequest.builder()
.name(applicationToCreateDto.getName())
.metadata(applicationToCreateDto.getMetadata())
.lifecycle(buildApplicationLifecycle(applicationToCreateDto.getStaging()))
.relationships(buildApplicationRelationships())
.environmentVariables(applicationToCreateDto.getEnv())
.build();
CreateApplicationResponse createApplicationResponse = delegate.applicationsV3()
.create(createApplicationRequest)
.block();
updateApplicationAttributes(applicationToCreateDto, createApplicationResponse.getId());
}
private Lifecycle buildApplicationLifecycle(Staging staging) {
return staging.getDockerInfo() != null ? createDockerLifecycle() : createBuildpackLifecycle(staging);
}
private Lifecycle createDockerLifecycle() {
return Lifecycle.builder()
.type(LifecycleType.DOCKER)
.data(DockerData.builder()
.build())
.build();
}
private Lifecycle createBuildpackLifecycle(Staging staging) {
BuildpackData buildpackData = createBuildpackData(staging);
return Lifecycle.builder()
.type(LifecycleType.BUILDPACK)
.data(buildpackData)
.build();
}
private BuildpackData createBuildpackData(Staging staging) {
BuildpackData.Builder buildpackDataBuilder = BuildpackData.builder()
.stack(staging.getStackName());
if (staging.getBuildpacks() != null) {
buildpackDataBuilder.addAllBuildpacks(staging.getBuildpacks());
}
return buildpackDataBuilder.build();
}
private ApplicationRelationships buildApplicationRelationships() {
return ApplicationRelationships.builder()
.space(buildToOneRelationship(getTargetSpaceGuid()))
.build();
}
private void updateApplicationAttributes(ApplicationToCreateDto applicationToCreateDto, String applicationGuid) {
UUID createdApplicationGuid = UUID.fromString(applicationGuid);
updateApplicationProcess(createdApplicationGuid, applicationToCreateDto.getStaging());
delegate.applicationsV3()
.scale(ScaleApplicationRequest.builder()
.applicationId(createdApplicationGuid.toString())
.type("web")
.memoryInMb(applicationToCreateDto.getMemoryInMb())
.diskInMb(applicationToCreateDto.getDiskQuotaInMb())
.build())
.block();
if (!CollectionUtils.isEmpty(applicationToCreateDto.getRoutes())) {
addRoutes(applicationToCreateDto.getRoutes(), createdApplicationGuid);
}
}
private void updateApplicationProcess(UUID applicationGuid, Staging staging) {
if (staging.isSshEnabled() != null) {
updateSsh(applicationGuid, staging.isSshEnabled());
}
GetApplicationProcessResponse getApplicationProcessResponse = getApplicationProcessResource(applicationGuid);
UpdateProcessRequest.Builder updateProcessRequestBuilder = UpdateProcessRequest.builder()
.processId(getApplicationProcessResponse.getId())
.command(staging.getCommand());
if (staging.getHealthCheckType() != null) {
updateProcessRequestBuilder.healthCheck(buildHealthCheck(staging));
}
delegate.processes()
.update(updateProcessRequestBuilder.build())
.block();
}
private void updateSsh(UUID applicationGuid, boolean isSshEnabled) {
delegate.applicationsV3()
.updateFeature(UpdateApplicationFeatureRequest.builder()
.featureName("ssh")
.enabled(isSshEnabled)
.applicationId(applicationGuid.toString())
.build())
.block();
}
private GetApplicationProcessResponse getApplicationProcessResource(UUID applicationGuid) {
return delegate.applicationsV3()
.getProcess(GetApplicationProcessRequest.builder()
.type("web")
.applicationId(applicationGuid.toString())
.build())
.block();
}
private HealthCheck buildHealthCheck(Staging staging) {
HealthCheckType healthCheckType = HealthCheckType.from(staging.getHealthCheckType());
return HealthCheck.builder()
.type(healthCheckType)
.data(Data.builder()
.endpoint(staging.getHealthCheckHttpEndpoint())
.timeout(staging.getHealthCheckTimeout())
.invocationTimeout(staging.getInvocationTimeout())
.build())
.build();
}
private void addRoutes(Set routes, UUID applicationGuid) {
Map domains = getDomainsFromRoutes(routes);
for (CloudRoute route : routes) {
validateDomainForRoute(route, domains);
UUID domainGuid = domains.get(route.getDomain()
.getName());
UUID routeGuid = getOrAddRoute(domainGuid, route.getHost(), route.getPath());
bindRoute(routeGuid, applicationGuid, route.getRequestedProtocol());
}
}
@Override
public void createServiceInstance(CloudServiceInstance serviceInstance) {
assertSpaceProvided("create service instance");
Assert.notNull(serviceInstance, "Service instance must not be null.");
CloudServicePlan servicePlan = findPlanForService(serviceInstance, serviceInstance.getPlan());
UUID servicePlanGuid = servicePlan.getGuid();
delegate.serviceInstancesV3()
.create(CreateServiceInstanceRequest.builder()
.type(ServiceInstanceType.MANAGED)
.name(serviceInstance.getName())
.metadata(serviceInstance.getV3Metadata())
.relationships(ServiceInstanceRelationships.builder()
.servicePlan(buildToOneRelationship(servicePlanGuid.toString()))
.space(buildToOneRelationship(getTargetSpaceGuid().toString()))
.build())
.tags(serviceInstance.getTags())
.parameters(serviceInstance.getCredentials())
.build())
.block();
}
@Override
public String createServiceBroker(CloudServiceBroker serviceBroker) {
Assert.notNull(serviceBroker, "Service broker must not be null.");
ServiceBrokerRelationships serviceBrokerRelationship = Optional.ofNullable(serviceBroker.getSpaceGuid())
.map(UUID::fromString)
.map(this::buildToOneRelationship)
.map(spaceRelationship -> ServiceBrokerRelationships.builder()
.space(spaceRelationship)
.build())
.orElse(null);
return delegate.serviceBrokersV3()
.create(CreateServiceBrokerRequest.builder()
.name(serviceBroker.getName())
.url(serviceBroker.getUrl())
.authentication(BasicAuthentication.builder()
.username(serviceBroker.getUsername())
.password(serviceBroker.getPassword())
.build())
.relationships(serviceBrokerRelationship)
.build())
.block();
}
@Override
public CloudServiceKey createAndFetchServiceKey(CloudServiceKey keyModel, String serviceInstanceName) {
CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName);
doCreateServiceKeySync(keyModel.getName(), keyModel.getCredentials(), keyModel.getV3Metadata(), serviceInstance);
return fetchWithAuxiliaryContent(() -> getServiceKeyResourceByNameAndServiceInstanceGuid(keyModel.getName(),
getGuid(serviceInstance)),
fetchedKey -> zipWithAuxiliaryServiceKeyContent(fetchedKey, serviceInstance));
}
@Override
public Optional createServiceKey(CloudServiceKey keyModel, String serviceInstanceName) {
CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName);
return doCreateServiceKey(keyModel.getName(), keyModel.getCredentials(), keyModel.getV3Metadata(), serviceInstance);
}
@Override
public Optional createServiceKey(String serviceInstanceName, String serviceKeyName, Map parameters) {
CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName);
return doCreateServiceKey(serviceKeyName, parameters, null, serviceInstance);
}
private void doCreateServiceKeySync(String name, Map parameters, Metadata metadata,
CloudServiceInstance serviceInstance) {
CreateServiceBindingRequest createServiceBindingRequest = buildServiceCredentialBindingRequest(name, parameters, metadata,
serviceInstance);
delegate.serviceBindingsV3()
.create(createServiceBindingRequest)
.map(response -> response.getJobId()
.get())
.flatMap(jobId -> JobV3Util.waitForCompletion(delegate, BINDING_OPERATIONS_TIMEOUT, jobId))
.block();
}
private Optional doCreateServiceKey(String name, Map parameters, Metadata metadata,
CloudServiceInstance serviceInstance) {
CreateServiceBindingRequest createServiceBindingRequest = buildServiceCredentialBindingRequest(name, parameters, metadata,
serviceInstance);
return delegate.serviceBindingsV3()
.create(createServiceBindingRequest)
.map(CreateServiceBindingResponse::getJobId)
.block();
}
private CreateServiceBindingRequest buildServiceCredentialBindingRequest(String name, Map parameters, Metadata metadata,
CloudServiceInstance serviceInstance) {
if (serviceInstance.getType() != ServiceInstanceType.MANAGED) {
throw new IllegalArgumentException(String.format(Messages.CANT_CREATE_SERVICE_KEY_FOR_USER_PROVIDED_SERVICE,
serviceInstance.getName()));
}
UUID serviceInstanceGuid = getGuid(serviceInstance);
var createBindingRequest = CreateServiceBindingRequest.builder()
.type(ServiceBindingType.KEY)
.name(name)
.metadata(metadata)
.relationships(ServiceBindingRelationships.builder()
.serviceInstance(buildToOneRelationship(serviceInstanceGuid))
.build());
if (!CollectionUtils.isEmpty(parameters)) {
createBindingRequest.parameters(parameters);
}
return createBindingRequest.build();
}
@Override
public void createUserProvidedServiceInstance(CloudServiceInstance serviceInstance) {
assertSpaceProvided("create service instance");
Assert.notNull(serviceInstance, "Service instance must not be null.");
String syslogDrainUrl = StringUtils.hasText(serviceInstance.getSyslogDrainUrl()) ? serviceInstance.getSyslogDrainUrl() : "";
delegate.serviceInstancesV3()
.create(CreateServiceInstanceRequest.builder()
.name(serviceInstance.getName())
.metadata(serviceInstance.getV3Metadata())
.type(ServiceInstanceType.USER_PROVIDED)
.credentials(serviceInstance.getCredentials())
.syslogDrainUrl(syslogDrainUrl)
.tags(serviceInstance.getTags())
.relationships(ServiceInstanceRelationships.builder()
.space(buildToOneRelationship(getTargetSpaceGuid().toString()))
.build())
.build())
.block();
}
@Override
public void deleteApplication(String applicationName) {
UUID applicationGuid = getRequiredApplicationGuid(applicationName);
deleteApplication(applicationGuid);
}
private void deleteApplication(UUID applicationGuid) {
delegate.applicationsV3()
.delete(DeleteApplicationRequest.builder()
.applicationId(applicationGuid.toString())
.build())
.flatMap(jobId -> JobV3Util.waitForCompletion(delegate, DELETE_JOB_TIMEOUT, jobId))
.block();
}
@Override
public void deleteDomain(String domainName) {
assertSpaceProvided("delete domain");
CloudDomain domain = findDomainByName(domainName, true);
List routes = findRoutes(domain);
if (!routes.isEmpty()) {
throw new IllegalStateException("Unable to remove domain that is in use --" + " it has " + routes.size() + " routes.");
}
doDeleteDomain(getGuid(domain));
}
/**
* Delete routes that do not have any application which is assigned to them.
*/
@Override
public void deleteOrphanedRoutes() {
delegate.spacesV3()
.deleteUnmappedRoutes(DeleteUnmappedRoutesRequest.builder()
.spaceId(getTargetSpaceGuid().toString())
.build())
.flatMap(jobId -> JobV3Util.waitForCompletion(delegate, DELETE_JOB_TIMEOUT, jobId))
.block();
}
@Override
public void deleteRoute(String host, String domainName, String path) {
assertSpaceProvided("delete route for domain");
UUID routeGuid = getRouteGuid(getRequiredDomainGuid(domainName), host, path);
if (routeGuid == null) {
throw new CloudOperationException(HttpStatus.NOT_FOUND,
"Not Found",
"Host " + host + " not found for domain " + domainName + ".");
}
doDeleteRoute(routeGuid);
}
@Override
public void deleteServiceInstance(String serviceInstanceName) {
CloudServiceInstance serviceInstance = getServiceInstanceWithoutAuxiliaryContent(serviceInstanceName);
doDeleteServiceInstance(serviceInstance.getGuid());
}
@Override
public void deleteServiceInstance(CloudServiceInstance serviceInstance) {
doDeleteServiceInstance(serviceInstance.getGuid());
}
@Override
public String deleteServiceBroker(String name) {
CloudServiceBroker broker = getServiceBroker(name);
UUID guid = broker.getMetadata()
.getGuid();
return delegate.serviceBrokersV3()
.delete(DeleteServiceBrokerRequest.builder()
.serviceBrokerId(guid.toString())
.build())
.block();
}
@Override
public Optional deleteServiceBinding(String serviceInstanceName, String serviceKeyName) {
CloudServiceKey serviceKey = getServiceKey(serviceInstanceName, serviceKeyName);
if (serviceKey == null) {
throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service key " + serviceKeyName + " not found.");
}
return doDeleteServiceBinding(serviceKey.getGuid());
}
@Override
public CloudApplication getApplication(String applicationName) {
return getApplication(applicationName, true);
}
@Override
public CloudApplication getApplication(String applicationName, boolean required) {
return findApplicationByName(applicationName, required);
}
@Override
public UUID getApplicationGuid(String applicationName) {
return getRequiredApplicationGuid(applicationName);
}
@Override
public String getApplicationName(UUID applicationGuid) {
// This will throw a CloudOperationException with a 404 if no app with given GUID is present
return getApplicationByGuid(applicationGuid).block()
.getName();
}
@Override
public Map getApplicationEnvironment(UUID applicationGuid) {
return delegate.applicationsV3()
.getEnvironmentVariables(GetApplicationEnvironmentVariablesRequest.builder()
.applicationId(applicationGuid.toString())
.build())
.map(GetApplicationEnvironmentVariablesResponse::getVars)
.block();
}
@Override
public Map getApplicationEnvironment(String applicationName) {
UUID applicationGuid = getRequiredApplicationGuid(applicationName);
return getApplicationEnvironment(applicationGuid);
}
@Override
public List getApplicationEvents(String applicationName) {
UUID applicationGuid = getRequiredApplicationGuid(applicationName);
return getEventsByTarget(applicationGuid);
}
@Override
public List getEventsByTarget(UUID uuid) {
return findEventsByTarget(uuid.toString());
}
@Override
public InstancesInfo getApplicationInstances(CloudApplication application) {
if (application.getState()
.equals(CloudApplication.State.STARTED)) {
return findApplicationInstances(getGuid(application));
}
return ImmutableInstancesInfo.builder()
.instances(Collections.emptyList())
.build();
}
@Override
public InstancesInfo getApplicationInstances(UUID applicationGuid) {
return findApplicationInstances(applicationGuid);
}
@Override
public CloudProcess getApplicationProcess(UUID applicationGuid) {
return fetch(() -> Mono.just(getApplicationProcessResource(applicationGuid)), ImmutableRawCloudProcess::of);
}
@Override
public List getApplicationRoutes(UUID applicationGuid) {
return fetchList(() -> getRouteResourcesByAppGuid(applicationGuid), routeResource -> ImmutableRawCloudRoute.builder()
.route(routeResource)
.applicationGuid(applicationGuid)
.build());
}
@Override
public boolean getApplicationSshEnabled(UUID applicationGuid) {
return delegate.applicationsV3()
.getSshEnabled(GetApplicationSshEnabledRequest.builder()
.applicationId(applicationGuid.toString())
.build())
.map(GetApplicationSshEnabledResponse::getEnabled)
.defaultIfEmpty(false)
.block();
}
@Override
public List getApplications() {
return fetchList(this::getApplicationResources, application -> ImmutableRawCloudApplication.builder()
.application(application)
.space(target)
.build());
}
@Override
public List getApplicationsByMetadataLabelSelector(String labelSelector) {
assertSpaceProvided("get applications");
return fetchList(() -> getApplicationsByLabelSelector(labelSelector), application -> ImmutableRawCloudApplication.builder()
.application(application)
.space(target)
.build());
}
private Flux extends Application> getApplicationsByLabelSelector(String labelSelector) {
IntFunction pageRequestSupplier = page -> ListApplicationsRequest.builder()
.spaceId(getTargetSpaceGuid().toString())
.labelSelector(labelSelector)
.page(page)
.build();
return PaginationUtils.requestClientV3Resources(page -> delegate.applicationsV3()
.list(pageRequestSupplier.apply(page)));
}
@Override
public CloudDomain getDefaultDomain() {
return fetch(() -> getDefaultDomainResource(getTargetOrganizationGuid().toString()), ImmutableRawCloudDomain::of);
}
private Mono extends Domain> getDefaultDomainResource(String guid) {
return delegate.organizationsV3()
.getDefaultDomain(GetOrganizationDefaultDomainRequest.builder()
.organizationId(guid)
.build());
}
@Override
public List getSharedDomains() {
return fetchList(this::getSharedDomainResources, ImmutableRawCloudDomain::of);
}
@Override
public List getDomains() {
return fetchList(this::getDomainResources, ImmutableRawCloudDomain::of);
}
@Override
public List getDomainsForOrganization() {
assertSpaceProvided("access organization domains");
return findDomainsByOrganizationGuid(getTargetOrganizationGuid());
}
@Override
public List getPrivateDomains() {
return fetchList(this::getPrivateDomainResources, ImmutableRawCloudDomain::of);
}
@Override
public List getEvents() {
return fetchList(this::getEventResources, ImmutableRawCloudEvent::of);
}
@Override
public List getRoutes(String domainName) {
assertSpaceProvided("get routes for domain");
CloudDomain domain = findDomainByName(domainName, true);
return findRoutes(domain);
}
@Override
public UUID getRequiredServiceInstanceGuid(String name) {
Resource serviceInstanceResource = getServiceInstanceByName(name).block();
if (serviceInstanceResource == null) {
throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service instance " + name + " not found.");
}
return UUID.fromString(serviceInstanceResource.getId());
}
@Override
public CloudServiceInstance getServiceInstance(String serviceInstanceName) {
return getServiceInstance(serviceInstanceName, true);
}
@Override
public CloudServiceInstance getServiceInstance(String serviceInstanceName, boolean required) {
CloudServiceInstance serviceInstance = findServiceInstanceByName(serviceInstanceName);
return getServiceInstanceIfRequired(serviceInstanceName, serviceInstance, required);
}
private CloudServiceInstance getServiceInstanceIfRequired(String serviceInstanceName, CloudServiceInstance serviceInstance,
boolean required) {
if (serviceInstance == null && required) {
throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service instance " + serviceInstanceName + " not found.");
}
return serviceInstance;
}
@Override
public CloudServiceBinding getServiceBinding(UUID serviceBindingGuid) {
// TODO: Refactor and use serviceBindingsV3.get() when https://github.com/cloudfoundry/cf-java-client/pull/1171 is merged and
// released
return fetch(() -> getServiceBindingResource(serviceBindingGuid), ImmutableRawCloudServiceBinding::of);
}
private Mono getServiceBindingResource(UUID serviceBindingGuid) {
IntFunction pageRequestSupplier = page -> ListServiceBindingsRequest.builder()
.page(page)
.id(serviceBindingGuid.toString())
.build();
return PaginationUtils.requestClientV3Resources(page -> delegate.serviceBindingsV3()
.list(pageRequestSupplier.apply(page)))
.singleOrEmpty();
}
@Override
public List getServiceAppBindings(UUID serviceInstanceGuid) {
return fetchList(() -> getServiceBindingResourcesByServiceInstanceGuid(serviceInstanceGuid), ImmutableRawCloudServiceBinding::of);
}
@Override
public List getAppBindings(UUID applicationGuid) {
return fetchList(() -> getServiceBindingResourcesByApplicationGuid(applicationGuid), ImmutableRawCloudServiceBinding::of);
}
@Override
public CloudServiceBinding getServiceBindingForApplication(UUID applicationId, UUID serviceInstanceGuid) {
return fetch(() -> getServiceBindingResourceByApplicationGuidAndServiceInstanceGuid(applicationId, serviceInstanceGuid),
ImmutableRawCloudServiceBinding::of);
}
@Override
public CloudServiceBroker getServiceBroker(String name) {
return getServiceBroker(name, true);
}
@Override
public CloudServiceBroker getServiceBroker(String name, boolean required) {
CloudServiceBroker serviceBroker = findServiceBrokerByName(name);
if (serviceBroker == null && required) {
throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Service broker " + name + " not found.");
}
return serviceBroker;
}
@Override
public List getServiceBrokers() {
return fetchList(this::getServiceBrokerResources, ImmutableRawCloudServiceBroker::of);
}
@Override
public CloudServiceKey getServiceKey(String serviceInstanceName, String serviceKeyName) {
CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName);
return fetchWithAuxiliaryContent(() -> getServiceKeyResourceByNameAndServiceInstanceGuid(serviceKeyName, serviceInstance.getGuid()),
serviceKey -> zipWithAuxiliaryServiceKeyContent(serviceKey, serviceInstance));
}
@Override
public List getServiceKeys(String serviceInstanceName) {
CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName);
return getServiceKeys(serviceInstance);
}
@Override
public List getServiceKeysWithCredentials(String serviceInstanceName) {
CloudServiceInstance serviceInstance = getServiceInstance(serviceInstanceName);
return getServiceKeysWithCredentials(serviceInstance);
}
@Override
public List getServiceKeys(CloudServiceInstance serviceInstance) {
return fetchList(() -> getServiceKeyResource(serviceInstance), serviceKey -> ImmutableRawCloudServiceKey.builder()
.serviceInstance(serviceInstance)
.serviceBindingResource(serviceKey)
.build());
}
@Override
public List getServiceKeysWithCredentials(CloudServiceInstance serviceInstance) {
return fetchListWithAuxiliaryContent(() -> getServiceKeyResource(serviceInstance),
serviceKey -> zipWithAuxiliaryServiceKeyContent(serviceKey, serviceInstance));
}
private Mono> zipWithAuxiliaryServiceKeyContent(ServiceBindingResource key,
CloudServiceInstance serviceInstance) {
return getServiceKeyCredentials(key.getId()).map(credentials -> ImmutableRawCloudServiceKey.builder()
.serviceBindingResource(key)
.credentials(credentials)
.serviceInstance(serviceInstance)
.build());
}
private Mono
© 2015 - 2025 Weber Informatics LLC | Privacy Policy