diff --git a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java index ff467034f5..3724c75c83 100644 --- a/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java +++ b/multiapps-controller-client/src/main/java/org/cloudfoundry/multiapps/controller/client/lib/domain/CloudServiceInstanceExtended.java @@ -1,11 +1,10 @@ package org.cloudfoundry.multiapps.controller.client.lib.domain; -import org.cloudfoundry.multiapps.common.Nullable; -import org.immutables.value.Value; - import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.sap.cloudfoundry.client.facade.domain.CloudServiceInstance; +import org.cloudfoundry.multiapps.common.Nullable; +import org.immutables.value.Value; @Value.Immutable @JsonSerialize(as = ImmutableCloudServiceInstanceExtended.class) @@ -45,4 +44,19 @@ public boolean shouldSkipSyslogUrlUpdate() { return false; } + @Value.Default + public boolean shouldFailOnParametersUpdateFailure() { + return false; + } + + @Value.Default + public boolean shouldFailOnPlanUpdateFailure() { + return false; + } + + @Value.Default + public boolean shouldFailOnTagsUpdateFailure() { + return false; + } + } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServicesCloudModelBuilder.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServicesCloudModelBuilder.java index 0ae5bbeb23..4b98901b8d 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServicesCloudModelBuilder.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ServicesCloudModelBuilder.java @@ -7,7 +7,6 @@ import java.util.Objects; import java.util.TreeMap; import java.util.stream.Collectors; - import org.cloudfoundry.client.v3.serviceinstances.ServiceInstanceType; import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; @@ -85,6 +84,10 @@ protected CloudServiceInstanceExtended createManagedService(Resource resource, C .shouldSkipTagsUpdate(commonServiceParameters.shouldSkipTagsUpdate()) .shouldSkipPlanUpdate(commonServiceParameters.shouldSkipPlanUpdate()) .shouldSkipSyslogUrlUpdate(commonServiceParameters.shouldSkipSyslogUrlUpdate()) + .shouldFailOnParametersUpdateFailure( + commonServiceParameters.failOnServiceParametersUpdateFailure()) + .shouldFailOnPlanUpdateFailure(commonServiceParameters.failOnServicePlanUpdateFailure()) + .shouldFailOnTagsUpdateFailure(commonServiceParameters.failOnServiceTagsUpdateFailure()) .v3Metadata(ServiceMetadataBuilder.build(deploymentDescriptor, namespace, resource)) .build(); } @@ -113,6 +116,10 @@ protected CloudServiceInstanceExtended createUserProvidedService(Resource resour .shouldSkipTagsUpdate(commonServiceParameters.shouldSkipTagsUpdate()) .shouldSkipPlanUpdate(commonServiceParameters.shouldSkipPlanUpdate()) .shouldSkipSyslogUrlUpdate(commonServiceParameters.shouldSkipSyslogUrlUpdate()) + .shouldFailOnParametersUpdateFailure( + commonServiceParameters.failOnServiceParametersUpdateFailure()) + .shouldFailOnPlanUpdateFailure(commonServiceParameters.failOnServicePlanUpdateFailure()) + .shouldFailOnTagsUpdateFailure(commonServiceParameters.failOnServiceTagsUpdateFailure()) .v3Metadata(ServiceMetadataBuilder.build(deploymentDescriptor, namespace, resource)) .build(); } @@ -126,6 +133,10 @@ protected CloudServiceInstanceExtended createExistingService(Resource resource, .shouldSkipTagsUpdate(commonServiceParameters.shouldSkipTagsUpdate()) .shouldSkipPlanUpdate(commonServiceParameters.shouldSkipPlanUpdate()) .shouldSkipSyslogUrlUpdate(commonServiceParameters.shouldSkipSyslogUrlUpdate()) + .shouldFailOnParametersUpdateFailure( + commonServiceParameters.failOnServiceParametersUpdateFailure()) + .shouldFailOnPlanUpdateFailure(commonServiceParameters.failOnServicePlanUpdateFailure()) + .shouldFailOnTagsUpdateFailure(commonServiceParameters.failOnServiceTagsUpdateFailure()) .v3Metadata(ServiceMetadataBuilder.build(deploymentDescriptor, namespace, resource)) .build(); } @@ -153,6 +164,7 @@ protected String getInvalidServiceConfigTypeErrorMessage(String serviceName, Obj protected static class CommonServiceParameters { protected final Resource resource; private final Map shouldSkipUpdates; + private final Map failOnServiceUpdateFailure; @SuppressWarnings("unchecked") protected CommonServiceParameters(Resource resource) { @@ -160,6 +172,9 @@ protected CommonServiceParameters(Resource resource) { this.shouldSkipUpdates = (Map) resource.getParameters() .getOrDefault(SupportedParameters.SKIP_SERVICE_UPDATES, Collections.emptyMap()); + failOnServiceUpdateFailure = (Map) resource.getParameters() + .getOrDefault(SupportedParameters.FAIL_ON_SERVICE_UPDATE, + Collections.emptyMap()); } private String getServiceName() { @@ -186,6 +201,18 @@ private boolean shouldSkipSyslogUrlUpdate() { return shouldSkipUpdates.getOrDefault("syslog-drain-url", false); } + private boolean failOnServiceParametersUpdateFailure() { + return failOnServiceUpdateFailure.getOrDefault("parameters", false); + } + + private boolean failOnServiceTagsUpdateFailure() { + return failOnServiceUpdateFailure.getOrDefault("tags", false); + } + + private boolean failOnServicePlanUpdateFailure() { + return failOnServiceUpdateFailure.getOrDefault("plan", false); + } + } } 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 13f6b5e3cb..2b28d75130 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 @@ -152,6 +152,7 @@ public class SupportedParameters { public static final String DEFAULT_XS_APP_NAME = "default-xsappname"; public static final String TYPE = "type"; public static final String SKIP_SERVICE_UPDATES = "skip-service-updates"; + public static final String FAIL_ON_SERVICE_UPDATE = "fail-on-service-update"; public static final String SYSLOG_DRAIN_URL = "syslog-drain-url"; public static final String SERVICE_GUID = "service-guid"; @@ -203,7 +204,8 @@ public class SupportedParameters { DEFAULT_SERVICE_NAME, DEFAULT_XS_APP_NAME, SERVICE, SERVICE_KEYS, SERVICE_KEY_NAME, SERVICE_NAME, SERVICE_PLAN, SERVICE_TAGS, SERVICE_BROKER, SKIP_SERVICE_UPDATES, TYPE, PROVIDER_ID, PROVIDER_NID, TARGET, - SERVICE_CONFIG_PATH, FILTER, MANAGED, VERSION, PATH, MEMORY); + SERVICE_CONFIG_PATH, FILTER, MANAGED, VERSION, PATH, MEMORY, + FAIL_ON_SERVICE_UPDATE); public static final Set GLOBAL_PARAMETERS = Set.of(KEEP_EXISTING_ROUTES, APPS_UPLOAD_TIMEOUT, APPS_TASK_EXECUTION_TIMEOUT, APPS_START_TIMEOUT, APPS_STAGE_TIMEOUT, APPLY_NAMESPACE, ENABLE_PARALLEL_DEPLOYMENTS, DEPLOY_MODE); diff --git a/multiapps-controller-core/src/test/resources/mta/devxdi/services.json b/multiapps-controller-core/src/test/resources/mta/devxdi/services.json index 037d2a0835..b916f5554c 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxdi/services.json +++ b/multiapps-controller-core/src/test/resources/mta/devxdi/services.json @@ -18,7 +18,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -42,5 +45,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-services.json b/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-services.json index 037d2a0835..b916f5554c 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-services.json +++ b/multiapps-controller-core/src/test/resources/mta/devxdi/xs2-services.json @@ -18,7 +18,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -42,5 +45,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/devxwebide/services.json b/multiapps-controller-core/src/test/resources/mta/devxwebide/services.json index db9d0a6dfd..a130f18413 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxwebide/services.json +++ b/multiapps-controller-core/src/test/resources/mta/devxwebide/services.json @@ -19,6 +19,9 @@ "shouldSkipParametersUpdate": false, "shouldSkipTagsUpdate": false, "shouldSkipPlanUpdate": false, - "shouldSkipSyslogUrlUpdate": false + "shouldSkipSyslogUrlUpdate": false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-1.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-1.json index c1c395accb..5248c269b2 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-1.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-1.json @@ -23,7 +23,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -52,5 +55,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-2.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-2.json index b5eb99f803..19e193e3d5 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-2.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-2.json @@ -23,7 +23,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -52,5 +55,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-3.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-3.json index ebfc6a2ef2..ad571ad08a 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-3.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-ns-3.json @@ -23,7 +23,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -52,5 +55,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch-ns.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch-ns.json index b0047de515..1b5f3c4f47 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch-ns.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch-ns.json @@ -23,7 +23,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -52,5 +55,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch.json index 9ba67f63fd..682630a9bf 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services-patch.json @@ -21,7 +21,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -48,5 +51,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services.json index 9ba67f63fd..682630a9bf 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services.json @@ -21,7 +21,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -48,5 +51,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-services.json b/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-services.json index 38a9b2d06f..a4822c0c5b 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-services.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/xs2-services.json @@ -21,7 +21,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -51,5 +54,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/sample/services.json b/multiapps-controller-core/src/test/resources/mta/sample/services.json index 68b60bbd2a..9a1821ea7e 100644 --- a/multiapps-controller-core/src/test/resources/mta/sample/services.json +++ b/multiapps-controller-core/src/test/resources/mta/sample/services.json @@ -21,7 +21,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -46,5 +49,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/mta/shine/services.json b/multiapps-controller-core/src/test/resources/mta/shine/services.json index a449ab35e0..f0cbcf199a 100644 --- a/multiapps-controller-core/src/test/resources/mta/shine/services.json +++ b/multiapps-controller-core/src/test/resources/mta/shine/services.json @@ -26,7 +26,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -53,5 +56,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/services-03.json b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/services-03.json index 20e5fb99c5..1ca3e7a4c6 100644 --- a/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/services-03.json +++ b/multiapps-controller-core/src/test/resources/org/cloudfoundry/multiapps/controller/core/cf/v2/services-03.json @@ -19,7 +19,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -41,7 +44,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -63,7 +69,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -87,7 +96,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -111,7 +123,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : true, @@ -135,7 +150,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : false, @@ -156,7 +174,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : false, @@ -177,7 +198,10 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false }, { "isOptional" : false, "isManaged" : false, @@ -198,5 +222,8 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false + "shouldSkipSyslogUrlUpdate" : false, + "shouldFailOnParametersUpdateFailure" : false, + "shouldFailOnPlanUpdateFailure" : false, + "shouldFailOnTagsUpdateFailure" : false } ] \ No newline at end of file diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java index d611337395..4a7b653900 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceCreateOrUpdateOperationsExecution.java @@ -2,8 +2,8 @@ import java.text.MessageFormat; import java.util.List; -import java.util.stream.Collectors; - +import java.util.function.Supplier; +import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.SLException; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.process.Messages; @@ -12,13 +12,20 @@ import org.cloudfoundry.multiapps.controller.process.util.StepLogger; import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - public class PollServiceCreateOrUpdateOperationsExecution extends PollServiceOperationsExecution implements AsyncExecution { + private final Supplier shouldFailOnUpdateSupplier; + public PollServiceCreateOrUpdateOperationsExecution(ServiceOperationGetter serviceOperationGetter, ServiceProgressReporter serviceProgressReporter) { + this(serviceOperationGetter, serviceProgressReporter, () -> false); + } + + public PollServiceCreateOrUpdateOperationsExecution(ServiceOperationGetter serviceOperationGetter, + ServiceProgressReporter serviceProgressReporter, + Supplier shouldFailOnUpdateSupplier) { super(serviceOperationGetter, serviceProgressReporter); + this.shouldFailOnUpdateSupplier = shouldFailOnUpdateSupplier; } @Override @@ -27,16 +34,14 @@ protected List getServicesData(ProcessContext cont // There's no need to poll the creation or update of user-provided services, because it is done synchronously: return allServicesToCreate.stream() .filter(s -> !s.isUserProvided()) - .collect(Collectors.toList()); + .toList(); } @Override protected ServiceOperation mapOperationState(StepLogger stepLogger, ServiceOperation lastServiceOperation, CloudServiceInstanceExtended service) { lastServiceOperation = super.mapOperationState(stepLogger, lastServiceOperation, service); - // Be fault tolerant on failure on update of service - if (lastServiceOperation.getType() == ServiceOperation.Type.UPDATE - && lastServiceOperation.getState() == ServiceOperation.State.FAILED) { + if (shouldIgnoreLastOperationFailure(lastServiceOperation)) { stepLogger.warn(Messages.FAILED_SERVICE_UPDATE, service.getName(), lastServiceOperation.getDescription()); return new ServiceOperation(lastServiceOperation.getType(), lastServiceOperation.getDescription(), @@ -45,6 +50,12 @@ protected ServiceOperation mapOperationState(StepLogger stepLogger, ServiceOpera return lastServiceOperation; } + private boolean shouldIgnoreLastOperationFailure(ServiceOperation lastServiceOperation) { + return lastServiceOperation.getType() == ServiceOperation.Type.UPDATE + && lastServiceOperation.getState() == ServiceOperation.State.FAILED + && !shouldFailOnUpdateSupplier.get(); + } + @Override protected void handleMissingOperationState(StepLogger stepLogger, CloudServiceInstanceExtended service) { if (!service.isOptional()) { @@ -76,8 +87,9 @@ private String getSuccessMessage(CloudServiceInstanceExtended service, ServiceOp case UPDATE: return MessageFormat.format(Messages.SERVICE_UPDATED, service.getName()); default: - throw new IllegalStateException(MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, - type)); + throw new IllegalStateException( + MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, + type)); } } @@ -101,8 +113,9 @@ private String getFailureMessage(CloudServiceInstanceExtended service, ServiceOp return MessageFormat.format(Messages.ERROR_UPDATING_SERVICE, service.getName(), service.getLabel(), service.getPlan(), operation.getDescription()); default: - throw new IllegalStateException(MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, - operation.getType())); + throw new IllegalStateException( + MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, + operation.getType())); } } @@ -115,8 +128,9 @@ private String getWarningMessage(CloudServiceInstanceExtended service, ServiceOp return MessageFormat.format(Messages.ERROR_UPDATING_OPTIONAL_SERVICE, service.getName(), service.getLabel(), service.getPlan(), operation.getDescription()); default: - throw new IllegalStateException(MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, - operation.getType())); + throw new IllegalStateException( + MessageFormat.format(org.cloudfoundry.multiapps.controller.core.Messages.ILLEGAL_SERVICE_OPERATION_TYPE, + operation.getType())); } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java index 457104e01a..04be023451 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStep.java @@ -3,19 +3,17 @@ import java.text.MessageFormat; import java.util.Collections; import java.util.List; - +import com.sap.cloudfoundry.client.facade.CloudControllerClient; +import com.sap.cloudfoundry.client.facade.CloudOperationException; +import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named("updateServiceParametersStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceParametersStep extends ServiceStep { @@ -44,8 +42,10 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { + CloudServiceInstanceExtended serviceToProcess = context.getVariable(Variables.SERVICE_TO_PROCESS); return Collections.singletonList(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), - getServiceProgressReporter())); + getServiceProgressReporter(), + serviceToProcess::shouldFailOnParametersUpdateFailure)); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java index b0abe261f5..d00f8d9b02 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStep.java @@ -3,19 +3,17 @@ import java.text.MessageFormat; import java.util.Collections; import java.util.List; - +import com.sap.cloudfoundry.client.facade.CloudControllerClient; +import com.sap.cloudfoundry.client.facade.CloudOperationException; +import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named("updateServicePlanStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServicePlanStep extends ServiceStep { @@ -28,7 +26,6 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud return OperationExecutionState.FINISHED; } getStepLogger().debug(Messages.UPDATING_SERVICE_0_WITH_PLAN_1, service.getName(), service.getPlan()); - try { client.updateServicePlan(service.getName(), service.getPlan()); getStepLogger().debug(Messages.SERVICE_PLAN_FOR_SERVICE_0_UPDATED, service.getName()); @@ -48,8 +45,10 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { + CloudServiceInstanceExtended serviceToProcess = context.getVariable(Variables.SERVICE_TO_PROCESS); return Collections.singletonList(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), - getServiceProgressReporter())); + getServiceProgressReporter(), + serviceToProcess::shouldFailOnPlanUpdateFailure)); } @Override diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java index e13960175e..7800ff6de9 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStep.java @@ -3,19 +3,17 @@ import java.text.MessageFormat; import java.util.Collections; import java.util.List; - +import com.sap.cloudfoundry.client.facade.CloudControllerClient; +import com.sap.cloudfoundry.client.facade.CloudOperationException; +import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import jakarta.inject.Named; - import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; import org.cloudfoundry.multiapps.controller.core.util.OperationExecutionState; import org.cloudfoundry.multiapps.controller.process.Messages; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - @Named("updateServiceTagsStep") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceTagsStep extends ServiceStep { @@ -48,8 +46,10 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud @Override protected List getAsyncStepExecutions(ProcessContext context) { + CloudServiceInstanceExtended serviceToProcess = context.getVariable(Variables.SERVICE_TO_PROCESS); return Collections.singletonList(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), - getServiceProgressReporter())); + getServiceProgressReporter(), + serviceToProcess::shouldFailOnTagsUpdateFailure)); } @Override diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java index a1d4291d67..da9329893f 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/PollServiceOperationsStepTest.java @@ -1,19 +1,13 @@ package org.cloudfoundry.multiapps.controller.process.steps; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Supplier; import java.util.stream.Stream; - +import com.sap.cloudfoundry.client.facade.CloudControllerClient; +import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; import org.cloudfoundry.multiapps.common.test.TestUtil; import org.cloudfoundry.multiapps.common.util.JsonUtil; import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; @@ -25,9 +19,13 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; - -import com.sap.cloudfoundry.client.facade.CloudControllerClient; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; class PollServiceOperationsStepTest extends AsyncStepOperationTest { @@ -38,42 +36,46 @@ class PollServiceOperationsStepTest extends AsyncStepOperationTest shouldFailOnUpdateSupplier; + @Mock protected CloudControllerClient client; private StepInput input; public static Stream testPollStateExecution() { return Stream.of( -// @formatter:off + // @formatter:off // (0) With no async services: - Arguments.of("poll-create-services-step-input-00.json", null), + Arguments.of("poll-create-services-step-input-00.json", null, false), // (1) With one async service: - Arguments.of("poll-create-services-step-input-01.json", null), + Arguments.of("poll-create-services-step-input-01.json", null, false), // (2) With non-existing service: - Arguments.of("poll-create-services-step-input-02.json", "Cannot retrieve service instance of service \"test-service-2\""), + Arguments.of("poll-create-services-step-input-02.json", "Cannot retrieve service instance of service \"test-service-2\"", false), // (3) With non-existing optional service: - Arguments.of("poll-create-services-step-input-03.json", null), + Arguments.of("poll-create-services-step-input-03.json", null, false), // (4) With failure and optional service: - Arguments.of("poll-create-services-step-input-04.json", null), + Arguments.of("poll-create-services-step-input-04.json", null, false), // (5) With failure and optional service: - Arguments.of("poll-create-services-step-input-05.json", "Error creating service \"test-service-2\" from offering \"test\" and plan \"test\": Something happened!"), + Arguments.of("poll-create-services-step-input-05.json", "Error creating service \"test-service-2\" from offering \"test\" and plan \"test\": Something happened!", false), // (6) With user provided service: - Arguments.of("poll-create-services-step-input-06.json", null), + Arguments.of("poll-create-services-step-input-06.json", null, false), // (7) With failure on update of service: - Arguments.of("poll-create-services-step-input-07.json", null), + Arguments.of("poll-create-services-step-input-07.json", null, false), // (8) With failure on creation of service and update of service: - Arguments.of("poll-create-services-step-input-08.json", "Error creating service \"test-service-2\" from offering \"test\" and plan \"test\": Something happened!"), + Arguments.of("poll-create-services-step-input-08.json", "Error creating service \"test-service-2\" from offering \"test\" and plan \"test\": Something happened!", false), // (8) With failure on creation of service and no error description: - Arguments.of("poll-create-services-step-input-09.json", "Error creating service \"test-service\" from offering \"test\" and plan \"test\": " + Messages.DEFAULT_FAILED_OPERATION_DESCRIPTION) + Arguments.of("poll-create-services-step-input-09.json", "Error creating service \"test-service\" from offering \"test\" and plan \"test\": " + Messages.DEFAULT_FAILED_OPERATION_DESCRIPTION, false), + // (9) With failure on update of service and update of service, exception is expected: + Arguments.of("poll-create-services-step-input-10.json", "Error updating service \"test-service\" from offering \"test\" and plan \"test\": The service broker returned an error with no description!", true) // @formatter:on ); } @ParameterizedTest @MethodSource - void testPollStateExecution(String inputLocation, String expectedExceptionMessage) { + void testPollStateExecution(String inputLocation, String expectedExceptionMessage, boolean failOnUpdate) { this.input = JsonUtil.fromJson(TestUtil.getResourceAsString(inputLocation, PollServiceOperationsStepTest.class), StepInput.class); - initializeParameters(); + initializeParameters(failOnUpdate); if (expectedExceptionMessage != null) { Exception exception = assertThrows(Exception.class, this::testExecuteOperations); assertTrue(exception.getMessage() @@ -83,7 +85,7 @@ void testPollStateExecution(String inputLocation, String expectedExceptionMessag testExecuteOperations(); } - private void initializeParameters() { + private void initializeParameters(boolean failOnUpdate) { context.setVariable(Variables.SPACE_GUID, TEST_SPACE_ID); prepareServiceOperationGetter(); context.setVariable(Variables.SERVICES_TO_CREATE, input.services); @@ -93,6 +95,7 @@ private void initializeParameters() { context.setVariable(Variables.SERVICES_TO_CREATE_COUNT, 0); when(clientProvider.getControllerClient(anyString(), anyString(), anyString())).thenReturn(client); + when(shouldFailOnUpdateSupplier.get()).thenReturn(failOnUpdate); } @SuppressWarnings("unchecked") @@ -140,7 +143,8 @@ protected CreateServiceStep createStep() { @Override protected List getAsyncOperations(ProcessContext wrapper) { - return List.of(new PollServiceCreateOrUpdateOperationsExecution(serviceOperationGetter, serviceProgressReporter)); + return List.of( + new PollServiceCreateOrUpdateOperationsExecution(serviceOperationGetter, serviceProgressReporter, shouldFailOnUpdateSupplier)); } } diff --git a/multiapps-controller-process/src/test/resources/org/cloudfoundry/multiapps/controller/process/steps/poll-create-services-step-input-10.json b/multiapps-controller-process/src/test/resources/org/cloudfoundry/multiapps/controller/process/steps/poll-create-services-step-input-10.json new file mode 100644 index 0000000000..1519628ce3 --- /dev/null +++ b/multiapps-controller-process/src/test/resources/org/cloudfoundry/multiapps/controller/process/steps/poll-create-services-step-input-10.json @@ -0,0 +1,22 @@ +{ + "services": [ + { + "name": "test-service", + "label": "test", + "plan": "test", + "provider": "test", + "version": "test" + } + ], + "triggeredServiceOperations": { + "test-service": "UPDATE" + }, + "serviceInstanceResponse": { + "test-service": { + "last_operation": { + "type": "update", + "state": "failed" + } + } + } +} \ No newline at end of file