From 2f5ed9eee4ce7297660fd93185c09a70ce2b466c Mon Sep 17 00:00:00 2001 From: Rakesh Date: Tue, 17 Nov 2020 20:03:49 +0100 Subject: [PATCH] Consider other conditions while listing templates with id (#4452) --- .../com/cloud/api/query/QueryManagerImpl.java | 123 +++++++++--------- 1 file changed, 61 insertions(+), 62 deletions(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index ac975195d5e..cb985bd9ae6 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3443,11 +3443,6 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q domain = _domainDao.findById(Domain.ROOT_DOMAIN); } - // List hypers = null; - // if (!isIso) { - // hypers = _resourceMgr.listAvailHypervisorInZone(null, null); - // } - setIdsListToSearchCriteria(sc, ids); // add criteria for project or not @@ -3495,17 +3490,6 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } } - if (!isIso) { - // add hypervisor criteria for template case - if (hypers != null && !hypers.isEmpty()) { - String[] relatedHypers = new String[hypers.size()]; - for (int i = 0; i < hypers.size(); i++) { - relatedHypers[i] = hypers.get(i).toString(); - } - sc.addAnd("hypervisorType", SearchCriteria.Op.IN, relatedHypers); - } - } - // control different template filters if (templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community) { sc.addAnd("publicTemplate", SearchCriteria.Op.EQ, true); @@ -3548,62 +3532,78 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } sc.addAnd("publicTemplate", SearchCriteria.Op.SC, scc); } + } - // add tags criteria - if (tags != null && !tags.isEmpty()) { - SearchCriteria scc = _templateJoinDao.createSearchCriteria(); - for (Map.Entry entry : tags.entrySet()) { - SearchCriteria scTag = _templateJoinDao.createSearchCriteria(); - scTag.addAnd("tagKey", SearchCriteria.Op.EQ, entry.getKey()); - scTag.addAnd("tagValue", SearchCriteria.Op.EQ, entry.getValue()); - if (isIso) { - scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.ISO); - } else { - scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.Template); - } - scc.addOr("tagKey", SearchCriteria.Op.SC, scTag); + return templateChecks(isIso, hypers, tags, name, keyword, hyperType, onlyReady, bootable, zoneId, showDomr, + showRemovedTmpl, parentTemplateId, showUnique, searchFilter, sc); + + } + + private Pair, Integer> templateChecks(boolean isIso, List hypers, Map tags, String name, String keyword, + HypervisorType hyperType, boolean onlyReady, Boolean bootable, Long zoneId, boolean showDomr, + boolean showRemovedTmpl, Long parentTemplateId, Boolean showUnique, + Filter searchFilter, SearchCriteria sc) { + if (!isIso) { + // add hypervisor criteria for template case + if (hypers != null && !hypers.isEmpty()) { + String[] relatedHypers = new String[hypers.size()]; + for (int i = 0; i < hypers.size(); i++) { + relatedHypers[i] = hypers.get(i).toString(); } - sc.addAnd("tagKey", SearchCriteria.Op.SC, scc); + sc.addAnd("hypervisorType", SearchCriteria.Op.IN, relatedHypers); } + } - // other criteria - - if (keyword != null) { - sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - } else if (name != null) { - sc.addAnd("name", SearchCriteria.Op.EQ, name); + // add tags criteria + if (tags != null && !tags.isEmpty()) { + SearchCriteria scc = _templateJoinDao.createSearchCriteria(); + for (Map.Entry entry : tags.entrySet()) { + SearchCriteria scTag = _templateJoinDao.createSearchCriteria(); + scTag.addAnd("tagKey", SearchCriteria.Op.EQ, entry.getKey()); + scTag.addAnd("tagValue", SearchCriteria.Op.EQ, entry.getValue()); + if (isIso) { + scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.ISO); + } else { + scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.Template); + } + scc.addOr("tagKey", SearchCriteria.Op.SC, scTag); } + sc.addAnd("tagKey", SearchCriteria.Op.SC, scc); + } - if (isIso) { - sc.addAnd("format", SearchCriteria.Op.EQ, "ISO"); + // other criteria - } else { - sc.addAnd("format", SearchCriteria.Op.NEQ, "ISO"); - } + if (keyword != null) { + sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + } else if (name != null) { + sc.addAnd("name", SearchCriteria.Op.EQ, name); + } - if (!hyperType.equals(HypervisorType.None)) { - sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hyperType); - } + SearchCriteria.Op op = isIso ? Op.EQ : Op.NEQ; + sc.addAnd("format", op, "ISO"); - if (bootable != null) { - sc.addAnd("bootable", SearchCriteria.Op.EQ, bootable); - } + if (!hyperType.equals(HypervisorType.None)) { + sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hyperType); + } - if (onlyReady) { - SearchCriteria readySc = _templateJoinDao.createSearchCriteria(); - readySc.addOr("state", SearchCriteria.Op.EQ, TemplateState.Ready); - readySc.addOr("format", SearchCriteria.Op.EQ, ImageFormat.BAREMETAL); - SearchCriteria isoPerhostSc = _templateJoinDao.createSearchCriteria(); - isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO); - isoPerhostSc.addAnd("templateType", SearchCriteria.Op.EQ, TemplateType.PERHOST); - readySc.addOr("templateType", SearchCriteria.Op.SC, isoPerhostSc); - sc.addAnd("state", SearchCriteria.Op.SC, readySc); - } + if (bootable != null) { + sc.addAnd("bootable", SearchCriteria.Op.EQ, bootable); + } - if (!showDomr) { - // excluding system template - sc.addAnd("templateType", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM); - } + if (onlyReady) { + SearchCriteria readySc = _templateJoinDao.createSearchCriteria(); + readySc.addOr("state", SearchCriteria.Op.EQ, TemplateState.Ready); + readySc.addOr("format", SearchCriteria.Op.EQ, ImageFormat.BAREMETAL); + SearchCriteria isoPerhostSc = _templateJoinDao.createSearchCriteria(); + isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO); + isoPerhostSc.addAnd("templateType", SearchCriteria.Op.EQ, TemplateType.PERHOST); + readySc.addOr("templateType", SearchCriteria.Op.SC, isoPerhostSc); + sc.addAnd("state", SearchCriteria.Op.SC, readySc); + } + + if (!showDomr) { + // excluding system template + sc.addAnd("templateType", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM); } if (zoneId != null) { @@ -3648,7 +3648,6 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // VMTemplateDaoImpl.searchForTemplates and understand why we need to // specially handle ISO. The original logic is very twisted and no idea // about what the code was doing. - } // findTemplatesByIdOrTempZonePair returns the templates with the given ids if showUnique is true, or else by the TempZonePair