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); }