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