CLOUDSTACK-7771: Throw exception while restoring vm if the template is already 
deleted. Also fix the usage event being generated from the right template id 
and fix the log message which sometime showed incorrect template id.
CLOUDSTACK-4201: listServiceOfferings API needs to be able to take 
virtualmachineid of SystemVM and return service offerings available for the vm 
to change service offering

(cherry picked from commit ee0f0a1cffb96a8371d9a8c4210b428660f79d4f)
Signed-off-by: Rohit Yadav <rohit.ya...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a6f9411b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a6f9411b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a6f9411b

Branch: refs/heads/4.5
Commit: a6f9411b1eb46739c9b47fc16ad7796cc0e3d221
Parents: 1288d53
Author: Nitin Mehta <nitin.me...@citrix.com>
Authored: Wed Oct 22 15:03:25 2014 -0700
Committer: Rohit Yadav <rohit.ya...@shapeblue.com>
Committed: Tue Jan 20 12:05:25 2015 +0530

----------------------------------------------------------------------
 server/src/com/cloud/api/query/QueryManagerImpl.java |  7 ++++++-
 server/src/com/cloud/vm/UserVmManagerImpl.java       | 12 ++++++++++--
 server/test/com/cloud/vm/UserVmManagerTest.java      |  8 ++++++++
 3 files changed, 24 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6f9411b/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java 
b/server/src/com/cloud/api/query/QueryManagerImpl.java
index a5e7d5c..62714ea 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -27,6 +27,8 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import com.cloud.utils.StringUtils;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.dao.VMInstanceDao;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -248,6 +250,9 @@ public class QueryManagerImpl extends ManagerBase 
implements QueryService {
     private UserVmDao _userVmDao;
 
     @Inject
+    private VMInstanceDao _vmInstanceDao;
+
+    @Inject
     private SecurityGroupJoinDao _securityGroupJoinDao;
 
     @Inject
@@ -2576,7 +2581,7 @@ public class QueryManagerImpl extends ManagerBase 
implements QueryService {
         }
 
         if (vmId != null) {
-            UserVmVO vmInstance = _userVmDao.findById(vmId);
+            VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
             if ((vmInstance == null) || (vmInstance.getRemoved() != null)) {
                 InvalidParameterValueException ex = new 
InvalidParameterValueException("unable to find a virtual machine with specified 
id");
                 ex.addProxyObject(vmId.toString(), "vmId");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6f9411b/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 3f539b2..22f2769 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -35,6 +35,8 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
@@ -303,6 +305,8 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
     @Inject
     protected VMTemplateZoneDao _templateZoneDao = null;
     @Inject
+    protected TemplateDataStoreDao _templateStoreDao;
+    @Inject
     protected DomainDao _domainDao = null;
     @Inject
     protected UserVmCloneSettingDao _vmCloneSettingDao = null;
@@ -4762,6 +4766,10 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                     throw ex;
                 }
             }
+            TemplateDataStoreVO tmplStore = 
_templateStoreDao.findByTemplateZoneReady(template.getId(), 
vm.getDataCenterId());
+            if (tmplStore == null) {
+                throw new InvalidParameterValueException("Cannot restore the 
vm as the template " + template.getUuid() + " isn't available in the zone");
+            }
 
             if (needRestart) {
                 try {
@@ -4794,7 +4802,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
             }
 
             // Create Usage event for the newly created volume
-            UsageEventVO usageEvent = new 
UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, newVol.getAccountId(), 
newVol.getDataCenterId(), newVol.getId(), newVol.getName(), 
newVol.getDiskOfferingId(), templateId, newVol.getSize());
+            UsageEventVO usageEvent = new 
UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, newVol.getAccountId(), 
newVol.getDataCenterId(), newVol.getId(), newVol.getName(), 
newVol.getDiskOfferingId(), template.getId(), newVol.getSize());
             _usageEventDao.persist(usageEvent);
 
             handleManagedStorage(vm, root);
@@ -4867,7 +4875,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
             }
         }
 
-        s_logger.debug("Restore VM " + vmId + " with template " + 
newTemplateId + " done successfully");
+        s_logger.debug("Restore VM " + vmId + " done successfully");
         return vm;
 
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a6f9411b/server/test/com/cloud/vm/UserVmManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vm/UserVmManagerTest.java 
b/server/test/com/cloud/vm/UserVmManagerTest.java
index aed468d..d86e55e 100755
--- a/server/test/com/cloud/vm/UserVmManagerTest.java
+++ b/server/test/com/cloud/vm/UserVmManagerTest.java
@@ -55,6 +55,7 @@ import 
org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationSer
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 
 import com.cloud.capacity.CapacityManager;
 import com.cloud.configuration.ConfigurationManager;
@@ -89,6 +90,7 @@ import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.snapshot.VMSnapshotVO;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 
 public class UserVmManagerTest {
 
@@ -121,6 +123,8 @@ public class UserVmManagerTest {
     @Mock
     VMTemplateDao _templateDao;
     @Mock
+    TemplateDataStoreDao _templateStoreDao;
+    @Mock
     VolumeDao _volsDao;
     @Mock
     RestoreVMCmd _restoreVMCmd;
@@ -135,6 +139,8 @@ public class UserVmManagerTest {
     @Mock
     VMTemplateVO _templateMock;
     @Mock
+    TemplateDataStoreVO _templateDataStoreMock;
+    @Mock
     VolumeVO _volumeMock;
     @Mock
     List<VolumeVO> _rootVols;
@@ -162,6 +168,7 @@ public class UserVmManagerTest {
         _userVmMgr._vmDao = _vmDao;
         _userVmMgr._vmInstanceDao = _vmInstanceDao;
         _userVmMgr._templateDao = _templateDao;
+        _userVmMgr._templateStoreDao = _templateStoreDao;
         _userVmMgr._volsDao = _volsDao;
         _userVmMgr._usageEventDao = _usageEventDao;
         _userVmMgr._itMgr = _itMgr;
@@ -190,6 +197,7 @@ public class UserVmManagerTest {
         List<VMSnapshotVO> mockList = mock(List.class);
         when(_vmSnapshotDao.findByVm(anyLong())).thenReturn(mockList);
         when(mockList.size()).thenReturn(0);
+        
when(_templateStoreDao.findByTemplateZoneReady(anyLong(),anyLong())).thenReturn(_templateDataStoreMock);
 
     }
 

Reply via email to