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 3724c75c83..656447df97 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 @@ -44,19 +44,13 @@ public boolean shouldSkipSyslogUrlUpdate() { return false; } - @Value.Default - public boolean shouldFailOnParametersUpdateFailure() { - return false; - } + @Nullable + public abstract Boolean shouldFailOnParametersUpdateFailure(); - @Value.Default - public boolean shouldFailOnPlanUpdateFailure() { - return false; - } + @Nullable + public abstract Boolean shouldFailOnPlanUpdateFailure(); - @Value.Default - public boolean shouldFailOnTagsUpdateFailure() { - return false; - } + @Nullable + public abstract Boolean shouldFailOnTagsUpdateFailure(); } 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 4b98901b8d..90abef06be 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 @@ -201,16 +201,16 @@ private boolean shouldSkipSyslogUrlUpdate() { return shouldSkipUpdates.getOrDefault("syslog-drain-url", false); } - private boolean failOnServiceParametersUpdateFailure() { - return failOnServiceUpdateFailure.getOrDefault("parameters", false); + private Boolean failOnServiceParametersUpdateFailure() { + return failOnServiceUpdateFailure.get("parameters"); } - private boolean failOnServiceTagsUpdateFailure() { - return failOnServiceUpdateFailure.getOrDefault("tags", false); + private Boolean failOnServiceTagsUpdateFailure() { + return failOnServiceUpdateFailure.get("tags"); } - private boolean failOnServicePlanUpdateFailure() { - return failOnServiceUpdateFailure.getOrDefault("plan", false); + private Boolean failOnServicePlanUpdateFailure() { + return failOnServiceUpdateFailure.get("plan"); } } 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 b916f5554c..037d2a0835 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxdi/services.json +++ b/multiapps-controller-core/src/test/resources/mta/devxdi/services.json @@ -18,10 +18,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -45,8 +42,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 b916f5554c..037d2a0835 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,10 +18,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -45,8 +42,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 a130f18413..0edc5c1844 100644 --- a/multiapps-controller-core/src/test/resources/mta/devxwebide/services.json +++ b/multiapps-controller-core/src/test/resources/mta/devxwebide/services.json @@ -19,9 +19,6 @@ "shouldSkipParametersUpdate": false, "shouldSkipTagsUpdate": false, "shouldSkipPlanUpdate": false, - "shouldSkipSyslogUrlUpdate": false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate": 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 5248c269b2..c1c395accb 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,10 +23,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -55,8 +52,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 19e193e3d5..b5eb99f803 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,10 +23,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -55,8 +52,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 ad571ad08a..ebfc6a2ef2 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,10 +23,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -55,8 +52,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 1b5f3c4f47..b0047de515 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,10 +23,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -55,8 +52,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 682630a9bf..9ba67f63fd 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,10 +21,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -51,8 +48,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 682630a9bf..9ba67f63fd 100644 --- a/multiapps-controller-core/src/test/resources/mta/javahelloworld/services.json +++ b/multiapps-controller-core/src/test/resources/mta/javahelloworld/services.json @@ -21,10 +21,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -51,8 +48,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 a4822c0c5b..38a9b2d06f 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,10 +21,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -54,8 +51,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 9a1821ea7e..68b60bbd2a 100644 --- a/multiapps-controller-core/src/test/resources/mta/sample/services.json +++ b/multiapps-controller-core/src/test/resources/mta/sample/services.json @@ -21,10 +21,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -49,8 +46,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 f0cbcf199a..a449ab35e0 100644 --- a/multiapps-controller-core/src/test/resources/mta/shine/services.json +++ b/multiapps-controller-core/src/test/resources/mta/shine/services.json @@ -26,10 +26,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -56,8 +53,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 1ca3e7a4c6..20e5fb99c5 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,10 +19,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -44,10 +41,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -69,10 +63,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -96,10 +87,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -123,10 +111,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : true, @@ -150,10 +135,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : false, @@ -174,10 +156,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : false, @@ -198,10 +177,7 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : false }, { "isOptional" : false, "isManaged" : false, @@ -222,8 +198,5 @@ "shouldSkipParametersUpdate" : false, "shouldSkipPlanUpdate" : false, "shouldSkipTagsUpdate" : false, - "shouldSkipSyslogUrlUpdate" : false, - "shouldFailOnParametersUpdateFailure" : false, - "shouldFailOnPlanUpdateFailure" : false, - "shouldFailOnTagsUpdateFailure" : false + "shouldSkipSyslogUrlUpdate" : 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 59951deebe..446f78c2c9 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 @@ -78,6 +78,9 @@ public class Messages { public static final String ROLLBACK_OPERATION_CANNOT_BE_DONE_BACKUP_APPLICATIONS_HAVE_DIFFERENT_MTA_VERSIONS = "Rollback operation cannot be done, backup applications have different MTA versions!"; public static final String ROLLBACK_MTA_ID_0_CANNOT_BE_DONE_MISSING_DESCRIPTOR = "Rollback of mta id \"{0}\" cannot be done, missing descriptor to perform the operation"; public static final String BACKUP_PREVIOUS_VERSION_FLAG_AND_APPLY_NAMESPACE_AS_SUFFIX_NOT_SUPPORTED = "Backup previous version flag and apply namespace as suffix is not supported combination"; + public static final String SERVICE_INSTANCE_0_PLAN_UPDATE_FAILED_ERROR_1 = "Service instance: \"{0}\" plan update failed, error: \"{1}\""; + public static final String SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_ERROR_1 = "Service instance: \"{0}\" parameters update failed, error: \"{1}\""; + public static final String SERVICE_INSTANCE_0_TAGS_UPDATE_FAILED_ERROR_1 = "Service instance: \"{0}\" tags update failed, error: \"{1}\""; // Audit log messages @@ -128,15 +131,18 @@ public class Messages { public static final String ERROR_STOPPING_APP = "Error stopping application \"{0}\""; public static final String DOWNLOAD_APP_LOGS_FOR_MORE_INFO = "Download the application logs via the dmol command and check them for more information."; public static final String ERROR_STAGING_APP_0 = "Error staging application \"{0}\""; - public static final String ERROR_STAGING_APP_0_DESCRIPTION_1 = "Error staging application \"{0}\": {1}\n" + DOWNLOAD_APP_LOGS_FOR_MORE_INFO; + public static final String ERROR_STAGING_APP_0_DESCRIPTION_1 = + "Error staging application \"{0}\": {1}\n" + DOWNLOAD_APP_LOGS_FOR_MORE_INFO; public static final String ERROR_PUBLISHING_PUBLIC_PROVIDED_DEPENDENCIES = "Error publishing public provided dependencies"; public static final String ERROR_STARTING_APP_0 = "Error starting application \"{0}\""; - public static final String ERROR_STARTING_APP_0_DESCRIPTION_1 = "Error starting application \"{0}\": {1}\n" + DOWNLOAD_APP_LOGS_FOR_MORE_INFO; + public static final String ERROR_STARTING_APP_0_DESCRIPTION_1 = + "Error starting application \"{0}\": {1}\n" + DOWNLOAD_APP_LOGS_FOR_MORE_INFO; public static final String ERROR_EXECUTING_APP_1 = "Error executing application \"{0}\""; public static final String ERROR_EXECUTING_APP_2 = "Error executing application \"{0}\": {1}"; public static final String ERROR_PREPARING_TO_EXECUTE_TASKS_ON_APP = "Error preparing to execute tasks on application \"{0}\""; public static final String ERROR_PREPARING_TO_RESTART_SERVICE_BROKER_SUBSCRIBERS = "Error preparing to restart service broker subscribers"; - public static final String ERROR_EXECUTING_TASK_0_ON_APP_1 = "Execution of task \"{0}\" on application \"{1}\" failed.\n" + DOWNLOAD_APP_LOGS_FOR_MORE_INFO; + public static final String ERROR_EXECUTING_TASK_0_ON_APP_1 = + "Execution of task \"{0}\" on application \"{1}\" failed.\n" + DOWNLOAD_APP_LOGS_FOR_MORE_INFO; public static final String ERROR_DETECTING_COMPONENTS_TO_UNDEPLOY = "Error detecting components to undeploy"; public static final String ERROR_DELETING_IDLE_ROUTES = "Error deleting idle routes"; public static final String ERROR_CREATING_SERVICE_BROKERS = "Error creating service brokers"; @@ -226,7 +232,6 @@ public class Messages { public static final String COULD_NOT_UPDATE_SYSLOG_DRAIN_URL_SERVICE = "Could not update syslog drain url of service \"{0}\" : {1}"; public static final String SCALING_DOWN_NEW_APPLICATION_TO_ONE_INSTANCE = "Scaling down new application: \"{0}\" to one instance"; public static final String UPLOAD_OF_APPLICATION_0_WAS_NOT_ACCEPTED_BY_INSTANCE_1 = "Upload of application: {0} was not accepted by instance: {1}"; - public static final String COULD_NOT_GET_SERVICE_KEYS_FOR_OPTIONAL_SERVICE = "Could not get service keys for optional service \"{0}\""; public static final String DEFAULT_FAILED_OPERATION_DESCRIPTION = "The service broker returned an error with no description!"; public static final String ERROR_DURING_CLEAN_UP_0 = "Error during clean-up: {0}"; @@ -257,8 +262,10 @@ public class Messages { public static final String ERROR_WHILE_DELETING_SERVICE_KEY_0_FOR_OPTIONAL_SERVICE_1 = "Error while deleting service key \"{0}\" for optional service \"{1}\""; public static final String SERVICE_KEY_0_IS_ALREADY_DELETED = "Service key \"{0}\" is already deleted"; public static final String FILE_WITH_ID_0_OPERATION_OWNERSHIP_CHANGED_FROM_0_TO_1 = "File with id \"{0}\" operation ownership was changed from \"{1}\" to \"{2}\" and won't be deleted"; - public static final String PARAMETERS_0_ARE_NOT_SUPPORTED_OR_REFERENCED_BY_ANY_OTHER_ENTITIES = "Parameter(s) \"{0}\" are not supported in the specified scope, or referenced by any other entities. These parameters will not be processed and can be lost after the operation completes."; + public static final String SERVICE_INSTANCE_0_PLAN_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" plan update failed, ignoring failure..."; + public static final String SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" parameters update failed, ignoring failure..."; + public static final String SERVICE_INSTANCE_0_TAGS_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" tags update failed, ignoring failure..."; // INFO log messages public static final String ACQUIRING_LOCK = "Process \"{0}\" attempting to acquire lock for operation on MTA \"{1}\""; 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 04be023451..cfa4865030 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 @@ -1,8 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; import java.text.MessageFormat; -import java.util.Collections; import java.util.List; +import java.util.function.Supplier; import com.sap.cloudfoundry.client.facade.CloudControllerClient; import com.sap.cloudfoundry.client.facade.CloudOperationException; import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; @@ -11,6 +11,8 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -18,6 +20,8 @@ @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceParametersStep extends ServiceStep { + private static final Logger LOGGER = LoggerFactory.getLogger(UpdateServiceParametersStep.class); + @Override protected OperationExecutionState executeOperation(ProcessContext context, CloudControllerClient client, CloudServiceInstanceExtended service) { @@ -27,12 +31,17 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud client.updateServiceParameters(service.getName(), service.getCredentials()); getStepLogger().debug(Messages.SERVICE_UPDATED, service.getName()); } catch (CloudOperationException e) { + if (service.shouldFailOnParametersUpdateFailure() != null && !service.shouldFailOnParametersUpdateFailure()) { + getStepLogger().warn( + MessageFormat.format(Messages.SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_IGNORING_FAILURE, service.getName())); + LOGGER.error(MessageFormat.format(Messages.SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_ERROR_1, service.getName(), + e.getMessage()), e); + return OperationExecutionState.FINISHED; + } String exceptionDescription = MessageFormat.format(Messages.COULD_NOT_UPDATE_PARAMETERS_SERVICE, service.getName(), e.getDescription()); - CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), - e.getStatusText(), + CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), e.getStatusText(), exceptionDescription); - processServiceActionFailure(context, service, cloudOperationException); return OperationExecutionState.FINISHED; } @@ -43,9 +52,16 @@ 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(), - serviceToProcess::shouldFailOnParametersUpdateFailure)); + return List.of( + new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter(), + shouldFailOnParametersUpdateFailure(serviceToProcess))); + } + + private Supplier shouldFailOnParametersUpdateFailure(CloudServiceInstanceExtended serviceToProcess) { + if (serviceToProcess.shouldFailOnParametersUpdateFailure() != null) { + return serviceToProcess::shouldFailOnParametersUpdateFailure; + } + return () -> false; } @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 d00f8d9b02..de9b771e47 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 @@ -1,8 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; import java.text.MessageFormat; -import java.util.Collections; import java.util.List; +import java.util.function.Supplier; import com.sap.cloudfoundry.client.facade.CloudControllerClient; import com.sap.cloudfoundry.client.facade.CloudOperationException; import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; @@ -11,6 +11,8 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -18,6 +20,8 @@ @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServicePlanStep extends ServiceStep { + private static final Logger LOGGER = LoggerFactory.getLogger(UpdateServicePlanStep.class); + @Override protected OperationExecutionState executeOperation(ProcessContext context, CloudControllerClient client, CloudServiceInstanceExtended service) { @@ -30,12 +34,18 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud client.updateServicePlan(service.getName(), service.getPlan()); getStepLogger().debug(Messages.SERVICE_PLAN_FOR_SERVICE_0_UPDATED, service.getName()); } catch (CloudOperationException e) { + if (service.shouldFailOnPlanUpdateFailure() != null && !service.shouldFailOnPlanUpdateFailure()) { + getStepLogger().warn( + MessageFormat.format(Messages.SERVICE_INSTANCE_0_PLAN_UPDATE_FAILED_IGNORING_FAILURE, service.getName())); + LOGGER.error(MessageFormat.format(Messages.SERVICE_INSTANCE_0_PLAN_UPDATE_FAILED_ERROR_1, service.getName(), + e.getMessage()), e); + return OperationExecutionState.FINISHED; + } String exceptionDescription = MessageFormat.format(Messages.COULD_NOT_UPDATE_PLAN_SERVICE, service.getName(), e.getDescription()); CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), e.getStatusText(), exceptionDescription); - processServiceActionFailure(context, service, cloudOperationException); return OperationExecutionState.FINISHED; } @@ -46,9 +56,17 @@ 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(), - serviceToProcess::shouldFailOnPlanUpdateFailure)); + return List.of(new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), + getServiceProgressReporter(), + shouldFailOnPlanUpdateFailure( + serviceToProcess))); + } + + private Supplier shouldFailOnPlanUpdateFailure(CloudServiceInstanceExtended serviceToProcess) { + if (serviceToProcess.shouldFailOnPlanUpdateFailure() != null) { + return serviceToProcess::shouldFailOnPlanUpdateFailure; + } + return () -> false; } @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 7800ff6de9..47243b220e 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 @@ -1,8 +1,8 @@ package org.cloudfoundry.multiapps.controller.process.steps; import java.text.MessageFormat; -import java.util.Collections; import java.util.List; +import java.util.function.Supplier; import com.sap.cloudfoundry.client.facade.CloudControllerClient; import com.sap.cloudfoundry.client.facade.CloudOperationException; import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; @@ -11,6 +11,8 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -18,6 +20,8 @@ @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class UpdateServiceTagsStep extends ServiceStep { + private static final Logger LOGGER = LoggerFactory.getLogger(UpdateServiceTagsStep.class); + @Override protected OperationExecutionState executeOperation(ProcessContext context, CloudControllerClient client, CloudServiceInstanceExtended service) { @@ -31,12 +35,17 @@ protected OperationExecutionState executeOperation(ProcessContext context, Cloud client.updateServiceTags(service.getName(), service.getTags()); getStepLogger().debug(Messages.SERVICE_TAGS_UPDATED, service.getName()); } catch (CloudOperationException e) { + if (service.shouldFailOnTagsUpdateFailure() != null && !service.shouldFailOnTagsUpdateFailure()) { + getStepLogger().warn( + MessageFormat.format(Messages.SERVICE_INSTANCE_0_TAGS_UPDATE_FAILED_IGNORING_FAILURE, service.getName())); + LOGGER.error( + MessageFormat.format(Messages.SERVICE_INSTANCE_0_TAGS_UPDATE_FAILED_ERROR_1, service.getName(), e.getMessage()), e); + return OperationExecutionState.FINISHED; + } String exceptionDescription = MessageFormat.format(Messages.COULD_NOT_UPDATE_TAGS_OF_SERVICE, service.getName(), e.getDescription()); - CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), - e.getStatusText(), + CloudOperationException cloudOperationException = new CloudOperationException(e.getStatusCode(), e.getStatusText(), exceptionDescription); - processServiceActionFailure(context, service, cloudOperationException); return OperationExecutionState.FINISHED; } @@ -47,9 +56,16 @@ 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(), - serviceToProcess::shouldFailOnTagsUpdateFailure)); + return List.of( + new PollServiceCreateOrUpdateOperationsExecution(getServiceOperationGetter(), getServiceProgressReporter(), + shouldFailOnTagsUpdateFailure(serviceToProcess))); + } + + private Supplier shouldFailOnTagsUpdateFailure(CloudServiceInstanceExtended serviceToProcess) { + if (serviceToProcess.shouldFailOnTagsUpdateFailure() != null) { + return serviceToProcess::shouldFailOnTagsUpdateFailure; + } + return () -> false; } @Override diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java index e7fd08b590..0fdcfa8a4c 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceParametersStepTest.java @@ -1,5 +1,14 @@ package org.cloudfoundry.multiapps.controller.process.steps; +import com.sap.cloudfoundry.client.facade.CloudOperationException; +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.client.lib.domain.ImmutableCloudServiceInstanceExtended; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -11,16 +20,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; -import org.cloudfoundry.multiapps.common.SLException; -import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudServiceInstanceExtended; -import org.cloudfoundry.multiapps.controller.process.variables.Variables; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.http.HttpStatus; - -import com.sap.cloudfoundry.client.facade.CloudOperationException; -import com.sap.cloudfoundry.client.facade.domain.ServiceOperation; - class UpdateServiceParametersStepTest extends SyncFlowableStepTest { @Test @@ -110,6 +109,20 @@ void testOperationType() { assertEquals(ServiceOperation.Type.UPDATE, step.getOperationType()); } + @Test + void testFailOnParametersSetToFalse() { + CloudServiceInstanceExtended serviceToProcess = buildServiceToProcess(FALSE); + serviceToProcess = ImmutableCloudServiceInstanceExtended.copyOf(serviceToProcess) + .withShouldFailOnParametersUpdateFailure(false); + prepareServiceToProcess(serviceToProcess); + prepareClient(serviceToProcess); + throwExceptionOnServiceParametersUpdate(HttpStatus.INTERNAL_SERVER_ERROR); + + step.execute(execution); + + assertStepFinishedSuccessfully(); + } + private void throwExceptionOnServiceParametersUpdate(HttpStatus httpStatus) { Mockito.doThrow(new CloudOperationException(httpStatus, "Error occurred")) .when(client) diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java index c49d2a22bb..5c94a74218 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServicePlanStepTest.java @@ -4,10 +4,10 @@ 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.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; - import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,7 +26,7 @@ void testUpdateServicePlan() { step.execute(execution); verify(client).updateServicePlan(serviceToProcess.getName(), - serviceToProcess.getPlan()); + serviceToProcess.getPlan()); } @Test @@ -79,10 +79,24 @@ void testOperationType() { assertEquals(ServiceOperation.Type.UPDATE, step.getOperationType()); } + @Test + void testFailOnPlanUpdateSetToFalse() { + CloudServiceInstanceExtended serviceToProcess = buildServiceToProcess(FALSE); + serviceToProcess = ImmutableCloudServiceInstanceExtended.copyOf(serviceToProcess) + .withShouldFailOnPlanUpdateFailure(false); + prepareServiceToProcess(serviceToProcess); + prepareClient(serviceToProcess); + throwExceptionOnServicePlanUpdate(HttpStatus.INTERNAL_SERVER_ERROR); + + step.execute(execution); + + assertStepFinishedSuccessfully(); + } + private void throwExceptionOnServicePlanUpdate(HttpStatus httpStatus) { Mockito.doThrow(new CloudOperationException(httpStatus, "Error occurred")) - .when(client) - .updateServicePlan(any(), any()); + .when(client) + .updateServicePlan(any(), any()); } @Override diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java index f06ed1897c..6a8f5ba535 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/UpdateServiceTagsStepTest.java @@ -4,10 +4,10 @@ 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.client.lib.domain.ImmutableCloudServiceInstanceExtended; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.http.HttpStatus; - import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,7 +26,7 @@ void testUpdateServiceTags() { step.execute(execution); verify(client).updateServiceTags(serviceToProcess.getName(), - serviceToProcess.getTags()); + serviceToProcess.getTags()); } @Test @@ -79,12 +79,26 @@ void testOperationType() { assertEquals(ServiceOperation.Type.UPDATE, step.getOperationType()); } + @Test + void testFailOnTagsSetToFalse() { + CloudServiceInstanceExtended serviceToProcess = buildServiceToProcess(FALSE); + serviceToProcess = ImmutableCloudServiceInstanceExtended.copyOf(serviceToProcess) + .withShouldFailOnTagsUpdateFailure(false); + prepareServiceToProcess(serviceToProcess); + prepareClient(serviceToProcess); + throwExceptionOnServiceTagsUpdate(HttpStatus.INTERNAL_SERVER_ERROR); + + step.execute(execution); + + assertStepFinishedSuccessfully(); + } + private void throwExceptionOnServiceTagsUpdate(HttpStatus httpStatus) { Mockito.doThrow(new CloudOperationException(httpStatus, "Error occurred")) - .when(client) - .updateServiceTags(any(), any()); + .when(client) + .updateServiceTags(any(), any()); } - + @Override protected UpdateServiceTagsStep createStep() { return new UpdateServiceTagsStep();