Repository: cloudstack Updated Branches: refs/heads/master b631da254 -> 5adfc1c78
CLOUDSTACK-8651: [Browser Based Upload Template] Partially uploaded templates doesn't get cleaned up after the SSVM handling it is destroyed Fixed template sync code to include templates in 'NotUploaded' and 'UploadInProgress' states along with 'Active'. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3be278ed Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3be278ed Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3be278ed Branch: refs/heads/master Commit: 3be278ed5e4e83c1f8024adaa7056629973e0151 Parents: b631da2 Author: Koushik Das <[email protected]> Authored: Mon Jul 20 14:48:40 2015 +0530 Committer: Koushik Das <[email protected]> Committed: Wed Jul 29 13:40:43 2015 +0530 ---------------------------------------------------------------------- .../com/cloud/storage/dao/VMTemplateDao.java | 4 +++ .../cloud/storage/dao/VMTemplateDaoImpl.java | 20 +++++++++-- .../storage/image/TemplateServiceImpl.java | 4 +-- .../component/test_browse_templates.py | 36 ++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3be278ed/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java index a3adffc..dccc902 100644 --- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java @@ -54,8 +54,12 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long>, StateDao< public List<VMTemplateVO> listAllInZone(long dataCenterId); + public List<VMTemplateVO> listInZoneByState(long dataCenterId, VirtualMachineTemplate.State... states); + public List<VMTemplateVO> listAllActive(); + public List<VMTemplateVO> listByState(VirtualMachineTemplate.State... states); + public List<VMTemplateVO> listByHypervisorType(List<HypervisorType> hyperTypes); public List<VMTemplateVO> publicIsoSearch(Boolean bootable, boolean listRemoved, Map<String, String> tags); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3be278ed/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 90196a8..02fb4b4 100644 --- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -372,7 +372,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem tmpltZoneSearch.and("zoneId", tmpltZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ); TmpltsInZoneSearch = createSearchBuilder(); - TmpltsInZoneSearch.and("state", TmpltsInZoneSearch.entity().getState(), SearchCriteria.Op.EQ); + TmpltsInZoneSearch.and("state", TmpltsInZoneSearch.entity().getState(), SearchCriteria.Op.IN); TmpltsInZoneSearch.and().op("avoidtype", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NEQ); TmpltsInZoneSearch.or("templateType", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NULL); TmpltsInZoneSearch.cp(); @@ -381,7 +381,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem TmpltsInZoneSearch.done(); ActiveTmpltSearch = createSearchBuilder(); - ActiveTmpltSearch.and("state", ActiveTmpltSearch.entity().getState(), SearchCriteria.Op.EQ); + ActiveTmpltSearch.and("state", ActiveTmpltSearch.entity().getState(), SearchCriteria.Op.IN); CountTemplatesByAccount = createSearchBuilder(Long.class); CountTemplatesByAccount.select(null, Func.COUNT, null); @@ -793,6 +793,15 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem } @Override + public List<VMTemplateVO> listInZoneByState(long dataCenterId, VirtualMachineTemplate.State... states) { + SearchCriteria<VMTemplateVO> sc = TmpltsInZoneSearch.create(); + sc.setParameters("avoidtype", TemplateType.PERHOST.toString()); + sc.setParameters("state", (Object[])states); + sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId); + return listBy(sc); + } + + @Override public List<VMTemplateVO> listAllActive() { SearchCriteria<VMTemplateVO> sc = ActiveTmpltSearch.create(); sc.setParameters("state", VirtualMachineTemplate.State.Active.toString()); @@ -800,6 +809,13 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem } @Override + public List<VMTemplateVO> listByState(VirtualMachineTemplate.State... states) { + SearchCriteria<VMTemplateVO> sc = ActiveTmpltSearch.create(); + sc.setParameters("state", (Object[])states); + return listBy(sc); + } + + @Override public List<VMTemplateVO> listDefaultBuiltinTemplates() { SearchCriteria<VMTemplateVO> sc = tmpltTypeSearch.create(); sc.setParameters("templateType", Storage.TemplateType.BUILTIN); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3be278ed/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index f6dc33e..ccb70c4 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -291,10 +291,10 @@ public class TemplateServiceImpl implements TemplateService { List<VMTemplateVO> allTemplates = null; if (zoneId == null) { // region wide store - allTemplates = _templateDao.listAllActive(); + allTemplates = _templateDao.listByState(VirtualMachineTemplate.State.Active, VirtualMachineTemplate.State.NotUploaded, VirtualMachineTemplate.State.UploadInProgress); } else { // zone wide store - allTemplates = _templateDao.listAllInZone(zoneId); + allTemplates = _templateDao.listInZoneByState(zoneId, VirtualMachineTemplate.State.Active, VirtualMachineTemplate.State.NotUploaded, VirtualMachineTemplate.State.UploadInProgress); } List<VMTemplateVO> rtngTmplts = _templateDao.listAllSystemVMTemplates(); List<VMTemplateVO> defaultBuiltin = _templateDao.listDefaultBuiltinTemplates(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3be278ed/test/integration/component/test_browse_templates.py ---------------------------------------------------------------------- diff --git a/test/integration/component/test_browse_templates.py b/test/integration/component/test_browse_templates.py index 2cacdb6..9366914 100644 --- a/test/integration/component/test_browse_templates.py +++ b/test/integration/component/test_browse_templates.py @@ -1674,6 +1674,42 @@ class TestBrowseUploadVolume(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns", "smoke", "basic"], required_hardware="false") + def test_browser_upload_template_incomplete(self): + """ + Test browser based incomplete template upload, followed by SSVM destroy. Template should go to UploadAbandoned state and get cleaned up. + """ + try: + self.debug("========================= Test browser based incomplete template upload ========================") + + #Only register template, without uploading + cmd = getUploadParamsForTemplate.getUploadParamsForTemplateCmd() + cmd.zoneid = self.zone.id + cmd.format = self.uploadtemplateformat + cmd.name=self.templatename+self.account.name+(random.choice(string.ascii_uppercase)) + cmd.account=self.account.name + cmd.domainid=self.domain.id + cmd.displaytext=cmd.name + cmd.hypervisor=self.templatehypervisor + cmd.ostypeid=self.templateostypeid + template_response=self.apiclient.getUploadParamsForTemplate(cmd) + + #Destroy SSVM, and wait for new one to start + self.destroy_ssvm() + + #Verify that the template is cleaned up as part of sync-up during new SSVM start + list_template_response=Template.list( + self.apiclient, + id=template_response.id, + templatefilter="all", + zoneid=self.zone.id) + self.assertEqual(list_template_response, None, "Template is not cleaned up, some issue with template sync-up") + + except Exception as e: + self.fail("Exceptione occurred : %s" % e) + return + + @classmethod def tearDownClass(self): try:
