@@ -104,17 +104,16 @@ public class ToscaOrchestrator {
104104
105105 private ExecutorService executorPool ;
106106
107- public ToscaServiceTemplate deployIacTemplate (String iacTemplateContent , Map <String , String > inputs , BaseCmd .HTTPMethod httpMethod ) {
107+ public Pair < ToscaServiceTemplate , Boolean > deployIacTemplate (String iacTemplateContent , Map <String , String > inputs , BaseCmd .HTTPMethod httpMethod ) {
108108 ToscaServiceTemplate serviceTemplate = parseServiceTemplate (iacTemplateContent );
109109 resolveServiceTemplateInputs (serviceTemplate , inputs );
110110
111111 Map <String , CompletableFuture <Void >> provisioningTasksFutures = new HashMap <>();
112112 Runnable cancelAllProvisioningTasks = getCancelAllProvisioningTasks (provisioningTasksFutures );
113- List <Throwable > errors = Collections .synchronizedList (new ArrayList <>());
114113 getCurrentNimbleExecutorPoolStatus ("before creating provisioning tasks" );
115- provisioningTasksFutures .putAll (createProvisioningTasksFutures (serviceTemplate , errors , cancelAllProvisioningTasks , httpMethod ));
116- awaitDeployCompletion (provisioningTasksFutures , errors , cancelAllProvisioningTasks );
117- return serviceTemplate ;
114+ provisioningTasksFutures .putAll (createProvisioningTasksFutures (serviceTemplate , cancelAllProvisioningTasks , httpMethod ));
115+ boolean success = awaitDeployCompletion (serviceTemplate , provisioningTasksFutures , cancelAllProvisioningTasks );
116+ return new Pair <>( serviceTemplate , success ) ;
118117 }
119118
120119 public ToscaServiceTemplate parseServiceTemplate (String iacTemplateContent ) {
@@ -139,26 +138,40 @@ private Runnable getCancelAllProvisioningTasks(Map<String, CompletableFuture<Voi
139138 };
140139 }
141140
142- private void awaitDeployCompletion (Map <String , CompletableFuture <Void >> provisioningTasksFutures , List < Throwable > errors , Runnable cancelAllProvisioningTasks ) {
141+ private boolean awaitDeployCompletion (ToscaServiceTemplate serviceTemplate , Map <String , CompletableFuture <Void >> provisioningTasksFutures , Runnable cancelAllProvisioningTasks ) {
143142 logger .debug ("Awaiting for all the provisioning tasks of the service template to complete." );
144143 CompletableFuture <Void > serviceTemplateFeature = CompletableFuture .allOf (provisioningTasksFutures .values ().toArray (new CompletableFuture [0 ]));
145144 int timeout = NimbleService .NimbleIaCTemplateExecutionTimeout .value ();
146145 try {
147146 serviceTemplateFeature .get (timeout , TimeUnit .SECONDS );
148147 logger .info ("All provisioning tasks of the service template completed successfully." );
149148 } catch (ExecutionException e ) {
150- Set <String > errorMessages = errors .stream ().map (Throwable ::getMessage ).collect (Collectors .toSet ());
151- throw new CloudRuntimeException (String .format ("The following errors occurred during the IaC template deployment: %s" , String .join (" | " , errorMessages )), e );
149+ List <String > errorMessages = serviceTemplate .getNodeTemplates ().values ().stream ()
150+ .filter (n -> n .getProvisioningError () != null )
151+ .map (n -> String .format ("[%s]: %s" , n .getName (), n .getProvisioningError ()))
152+ .collect (Collectors .toList ());
153+ String baseErrorMessage = "One or more node templates failed to be provisioned" ;
154+ logger .error ("{}: {}" , baseErrorMessage , String .join (" | " , errorMessages ), e );
155+ serviceTemplate .setDeploymentError (baseErrorMessage + "." );
156+ return false ;
152157 } catch (TimeoutException e ) {
153158 cancelAllProvisioningTasks .run ();
154- throw new CloudRuntimeException (String .format ("IaC template deployment timed out after [%d] seconds." , timeout ), e );
159+ String errorMessage = String .format ("IaC template deployment timed out after [%d] seconds." , timeout );
160+ logger .error (errorMessage , e );
161+ serviceTemplate .setDeploymentError (errorMessage );
162+ return false ;
155163 } catch (InterruptedException e ) {
156164 Thread .currentThread ().interrupt ();
157165 cancelAllProvisioningTasks .run ();
158- throw new CloudRuntimeException ("IaC template deployment was interrupted." , e );
166+ String errorMessage = "IaC template deployment was interrupted." ;
167+ logger .error (errorMessage , e );
168+ serviceTemplate .setDeploymentError (errorMessage );
169+ return false ;
159170 } finally {
160171 getCurrentNimbleExecutorPoolStatus ("after awaiting the deployment of the service template" );
161172 }
173+
174+ return true ;
162175 }
163176
164177 /**
@@ -200,7 +213,7 @@ private void handleGetInputFunctionCalls(String nodeTemplateName, ToscaProperty
200213 property .setEvaluatedValue (evaluatedValue );
201214 }
202215
203- private Map <String , CompletableFuture <Void >> createProvisioningTasksFutures (ToscaServiceTemplate serviceTemplate , List < Throwable > errors , Runnable cancelAllProvisioningTasks , BaseCmd .HTTPMethod httpMethod ) {
216+ private Map <String , CompletableFuture <Void >> createProvisioningTasksFutures (ToscaServiceTemplate serviceTemplate , Runnable cancelAllProvisioningTasks , BaseCmd .HTTPMethod httpMethod ) {
204217 logger .debug ("Building provisioning tasks for the service template based on its graph topological sort." );
205218 Map <String , CompletableFuture <Void >> futures = new HashMap <>();
206219 CallContext callContext = CallContext .current ();
@@ -222,7 +235,7 @@ private Map<String, CompletableFuture<Void>> createProvisioningTasksFutures(Tosc
222235 }
223236
224237 taskFuture .whenComplete ((result , ex ) -> {
225- handleTaskCompletion (nodeTemplate , ex , errors , cancelAllProvisioningTasks );
238+ handleTaskCompletion (nodeTemplate , ex , cancelAllProvisioningTasks );
226239 getCurrentNimbleExecutorPoolStatus (String .format ("after node template [%s] provisioning" , node ));
227240 });
228241
@@ -233,7 +246,7 @@ private Map<String, CompletableFuture<Void>> createProvisioningTasksFutures(Tosc
233246 return futures ;
234247 }
235248
236- private void handleTaskCompletion (ToscaNodeTemplate nodeTemplate , Throwable ex , List < Throwable > errors , Runnable cancelAllProvisioningTasks ) {
249+ private void handleTaskCompletion (ToscaNodeTemplate nodeTemplate , Throwable ex , Runnable cancelAllProvisioningTasks ) {
237250 if (ex == null ) {
238251 logger .trace ("The provisioning of the node template completed successfully. Skipping error handling." );
239252 nodeTemplate .setProvisioningState (ToscaNodeTemplate .ProvisioningState .SUCCEEDED );
@@ -252,7 +265,7 @@ private void handleTaskCompletion(ToscaNodeTemplate nodeTemplate, Throwable ex,
252265
253266 logger .trace ("An error occurred during the provisioning of a node template. Adding it to the list of errors." , ex );
254267 nodeTemplate .setProvisioningState (ToscaNodeTemplate .ProvisioningState .FAILED );
255- errors . add (ex );
268+ nodeTemplate . setProvisioningError (ex . getMessage () );
256269 cancelAllProvisioningTasks .run ();
257270 }
258271
0 commit comments