Skip to content
Merged
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
127 changes: 117 additions & 10 deletions multiapps-controller-client/pom.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<artifactId>multiapps-controller-client</artifactId>
Expand All @@ -22,17 +22,13 @@
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.sap.cloud.lm.sl</groupId>
<artifactId>cloudfoundry-client-facade</artifactId>
</dependency>
<dependency>
<groupId>org.cloudfoundry.multiapps</groupId>
<artifactId>multiapps-common</artifactId>
Expand All @@ -44,18 +40,129 @@
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring-security.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring-security.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webflux -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webflux</artifactId>
<exclusions>
<!-- Prevents "module foo reads package org.apache.commons.logging.impl
from both spring.jcl and org.apache.commons.logging" errors during compilation
(org.apache.commons.logging comes from jcl-over-slf4j). -->
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-jcl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
<version>${spring-security.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.immutables/value -->
<dependency>
<groupId>org.immutables</groupId>
<artifactId>value</artifactId>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.cloudfoundry/cloudfoundry-client-reactor -->
<dependency>
<groupId>org.cloudfoundry</groupId>
<artifactId>cloudfoundry-client-reactor</artifactId>
</dependency>
<!-- Transitive dependency from cloudfoundry-client. Pin the version, because the one they're using (1.0.3) contains vulnerabilities -->
<!-- https://mvnrepository.com/artifact/io.projectreactor.netty/reactor-netty -->
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
</dependency>
<!-- Required dependency due to enabled metrics of reactor-netty client -->
<!-- https://mvnrepository.com/artifact/io.micrometer/micrometer-registry-jmx -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>${micrometer.version}</version>
</dependency>
</dependencies>

<profiles>
<profile>
<id>integration</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.3</version>
<configuration>
<excludes>
<exclude>**/*</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.2.5</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>**/*IntegrationTest</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.cloudfoundry</groupId>
<artifactId>cloudfoundry-client-reactor</artifactId>
<version>${cloudfoundry-client.version}</version>
<exclusions>
<exclusion>
<!-- Excluding the dependency as it will be overridden by commons-logging (see below)
because they expose the same module, but jcl-over-slf4j 2.0.9 which comes as a transitive
dependency does not expose "org.apache.commons.logging.impl" package from "org.apache.commons.logging"
module which is used by org.springframework.core.log.CompositeLog and leads to java.lang.IllegalAccessError
during integration tests. -->
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>
</dependencies>
</profile>
</profiles>
</project>
16 changes: 15 additions & 1 deletion multiapps-controller-client/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,32 @@
exports org.cloudfoundry.multiapps.controller.client.lib.domain;
exports org.cloudfoundry.multiapps.controller.client.uaa;
exports org.cloudfoundry.multiapps.controller.client.util;
exports org.cloudfoundry.multiapps.controller.client.facade;
exports org.cloudfoundry.multiapps.controller.client.facade.rest;
exports org.cloudfoundry.multiapps.controller.client.facade.oauth2;
exports org.cloudfoundry.multiapps.controller.client.facade.domain;
exports org.cloudfoundry.multiapps.controller.client.facade.adapters;
exports org.cloudfoundry.multiapps.controller.client.facade.util;
exports org.cloudfoundry.multiapps.controller.client.facade.dto;

requires transitive org.cloudfoundry.client;
requires transitive com.sap.cloudfoundry.client.facade;
requires spring.security.oauth2.core;
requires transitive spring.web;

requires com.fasterxml.jackson.databind;
requires org.apache.commons.collections4;
requires org.apache.commons.io;
requires org.apache.commons.logging;
requires org.cloudfoundry.client.reactor;
requires org.cloudfoundry.multiapps.common;
requires org.cloudfoundry.util;
requires org.slf4j;
requires java.net.http;
requires spring.core;
requires spring.webflux;
requires reactor.core;
requires reactor.netty.core;
requires reactor.netty.http;
requires org.reactivestreams;
requires io.netty.handler;
requires io.netty.transport;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.cloudfoundry.multiapps.controller.client;

import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo;
import com.sap.cloudfoundry.client.facade.oauth2.OAuthClient;
import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo;
import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuthClient;

public class CloudFoundryTokenProvider implements TokenProvider {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,39 @@
import java.util.function.Supplier;

import org.cloudfoundry.client.v3.Metadata;
import org.cloudfoundry.multiapps.controller.client.facade.ApplicationServicesUpdateCallback;
import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient;
import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClientImpl;
import org.cloudfoundry.multiapps.controller.client.facade.ServiceBindingOperationCallback;
import org.cloudfoundry.multiapps.controller.client.facade.UploadStatusCallback;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudAsyncJob;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudBuild;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudEvent;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudPackage;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudProcess;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBinding;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceBroker;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceInstance;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceKey;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudServiceOffering;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudSpace;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudStack;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudTask;
import org.cloudfoundry.multiapps.controller.client.facade.domain.DockerInfo;
import org.cloudfoundry.multiapps.controller.client.facade.domain.DropletInfo;
import org.cloudfoundry.multiapps.controller.client.facade.domain.InstancesInfo;
import org.cloudfoundry.multiapps.controller.client.facade.domain.ServicePlanVisibility;
import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging;
import org.cloudfoundry.multiapps.controller.client.facade.domain.Upload;
import org.cloudfoundry.multiapps.controller.client.facade.domain.UserRole;
import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto;
import org.cloudfoundry.multiapps.controller.client.facade.rest.CloudControllerRestClient;
import org.cloudfoundry.multiapps.controller.client.util.ResilientCloudOperationExecutor;
import org.springframework.http.HttpStatus;

import com.sap.cloudfoundry.client.facade.ApplicationServicesUpdateCallback;
import com.sap.cloudfoundry.client.facade.CloudControllerClient;
import com.sap.cloudfoundry.client.facade.CloudControllerClientImpl;
import com.sap.cloudfoundry.client.facade.ServiceBindingOperationCallback;
import com.sap.cloudfoundry.client.facade.UploadStatusCallback;
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.CloudEvent;
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.CloudSpace;
import com.sap.cloudfoundry.client.facade.domain.CloudStack;
import com.sap.cloudfoundry.client.facade.domain.CloudTask;
import com.sap.cloudfoundry.client.facade.domain.DockerInfo;
import com.sap.cloudfoundry.client.facade.domain.DropletInfo;
import com.sap.cloudfoundry.client.facade.domain.InstancesInfo;
import com.sap.cloudfoundry.client.facade.domain.ServicePlanVisibility;
import com.sap.cloudfoundry.client.facade.domain.Staging;
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.rest.CloudControllerRestClient;

public class ResilientCloudControllerClient implements CloudControllerClient {

private final CloudControllerClientImpl delegate;
Expand Down Expand Up @@ -400,11 +399,11 @@ public void updateServiceSyslogDrainUrl(String serviceName, String syslogDrainUr
public CloudPackage asyncUploadApplicationWithExponentialBackoff(String applicationName, Path file, UploadStatusCallback callback,
Duration overrideTimeout) {
if (overrideTimeout != null) {
return executeWithRetry(() -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, callback,
overrideTimeout));
return executeWithRetry(
() -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, callback, overrideTimeout));
}
return executeWithExponentialBackoff(timeout -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file,
callback, timeout));
return executeWithExponentialBackoff(
timeout -> delegate.asyncUploadApplicationWithExponentialBackoff(applicationName, file, callback, timeout));
}

@Override
Expand Down Expand Up @@ -550,8 +549,8 @@ public List<CloudBuild> getBuildsForApplication(UUID applicationGuid) {
@Override
public Optional<String> unbindServiceInstance(String applicationName, String serviceInstanceName,
ApplicationServicesUpdateCallback applicationServicesUpdateCallback) {
return executeWithRetry(() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName,
applicationServicesUpdateCallback));
return executeWithRetry(
() -> delegate.unbindServiceInstance(applicationName, serviceInstanceName, applicationServicesUpdateCallback));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.cloudfoundry.multiapps.controller.client;

import com.sap.cloudfoundry.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo;
import org.cloudfoundry.multiapps.controller.client.facade.oauth2.OAuth2AccessTokenWithAdditionalInfo;

public interface TokenProvider {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.cloudfoundry.multiapps.controller.client.facade;

import org.cloudfoundry.multiapps.controller.client.facade.domain.ApplicationLog;

public interface ApplicationLogListener {

void onComplete();

void onError(Throwable exception);

void onMessage(ApplicationLog log);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.cloudfoundry.multiapps.controller.client.facade;

public interface ApplicationServicesUpdateCallback {

void onError(CloudOperationException e, String applicationName, String serviceInstanceName);
}
Loading
Loading