diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java index 0cb70df31a..69d4515967 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/ResilientCloudControllerClient.java @@ -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; @@ -69,8 +68,8 @@ public void addDomain(String domainName) { } @Override - public void addRoute(String host, String domainName, String path) { - executeWithRetry(() -> delegate.addRoute(host, domainName, path)); + public void addRoute(String host, String domainName, String path, Map options) { + executeWithRetry(() -> delegate.addRoute(host, domainName, path, options)); } @Override diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java index e8e057cbcc..752ce5436d 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClient.java @@ -53,8 +53,9 @@ public interface CloudControllerClient { * * @param host the host of the route to register * @param domainName the domain of the route to register + * @param options the options for the route as load balancing algorithm */ - void addRoute(String host, String domainName, String path); + void addRoute(String host, String domainName, String path, Map options); /** * Associate (provision) a service with an application. diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java index 9bf88c3bc9..a3997c4304 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/CloudControllerClientImpl.java @@ -83,8 +83,8 @@ public void addDomain(String domainName) { } @Override - public void addRoute(String host, String domainName, String path) { - handleExceptions(() -> delegate.addRoute(host, domainName, path)); + public void addRoute(String host, String domainName, String path, Map options) { + handleExceptions(() -> delegate.addRoute(host, domainName, path, options)); } @Override diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java index e2ae758814..67d0239ea2 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRoute.java @@ -6,8 +6,6 @@ import java.util.stream.Collectors; import org.cloudfoundry.client.v3.routes.Route; -import org.immutables.value.Value; - import org.cloudfoundry.multiapps.controller.client.facade.Nullable; import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; @@ -15,6 +13,7 @@ import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableRouteDestination; import org.cloudfoundry.multiapps.controller.client.facade.domain.RouteDestination; +import org.immutables.value.Value; @Value.Immutable public abstract class RawCloudRoute extends RawCloudEntity { @@ -47,6 +46,8 @@ public CloudRoute derive() { .url(route.getUrl()) .destinations(destinations) .requestedProtocol(computeRequestedProtocol(destinations)) + .options(route.getOptions() + .getValues()) .build(); } @@ -56,7 +57,7 @@ private static String computeDomain(Route route) { .isEmpty()) { domain = domain.substring(route.getHost() .length() - + 1); + + 1); } if (!route.getPath() .isEmpty()) { @@ -73,7 +74,8 @@ private List mapDestinations() { .stream() .map(destination -> ImmutableRouteDestination.builder() .metadata(ImmutableCloudMetadata.builder() - .guid(UUID.fromString(destination.getDestinationId())) + .guid(UUID.fromString( + destination.getDestinationId())) .build()) .applicationGuid(UUID.fromString(destination.getApplication() .getApplicationId())) diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java index c769706512..5981e070b1 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/domain/CloudRoute.java @@ -1,13 +1,14 @@ package org.cloudfoundry.multiapps.controller.client.facade.domain; import java.util.List; +import java.util.Map; import java.util.Objects; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.cloudfoundry.multiapps.common.AllowNulls; import org.cloudfoundry.multiapps.controller.client.facade.Nullable; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableCloudRoute.class) @@ -33,6 +34,9 @@ public int getAppsUsingRoute() { @Nullable public abstract String getRequestedProtocol(); + @AllowNulls + public abstract Map getOptions(); + @Nullable public abstract List getDestinations(); @@ -50,7 +54,7 @@ public String toString() { @Override public int hashCode() { - return Objects.hash(getDomain().getName(), getHost(), getPath(), getPort()); + return Objects.hash(getDomain().getName(), getHost(), getPath(), getPort(), getOptions()); } @Override @@ -69,7 +73,8 @@ public boolean equals(Object object) { return thisDomain.equals(otherDomain) && areEmptyOrEqual(getHost(), otherRoute.getHost()) && areEmptyOrEqual(getPath(), otherRoute.getPath()) - && Objects.equals(getPort(), otherRoute.getPort()); + && Objects.equals(getPort(), otherRoute.getPort()) + && Objects.equals(getOptions(), otherRoute.getOptions()); // @formatter:on } diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java index 61c3b2b8bd..53b0711b70 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClient.java @@ -44,7 +44,7 @@ public interface CloudControllerRestClient { void addDomain(String domainName); - void addRoute(String host, String domainName, String path); + void addRoute(String host, String domainName, String path, Map options); Optional bindServiceInstance(String bindingName, String applicationName, String serviceInstanceName); diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java index ef744cd882..534b547ccd 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/facade/rest/CloudControllerRestClientImpl.java @@ -99,8 +99,11 @@ 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.RouteOptions; import org.cloudfoundry.client.v3.routes.RouteRelationships; import org.cloudfoundry.client.v3.routes.RouteResource; +import org.cloudfoundry.client.v3.routes.UpdateRouteRequest; +import org.cloudfoundry.client.v3.routes.UpdateRouteResponse; import org.cloudfoundry.client.v3.servicebindings.CreateServiceBindingRequest; import org.cloudfoundry.client.v3.servicebindings.CreateServiceBindingResponse; import org.cloudfoundry.client.v3.servicebindings.DeleteServiceBindingRequest; @@ -264,10 +267,10 @@ public void addDomain(String domainName) { } @Override - public void addRoute(String host, String domainName, String path) { + public void addRoute(String host, String domainName, String path, Map options) { assertSpaceProvided("add route for domain"); UUID domainGuid = getRequiredDomainGuid(domainName); - doAddRoute(domainGuid, host, path); + doAddRoute(domainGuid, host, path, options); } @Override @@ -456,7 +459,7 @@ private void addRoutes(Set routes, UUID applicationGuid) { validateDomainForRoute(route, domains); UUID domainGuid = domains.get(route.getDomain() .getName()); - UUID routeGuid = getOrAddRoute(domainGuid, route.getHost(), route.getPath()); + UUID routeGuid = getOrAddRoute(domainGuid, route.getHost(), route.getPath(), route.getOptions()); bindRoute(routeGuid, applicationGuid, route.getRequestedProtocol()); } } @@ -641,12 +644,12 @@ public void deleteOrphanedRoutes() { @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) { + RouteResource routeResource = getRouteResource(getRequiredDomainGuid(domainName), host, path); + if (routeResource == null) { throw new CloudOperationException(HttpStatus.NOT_FOUND, "Not Found", "Host " + host + " not found for domain " + domainName + "."); } - doDeleteRoute(routeGuid); + doDeleteRoute(UUID.fromString(routeResource.getId())); } @Override @@ -1365,7 +1368,15 @@ private boolean isRouteOutdated(UUID applicationGuid, CloudRoute currentRoute, S if (updatedRoute.isEmpty()) { return true; } - return isProtocolChanged(applicationGuid, currentRoute, updatedRoute.get()); + return isProtocolChanged(applicationGuid, currentRoute, updatedRoute.get()) + || isOptionsChanged(currentRoute, updatedRoute.get()); + } + + private boolean isOptionsChanged(CloudRoute currentRoute, CloudRoute updatedRoute) { + if (updatedRoute.getOptions() == null) { + return false; + } + return !Objects.equals(currentRoute.getOptions(), updatedRoute.getOptions()); } private Optional findRoute(String url, Collection routes) { @@ -1396,7 +1407,7 @@ private boolean isRouteUpdated(UUID applicationGuid, CloudRoute updatedRoute, Li if (currentRoute.isEmpty()) { return true; } - return isProtocolChanged(applicationGuid, currentRoute.get(), updatedRoute); + return isProtocolChanged(applicationGuid, currentRoute.get(), updatedRoute) || isOptionsChanged(currentRoute.get(), updatedRoute); } @Override @@ -1973,15 +1984,28 @@ private Destination createDestination(UUID applicationGuid, String protocol) { .build(); } - private UUID getOrAddRoute(UUID domainGuid, String host, String path) { - UUID routeGuid = getRouteGuid(domainGuid, host, path); - if (routeGuid == null) { - routeGuid = doAddRoute(domainGuid, host, path); + private UUID getOrAddRoute(UUID domainGuid, String host, String path, Map options) { + RouteResource routeResource = getRouteResource(domainGuid, host, path); + if (routeResource == null) { + return doAddRoute(domainGuid, host, path, options); + } + if (!Objects.equals(routeResource.getOptions() + .getValues(), options)) { + UpdateRouteRequest request = UpdateRouteRequest.builder() + .routeId(routeResource.getId()) + .options(RouteOptions.builder() + .values(options) + .build()) + .build(); + UpdateRouteResponse response = delegate.routesV3() + .update(request) + .block(); + return UUID.fromString(response.getId()); } - return routeGuid; + return UUID.fromString(routeResource.getId()); } - private UUID doAddRoute(UUID domainGuid, String host, String path) { + private UUID doAddRoute(UUID domainGuid, String host, String path, Map options) { assertSpaceProvided("add route"); CreateRouteResponse response = delegate.routesV3() .create(CreateRouteRequest.builder() @@ -1993,6 +2017,9 @@ private UUID doAddRoute(UUID domainGuid, String host, String path) { .space(buildToOneRelationship( getTargetSpaceGuid())) .build()) + .options(RouteOptions.builder() + .values(options) + .build()) .build()) .block(); return getGuid(response); @@ -2454,14 +2481,14 @@ private Map getDomainsFromRoutes(Set routes) { .block(); } - private UUID getRouteGuid(UUID domainGuid, String host, String path) { + private RouteResource getRouteResource(UUID domainGuid, String host, String path) { List routeEntitiesResource = getRouteResourcesByDomainGuidHostAndPath(domainGuid, host, path).collect( Collectors.toList()) .block(); if (CollectionUtils.isEmpty(routeEntitiesResource)) { return null; } - return getGuid(routeEntitiesResource.get(0)); + return routeEntitiesResource.get(0); } private UUID getServiceBindingGuid(UUID applicationGuid, UUID serviceInstanceGuid) { diff --git a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java index 94f19d18d3..22e999622f 100644 --- a/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java +++ b/multiapps-controller-client/src/test/java/org/cloudfoundry/multiapps/controller/client/facade/adapters/RawCloudRouteTest.java @@ -1,6 +1,7 @@ package org.cloudfoundry.multiapps.controller.client.facade.adapters; import java.util.List; +import java.util.Map; import java.util.UUID; import org.cloudfoundry.client.v3.Relationship; @@ -8,14 +9,14 @@ import org.cloudfoundry.client.v3.routes.Application; import org.cloudfoundry.client.v3.routes.Destination; import org.cloudfoundry.client.v3.routes.Route; +import org.cloudfoundry.client.v3.routes.RouteOptions; import org.cloudfoundry.client.v3.routes.RouteRelationships; import org.cloudfoundry.client.v3.routes.RouteResource; -import org.junit.jupiter.api.Test; - import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudDomain; import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute; import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudDomain; import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudRoute; +import org.junit.jupiter.api.Test; class RawCloudRouteTest { @@ -44,6 +45,7 @@ private static CloudRoute buildExpectedRoute() { .path("") .appsUsingRoute(APPS_USING_ROUTE) .url(HOST + "." + DOMAIN_NAME) + .options(Map.of("loadbalancing", "round-robin")) .build(); } @@ -67,6 +69,9 @@ private static Route buildTestRoute() { .path("") .url(HOST + "." + DOMAIN_NAME) .addAllDestinations(DESTINATIONS) + .options(RouteOptions.builder() + .value("loadbalancing", "round-robin") + .build()) .build(); } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaDescriptorPropertiesResolver.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaDescriptorPropertiesResolver.java index ef806917b9..4a294615ce 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaDescriptorPropertiesResolver.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/helpers/MtaDescriptorPropertiesResolver.java @@ -1,10 +1,12 @@ package org.cloudfoundry.multiapps.controller.core.helpers; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.collections4.MapUtils; import org.cloudfoundry.multiapps.common.util.MapUtil; import org.cloudfoundry.multiapps.controller.core.cf.CloudHandlerFactory; import org.cloudfoundry.multiapps.controller.core.helpers.v2.ConfigurationReferencesResolver; @@ -142,8 +144,12 @@ private void editRoutesSetTemporaryPlaceholders(DeploymentDescriptor descriptor) Object routeValue = routeMap.get(SupportedParameters.ROUTE); Boolean noHostname = MapUtil.parseBooleanFlag(routeMap, SupportedParameters.NO_HOSTNAME, false); String protocol = (String) routeMap.get(SupportedParameters.ROUTE_PROTOCOL); + @SuppressWarnings("unchecked") Map routeOptions = (Map) MapUtils.getMap(routeMap, + SupportedParameters.ROUTE_OPTIONS, + Collections.emptyMap()); if (routeValue instanceof String) { - routeMap.put(SupportedParameters.ROUTE, replacePartsWithIdlePlaceholders((String) routeValue, noHostname, protocol)); + routeMap.put(SupportedParameters.ROUTE, + replacePartsWithIdlePlaceholders((String) routeValue, noHostname, protocol, routeOptions)); } if (routeMap.containsKey(SupportedParameters.NO_HOSTNAME)) { @@ -154,8 +160,9 @@ private void editRoutesSetTemporaryPlaceholders(DeploymentDescriptor descriptor) } } - private String replacePartsWithIdlePlaceholders(String uriString, boolean noHostname, String protocol) { - ApplicationURI uri = new ApplicationURI(uriString, noHostname, protocol); + private String replacePartsWithIdlePlaceholders(String uriString, boolean noHostname, String protocol, + Map routeOptions) { + ApplicationURI uri = new ApplicationURI(uriString, noHostname, protocol, routeOptions); uri.setDomain(IDLE_DOMAIN_PLACEHOLDER); uri.setHost(IDLE_HOST_PLACEHOLDER); return uri.toString(); diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameters.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameters.java index 62ff077d27..b306354ffa 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameters.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameters.java @@ -114,6 +114,7 @@ public class SupportedParameters { public static final String NO_START = "no-start"; public static final String CHECK_DEPLOY_ID = "check-deploy-id"; public static final String SKIP_DEPLOY = "skip-deploy"; + public static final String ROUTE_OPTIONS = "options"; public static final String REGISTER_SERVICE_URL = "register-service-url"; public static final String REGISTER_SERVICE_URL_SERVICE_NAME = "service-name"; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java index 925a9186a2..fad40b9b44 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/IdleRouteParametersParser.java @@ -58,7 +58,8 @@ public CloudRoute parseIdleRouteMap(Map routeMap) { } Boolean noHostname = MapUtil.parseBooleanFlag(routeMap, SupportedParameters.NO_HOSTNAME, false); String protocol = (String) routeMap.get(SupportedParameters.ROUTE_PROTOCOL); - return new ApplicationURI(routeString, noHostname, protocol).toCloudRoute(); + Map routeOptions = MapUtil.parseMap(routeMap, SupportedParameters.ROUTE_OPTIONS, Collections.emptyMap()); + return new ApplicationURI(routeString, noHostname, protocol, routeOptions).toCloudRoute(); } private Set modifyLiveRoutes(Set liveRoutes) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java index 1e8c57d824..19c4461d5d 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/parser/RouteParametersParser.java @@ -137,7 +137,8 @@ public CloudRoute parseRouteMap(Map routeMap) { } Boolean noHostname = MapUtil.parseBooleanFlag(routeMap, SupportedParameters.NO_HOSTNAME, false); String protocol = (String) routeMap.get(SupportedParameters.ROUTE_PROTOCOL); - return new ApplicationURI(routeString, noHostname, protocol).toCloudRoute(); + Map routeOptions = MapUtil.parseMap(routeMap, SupportedParameters.ROUTE_OPTIONS, Collections.emptyMap()); + return new ApplicationURI(routeString, noHostname, protocol, routeOptions).toCloudRoute(); } private List getDomainsFromRoutes(Set routes) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java index ddacd3f717..0bdc769f10 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURI.java @@ -18,15 +18,17 @@ public class ApplicationURI { private String domain = ""; private String path = ""; private String protocol; + private Map options = Collections.emptyMap(); public static String getDomainFromURI(String uri, boolean noHostname) { - ApplicationURI parsedURI = new ApplicationURI(uri, noHostname, null); + ApplicationURI parsedURI = new ApplicationURI(uri, noHostname, null, Collections.emptyMap()); return parsedURI.getDomain(); } - public ApplicationURI(String initial, boolean noHostname, String protocol) { + public ApplicationURI(String initial, boolean noHostname, String protocol, Map options) { uri = UriUtil.stripScheme(initial); this.protocol = protocol; + this.options = options; int domainIndex = getDomainIndex(noHostname); int pathIndex = getPathIndexAfter(domainIndex); @@ -124,6 +126,7 @@ public CloudRoute toCloudRoute() { .path(getPath()) .url(toString()) .requestedProtocol(getProtocol()) + .options(getOptions()) .build(); } @@ -174,6 +177,10 @@ public void setProtocol(String protocol) { this.protocol = protocol; } + public Map getOptions() { + return options; + } + private void setParts(String host, String domain, String path) { this.host = host; this.domain = domain; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RouteValidator.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RouteValidator.java index 8d2052f3db..9418f1b8e2 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RouteValidator.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RouteValidator.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Set; +import org.apache.commons.collections4.MapUtils; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.common.util.MapUtil; import org.cloudfoundry.multiapps.controller.core.Messages; @@ -34,7 +35,10 @@ public String attemptToCorrect(Object route, final Map context) String routeString = (String) route; Boolean noHostname = MapUtil.parseBooleanFlag(context, SupportedParameters.NO_HOSTNAME, false); String protocol = (String) context.get(SupportedParameters.ROUTE_PROTOCOL); - ApplicationURI uri = new ApplicationURI(routeString, noHostname, protocol); + @SuppressWarnings("unchecked") Map routeOptions = (Map) MapUtils.getMap(context, + SupportedParameters.ROUTE_OPTIONS, + Collections.emptyMap()); + ApplicationURI uri = new ApplicationURI(routeString, noHostname, protocol, routeOptions); try { for (ParameterValidator validator : validators) { correctUriPartIfPresent(uri, validator, context); @@ -79,7 +83,10 @@ public boolean isValid(Object route, final Map context) { Boolean noHostname = MapUtil.parseBooleanFlag(context, SupportedParameters.NO_HOSTNAME, false); String protocol = (String) context.get(SupportedParameters.ROUTE_PROTOCOL); - ApplicationURI uri = new ApplicationURI(routeString, noHostname, protocol); + @SuppressWarnings("unchecked") Map routeOptions = (Map) MapUtils.getMap(context, + SupportedParameters.ROUTE_OPTIONS, + Collections.emptyMap()); + ApplicationURI uri = new ApplicationURI(routeString, noHostname, protocol, routeOptions); Map uriParts = uri.getURIParts(); for (ParameterValidator validator : validators) { diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RoutesValidator.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RoutesValidator.java index 4662133fc3..3ec07d8d0e 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RoutesValidator.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/validators/parameters/RoutesValidator.java @@ -111,10 +111,14 @@ private Map getUpdatedAllRouteElements(Map route Map updatedAllRouteElements = new HashMap<>(routeElement); Set relatedParameters = getRelatedParameterNames(); Map globalParametersValues = relatedParameters.stream() - .filter(relatedParameter -> isGlobalParameterValueNotOverridenInRouteElement(relatedParameter, - routeElement, - context)) - .filter(relatedParameter -> !getSpecificRouteParameterNames().contains(relatedParameter)) + .filter( + relatedParameter -> isGlobalParameterValueNotOverridenInRouteElement( + relatedParameter, + routeElement, + context)) + .filter( + relatedParameter -> !getSpecificRouteParameterNames().contains( + relatedParameter)) .collect(Collectors.toMap(Function.identity(), context::get)); updatedAllRouteElements.putAll(globalParametersValues); return updatedAllRouteElements; @@ -171,7 +175,8 @@ public boolean canCorrect() { @Override public Set getRelatedParameterNames() { - return Set.of(SupportedParameters.NO_HOSTNAME, SupportedParameters.ROUTE_PROTOCOL, SupportedParameters.APPLY_NAMESPACE); + return Set.of(SupportedParameters.NO_HOSTNAME, SupportedParameters.ROUTE_PROTOCOL, SupportedParameters.APPLY_NAMESPACE, + SupportedParameters.ROUTE_OPTIONS); } private Set getSpecificRouteParameterNames() { diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java index 7c1d5c4508..73eac05d3c 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationRoutesCloudModelBuilderTest.java @@ -2,6 +2,7 @@ import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -86,13 +87,54 @@ private List> getModuleParameters() { } private List getExistingRoutes() { - var existingHttp2RouteAlreadyDefined = buildCloudRoute("ccc", "cfapps.sap.hana.ondemand.com", "http2"); - var existingHttp2RouteNotDefined = buildCloudRoute("xxx", "cfapps.sap.hana.ondemand.com", "http2"); - var existingHttp2RouteOverridden = buildCloudRoute("bbc", "cfapps.sap.hana.ondemand.com", "http1"); + var existingHttp2RouteAlreadyDefined = buildCloudRoute("ccc", "cfapps.sap.hana.ondemand.com", "http2", Collections.emptyMap()); + var existingHttp2RouteNotDefined = buildCloudRoute("xxx", "cfapps.sap.hana.ondemand.com", "http2", Collections.emptyMap()); + var existingHttp2RouteOverridden = buildCloudRoute("bbc", "cfapps.sap.hana.ondemand.com", "http1", Collections.emptyMap()); return List.of(existingHttp2RouteAlreadyDefined, existingHttp2RouteNotDefined, existingHttp2RouteOverridden); } - private CloudRoute buildCloudRoute(String host, String domain, String protocol) { + @Test + void testGetApplicationRoutesWithOptions() { + Map routeOptions = Map.of("loadbalancing", "round-robin"); + Map route = Map.of(SupportedParameters.ROUTE, "abc.cfapps.sap.hana.ondemand.com", + SupportedParameters.ROUTE_OPTIONS, routeOptions); + List> moduleParameters = List.of(Map.of(SupportedParameters.ROUTES, List.of(route))); + Module module = Mockito.mock(Module.class); + DeployedMtaApplication deployedMtaApplication = Mockito.mock(DeployedMtaApplication.class); + + List applicationRoutes = new ArrayList<>( + applicationRoutesCloudModelBuilder.getApplicationRoutes(module, moduleParameters, deployedMtaApplication)); + + assertEquals(1, applicationRoutes.size()); + assertEquals("abc.cfapps.sap.hana.ondemand.com", applicationRoutes.get(0) + .getUrl()); + assertEquals(routeOptions, applicationRoutes.get(0) + .getOptions()); + } + + @Test + void testGetApplicationRoutesWhenKeepExistingIsTruePreservesOptions() { + Map routeOptions = Map.of("loadbalancing", "round-robin"); + Map newRoute = Map.of(SupportedParameters.ROUTE, "abc.cfapps.sap.hana.ondemand.com", + SupportedParameters.ROUTE_OPTIONS, routeOptions); + List> moduleParameters = List.of(Map.of(SupportedParameters.ROUTES, List.of(newRoute), + SupportedParameters.KEEP_EXISTING_ROUTES, true)); + CloudRoute existingRoute = buildCloudRoute("abc", "cfapps.sap.hana.ondemand.com", null, routeOptions); + when(client.getApplicationRoutes(any())).thenReturn(List.of(existingRoute)); + Module module = Mockito.mock(Module.class); + DeployedMtaApplication deployedMtaApplication = Mockito.mock(DeployedMtaApplication.class); + + Set applicationRoutes = applicationRoutesCloudModelBuilder.getApplicationRoutes(module, moduleParameters, + deployedMtaApplication); + + assertEquals(1, applicationRoutes.size()); + CloudRoute resultRoute = applicationRoutes.iterator() + .next(); + assertEquals("abc.cfapps.sap.hana.ondemand.com", resultRoute.getUrl()); + assertEquals(routeOptions, resultRoute.getOptions()); + } + + private CloudRoute buildCloudRoute(String host, String domain, String protocol, Map options) { return ImmutableCloudRoute.builder() .url(host + "." + domain) .host(host) @@ -100,6 +142,7 @@ private CloudRoute buildCloudRoute(String host, String domain, String protocol) .domain(ImmutableCloudDomain.builder() .name(domain) .build()) + .options(options) .build(); } diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameterTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameterTest.java index 6285baa1a5..3bb7e3e610 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameterTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameterTest.java @@ -34,7 +34,8 @@ public class SupportedParameterTest { private static final Set NESTED_PARAMETERS = Set.of(SupportedParameters.IDLE_ROUTE, SupportedParameters.VCAP_APPLICATION_ENV, SupportedParameters.VCAP_SERVICES_ENV, - SupportedParameters.USER_PROVIDED_ENV, SupportedParameters.NO_HOSTNAME); + SupportedParameters.USER_PROVIDED_ENV, SupportedParameters.NO_HOSTNAME, + SupportedParameters.ROUTE_OPTIONS); private static final Set PLANNED_FUTURE_PARAMETERS = Set.of( SupportedParameters.READINESS_HEALTH_CHECK_HTTP_ENDPOINT, diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java index edf8d475e6..352638101d 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/ApplicationURITest.java @@ -1,5 +1,6 @@ package org.cloudfoundry.multiapps.controller.core.util; +import java.util.Collections; import java.util.Map; import java.util.stream.Stream; @@ -32,7 +33,7 @@ static Stream testGetHostDomainPath() { @ParameterizedTest @MethodSource void testGetHostDomainPath(String uri, boolean noHostname, String expectedHost, String expectedDomain, String expectedPath) { - ApplicationURI applicationURI = new ApplicationURI(uri, noHostname, "http2"); + ApplicationURI applicationURI = new ApplicationURI(uri, noHostname, "http2", Collections.emptyMap()); Assertions.assertEquals(expectedHost, applicationURI.getHost()); Assertions.assertEquals(expectedDomain, applicationURI.getDomain()); Assertions.assertEquals(expectedPath, applicationURI.getPath()); diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java index 592d9e8201..e28a40bc57 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/util/TestData.java @@ -1,5 +1,6 @@ package org.cloudfoundry.multiapps.controller.core.util; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -53,11 +54,11 @@ public static Map constructRouteParameter(String route, boolean public static final String NOHOSTNAME_URI_FLAG = "NOHOSTNAME-"; public static CloudRoute route(String uri) { - return route(removePrefix(uri), uriIsHostless(uri), "http1"); + return route(removePrefix(uri), uriIsHostless(uri), "http1", Collections.emptyMap()); } - public static CloudRoute route(String uri, boolean noHostname, String protocol) { - return new ApplicationURI(uri, noHostname, protocol).toCloudRoute(); + public static CloudRoute route(String uri, boolean noHostname, String protocol, Map options) { + return new ApplicationURI(uri, noHostname, protocol, options).toCloudRoute(); } public static CloudRoute route(String host, String domain, String path) { diff --git a/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-empty.json b/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-empty.json index 510a916b02..89233ce1aa 100644 --- a/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-empty.json +++ b/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-empty.json @@ -29,6 +29,7 @@ }, "host": "feature-app", "path": "", + "options": {}, "url": "feature-app.cfapps.neo.ondemand.com" } ], @@ -51,4 +52,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-single.json b/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-single.json index fea9651101..892fb01973 100644 --- a/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-single.json +++ b/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features-single.json @@ -31,6 +31,7 @@ }, "host": "feature-app", "path": "", + "options": {}, "url": "feature-app.cfapps.neo.ondemand.com" } ], @@ -53,4 +54,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features.json b/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features.json index fd22c32a93..1da3aec88f 100644 --- a/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features.json +++ b/multiapps-controller-core/src/test/resources/mta/app-features/apps-app-features.json @@ -33,6 +33,7 @@ }, "host": "feature-app", "path": "", + "options": {}, "url": "feature-app.cfapps.neo.ondemand.com" } ], @@ -55,4 +56,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/devxdi/apps.json b/multiapps-controller-core/src/test/resources/mta/devxdi/apps.json index 8755528450..30047e1a8c 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxdi/apps.json +++ b/multiapps-controller-core/src/test/resources/mta/devxdi/apps.json @@ -31,6 +31,7 @@ }, "host": "i027947-di-core", "path": "", + "options": {}, "url": "i027947-di-core.cfapps.neo.ondemand.com" } ], @@ -93,6 +94,7 @@ }, "host": "i027947-di-builder", "path": "", + "options": {}, "url": "i027947-di-builder.cfapps.neo.ondemand.com" } ], @@ -152,6 +154,7 @@ }, "host": "i027947-di-runner", "path": "", + "options": {}, "url": "i027947-di-runner.cfapps.neo.ondemand.com" } ], @@ -180,4 +183,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-apps.json b/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-apps.json index 7aaac0b573..94a5cd71f4 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-apps.json +++ b/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-apps.json @@ -29,6 +29,7 @@ }, "host": "di-core", "path": "", + "options": {}, "url": "di-core.sofd60245639a" } ], @@ -93,6 +94,7 @@ }, "host": "di-builder", "path": "", + "options": {}, "url": "di-builder.sofd60245639a" } ], @@ -151,6 +153,7 @@ }, "host": "di-runner", "path": "", + "options": {}, "url": "di-runner.sofd60245639a" } ], @@ -180,4 +183,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/devxwebide/apps.json b/multiapps-controller-core/src/test/resources/mta/devxwebide/apps.json index 2de7f83aa4..bd1ee210d2 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxwebide/apps.json +++ b/multiapps-controller-core/src/test/resources/mta/devxwebide/apps.json @@ -29,6 +29,7 @@ }, "host": "i027947-webide", "path": "", + "options": {}, "url": "i027947-webide.cfapps.neo.ondemand.com" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/devxwebide/xs2-apps.json b/multiapps-controller-core/src/test/resources/mta/devxwebide/xs2-apps.json index 95c41b1ca2..d1894fb5f8 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxwebide/xs2-apps.json +++ b/multiapps-controller-core/src/test/resources/mta/devxwebide/xs2-apps.json @@ -29,6 +29,7 @@ }, "host": "webide", "path": "", + "options": {}, "url": "webide.sofd60245639a" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-1.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-1.json index 77feeedfae..a1899feb3b 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-1.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-1.json @@ -31,6 +31,7 @@ }, "host": "i027947-java-hello-world", "path": "", + "options": {}, "url": "i027947-java-hello-world.cfapps.neo.ondemand.com" } ], @@ -90,6 +91,7 @@ }, "host": "i027947-java-hello-world-backend", "path": "", + "options": {}, "url": "i027947-java-hello-world-backend.cfapps.neo.ondemand.com" } ], @@ -165,4 +167,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-2.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-2.json index dad53cfef5..55fbbb579b 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-2.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-2.json @@ -31,6 +31,7 @@ }, "host": "i027947-java-hello-world", "path": "", + "options": {}, "url": "i027947-java-hello-world.cfapps.neo.ondemand.com" } ], @@ -90,6 +91,7 @@ }, "host": "i027947-java-hello-world-backend", "path": "", + "options": {}, "url": "i027947-java-hello-world-backend.cfapps.neo.ondemand.com" } ], @@ -165,4 +167,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-3.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-3.json index 3f0ce02e8c..645dd556ed 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-3.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-ns-3.json @@ -31,6 +31,7 @@ }, "host": "i027947-java-hello-world", "path": "", + "options": {}, "url": "i027947-java-hello-world.cfapps.neo.ondemand.com" } ], @@ -90,6 +91,7 @@ }, "host": "i027947-java-hello-world-backend", "path": "", + "options": {}, "url": "i027947-java-hello-world-backend.cfapps.neo.ondemand.com" } ], @@ -165,4 +167,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch-ns.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch-ns.json index 41315f7c7b..15171d287b 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch-ns.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch-ns.json @@ -31,6 +31,7 @@ }, "host": "i027947-java-hello-world", "path": "", + "options": {}, "url": "i027947-java-hello-world.cfapps.neo.ondemand.com" } ], @@ -56,4 +57,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch.json index 968b6993ad..387ef07e3c 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps-patch.json @@ -29,6 +29,7 @@ }, "host": "i027947-java-hello-world", "path": "", + "options": {}, "url": "i027947-java-hello-world.cfapps.neo.ondemand.com" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps.json index c2b01d3f57..7235ed43ee 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/apps.json @@ -29,6 +29,7 @@ }, "host": "i027947-java-hello-world", "path": "", + "options": {}, "url": "i027947-java-hello-world.cfapps.neo.ondemand.com" } ], @@ -86,6 +87,7 @@ }, "host": "i027947-java-hello-world-backend", "path": "", + "options": {}, "url": "i027947-java-hello-world-backend.cfapps.neo.ondemand.com" } ], @@ -159,4 +161,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-apps.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-apps.json index 90f009930c..85526e1b6b 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-apps.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-apps.json @@ -29,6 +29,7 @@ }, "host": "java-hello-world", "path": "", + "options": {}, "url": "java-hello-world.sofd60245639a" } ], @@ -84,6 +85,7 @@ }, "host": "java-hello-world-backend", "path": "", + "options": {}, "url": "java-hello-world-backend.sofd60245639a" } ], @@ -154,4 +156,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/sample/apps.json b/multiapps-controller-core/src/test/resources/mta/sample/apps.json index 65f2803854..0ef55c714e 100644 --- a/multiapps-controller-core/src/test/resources/mta/sample/apps.json +++ b/multiapps-controller-core/src/test/resources/mta/sample/apps.json @@ -29,6 +29,7 @@ }, "host": "www", "path": "", + "options": {}, "url": "www.bestprice.sap.com" } ], @@ -88,6 +89,7 @@ }, "host": "api", "path": "", + "options": {}, "url": "api.bestprice.sap.com" } ], @@ -147,6 +149,7 @@ }, "host": "pricing-db", "path": "", + "options": {}, "url": "pricing-db.cfapps.neo.ondemand.com" } ], @@ -172,4 +175,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/shine/apps.json b/multiapps-controller-core/src/test/resources/mta/shine/apps.json index 671c3b9de9..0d27c2c8ac 100644 --- a/multiapps-controller-core/src/test/resources/mta/shine/apps.json +++ b/multiapps-controller-core/src/test/resources/mta/shine/apps.json @@ -29,6 +29,7 @@ }, "host": "i027947-shine", "path": "", + "options": {}, "url": "i027947-shine.cfapps.neo.ondemand.com" } ], @@ -84,6 +85,7 @@ }, "host": "i027947-shine-xsjs", "path": "", + "options": {}, "url": "i027947-shine-xsjs.cfapps.neo.ondemand.com" } ], @@ -142,6 +144,7 @@ }, "host": "i027947-shine-odata", "path": "", + "options": {}, "url": "i027947-shine-odata.cfapps.neo.ondemand.com" } ], @@ -169,4 +172,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-false.json b/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-false.json index 23b64a82aa..77ddda5c14 100644 --- a/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-false.json +++ b/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-false.json @@ -29,6 +29,7 @@ }, "host": "skip-deploy-app", "path": "", + "options": {}, "url": "skip-deploy-app.cfapps.neo.ondemand.com" } ], @@ -81,6 +82,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.cfapps.neo.ondemand.com" } ], @@ -103,4 +105,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-true.json b/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-true.json index b08c5db413..ac2685c380 100644 --- a/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-true.json +++ b/multiapps-controller-core/src/test/resources/mta/skip-deploy/apps-skip-deploy-true.json @@ -29,6 +29,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.cfapps.neo.ondemand.com" } ], @@ -51,4 +52,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-01.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-01.json index fe1c6f6236..787578f942 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-01.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-01.json @@ -29,6 +29,7 @@ }, "host": "foo", "path": "/test", + "options": {}, "url": "foo.cfapps.neo.ondemand.com/test" } ], @@ -59,4 +60,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-02.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-02.json index d3eba88c44..1156e679c0 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-02.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-02.json @@ -29,6 +29,7 @@ }, "host": "test-host", "path": "/test", + "options": {}, "url": "test-host.sofd60245639a/test" } ], @@ -82,6 +83,7 @@ }, "host": "module-2", "path": "", + "options": {}, "url": "module-2.sofd60245639a" } ], @@ -105,4 +107,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-03.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-03.json index 9690daeca4..f00ca086f3 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-03.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-03.json @@ -31,6 +31,7 @@ }, "host": "test-host", "path": "/test", + "options": {}, "url": "test-host.sofd60245639a/test" } ], @@ -86,6 +87,7 @@ }, "host": "module-2", "path": "", + "options": {}, "url": "module-2.sofd60245639a" } ], @@ -109,4 +111,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-04.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-04.json index b250ea221c..82dc01952d 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-04.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-04.json @@ -18,6 +18,7 @@ }, "host": "module-1", "path": "", + "options": {}, "url": "module-1.sofd60245639a" } ], @@ -28,7 +29,7 @@ "TARGET_RUNTIME=tomee" ], "name": "com.sap.sample.mta.module-1", - "bindingParameters" : {} + "bindingParameters": {} }, { "moduleName": "module-2", @@ -48,7 +49,8 @@ "name": "sofd60245639a" }, "host": "module-2", - "path" : "", + "path": "", + "options": {}, "url": "module-2.sofd60245639a" } ], @@ -57,6 +59,6 @@ "TARGET_RUNTIME=tomee" ], "name": "com.sap.sample.mta.application-2", - "bindingParameters" : {} + "bindingParameters": {} } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-05.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-05.json index c4ff09b946..1da76d6d22 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-05.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-05.json @@ -29,6 +29,7 @@ }, "host": "module-1", "path": "", + "options": {}, "url": "module-1.sofd60245639a" } ], @@ -45,6 +46,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.localhost" }, { @@ -54,6 +56,7 @@ }, "host": "bar", "path": "", + "options": {}, "url": "bar.localhost" } ], @@ -101,6 +104,7 @@ }, "host": "module-2", "path": "", + "options": {}, "url": "module-2.sofd60245639a" } ], @@ -117,6 +121,7 @@ }, "host": "baz", "path": "", + "options": {}, "url": "baz.localhost" }, { @@ -126,6 +131,7 @@ }, "host": "qux", "path": "", + "options": {}, "url": "qux.localhost" } ], @@ -143,4 +149,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-06.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-06.json index 12e696508b..fb39c2a6c4 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-06.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-06.json @@ -29,6 +29,7 @@ }, "host": "framework", "path": "/v2", + "options": {}, "url": "framework.sofd60245639a/v2" } ], @@ -52,4 +53,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-07.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-07.json index 1f9ad324c6..437b005b04 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-07.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-07.json @@ -29,6 +29,7 @@ }, "host": "framework", "path": "", + "options": {}, "url": "framework.sofd60245639a" } ], @@ -52,4 +53,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-08.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-08.json index 4d17c263db..d33f8eb205 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-08.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-08.json @@ -29,6 +29,7 @@ }, "host": "module-1", "path": "", + "options": {}, "url": "module-1.sofd60245639a" } ], @@ -62,4 +63,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-09.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-09.json index 4f9f17af70..0e199763e6 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-09.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-09.json @@ -29,6 +29,7 @@ }, "host": "module-1", "path": "", + "options": {}, "url": "module-1.sofd60245639a" } ], @@ -95,6 +96,7 @@ }, "host": "module-2", "path": "", + "options": {}, "url": "module-2.sofd60245639a" } ], @@ -147,6 +149,7 @@ }, "host": "module-3", "path": "", + "options": {}, "url": "module-3.sofd60245639a" } ], @@ -199,6 +202,7 @@ }, "host": "module-4", "path": "", + "options": {}, "url": "module-4.sofd60245639a" } ], @@ -222,4 +226,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-10.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-10.json index edaca2e21f..97482f0da6 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-10.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-10.json @@ -29,6 +29,7 @@ }, "host": "module-1", "path": "", + "options": {}, "url": "module-1.sofd60245639a" } ], @@ -72,4 +73,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-12.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-12.json index fec123245d..ebfdfab72c 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-12.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-12.json @@ -31,6 +31,7 @@ }, "host": "foo-custom-route", "path": "", + "options": {}, "url": "foo-custom-route.test-domain" } ], @@ -47,6 +48,7 @@ }, "host": "foo-custom-route", "path": "", + "options": {}, "url": "foo-custom-route.test-domain" } ], @@ -64,4 +66,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-13.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-13.json index 7f92f18ae4..7d42bb7e52 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-13.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-13.json @@ -29,18 +29,20 @@ "domain": { "name": "test-domain" }, - "host": "host-in-route2", - "path": "/path-in-route", - "url": "host-in-route2.test-domain/path-in-route" + "host": "host-in-route1", + "path": "", + "options": {}, + "url": "host-in-route1.test-domain" }, { "appsUsingRoute": 0, "domain": { "name": "test-domain" }, - "host": "host-in-route1", - "path": "", - "url": "host-in-route1.test-domain" + "host": "host-in-route2", + "path": "/path-in-route", + "options": {}, + "url": "host-in-route2.test-domain/path-in-route" } ], "services": [], @@ -54,18 +56,20 @@ "domain": { "name": "test-domain" }, - "host": "host-in-route2", - "path": "/path-in-route", - "url": "host-in-route2.test-domain/path-in-route" + "host": "host-in-route1", + "path": "", + "options": {}, + "url": "host-in-route1.test-domain" }, { "appsUsingRoute": 0, "domain": { "name": "test-domain" }, - "host": "host-in-route1", - "path": "", - "url": "host-in-route1.test-domain" + "host": "host-in-route2", + "path": "/path-in-route", + "options": {}, + "url": "host-in-route2.test-domain/path-in-route" } ], "bindingParameters": {}, @@ -82,4 +86,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-14.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-14.json index 6dda7c7dbf..7dae4e86b7 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-14.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-14.json @@ -31,6 +31,7 @@ }, "host": "abc", "path": "", + "options": {}, "url": "abc.cfapps.domain.com" }, { @@ -40,6 +41,7 @@ }, "host": "cba", "path": "", + "options": {}, "url": "cba.cfapps.domain.com" }, { @@ -49,6 +51,7 @@ }, "host": "abc", "path": "", + "options": {}, "url": "abc.cfapps.domain.moc" }, { @@ -58,6 +61,7 @@ }, "host": "cba", "path": "", + "options": {}, "url": "cba.cfapps.domain.moc" } ], @@ -81,4 +85,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-15.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-15.json index 1ff52b84b1..5202534bc3 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-15.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-15.json @@ -32,6 +32,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.cfapps.neo.ondemand.com" } ], @@ -55,4 +56,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-16.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-16.json index 7d0b18ea29..25fe91896e 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-16.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-16.json @@ -31,6 +31,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.cfapps.neo.ondemand.com" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-with-endpoint.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-with-endpoint.json index b1d69773e8..795d9905e7 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-with-endpoint.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-with-endpoint.json @@ -31,6 +31,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -53,4 +54,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-without-endpoint.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-without-endpoint.json index a5061e4ef6..6f62e64aaf 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-without-endpoint.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-http-without-endpoint.json @@ -31,6 +31,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -53,4 +54,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-port.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-port.json index 50c38dc520..62973957fc 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-port.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-health-check-type-port.json @@ -30,6 +30,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -52,4 +53,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-nohostname.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-nohostname.json index 57167831d5..c3a7142875 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-nohostname.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-nohostname.json @@ -27,20 +27,22 @@ { "appsUsingRoute": 0, "domain": { - "name": "domain.to.test" + "name": "sub.sub.domain.to.test" }, - "host": "normal-host", - "path": "", - "url": "normal-host.domain.to.test" + "host": "", + "path": "/with/path", + "options": {}, + "url": "sub.sub.domain.to.test/with/path" }, { "appsUsingRoute": 0, "domain": { - "name": "sub.sub.domain.to.test" + "name": "domain.to.test" }, - "host": "", - "path": "/with/path", - "url": "sub.sub.domain.to.test/with/path" + "host": "normal-host", + "path": "", + "options": {}, + "url": "normal-host.domain.to.test" }, { "appsUsingRoute": 0, @@ -49,6 +51,7 @@ }, "host": "", "path": "", + "options": {}, "url": "sub.domain.to.test" } ], @@ -61,20 +64,22 @@ { "appsUsingRoute": 0, "domain": { - "name": "domain.to.test" + "name": "sub.sub.domain.to.test" }, - "host": "normal-host", - "path": "", - "url": "normal-host.domain.to.test" + "host": "", + "path": "/with/path", + "options": {}, + "url": "sub.sub.domain.to.test/with/path" }, { "appsUsingRoute": 0, "domain": { - "name": "sub.sub.domain.to.test" + "name": "domain.to.test" }, - "host": "", - "path": "/with/path", - "url": "sub.sub.domain.to.test/with/path" + "host": "normal-host", + "path": "", + "options": {}, + "url": "normal-host.domain.to.test" }, { "appsUsingRoute": 0, @@ -83,6 +88,7 @@ }, "host": "", "path": "", + "options": {}, "url": "sub.domain.to.test" } ], @@ -100,4 +106,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-restart-parameters-false.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-restart-parameters-false.json index ba80ab1539..d80e84b325 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-restart-parameters-false.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-restart-parameters-false.json @@ -29,6 +29,7 @@ }, "host": "module-1", "path": "", + "options": {}, "url": "module-1.sofd60245639a" } ], @@ -81,6 +82,7 @@ }, "host": "module-2", "path": "", + "options": {}, "url": "module-2.sofd60245639a" } ], @@ -133,6 +135,7 @@ }, "host": "module-3", "path": "", + "options": {}, "url": "module-3.sofd60245639a" } ], @@ -155,4 +158,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-false.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-false.json index 847d44fa6b..ad7fc68ef1 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-false.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-false.json @@ -32,6 +32,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-true.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-true.json index e802492adf..ba03b34b24 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-true.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/apps-with-ssh-enabled-true.json @@ -32,6 +32,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-existing-routes.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-existing-routes.json index c938d9426c..96928e0651 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-existing-routes.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-existing-routes.json @@ -29,6 +29,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -51,4 +52,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-nohostname.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-nohostname.json index 113cc7193d..85e12b518f 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-nohostname.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps-with-nohostname.json @@ -27,20 +27,22 @@ { "appsUsingRoute": 0, "domain": { - "name": "domain.to.test" + "name": "sub.sub.domain.to.test" }, - "host": "normal-host", - "path": "", - "url": "normal-host.domain.to.test" + "host": "", + "path": "/with/path", + "options": {}, + "url": "sub.sub.domain.to.test/with/path" }, { "appsUsingRoute": 0, "domain": { - "name": "sub.sub.domain.to.test" + "name": "domain.to.test" }, - "host": "", - "path": "/with/path", - "url": "sub.sub.domain.to.test/with/path" + "host": "normal-host", + "path": "", + "options": {}, + "url": "normal-host.domain.to.test" }, { "appsUsingRoute": 0, @@ -49,6 +51,7 @@ }, "host": "", "path": "", + "options": {}, "url": "sub.domain.to.test" } ], @@ -61,20 +64,22 @@ { "appsUsingRoute": 0, "domain": { - "name": "domain.to.test" + "name": "sub.sub.domain.to.test" }, - "host": "normal-host", - "path": "", - "url": "normal-host.domain.to.test" + "host": "", + "path": "/with/path", + "options": {}, + "url": "sub.sub.domain.to.test/with/path" }, { "appsUsingRoute": 0, "domain": { - "name": "sub.sub.domain.to.test" + "name": "domain.to.test" }, - "host": "", - "path": "/with/path", - "url": "sub.sub.domain.to.test/with/path" + "host": "normal-host", + "path": "", + "options": {}, + "url": "normal-host.domain.to.test" }, { "appsUsingRoute": 0, @@ -83,6 +88,7 @@ }, "host": "", "path": "", + "options": {}, "url": "sub.domain.to.test" } ], @@ -100,4 +106,4 @@ "shouldKeepExistingRoutes": true } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps.json index c938d9426c..96928e0651 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/keep-existing-routes/apps.json @@ -29,6 +29,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.sofd60245639a" } ], @@ -51,4 +52,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v3/apps-01.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v3/apps-01.json index 8b4b3297a8..e1d6bb4e9f 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v3/apps-01.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v3/apps-01.json @@ -31,6 +31,7 @@ }, "host": "foo", "path": "", + "options": {}, "url": "foo.cfapps.neo.ondemand.com" } ], @@ -54,4 +55,4 @@ "shouldKeepExistingRoutes": false } } -] \ No newline at end of file +] diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java index d84760ad58..a87990df53 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java @@ -592,7 +592,7 @@ public class Messages { public static final String RESULT_0 = "Result: {0}"; public static final String SHUTTING_DOWN_FLOWABLE_JOB_EXECUTOR = "Shutting down Flowable job executor..."; public static final String ADDING_DOMAIN_0 = "Adding domain \"{0}\"..."; - public static final String ADDING_ROUTE_WITH_HOST_0_DOMAIN_1_AND_PATH_2 = "Adding route with host \"{0}\", domain \"{1}\" and path \"{2}\"..."; + public static final String ADDING_ROUTE_WITH_HOST_0_DOMAIN_1_AND_PATH_2 = "Adding route with host \"{0}\", domain \"{1}\", path \"{2}\" and options \"{3}\"..."; public static final String BINDING_SERVICE_INSTANCE_0_TO_APPLICATION_1_WITH_BINDING_NAME_2 = "Binding service instance \"{0}\" to application \"{1}\" with binding name \"{2}\"..."; public static final String BINDING_SERVICE_INSTANCE_0_TO_APPLICATION_1 = "Binding service instance \"{0}\" to application \"{1}\"..."; public static final String BINDING_SERVICE_INSTANCE_0_TO_APPLICATION_1_FINISHED = "Binding service instance \"{0}\" to application \"{1}\" finished"; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java index a4376ac360..0688401afe 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/client/LoggingCloudControllerClient.java @@ -67,9 +67,9 @@ public void addDomain(String domainName) { } @Override - public void addRoute(String host, String domainName, String path) { - logger.debug(Messages.ADDING_ROUTE_WITH_HOST_0_DOMAIN_1_AND_PATH_2, host, domainName, path); - delegate.addRoute(host, domainName, path); + public void addRoute(String host, String domainName, String path, Map options) { + logger.debug(Messages.ADDING_ROUTE_WITH_HOST_0_DOMAIN_1_AND_PATH_2, host, domainName, path, dynamicSecureSerialization.toJson(options)); + delegate.addRoute(host, domainName, path, options); } @Override diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/FlowableProcessTestDataUtils.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/FlowableProcessTestDataUtils.java index 82909fdd58..8ec30efcb2 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/FlowableProcessTestDataUtils.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/flowable/FlowableProcessTestDataUtils.java @@ -1,6 +1,7 @@ package org.cloudfoundry.multiapps.controller.process.flowable; import java.time.Duration; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -347,7 +348,7 @@ private static DeployedMta createDeployed(String id, String mtaVersion) { private static List createRoutes(String... routes) { return Stream.of(routes) - .map(route -> new ApplicationURI(route, false, null).toCloudRoute()) + .map(route -> new ApplicationURI(route, false, null, Collections.emptyMap()).toCloudRoute()) .collect(Collectors.toList()); } diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java index 78f20b5f65..7f0234edbf 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java @@ -348,7 +348,16 @@ static Stream testHandleRoutesApplicationAttributes() { return Stream.of(Arguments.of(Collections.emptySet(), constructRoutes("example.com"), true), Arguments.of(constructRoutes("example.com"), Collections.emptySet(), true), Arguments.of(constructRoutes("example.com"), constructRoutes("example.com", "example1.com"), true), - Arguments.of(constructRoutes("example.com"), constructRoutes("example.com"), false)); + Arguments.of(constructRoutes("example.com"), constructRoutes("example.com"), false), + // route with options added -> update needed + Arguments.of(constructRoutes("example.com"), + constructRoutesWithOptions("example.com", Map.of("loadbalancing", "round-robin")), true), + // route options changed -> update needed + Arguments.of(constructRoutesWithOptions("example.com", Map.of("loadbalancing", "round-robin")), + constructRoutesWithOptions("example.com", Map.of("loadbalancing", "least-connection")), true), + // route options unchanged -> no update + Arguments.of(constructRoutesWithOptions("example.com", Map.of("loadbalancing", "round-robin")), + constructRoutesWithOptions("example.com", Map.of("loadbalancing", "round-robin")), false)); } @ParameterizedTest @@ -374,10 +383,14 @@ void testHandleRoutesApplicationAttributes(Set existingRoutes, Set constructRoutes(String... uriStrings) { return Stream.of(uriStrings) - .map(uri -> new ApplicationURI(uri, false, null).toCloudRoute()) + .map(uri -> new ApplicationURI(uri, false, null, Collections.emptyMap()).toCloudRoute()) .collect(Collectors.toSet()); } + private static Set constructRoutesWithOptions(String uri, Map options) { + return Set.of(new ApplicationURI(uri, false, null, options).toCloudRoute()); + } + static Stream testHandleApplicationServices() { return Stream.of(Arguments.of(List.of("service-1"), List.of("service-1", "service-2"), false, List.of("service-1", "service-2")), Arguments.of(Collections.emptyList(), List.of("service-1"), false, List.of("service-1")), diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java index 9e9d5b0b3e..7a3ab4cbc0 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/TestData.java @@ -1,6 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -17,11 +19,11 @@ public class TestData { public static final String NOHOSTNAME_URI_FLAG = "NOHOSTNAME-"; public static CloudRoute route(String uri) { - return route(removePrefix(uri), uriIsHostless(uri), "http1"); + return route(removePrefix(uri), uriIsHostless(uri), "http1", Collections.emptyMap()); } - public static CloudRoute route(String uri, boolean noHostname, String protocol) { - return new ApplicationURI(uri, noHostname, protocol).toCloudRoute(); + public static CloudRoute route(String uri, boolean noHostname, String protocol, Map options) { + return new ApplicationURI(uri, noHostname, protocol, options).toCloudRoute(); } public static CloudRoute route(String host, String domain, String path) { diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java index 8c30684b31..0926104469 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/util/UrisApplicationAttributeUpdaterTest.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Stream; @@ -48,7 +49,16 @@ void setUp() throws Exception { static Stream shouldUpdateRoutes() { return Stream.of(Arguments.of(getExistingCloudRoutes(), Collections.emptyList(), true), Arguments.of(getExistingCloudRoutes(), getExistingCloudRoutes(), false), - Arguments.of(getExistingCloudRoutes(), getNewCloudRoutesWithExistingRouteAndModifiedProtocol(), true)); + Arguments.of(getExistingCloudRoutes(), getNewCloudRoutesWithExistingRouteAndModifiedProtocol(), true), + // route options differ -> should trigger update + Arguments.of(getRoutesWithOptions(Map.of("loadbalancing", "round-robin")), + getRoutesWithOptions(Map.of("loadbalancing", "least-connection")), true), + // route options are the same -> no update needed + Arguments.of(getRoutesWithOptions(Map.of("loadbalancing", "round-robin")), + getRoutesWithOptions(Map.of("loadbalancing", "round-robin")), false), + // existing route has options, new route has empty options -> routes are not equal -> should trigger update + Arguments.of(getRoutesWithOptions(Map.of("loadbalancing", "round-robin")), + getRoutesWithOptions(Collections.emptyMap()), true)); } @ParameterizedTest @@ -68,6 +78,18 @@ private static List getExistingCloudRoutes() { return List.of(existingHttp1Route, existingHtt2Route); } + private static List getRoutesWithOptions(Map options) { + CloudRoute route = ImmutableCloudRoute.builder() + .url("abc.cfapps.sap.hana.ondemand.com") + .host("abc") + .domain(ImmutableCloudDomain.builder() + .name("cfapps.sap.hana.ondemand.com") + .build()) + .options(options) + .build(); + return List.of(route); + } + private static CloudRoute buildCloudRouteWithDestination(String host, String domain, String requestedProtocol) { return ImmutableCloudRoute.builder() .url(host + "." + domain) diff --git a/pom.xml b/pom.xml index 66f3372c69..3748d45977 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 3.0.4 4.33.0 5.1.0 - 5.16.0.RELEASE + 6.0.0-SNAPSHOT 1.2.15 1.6.16 @@ -48,7 +48,7 @@ 1.1.1 1.21.0 - 2.45.0 + 2.46.0-SNAPSHOT 3.5.1 4.0.5 4.0.6