bug 7410 : listTemplates and ListIsos - Correcting the pagesize use. Putting all the filters in the DB query rather than after execution so that pagesize restriction happens at the end.

status 7410: resolved fixed
This commit is contained in:
nit 2010-12-08 19:46:04 +05:30
parent c2bec9fec4
commit 83145c38fd
8 changed files with 80 additions and 89 deletions

View File

@ -19,6 +19,7 @@ package com.cloud.api;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.List; import java.util.List;
import java.util.Set;
import com.cloud.api.commands.QueryAsyncJobResultCmd; import com.cloud.api.commands.QueryAsyncJobResultCmd;
import com.cloud.api.response.AccountResponse; import com.cloud.api.response.AccountResponse;
@ -92,6 +93,7 @@ import com.cloud.user.Account;
import com.cloud.user.User; import com.cloud.user.User;
import com.cloud.user.UserAccount; import com.cloud.user.UserAccount;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroup;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@ -168,7 +170,7 @@ public interface ResponseGenerator {
RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn); RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn);
void createTemplateResponse(List<TemplateResponse> responses, VirtualMachineTemplate template, Long zoneId, boolean isAdmin, void createTemplateResponse(List<TemplateResponse> responses, Pair<Long, Long> templateZonePair, boolean isAdmin,
Account account); Account account);
ListResponse<TemplateResponse> createTemplateResponse2(VirtualMachineTemplate template, Long zoneId); ListResponse<TemplateResponse> createTemplateResponse2(VirtualMachineTemplate template, Long zoneId);
@ -195,8 +197,7 @@ public interface ResponseGenerator {
EventResponse createEventResponse(Event event); EventResponse createEventResponse(Event event);
ListResponse<TemplateResponse> createIsoResponse(List<? extends VirtualMachineTemplate> isos, Long zoneId, boolean onlyReady, boolean isAdmin, ListResponse<TemplateResponse> createIsoResponse(Set<Pair<Long,Long>> isoZonePairSet, boolean onlyReady, Account account);
Account account);
TemplateResponse createIsoResponse(VirtualMachineTemplate result); TemplateResponse createIsoResponse(VirtualMachineTemplate result);

View File

@ -19,6 +19,7 @@
package com.cloud.api.commands; package com.cloud.api.commands;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -33,6 +34,7 @@ import com.cloud.template.VirtualMachineTemplate;
import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.UserContext; import com.cloud.user.UserContext;
import com.cloud.utils.Pair;
@Implementation(description="Lists all available ISO files.", responseObject=TemplateResponse.class) @Implementation(description="Lists all available ISO files.", responseObject=TemplateResponse.class)
public class ListIsosCmd extends BaseListCmd { public class ListIsosCmd extends BaseListCmd {
@ -137,7 +139,7 @@ public class ListIsosCmd extends BaseListCmd {
@Override @Override
public void execute(){ public void execute(){
List<? extends VirtualMachineTemplate> isos = _mgr.listIsos(this); Set<Pair<Long, Long>> isoZonePairSet = _mgr.listIsos(this);
TemplateFilter isoFilterObj = null; TemplateFilter isoFilterObj = null;
try { try {
@ -152,23 +154,12 @@ public class ListIsosCmd extends BaseListCmd {
} }
boolean isAdmin = false; boolean isAdmin = false;
boolean isAccountSpecific = true;
Account account = UserContext.current().getAccount(); Account account = UserContext.current().getAccount();
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) { if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) {
isAdmin = true; isAdmin = true;
if ((accountName == null) || (domainId == null)) {
isAccountSpecific = false;
}
} }
boolean onlyReady = (isoFilterObj == TemplateFilter.featured) || ListResponse<TemplateResponse> response = _responseGenerator.createIsoResponse(isoZonePairSet, isAdmin, account);
(isoFilterObj == TemplateFilter.selfexecutable) ||
(isoFilterObj == TemplateFilter.sharedexecutable) ||
(isoFilterObj == TemplateFilter.executable && isAccountSpecific) ||
(isoFilterObj == TemplateFilter.community);
ListResponse<TemplateResponse> response = _responseGenerator.createIsoResponse(isos, zoneId, onlyReady, isAdmin, account);
response.setResponseName(getName()); response.setResponseName(getName());
this.setResponseObject(response); this.setResponseObject(response);
} }

View File

@ -20,6 +20,7 @@ package com.cloud.api.commands;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -35,6 +36,7 @@ import com.cloud.template.VirtualMachineTemplate;
import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.UserContext; import com.cloud.user.UserContext;
import com.cloud.utils.Pair;
@Implementation(description="List all public, private, and privileged templates.", responseObject=TemplateResponse.class) @Implementation(description="List all public, private, and privileged templates.", responseObject=TemplateResponse.class)
public class ListTemplatesCmd extends BaseListCmd { public class ListTemplatesCmd extends BaseListCmd {
@ -118,35 +120,19 @@ public class ListTemplatesCmd extends BaseListCmd {
@Override @Override
public void execute(){ public void execute(){
List<? extends VirtualMachineTemplate> templates = _mgr.listTemplates(this); Set<Pair<Long, Long>> templateZonePairSet = _mgr.listTemplates(this);
TemplateFilter templateFilterObj;
try {
templateFilterObj = TemplateFilter.valueOf(templateFilter);
} catch (IllegalArgumentException e) {
// how did we get this far? The request should've been rejected already before the response stage...
templateFilterObj = TemplateFilter.selfexecutable;
}
boolean isAdmin = false; boolean isAdmin = false;
boolean isAccountSpecific = true;
Account account = UserContext.current().getAccount(); Account account = UserContext.current().getAccount();
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) { if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) {
isAdmin = true; isAdmin = true;
if ((accountName == null) || (domainId == null)) {
isAccountSpecific = false;
}
} }
boolean showDomr = (templateFilterObj != TemplateFilter.selfexecutable);
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>(); ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> templateResponses = new ArrayList<TemplateResponse>(); List<TemplateResponse> templateResponses = new ArrayList<TemplateResponse>();
for (VirtualMachineTemplate template : templates) { for (Pair<Long, Long> template : templateZonePairSet) {
if (!showDomr && template.getTemplateType() == Storage.TemplateType.SYSTEM) { _responseGenerator.createTemplateResponse(templateResponses, template, isAdmin, account);
continue;
}
_responseGenerator.createTemplateResponse(templateResponses, template, zoneId, isAdmin, account);
} }
response.setResponses(templateResponses); response.setResponses(templateResponses);

View File

@ -21,6 +21,7 @@ import java.net.URISyntaxException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import com.cloud.alert.Alert; import com.cloud.alert.Alert;
import com.cloud.api.ServerApiException; import com.cloud.api.ServerApiException;
@ -101,6 +102,7 @@ import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.UserAccount; import com.cloud.user.UserAccount;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroup;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@ -309,14 +311,14 @@ public interface ManagementService {
* @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters. * @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters.
* @return list of ISOs * @return list of ISOs
*/ */
List<? extends VirtualMachineTemplate> listIsos(ListIsosCmd cmd); Set<Pair<Long, Long>> listIsos(ListIsosCmd cmd);
/** /**
* List templates that match the specified criteria. * List templates that match the specified criteria.
* @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters. * @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters.
* @return list of ISOs * @return list of ISOs
*/ */
List<? extends VirtualMachineTemplate> listTemplates(ListTemplatesCmd cmd); Set<Pair<Long, Long>> listTemplates(ListTemplatesCmd cmd);
/** /**
* Search for disk offerings based on search criteria * Search for disk offerings based on search criteria

View File

@ -139,6 +139,7 @@ import com.cloud.user.UserContext;
import com.cloud.user.UserStatisticsVO; import com.cloud.user.UserStatisticsVO;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NetUtils;
import com.cloud.utils.Pair;
import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroup;
import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.InstanceGroupVO;
@ -1492,9 +1493,10 @@ public class ApiResponseHelper implements ResponseGenerator {
} }
@Override @Override
public void createTemplateResponse(List<TemplateResponse> responses, VirtualMachineTemplate template, Long zoneId, boolean isAdmin, Account account) { public void createTemplateResponse(List<TemplateResponse> responses, Pair<Long,Long> templateZonePair, boolean isAdmin, Account account) {
List<VMTemplateHostVO> templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(template.getId(), zoneId); List<VMTemplateHostVO> templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(templateZonePair.first(), templateZonePair.second());
VMTemplateVO template = ApiDBUtils.findTemplateById(templateZonePair.first());
for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) { for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) {
TemplateResponse templateResponse = new TemplateResponse(); TemplateResponse templateResponse = new TemplateResponse();
@ -2009,11 +2011,13 @@ public class ApiResponseHelper implements ResponseGenerator {
} }
@Override @Override
public ListResponse<TemplateResponse> createIsoResponse(List<? extends VirtualMachineTemplate> isos, Long zoneId, boolean onlyReady, boolean isAdmin, Account account) { public ListResponse<TemplateResponse> createIsoResponse(Set<Pair<Long,Long>> isoZonePairSet, boolean isAdmin, Account account) {
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>(); ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>(); List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>();
for (VirtualMachineTemplate iso : isos) {
for (Pair<Long,Long> isoZonePair : isoZonePairSet) {
VMTemplateVO iso = ApiDBUtils.findTemplateById(isoZonePair.first());
if ( iso.getTemplateType() == TemplateType.PERHOST ) { if ( iso.getTemplateType() == TemplateType.PERHOST ) {
TemplateResponse isoResponse = new TemplateResponse(); TemplateResponse isoResponse = new TemplateResponse();
isoResponse.setId(iso.getId()); isoResponse.setId(iso.getId());
@ -2031,12 +2035,8 @@ public class ApiResponseHelper implements ResponseGenerator {
continue; continue;
} }
List<VMTemplateHostVO> isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), zoneId); List<VMTemplateHostVO> isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), isoZonePair.second());
for (VMTemplateHostVO isoHost : isoHosts) { for (VMTemplateHostVO isoHost : isoHosts) {
if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) {
continue;
}
TemplateResponse isoResponse = new TemplateResponse(); TemplateResponse isoResponse = new TemplateResponse();
isoResponse.setId(iso.getId()); isoResponse.setId(iso.getId());
isoResponse.setName(iso.getName()); isoResponse.setName(iso.getName());

View File

@ -41,9 +41,11 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -1562,7 +1564,7 @@ public class ManagementServerImpl implements ManagementServer {
} }
@Override @Override
public List<VMTemplateVO> listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { public Set<Pair<Long, Long>> listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException {
TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter()); TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter());
Long accountId = null; Long accountId = null;
Account account = UserContext.current().getAccount(); Account account = UserContext.current().getAccount();
@ -1598,7 +1600,7 @@ public class ManagementServerImpl implements ManagementServer {
} }
@Override @Override
public List<VMTemplateVO> listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { public Set<Pair<Long, Long>> listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException {
TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter()); TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter());
Long accountId = null; Long accountId = null;
Account account = UserContext.current().getAccount(); Account account = UserContext.current().getAccount();
@ -1634,7 +1636,7 @@ public class ManagementServerImpl implements ManagementServer {
return listTemplates(cmd.getId(), cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, accountId, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, isAccountSpecific, showDomr); return listTemplates(cmd.getId(), cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, accountId, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, isAccountSpecific, showDomr);
} }
private List<VMTemplateVO> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean isAccountSpecific, boolean showDomr) throws InvalidParameterValueException { private Set<Pair<Long, Long>> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean isAccountSpecific, boolean showDomr) throws InvalidParameterValueException {
VMTemplateVO template = null; VMTemplateVO template = null;
if (templateId != null) { if (templateId != null) {
template = _templateDao.findById(templateId); template = _templateDao.findById(templateId);
@ -1667,16 +1669,15 @@ public class ManagementServerImpl implements ManagementServer {
domain = _domainDao.findById(DomainVO.ROOT_DOMAIN); domain = _domainDao.findById(DomainVO.ROOT_DOMAIN);
} }
List<VMTemplateVO> templates = new ArrayList<VMTemplateVO>(); Set<Pair<Long, Long>> templateZonePairSet = new HashSet<Pair<Long,Long>>();
if (template == null) { if (template == null) {
templates = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, bootable, account, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr); templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, bootable, account, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr);
} else { } else {
templates = new ArrayList<VMTemplateVO>(); templateZonePairSet.add(new Pair<Long,Long>(template.getId(), zoneId));
templates.add(template);
} }
return templates; return templateZonePairSet;
} }
@Override @Override

View File

@ -19,12 +19,14 @@
package com.cloud.storage.dao; package com.cloud.storage.dao;
import java.util.List; import java.util.List;
import java.util.Set;
import com.cloud.domain.DomainVO; import com.cloud.domain.DomainVO;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.Pair;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
/* /*
@ -56,7 +58,7 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long> {
public List<VMTemplateVO> findIsosByIdAndPath(Long domainId, Long accountId, String path); public List<VMTemplateVO> findIsosByIdAndPath(Long domainId, Long accountId, String path);
public List<VMTemplateVO> listReadyTemplates(); public List<VMTemplateVO> listReadyTemplates();
public List<VMTemplateVO> listByAccountId(long accountId); public List<VMTemplateVO> listByAccountId(long accountId);
public List<VMTemplateVO> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, public Set<Pair<Long, Long>> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable,
Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr); Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr);
public long addTemplateToZone(VMTemplateVO tmplt, long zoneId); public long addTemplateToZone(VMTemplateVO tmplt, long zoneId);

View File

@ -23,8 +23,11 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import javax.ejb.Local; import javax.ejb.Local;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
@ -41,6 +44,7 @@ import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericDaoBase;
@ -61,6 +65,12 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
private final String SELECT_ALL = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + private final String SELECT_ALL = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " +
"t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t";
private final String SELECT_TEMPLATE_HOST_REF = "SELECT t.id, h.data_center_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " +
"t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t";
private final String SELECT_TEMPLATE_ZONE_REF = "SELECT t.id, tzr.zone_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " +
"t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t INNER JOIN template_zone_ref tzr on (t.id = tzr.template_id) ";
protected SearchBuilder<VMTemplateVO> TemplateNameSearch; protected SearchBuilder<VMTemplateVO> TemplateNameSearch;
protected SearchBuilder<VMTemplateVO> UniqueNameSearch; protected SearchBuilder<VMTemplateVO> UniqueNameSearch;
@ -113,6 +123,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
SearchCriteria<VMTemplateVO> sc = PublicIsoSearch.create(); SearchCriteria<VMTemplateVO> sc = PublicIsoSearch.create();
sc.setParameters("public", 1); sc.setParameters("public", 1);
sc.setParameters("format", "ISO"); sc.setParameters("format", "ISO");
sc.setParameters("type", TemplateType.PERHOST.toString());
return listBy(sc); return listBy(sc);
} }
@ -200,6 +211,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
PublicIsoSearch = createSearchBuilder(); PublicIsoSearch = createSearchBuilder();
PublicIsoSearch.and("public", PublicIsoSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); PublicIsoSearch.and("public", PublicIsoSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ);
PublicIsoSearch.and("format", PublicIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ); PublicIsoSearch.and("format", PublicIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ);
PublicIsoSearch.and("type", PublicIsoSearch.entity().getTemplateType(), SearchCriteria.Op.EQ);
tmpltTypeHyperSearch = createSearchBuilder(); tmpltTypeHyperSearch = createSearchBuilder();
tmpltTypeHyperSearch.and("templateType", tmpltTypeHyperSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); tmpltTypeHyperSearch.and("templateType", tmpltTypeHyperSearch.entity().getTemplateType(), SearchCriteria.Op.EQ);
@ -234,12 +246,14 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
} }
@Override @Override
public List<VMTemplateVO> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady,boolean showDomr) { public Set<Pair<Long, Long>> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady,boolean showDomr) {
Transaction txn = Transaction.currentTxn(); Transaction txn = Transaction.currentTxn();
txn.start(); txn.start();
List<VMTemplateVO> templates = new ArrayList<VMTemplateVO>();
Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long, Long>>();
PreparedStatement pstmt = null; PreparedStatement pstmt = null;
ResultSet rs = null; ResultSet rs = null;
String sql = SELECT_TEMPLATE_ZONE_REF;
try { try {
short accountType; short accountType;
String accountId = null; String accountId = null;
@ -252,20 +266,16 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
String guestOSJoin = ""; String guestOSJoin = "";
StringBuilder templateHostRefJoin = new StringBuilder(); StringBuilder templateHostRefJoin = new StringBuilder();
String templateZoneRef = "";
if (isIso && !hyperType.equals(HypervisorType.None)) { if (isIso && !hyperType.equals(HypervisorType.None)) {
guestOSJoin = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "; guestOSJoin = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) ";
} }
if (onlyReady){ if (onlyReady){
templateHostRefJoin.append(" INNER JOIN template_host_ref thr on (t.id = thr.template_id) "); templateHostRefJoin.append(" INNER JOIN template_host_ref thr on (t.id = thr.template_id) INNER JOIN host h on (thr.host_id = h.id)");
if(zoneId != null){ sql = SELECT_TEMPLATE_HOST_REF;
templateHostRefJoin.append("INNER JOIN host h on (thr.host_id = h.id)");
}
}else if (zoneId != null){
templateZoneRef = " INNER JOIN template_zone_ref tzr on (t.id = tzr.template_id) ";
} }
String sql = SELECT_ALL + guestOSJoin + templateHostRefJoin + templateZoneRef; sql += guestOSJoin + templateHostRefJoin;
String whereClause = ""; String whereClause = "";
if (templateFilter == TemplateFilter.featured) { if (templateFilter == TemplateFilter.featured) {
@ -291,7 +301,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
} else if (templateFilter == TemplateFilter.all && accountType == Account.ACCOUNT_TYPE_ADMIN) { } else if (templateFilter == TemplateFilter.all && accountType == Account.ACCOUNT_TYPE_ADMIN) {
whereClause += " WHERE "; whereClause += " WHERE ";
} else if (accountType != Account.ACCOUNT_TYPE_ADMIN) { } else if (accountType != Account.ACCOUNT_TYPE_ADMIN) {
return templates; return templateZonePairList;
} }
if (whereClause.equals("")) { if (whereClause.equals("")) {
@ -300,25 +310,20 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
whereClause += " AND "; whereClause += " AND ";
} }
sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId, onlyReady, showDomr) + getOrderByLimit(pageSize, startIndex); sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId, onlyReady, showDomr, accountType) + getOrderByLimit(pageSize, startIndex);
pstmt = txn.prepareStatement(sql); pstmt = txn.prepareStatement(sql);
rs = pstmt.executeQuery(); rs = pstmt.executeQuery();
while (rs.next()) { while (rs.next()) {
VMTemplateVO tmplt = toEntityBean(rs, false); Pair<Long, Long> templateZonePair = new Pair<Long, Long>(rs.getLong(1), rs.getLong(2));
if (zoneId != null) { templateZonePairList.add(templateZonePair);
VMTemplateZoneVO vtzvo = _templateZoneDao.findByZoneTemplate(zoneId, tmplt.getId());
if (vtzvo != null){
templates.add(tmplt);
}
} else {
templates.add(tmplt);
}
} }
if(isIso && (account.getType() == Account.ACCOUNT_TYPE_NORMAL)){ if(isIso && templateZonePairList.size() < pageSize && templateFilter != TemplateFilter.community){
List<VMTemplateVO> publicIsos = publicIsoSearch(); List<VMTemplateVO> publicIsos = publicIsoSearch();
templates.addAll(publicIsos); for( int i=0; i < publicIsos.size(); i++){
templateZonePairList.add(new Pair<Long,Long>(publicIsos.get(i).getId(), null));
}
} }
} catch (Exception e) { } catch (Exception e) {
s_logger.warn("Error listing templates", e); s_logger.warn("Error listing templates", e);
@ -336,10 +341,10 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
} }
} }
return templates; return templateZonePairList;
} }
private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr) { private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr, short accountType) {
String sql = ""; String sql = "";
if (keyword != null) { if (keyword != null) {
sql += " t.name LIKE \"%" + keyword + "%\" AND"; sql += " t.name LIKE \"%" + keyword + "%\" AND";
@ -348,7 +353,10 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
} }
if (isIso) { if (isIso) {
sql += " t.format = 'ISO'"; sql += " t.format = 'ISO'";
if (accountType == Account.ACCOUNT_TYPE_NORMAL){
sql += " AND t.public = 1 ";
}
if (!hyperType.equals(HypervisorType.None)) { if (!hyperType.equals(HypervisorType.None)) {
sql += " AND goh.hypervisor_type = '" + hyperType.toString() + "'"; sql += " AND goh.hypervisor_type = '" + hyperType.toString() + "'";
} }
@ -372,7 +380,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
sql += " AND tzr.zone_id = " +zoneId; sql += " AND tzr.zone_id = " +zoneId;
} }
if (!showDomr){ if (!showDomr){
sql += " AND t.type = '" +Storage.TemplateType.SYSTEM.toString() + "'"; sql += " AND t.type != '" +Storage.TemplateType.SYSTEM.toString() + "'";
} }
sql += " AND t.removed IS NULL"; sql += " AND t.removed IS NULL";