rafaelweingartner commented on a change in pull request #2146: CLOUDSTACK-4757: 
Support OVA files with multiple disks for templates
URL: https://github.com/apache/cloudstack/pull/2146#discussion_r158581871
 
 

 ##########
 File path: 
engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
 ##########
 @@ -1003,4 +1180,72 @@ public void addSystemVMTemplatesToSecondary(DataStore 
store) {
             }
         }
     }
+
+    private class CreateDataDiskTemplateContext<T> extends AsyncRpcContext<T> {
+        private final DataObject dataDiskTemplate;
+        private final AsyncCallFuture<TemplateApiResult> future;
+
+        public CreateDataDiskTemplateContext(AsyncCompletionCallback<T> 
callback, DataObject dataDiskTemplate, AsyncCallFuture<TemplateApiResult> 
future) {
+            super(callback);
+            this.dataDiskTemplate = dataDiskTemplate;
+            this.future = future;
+        }
+
+        public AsyncCallFuture<TemplateApiResult> getFuture() {
+            return this.future;
+        }
+    }
+
+    @Override
+    public AsyncCallFuture<TemplateApiResult> 
createDatadiskTemplateAsync(TemplateInfo parentTemplate, TemplateInfo 
dataDiskTemplate, String path, String diskId, long fileSize, boolean bootable) {
+        AsyncCallFuture<TemplateApiResult> future = new 
AsyncCallFuture<TemplateApiResult>();
+        // Make an entry for disk template in template_store_ref table
+        DataStore store = parentTemplate.getDataStore();
+        TemplateObject dataDiskTemplateOnStore;
+        if (!bootable) {
+            dataDiskTemplateOnStore = 
(TemplateObject)store.create(dataDiskTemplate);
+            
dataDiskTemplateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.CreateOnlyRequested);
+        } else {
+            dataDiskTemplateOnStore = (TemplateObject) 
imageFactory.getTemplate(parentTemplate, store);
+        }
+        try {
+            CreateDataDiskTemplateContext<TemplateApiResult> context = new 
CreateDataDiskTemplateContext<TemplateApiResult>(null, dataDiskTemplateOnStore, 
future);
+            AsyncCallbackDispatcher<TemplateServiceImpl, CreateCmdResult> 
caller = AsyncCallbackDispatcher.create(this);
+            
caller.setCallback(caller.getTarget().createDatadiskTemplateCallback(null, 
null)).setContext(context);
+            ImageStoreEntity tmpltStore = 
(ImageStoreEntity)parentTemplate.getDataStore();
+            tmpltStore.createDataDiskTemplateAsync(dataDiskTemplate, path, 
diskId, fileSize, bootable, caller);
+        } catch (CloudRuntimeException ex) {
+            
dataDiskTemplateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
+            TemplateApiResult result = new TemplateApiResult(dataDiskTemplate);
+            result.setResult(ex.getMessage());
+            if (future != null) {
+                future.complete(result);
+            }
+        }
+        return future;
+    }
+
+    protected Void 
createDatadiskTemplateCallback(AsyncCallbackDispatcher<TemplateServiceImpl, 
CreateCmdResult> callback,
+            CreateDataDiskTemplateContext<TemplateApiResult> context) {
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("MDOVA createDatadiskTemplateCallback Performing 
create datadisk template cross callback after completion");
+        }
+        DataObject dataDiskTemplate = context.dataDiskTemplate;
+        AsyncCallFuture<TemplateApiResult> future = context.getFuture();
+        CreateCmdResult result = callback.getResult();
+        TemplateApiResult dataDiskTemplateResult = new 
TemplateApiResult((TemplateObject)dataDiskTemplate);
+        try {
+            if (result.isSuccess()) {
+                dataDiskTemplate.processEvent(Event.OperationSuccessed, 
result.getAnswer());
+            } else {
+                dataDiskTemplate.processEvent(Event.OperationFailed);
+                dataDiskTemplateResult.setResult(result.getResult());
+            }
+        } catch (Exception e) {
 
 Review comment:
   Do you need to catch almost everything here?

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to