This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/master by this push:
     new bbc0ae8  storage: post process locally uploaded multi-disk ova 
template (#3215)
bbc0ae8 is described below

commit bbc0ae873d5a2cb94b5adafb326c836513175203
Author: Rohit Yadav <rohit.ya...@shapeblue.com>
AuthorDate: Wed Jun 5 23:07:40 2019 +0530

    storage: post process locally uploaded multi-disk ova template (#3215)
    
    Problem: When a multi-disk OVA template is uploaded, only the root disk is 
recognized and VMs deployed using such template only get the root disk 
provisioned.
    Root Cause: The template processor for multi-disk OVA was not used in the 
template upload processor.
    Solution: Added support for local multi-disk OVA template upload. After a 
multi-disk OVA template is
    uploaded, the mechanism that worked on multi-disk OVA templates registered 
using URL is now also used to discovers and creates data-disk templates in 
cloud.vm_template table and on the secondary storage.
    
    To enable SSL on SSVMs :
    • Upload the certificates like you usually do via the API or 
UI->Infrastructure tab
    • Set the global settings secstorage.encrypt.copy, 
secstorage.ssl.cert.domain to appropriate values
    along with the CPVM ones
    • Restart management server (no need to destroy/restart SSVM (or the ssvm 
agent))
    
    Test cases:
    - Upload template and check it creates multi-disk folders on secondary
    storage and entries in cloud.vm_template table
    - Upload template and kill/shutdown management server. Then restart MS
    to check if template sync works
    - Copy template across zone of an uploaded template
    
    Signed-off-by: Rohit Yadav rohit.ya...@shapeblue.com
---
 .../subsystem/api/storage/TemplateService.java     |  2 ++
 .../storage/image/TemplateServiceImpl.java         | 15 +++++++---
 .../datastore/ObjectInDataStoreManagerImpl.java    |  1 +
 .../cloud/storage/ImageStoreUploadMonitorImpl.java | 35 ++++++++++++++++++----
 4 files changed, 43 insertions(+), 10 deletions(-)

diff --git 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
index fc8a769..f70a781 100644
--- 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
+++ 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
@@ -47,6 +47,8 @@ public interface TemplateService {
 
     AsyncCallFuture<TemplateApiResult> 
createTemplateFromVolumeAsync(VolumeInfo volume, TemplateInfo template, 
DataStore store);
 
+    boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate);
+
     AsyncCallFuture<TemplateApiResult> deleteTemplateAsync(TemplateInfo 
template);
 
     AsyncCallFuture<TemplateApiResult> copyTemplate(TemplateInfo srcTemplate, 
DataStore destStore);
diff --git 
a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
 
b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index 45e3941..097b854 100644
--- 
a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ 
b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -409,8 +409,15 @@ public class TemplateServiceImpl implements 
TemplateService {
                                     _templateDao.update(tmplt.getId(), tmlpt);
 
                                     if (tmplt.getState() == 
VirtualMachineTemplate.State.NotUploaded || tmplt.getState() == 
VirtualMachineTemplate.State.UploadInProgress) {
+                                        VirtualMachineTemplate.Event event = 
VirtualMachineTemplate.Event.OperationSucceeded;
+                                        // For multi-disk OVA, check and 
create data disk templates
+                                        if 
(tmplt.getFormat().equals(ImageFormat.OVA)) {
+                                            if 
(!createOvaDataDiskTemplates(_templateFactory.getTemplate(tmlpt.getId(), 
store))) {
+                                                event = 
VirtualMachineTemplate.Event.OperationFailed;
+                                            }
+                                        }
                                         try {
-                                            stateMachine.transitTo(tmplt, 
VirtualMachineTemplate.Event.OperationSucceeded, null, _templateDao);
+                                            stateMachine.transitTo(tmplt, 
event, null, _templateDao);
                                         } catch (NoTransitionException e) {
                                             s_logger.error("Unexpected state 
transition exception for template " + tmplt.getName() + ". Details: " + 
e.getMessage());
                                         }
@@ -701,7 +708,7 @@ public class TemplateServiceImpl implements TemplateService 
{
             return null;
         }
 
-        // Check if OVA contains additional data disks. If yes, create 
Datadisk templates for each of the additional datadisk present in the OVA
+        // For multi-disk OVA, check and create data disk templates
         if (template.getFormat().equals(ImageFormat.OVA)) {
             if (!createOvaDataDiskTemplates(template)) {
                 
template.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
@@ -729,8 +736,8 @@ public class TemplateServiceImpl implements TemplateService 
{
         return null;
     }
 
-
-    protected boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate) {
+    @Override
+    public boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate) {
         try {
             // Get Datadisk template (if any) for OVA
             List<DatadiskTO> dataDiskTemplates = new ArrayList<DatadiskTO>();
diff --git 
a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
 
b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
index 5117b7c..062e89a 100644
--- 
a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
+++ 
b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
@@ -90,6 +90,7 @@ public class ObjectInDataStoreManagerImpl implements 
ObjectInDataStoreManager {
         stateMachines.addTransition(State.Allocated, 
Event.CreateOnlyRequested, State.Creating);
         stateMachines.addTransition(State.Allocated, Event.DestroyRequested, 
State.Destroying);
         stateMachines.addTransition(State.Allocated, Event.OperationFailed, 
State.Failed);
+        stateMachines.addTransition(State.Allocated, Event.OperationSuccessed, 
State.Ready);
         stateMachines.addTransition(State.Creating, Event.OperationFailed, 
State.Allocated);
         stateMachines.addTransition(State.Creating, Event.OperationSuccessed, 
State.Ready);
         stateMachines.addTransition(State.Ready, Event.CopyingRequested, 
State.Copying);
diff --git 
a/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java 
b/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java
index b5ee6b5..2b39518 100755
--- a/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java
+++ b/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java
@@ -25,17 +25,14 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.configuration.Resource;
-import com.cloud.event.EventTypes;
-import com.cloud.event.UsageEventUtils;
-import com.cloud.user.ResourceLimitService;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import 
org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
@@ -48,6 +45,8 @@ import 
org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -56,6 +55,9 @@ import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.alert.AlertManager;
+import com.cloud.configuration.Resource;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
 import com.cloud.exception.ConnectionException;
 import com.cloud.host.Host;
 import com.cloud.host.Status;
@@ -65,6 +67,7 @@ import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.user.ResourceLimitService;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.Transaction;
@@ -102,6 +105,12 @@ public class ImageStoreUploadMonitorImpl extends 
ManagerBase implements ImageSto
     private AlertManager _alertMgr;
     @Inject
     private VMTemplateZoneDao _vmTemplateZoneDao;
+    @Inject
+    private DataStoreManager dataStoreManager;
+    @Inject
+    private TemplateDataFactory templateFactory;
+    @Inject
+    private TemplateService templateService;
 
     private long _nodeId;
     private ScheduledExecutorService _executor = null;
@@ -395,6 +404,20 @@ public class ImageStoreUploadMonitorImpl extends 
ManagerBase implements ImageSto
                             VMTemplateVO templateUpdate = 
_templateDao.createForUpdate();
                             templateUpdate.setSize(answer.getVirtualSize());
                             _templateDao.update(tmpTemplate.getId(), 
templateUpdate);
+                            // For multi-disk OVA, check and create data disk 
templates
+                            if 
(tmpTemplate.getFormat().equals(Storage.ImageFormat.OVA)) {
+                                final DataStore store = 
dataStoreManager.getDataStore(templateDataStore.getDataStoreId(), 
templateDataStore.getDataStoreRole());
+                                final TemplateInfo templateInfo = 
templateFactory.getTemplate(tmpTemplate.getId(), store);
+                                if 
(!templateService.createOvaDataDiskTemplates(templateInfo)) {
+                                    
tmpTemplateDataStore.setDownloadState(VMTemplateStorageResourceAssoc.Status.ABANDONED);
+                                    
tmpTemplateDataStore.setState(State.Failed);
+                                    stateMachine.transitTo(tmpTemplate, 
VirtualMachineTemplate.Event.OperationFailed, null, _templateDao);
+                                    msg = "Multi-disk OVA template " + 
tmpTemplate.getUuid() + " failed to process data disks";
+                                    s_logger.error(msg);
+                                    sendAlert = true;
+                                    break;
+                                }
+                            }
                             stateMachine.transitTo(tmpTemplate, 
VirtualMachineTemplate.Event.OperationSucceeded, null, _templateDao);
                             
_resourceLimitMgr.incrementResourceCount(template.getAccountId(), 
Resource.ResourceType.secondary_storage, answer.getVirtualSize());
                             //publish usage event

Reply via email to