diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index 96374f920a9..3e755f8d014 100644 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -156,13 +156,10 @@ public interface ResponseGenerator { VirtualMachineTemplate findTemplateById(Long templateId); - void createTemplateResponse(List responses, Pair templateZonePair, boolean isAdmin, - Account account, boolean readyOnly); - - ListResponse createTemplateResponse2(VirtualMachineTemplate template, Long zoneId); - - ListResponse createIsoResponses(VirtualMachineTemplate template, Long zoneId); + List createTemplateResponses(long templateId, long zoneId, boolean readyOnly); + List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly); + ListResponse createSecurityGroupResponses(List networkGroups); SecurityGroupResponse createSecurityGroupResponseFromIngressRule(List ingressRules); @@ -171,20 +168,12 @@ public interface ResponseGenerator { ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode); - TemplateResponse createTemplateResponse(VirtualMachineTemplate template, Long destZoneId); - - TemplateResponse createIsoResponse3(VirtualMachineTemplate iso, Long destZoneId); - String toSerializedString(CreateCmdResponse response, String responseType); AsyncJobResponse createAsyncJobResponse(AsyncJob job); - TemplateResponse createTemplateResponse(VirtualMachineTemplate template, Long snapshotId, Long volumeId); - EventResponse createEventResponse(Event event); - ListResponse createIsoResponse(Set> isoZonePairSet, boolean onlyReady, Account account, Boolean isBootable, boolean readyOnly); - TemplateResponse createIsoResponse(VirtualMachineTemplate result); List createCapacityResponse(List result, DecimalFormat format); @@ -203,4 +192,6 @@ public interface ResponseGenerator { Long getSecurityGroupId(String groupName, long accountId); + List createIsoResponses(long isoId, long zoneId, boolean readyOnly); + } diff --git a/api/src/com/cloud/api/commands/CopyTemplateCmd.java b/api/src/com/cloud/api/commands/CopyTemplateCmd.java index e9b29fdaf81..58944b248a6 100755 --- a/api/src/com/cloud/api/commands/CopyTemplateCmd.java +++ b/api/src/com/cloud/api/commands/CopyTemplateCmd.java @@ -18,6 +18,8 @@ package com.cloud.api.commands; +import java.util.List; + import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; @@ -26,6 +28,7 @@ import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.response.ListResponse; import com.cloud.api.response.TemplateResponse; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; @@ -115,10 +118,16 @@ public class CopyTemplateCmd extends BaseAsyncCmd { public void execute() throws ResourceAllocationException{ try { VirtualMachineTemplate template = _templateService.copyTemplate(this); - TemplateResponse templateResponse = _responseGenerator.createTemplateResponse(template, destZoneId); - templateResponse.setResponseName(getCommandName()); - this.setResponseObject(templateResponse); + if (template != null){ + ListResponse response = new ListResponse(); + List templateResponses = _responseGenerator.createTemplateResponses(template.getId(), getDestinationZoneId(), false); + response.setResponses(templateResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to copy template"); + } } catch (StorageUnavailableException ex) { s_logger.warn("Exception: ", ex); throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); diff --git a/api/src/com/cloud/api/commands/CreateTemplateCmd.java b/api/src/com/cloud/api/commands/CreateTemplateCmd.java index 8fef0309694..e79e6bf183a 100755 --- a/api/src/com/cloud/api/commands/CreateTemplateCmd.java +++ b/api/src/com/cloud/api/commands/CreateTemplateCmd.java @@ -18,6 +18,8 @@ package com.cloud.api.commands; +import java.util.List; + import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; @@ -26,6 +28,7 @@ import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.response.ListResponse; import com.cloud.api.response.StoragePoolResponse; import com.cloud.api.response.TemplateResponse; import com.cloud.async.AsyncJob; @@ -183,12 +186,15 @@ public class CreateTemplateCmd extends BaseAsyncCreateCmd { @Override public void execute() { VirtualMachineTemplate template = _userVmService.createPrivateTemplate(this); - if (template != null) { - TemplateResponse response = _responseGenerator.createTemplateResponse(template, snapshotId, volumeId); - response.setResponseName(getCommandName()); + if (template != null){ + ListResponse response = new ListResponse(); + List templateResponses = _responseGenerator.createTemplateResponses(template.getId(), snapshotId, volumeId, false); + response.setResponses(templateResponses); + response.setResponseName(getCommandName()); this.setResponseObject(response); } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create template"); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create private template"); } + } } diff --git a/api/src/com/cloud/api/commands/ListIsosCmd.java b/api/src/com/cloud/api/commands/ListIsosCmd.java index d9b88550067..bc18394a422 100755 --- a/api/src/com/cloud/api/commands/ListIsosCmd.java +++ b/api/src/com/cloud/api/commands/ListIsosCmd.java @@ -18,6 +18,7 @@ package com.cloud.api.commands; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -126,8 +127,6 @@ public class ListIsosCmd extends BaseListCmd { } public boolean listInReadyState() { - return true; -/* Account account = UserContext.current().getCaller(); // It is account specific if account is admin type and domainId and accountName are not null boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null); @@ -136,7 +135,6 @@ public class ListIsosCmd extends BaseListCmd { boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable) || (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community); return onlyReady; -*/ } ///////////////////////////////////////////////////// @@ -155,27 +153,15 @@ public class ListIsosCmd extends BaseListCmd { @Override public void execute(){ Set> isoZonePairSet = _mgr.listIsos(this); - TemplateFilter isoFilterObj = null; + ListResponse response = new ListResponse(); + List templateResponses = new ArrayList(); - try { - if (isoFilter == null) { - isoFilterObj = TemplateFilter.selfexecutable; - } else { - isoFilterObj = TemplateFilter.valueOf(isoFilter); - } - } catch (IllegalArgumentException e) { - // how did we get this far? The request should've been rejected already before the response stage... - isoFilterObj = TemplateFilter.selfexecutable; + for (Pair iso : isoZonePairSet) { + List responses = new ArrayList(); + responses = _responseGenerator.createIsoResponses(iso.first(), iso.second(), listInReadyState()); + templateResponses.addAll(responses); } - - boolean isAdmin = false; - Account account = UserContext.current().getCaller(); - if ((account == null) || BaseCmd.isAdmin(account.getType())) { - isAdmin = true; - } - - ListResponse response = _responseGenerator.createIsoResponse(isoZonePairSet, isAdmin, account, bootable, listInReadyState()); + response.setResponses(templateResponses); response.setResponseName(getCommandName()); - this.setResponseObject(response); } } diff --git a/api/src/com/cloud/api/commands/ListTemplatesCmd.java b/api/src/com/cloud/api/commands/ListTemplatesCmd.java index dc0c875abea..39410c34e8b 100755 --- a/api/src/com/cloud/api/commands/ListTemplatesCmd.java +++ b/api/src/com/cloud/api/commands/ListTemplatesCmd.java @@ -107,8 +107,7 @@ public class ListTemplatesCmd extends BaseListCmd { } public boolean listInReadyState() { - return true; -/* + Account account = UserContext.current().getCaller(); // It is account specific if account is admin type and domainId and accountName are not null boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null); @@ -117,7 +116,6 @@ public class ListTemplatesCmd extends BaseListCmd { boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable) || (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community); return onlyReady; -*/ } ///////////////////////////////////////////////////// @@ -136,18 +134,14 @@ public class ListTemplatesCmd extends BaseListCmd { @Override public void execute(){ Set> templateZonePairSet = _mgr.listTemplates(this); - - boolean isAdmin = false; - Account account = UserContext.current().getCaller(); - if ((account == null) || BaseCmd.isAdmin(account.getType())) { - isAdmin = true; - } ListResponse response = new ListResponse(); List templateResponses = new ArrayList(); for (Pair template : templateZonePairSet) { - _responseGenerator.createTemplateResponse(templateResponses, template, isAdmin, account, listInReadyState()); + List responses = new ArrayList(); + responses = _responseGenerator.createTemplateResponses(template.first(), template.second(), listInReadyState()); + templateResponses.addAll(responses); } response.setResponses(templateResponses); diff --git a/api/src/com/cloud/api/commands/RegisterIsoCmd.java b/api/src/com/cloud/api/commands/RegisterIsoCmd.java index 2c30246878d..7aef022aa41 100755 --- a/api/src/com/cloud/api/commands/RegisterIsoCmd.java +++ b/api/src/com/cloud/api/commands/RegisterIsoCmd.java @@ -17,6 +17,8 @@ */ package com.cloud.api.commands; +import java.util.List; + import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; @@ -153,9 +155,11 @@ public class RegisterIsoCmd extends BaseCmd { @Override public void execute() throws ResourceAllocationException{ VirtualMachineTemplate template = _templateService.registerIso(this); - if (template != null) { - ListResponse response = _responseGenerator.createIsoResponses(template, zoneId); - response.setResponseName(getCommandName()); + if (template != null) { + ListResponse response = new ListResponse(); + List templateResponses = _responseGenerator.createIsoResponses(template.getId(), zoneId, false); + response.setResponses(templateResponses); + response.setResponseName(getCommandName()); this.setResponseObject(response); } else { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to register iso"); diff --git a/api/src/com/cloud/api/commands/RegisterTemplateCmd.java b/api/src/com/cloud/api/commands/RegisterTemplateCmd.java index d59c5d2367a..dedcfe84d64 100755 --- a/api/src/com/cloud/api/commands/RegisterTemplateCmd.java +++ b/api/src/com/cloud/api/commands/RegisterTemplateCmd.java @@ -18,6 +18,8 @@ package com.cloud.api.commands; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; import org.apache.log4j.Logger; @@ -34,6 +36,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.UserContext; +import com.cloud.utils.Pair; @Implementation(description="Registers an existing template into the Cloud.com cloud. ", responseObject=TemplateResponse.class) public class RegisterTemplateCmd extends BaseCmd { @@ -196,9 +199,10 @@ public class RegisterTemplateCmd extends BaseCmd { try { VirtualMachineTemplate template = _templateService.registerTemplate(this); if (template != null){ - ListResponse response = _responseGenerator.createTemplateResponse2(template, zoneId); - response.setResponseName(getCommandName()); - + ListResponse response = new ListResponse(); + List templateResponses = _responseGenerator.createTemplateResponses(template.getId(), zoneId, false); + response.setResponses(templateResponses); + response.setResponseName(getCommandName()); this.setResponseObject(response); } else { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to register template"); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 0835638b510..e47f2d29a0c 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -425,13 +425,17 @@ public class ApiDBUtils { public static VMTemplateVO findTemplateById(Long templateId) { return _templateDao.findByIdIncludingRemoved(templateId); } - + public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId) { + return findTemplateHostRef(templateId, zoneId, false); + } + + public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId, boolean readyOnly) { VMTemplateVO vmTemplate = findTemplateById(templateId); if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) { return _templateHostDao.listByTemplateId(templateId).get(0); } else { - return _storageMgr.getTemplateHostRef(zoneId, templateId); + return _storageMgr.getTemplateHostRef(zoneId, templateId, readyOnly); } } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 3029b891c2c..f182172a52a 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1447,225 +1447,209 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public void createTemplateResponse(List responses, Pair templateZonePair, boolean isAdmin, Account account, boolean readyOnly) { - List templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(templateZonePair.first(), templateZonePair.second(), readyOnly); - VMTemplateVO template = ApiDBUtils.findTemplateById(templateZonePair.first()); + public List createTemplateResponses(long templateId, long zoneId, boolean readyOnly) { + VirtualMachineTemplate template = findTemplateById(templateId); + List responses = new ArrayList(); + VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(templateId, zoneId, readyOnly); + if (templateHostRef == null) { + return responses; + } - for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) { - - if (readyOnly) { - if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { - continue; - } - boolean foundTheSameTemplate = false; - for (TemplateResponse res : responses) { - if (res.getId() == templateHostRef.getTemplateId() && res.getZoneId() == templateZonePair.second()) { - foundTheSameTemplate = true; - continue; + HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId()); + if (host.getType() == Host.Type.LocalSecondaryStorage && host.getStatus() != com.cloud.host.Status.Up) { + return responses; + } + + TemplateResponse templateResponse = new TemplateResponse(); + templateResponse.setId(template.getId()); + templateResponse.setName(template.getName()); + templateResponse.setDisplayText(template.getDisplayText()); + templateResponse.setPublic(template.isPublicTemplate()); + templateResponse.setCreated(templateHostRef.getCreated()); + + templateResponse.setReady(templateHostRef.getDownloadState() == Status.DOWNLOADED); + templateResponse.setFeatured(template.isFeatured()); + templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); + templateResponse.setPasswordEnabled(template.getEnablePassword()); + templateResponse.setCrossZones(template.isCrossZones()); + templateResponse.setFormat(template.getFormat()); + if (template.getTemplateType() != null) { + templateResponse.setTemplateType(template.getTemplateType().toString()); + } + templateResponse.setHypervisor(template.getHypervisorType().toString()); + + GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); + if (os != null) { + templateResponse.setOsTypeId(os.getId()); + templateResponse.setOsTypeName(os.getDisplayName()); + } else { + templateResponse.setOsTypeId(-1L); + templateResponse.setOsTypeName(""); + } + + // add account ID and name + Account owner = ApiDBUtils.findAccountById(template.getAccountId()); + if (owner != null) { + templateResponse.setAccount(owner.getAccountName()); + templateResponse.setDomainId(owner.getDomainId()); + templateResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); + } + + + + DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId); + + // Add the zone ID + templateResponse.setZoneId(zoneId); + templateResponse.setZoneName(datacenter.getName()); + + Account account = UserContext.current().getCaller(); + boolean isAdmin = false; + if ((account == null) || BaseCmd.isAdmin(account.getType())) { + isAdmin = true; + } + + // If the user is an Admin, add the template download status + if (isAdmin || account.getId() == template.getAccountId()) { + // add download status + if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { + String templateStatus = "Processing"; + if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (templateHostRef.getDownloadPercent() == 100) { + templateStatus = "Installing Template"; + } else { + templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; } + } else { + templateStatus = templateHostRef.getErrorString(); } - if (foundTheSameTemplate) { - continue; - } - } - - HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId()); - if (host.getType() == Host.Type.LocalSecondaryStorage && host.getStatus() != com.cloud.host.Status.Up) { - continue; - } - - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getId()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setCreated(templateHostRef.getCreated()); - - templateResponse.setReady(templateHostRef.getDownloadState() == Status.DOWNLOADED); - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setCrossZones(template.isCrossZones()); - templateResponse.setFormat(template.getFormat()); - if (template.getTemplateType() != null) { - templateResponse.setTemplateType(template.getTemplateType().toString()); - } - templateResponse.setHypervisor(template.getHypervisorType().toString()); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getId()); - templateResponse.setOsTypeName(os.getDisplayName()); + templateResponse.setStatus(templateStatus); + } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + templateResponse.setStatus("Download Complete"); } else { - templateResponse.setOsTypeId(-1L); - templateResponse.setOsTypeName(""); + templateResponse.setStatus("Successfully Installed"); } + } - // add account ID and name - Account owner = ApiDBUtils.findAccountById(template.getAccountId()); + Long templateSize = templateHostRef.getSize(); + if (templateSize > 0) { + templateResponse.setSize(templateSize); + } + + templateResponse.setChecksum(template.getChecksum()); + templateResponse.setSourceTemplateId(template.getSourceTemplateId()); + + templateResponse.setChecksum(template.getChecksum()); + + templateResponse.setObjectName("template"); + responses.add(templateResponse); + return responses; + } + + + @Override + public List createIsoResponses(long isoId, long zoneId, boolean readyOnly) { + VirtualMachineTemplate iso = findTemplateById(isoId); + List isoResponses = new ArrayList(); + if ( iso.getTemplateType() == TemplateType.PERHOST) { + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getId()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setReady(true); + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setCreated(iso.getCreated()); + isoResponse.setPasswordEnabled(false); + Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); if (owner != null) { - templateResponse.setAccount(owner.getAccountName()); - templateResponse.setDomainId(owner.getDomainId()); - templateResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); + isoResponse.setAccount(owner.getAccountName()); + isoResponse.setDomainId(owner.getDomainId()); + isoResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); } + isoResponse.setObjectName("iso"); + isoResponses.add(isoResponse); - templateResponse.setHostId(host.getId()); - templateResponse.setHostName(host.getName()); - - DataCenterVO datacenter = ApiDBUtils.findZoneById(host.getDataCenterId()); - + } else { + + VMTemplateHostVO isoHost = ApiDBUtils.findTemplateHostRef(isoId, zoneId, readyOnly); + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getId()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setCreated(isoHost.getCreated()); + isoResponse.setReady(isoHost.getDownloadState() == Status.DOWNLOADED); + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + + // TODO: implement + GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); + if (os != null) { + isoResponse.setOsTypeId(os.getId()); + isoResponse.setOsTypeName(os.getDisplayName()); + } else { + isoResponse.setOsTypeId(-1L); + isoResponse.setOsTypeName(""); + } + + // add account ID and name + Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); + if (owner != null) { + isoResponse.setAccount(owner.getAccountName()); + isoResponse.setDomainId(owner.getDomainId()); + // TODO: implement + isoResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); + } + + Account account = UserContext.current().getCaller(); + boolean isAdmin = false; + if ((account == null) || BaseCmd.isAdmin(account.getType())) { + isAdmin = true; + } // Add the zone ID - templateResponse.setZoneId(host.getDataCenterId()); - templateResponse.setZoneName(datacenter.getName()); - + DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId); + isoResponse.setZoneId(zoneId); + isoResponse.setZoneName(datacenter.getName()); + // If the user is an admin, add the template download status - if (isAdmin || account.getId() == template.getAccountId()) { + if (isAdmin || account.getId() == iso.getAccountId()) { // add download status - if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { - String templateStatus = "Processing"; - if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (templateHostRef.getDownloadPercent() == 100) { - templateStatus = "Installing Template"; + if (isoHost.getDownloadState() != Status.DOWNLOADED) { + String isoStatus = "Processing"; + if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + isoStatus = "Download Complete"; + } else if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (isoHost.getDownloadPercent() == 100) { + isoStatus = "Installing ISO"; } else { - templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; + isoStatus = isoHost.getDownloadPercent() + "% Downloaded"; } } else { - templateStatus = templateHostRef.getErrorString(); + isoStatus = isoHost.getErrorString(); } - templateResponse.setStatus(templateStatus); - } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - templateResponse.setStatus("Download Complete"); + isoResponse.setStatus(isoStatus); } else { - templateResponse.setStatus("Successfully Installed"); + isoResponse.setStatus("Successfully Installed"); } } - - Long templateSize = templateHostRef.getSize(); - if (templateSize > 0) { - templateResponse.setSize(templateSize); + + Long isoSize = isoHost.getSize(); + if (isoSize > 0) { + isoResponse.setSize(isoSize); } - - templateResponse.setChecksum(template.getChecksum()); - templateResponse.setSourceTemplateId(template.getSourceTemplateId()); - - templateResponse.setChecksum(template.getChecksum()); - - templateResponse.setObjectName("template"); - responses.add(templateResponse); + + isoResponse.setObjectName("iso"); + isoResponses.add(isoResponse); } - } - - @Override - public ListResponse createTemplateResponse2(VirtualMachineTemplate template, Long zoneId) { - ListResponse response = new ListResponse(); - List responses = new ArrayList(); - List zones = null; - - if ((zoneId != null) && (zoneId != -1)) { - zones = new ArrayList(); - zones.add(ApiDBUtils.findZoneById(zoneId)); - } else { - zones = ApiDBUtils.listZones(); - } - - for (DataCenterVO zone : zones) { - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getId()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setExtractable(template.isExtractable()); - templateResponse.setCrossZones(template.isCrossZones()); - - VMTemplateHostVO isoHostRef = ApiDBUtils.findTemplateHostRef(template.getId(), zone.getId()); - if (isoHostRef != null) { - templateResponse.setCreated(isoHostRef.getCreated()); - templateResponse.setReady(isoHostRef.getDownloadState() == Status.DOWNLOADED); - } - - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setFormat(template.getFormat()); - templateResponse.setStatus("Processing"); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getId()); - templateResponse.setOsTypeName(os.getDisplayName()); - } else { - templateResponse.setOsTypeId(-1L); - templateResponse.setOsTypeName(""); - } - - Account owner = ApiDBUtils.findAccountById(template.getAccountId()); - if (owner != null) { - templateResponse.setAccountId(owner.getId()); - templateResponse.setAccount(owner.getAccountName()); - templateResponse.setDomainId(owner.getDomainId()); - templateResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - - templateResponse.setZoneId(zone.getId()); - templateResponse.setZoneName(zone.getName()); - templateResponse.setHypervisor(template.getHypervisorType().toString()); - templateResponse.setObjectName("template"); - templateResponse.setChecksum(template.getChecksum()); - templateResponse.setSourceTemplateId(template.getSourceTemplateId()); - - responses.add(templateResponse); - } - response.setResponses(responses); - return response; - } - - @Override - public ListResponse createIsoResponses(VirtualMachineTemplate template, Long zoneId) { - ListResponse response = new ListResponse(); - List responses = new ArrayList(); - List zones = null; - - if ((zoneId != null) && (zoneId != -1)) { - zones = new ArrayList(); - zones.add(ApiDBUtils.findZoneById(zoneId)); - } else { - zones = ApiDBUtils.listZones(); - } - - for (DataCenterVO zone : zones) { - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getId()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - - VMTemplateHostVO isoHostRef = ApiDBUtils.findTemplateHostRef(template.getId(), zone.getId()); - if (isoHostRef != null) { - templateResponse.setCreated(isoHostRef.getCreated()); - templateResponse.setReady(isoHostRef.getDownloadState() == Status.DOWNLOADED); - } - - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setExtractable(template.isExtractable()); - templateResponse.setBootable(template.isBootable()); - templateResponse.setOsTypeId(template.getGuestOSId()); - templateResponse.setOsTypeName(ApiDBUtils.findGuestOSById(template.getGuestOSId()).getDisplayName()); - - Account owner = ApiDBUtils.findAccountById(template.getAccountId()); - if (owner != null) { - templateResponse.setAccountId(owner.getId()); - templateResponse.setAccount(owner.getAccountName()); - templateResponse.setDomainId(owner.getDomainId()); - templateResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - - templateResponse.setZoneId(zone.getId()); - templateResponse.setZoneName(zone.getName()); - templateResponse.setObjectName("iso"); - - responses.add(templateResponse); - } - response.setResponses(responses); - return response; + return isoResponses; } @Override @@ -1757,154 +1741,6 @@ public class ApiResponseHelper implements ResponseGenerator { } - @Override - public TemplateResponse createTemplateResponse(VirtualMachineTemplate template, Long destZoneId) { - TemplateResponse templateResponse = new TemplateResponse(); - if (template != null) { - templateResponse.setId(template.getId()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setBootable(template.isBootable()); - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setCrossZones(template.isCrossZones()); - templateResponse.setCreated(template.getCreated()); - templateResponse.setFormat(template.getFormat()); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setZoneId(destZoneId); - templateResponse.setZoneName(ApiDBUtils.findZoneById(destZoneId).getName()); - templateResponse.setSourceTemplateId(template.getSourceTemplateId()); - templateResponse.setChecksum(template.getChecksum()); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getId()); - templateResponse.setOsTypeName(os.getDisplayName()); - } else { - templateResponse.setOsTypeId(-1L); - templateResponse.setOsTypeName(""); - } - - // add account ID and name - Account owner = ApiDBUtils.findAccountById(template.getAccountId()); - if (owner != null) { - templateResponse.setAccount(owner.getAccountName()); - templateResponse.setDomainId(owner.getDomainId()); - templateResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - - // set status - Account account = UserContext.current().getCaller(); - boolean isAdmin = false; - if ((account == null) || BaseCmd.isAdmin(account.getType())) { - isAdmin = true; - } - - // Return download status for admin users - VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(template.getId(), destZoneId); - - if (isAdmin || template.getAccountId() == account.getId()) { - if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { - String templateStatus = "Processing"; - if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (templateHostRef.getDownloadPercent() == 100) { - templateStatus = "Installing Template"; - } else { - templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; - } - } else { - templateStatus = templateHostRef.getErrorString(); - } - templateResponse.setStatus(templateStatus); - } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - templateResponse.setStatus("Download Complete"); - } else { - templateResponse.setStatus("Successfully Installed"); - } - } - - templateResponse.setReady(templateHostRef != null && templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED); - - } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to copy template"); - } - - templateResponse.setObjectName("template"); - return templateResponse; - } - - @Override - public TemplateResponse createIsoResponse3(VirtualMachineTemplate iso, Long destZoneId) { - TemplateResponse isoResponse = new TemplateResponse(); - if (iso != null) { - isoResponse.setId(iso.getId()); - isoResponse.setName(iso.getName()); - isoResponse.setDisplayText(iso.getDisplayText()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setBootable(iso.isBootable()); - isoResponse.setFeatured(iso.isFeatured()); - isoResponse.setCrossZones(iso.isCrossZones()); - isoResponse.setCreated(iso.getCreated()); - isoResponse.setZoneId(destZoneId); - isoResponse.setZoneName(ApiDBUtils.findZoneById(destZoneId).getName()); - - GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); - if (os != null) { - isoResponse.setOsTypeId(os.getId()); - isoResponse.setOsTypeName(os.getDisplayName()); - } else { - isoResponse.setOsTypeId(-1L); - isoResponse.setOsTypeName(""); - } - - // add account ID and name - Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); - if (owner != null) { - isoResponse.setAccount(owner.getAccountName()); - isoResponse.setDomainId(owner.getDomainId()); - isoResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - - // set status - Account account = UserContext.current().getCaller(); - boolean isAdmin = false; - if ((account == null) || BaseCmd.isAdmin(account.getType())) { - isAdmin = true; - } - - // Return download status for admin users - VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(iso.getId(), destZoneId); - - if (isAdmin || iso.getAccountId() == account.getId()) { - if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { - String templateStatus = "Processing"; - if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (templateHostRef.getDownloadPercent() == 100) { - templateStatus = "Installing Template"; - } else { - templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; - } - } else { - templateStatus = templateHostRef.getErrorString(); - } - isoResponse.setStatus(templateStatus); - } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - isoResponse.setStatus("Download Complete"); - } else { - isoResponse.setStatus("Successfully Installed"); - } - } - - isoResponse.setReady(templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED); - - } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to copy iso"); - } - - isoResponse.setObjectName("iso"); - return isoResponse; - } - @Override public String toSerializedString(CreateCmdResponse response, String responseType) { return ApiResponseSerializer.toSerializedString(response, responseType); @@ -1933,16 +1769,8 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public TemplateResponse createTemplateResponse(VirtualMachineTemplate template, Long snapshotId, Long volumeId) { - TemplateResponse response = new TemplateResponse(); - response.setId(template.getId()); - response.setName(template.getName()); - response.setDisplayText(template.getDisplayText()); - response.setPublic(template.isPublicTemplate()); - response.setPasswordEnabled(template.getEnablePassword()); - response.setCrossZones(template.isCrossZones()); - response.setChecksum(template.getChecksum()); - + public List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly) { + Long zoneId = null; VolumeVO volume = null; if (snapshotId != null) { Snapshot snapshot = ApiDBUtils.findSnapshotById(snapshotId); @@ -1950,38 +1778,7 @@ public class ApiResponseHelper implements ResponseGenerator { } else { volume = findVolumeById(volumeId); } - - VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(template.getId(), volume.getDataCenterId()); - response.setCreated(templateHostRef.getCreated()); - response.setReady(templateHostRef != null && templateHostRef.getDownloadState() == Status.DOWNLOADED); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - response.setOsTypeId(os.getId()); - response.setOsTypeName(os.getDisplayName()); - } else { - response.setOsTypeId(-1L); - response.setOsTypeName(""); - } - - Account owner = ApiDBUtils.findAccountById(template.getAccountId()); - if (owner != null) { - response.setAccount(owner.getAccountName()); - response.setDomainId(owner.getDomainId()); - response.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - - DataCenter zone = ApiDBUtils.findZoneById(volume.getDataCenterId()); - if (zone != null) { - response.setZoneId(zone.getId()); - response.setZoneName(zone.getName()); - } - - response.setSourceTemplateId(template.getSourceTemplateId()); - - response.setObjectName("template"); - return response; - + return createTemplateResponses(templateId, volume.getDataCenterId(), readyOnly); } @Override @@ -2006,137 +1803,6 @@ public class ApiResponseHelper implements ResponseGenerator { return responseEvent; } - @Override - public ListResponse createIsoResponse(Set> isoZonePairSet, boolean isAdmin, Account account, Boolean isBootable, boolean readyOnly) { - - ListResponse response = new ListResponse(); - List isoResponses = new ArrayList(); - - for (Pair isoZonePair : isoZonePairSet) { - VMTemplateVO iso = ApiDBUtils.findTemplateById(isoZonePair.first()); - if ((isBootable == null || !isBootable) && iso.getTemplateType() == TemplateType.PERHOST) { - TemplateResponse isoResponse = new TemplateResponse(); - isoResponse.setId(iso.getId()); - isoResponse.setName(iso.getName()); - isoResponse.setDisplayText(iso.getDisplayText()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); - isoResponse.setReady(true); - isoResponse.setBootable(iso.isBootable()); - isoResponse.setFeatured(iso.isFeatured()); - isoResponse.setCrossZones(iso.isCrossZones()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setCreated(iso.getCreated()); - isoResponse.setPasswordEnabled(false); - Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); - if (owner != null) { - isoResponse.setAccount(owner.getAccountName()); - isoResponse.setDomainId(owner.getDomainId()); - isoResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - isoResponse.setObjectName("iso"); - isoResponses.add(isoResponse); - response.setResponses(isoResponses); - - if (isBootable != null && !isBootable) { - continue; // fetch only non-bootable isos and return (for now only xen tools iso) - } - } - - List isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), isoZonePair.second(), readyOnly); - for (VMTemplateHostVO isoHost : isoHosts) { - - if (readyOnly) { - if (isoHost.getDownloadState() != Status.DOWNLOADED) { - continue; - } - boolean foundTheSameTemplate = false; - for (TemplateResponse res : isoResponses) { - if (res.getId() == isoHost.getTemplateId() && res.getZoneId() == isoZonePair.second()) { - foundTheSameTemplate = true; - continue; - } - } - if (foundTheSameTemplate) { - continue; - } - } - - TemplateResponse isoResponse = new TemplateResponse(); - isoResponse.setId(iso.getId()); - isoResponse.setName(iso.getName()); - isoResponse.setDisplayText(iso.getDisplayText()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); - isoResponse.setCreated(isoHost.getCreated()); - isoResponse.setReady(isoHost.getDownloadState() == Status.DOWNLOADED); - isoResponse.setBootable(iso.isBootable()); - isoResponse.setFeatured(iso.isFeatured()); - isoResponse.setCrossZones(iso.isCrossZones()); - isoResponse.setPublic(iso.isPublicTemplate()); - - // TODO: implement - GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); - if (os != null) { - isoResponse.setOsTypeId(os.getId()); - isoResponse.setOsTypeName(os.getDisplayName()); - } else { - isoResponse.setOsTypeId(-1L); - isoResponse.setOsTypeName(""); - } - - // add account ID and name - Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); - if (owner != null) { - isoResponse.setAccount(owner.getAccountName()); - isoResponse.setDomainId(owner.getDomainId()); - // TODO: implement - isoResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); - } - - // Add the zone ID - // TODO: implement - HostVO host = ApiDBUtils.findHostById(isoHost.getHostId()); - DataCenterVO datacenter = ApiDBUtils.findZoneById(host.getDataCenterId()); - isoResponse.setZoneId(host.getDataCenterId()); - isoResponse.setZoneName(datacenter.getName()); - - // If the user is an admin, add the template download status - if (isAdmin || account.getId() == iso.getAccountId()) { - // add download status - if (isoHost.getDownloadState() != Status.DOWNLOADED) { - String isoStatus = "Processing"; - if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - isoStatus = "Download Complete"; - } else if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (isoHost.getDownloadPercent() == 100) { - isoStatus = "Installing ISO"; - } else { - isoStatus = isoHost.getDownloadPercent() + "% Downloaded"; - } - } else { - isoStatus = isoHost.getErrorString(); - } - isoResponse.setStatus(isoStatus); - } else { - isoResponse.setStatus("Successfully Installed"); - } - } - - Long isoSize = isoHost.getSize(); - if (isoSize > 0) { - isoResponse.setSize(isoSize); - } - - isoResponse.setObjectName("iso"); - isoResponses.add(isoResponse); - } - } - - response.setResponses(isoResponses); - - return response; - } private List sumCapacities(List hostCapacities) { Map totalCapacityMap = new HashMap(); diff --git a/server/src/com/cloud/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java index 311b23bfdac..edaefc65e61 100644 --- a/server/src/com/cloud/host/dao/HostDao.java +++ b/server/src/com/cloud/host/dao/HostDao.java @@ -142,7 +142,7 @@ public interface HostDao extends GenericDao { HostVO findConsoleProxyHost(String name, Type type); - List getAvailHypervisorInZone(long hostId, long zoneId); + List getAvailHypervisorInZone(Long hostId, Long zoneId); /** * Returns a list of host ids given the conditions. diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/server/src/com/cloud/host/dao/HostDaoImpl.java index 284aecfe6c4..1b9cd057ca2 100644 --- a/server/src/com/cloud/host/dao/HostDaoImpl.java +++ b/server/src/com/cloud/host/dao/HostDaoImpl.java @@ -828,10 +828,14 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } @Override - public List getAvailHypervisorInZone(long hostId, long zoneId) { + public List getAvailHypervisorInZone(Long hostId, Long zoneId) { SearchCriteria sc = AvailHypevisorInZone.create(); - sc.setParameters("zoneId", zoneId); - sc.setParameters("hostId", hostId); + if ( zoneId != null ) { + sc.setParameters("zoneId", zoneId); + } + if ( hostId != null ) { + sc.setParameters("hostId", hostId); + } sc.setParameters("type", Host.Type.Routing); List hosts = listBy(sc); List hypers = new ArrayList(4); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index b29bed28174..88973c061ab 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1655,6 +1655,8 @@ public class ManagementServerImpl implements ManagementServer { private Set> 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, boolean onlyReady) { + + Account caller = UserContext.current().getCaller(); VMTemplateVO template = null; if (templateId != null) { @@ -1680,11 +1682,14 @@ public class ManagementServerImpl implements ManagementServer { } else { domain = _domainDao.findById(DomainVO.ROOT_DOMAIN); } - + List hypers = null; + if( ! isIso ) { + hypers = _hostDao.getAvailHypervisorInZone(null, null); + } Set> templateZonePairSet = new HashSet>(); if (template == null) { - templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, bootable, account, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr); + templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, account, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr); } else { // if template is not public, perform permission check here if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index 4dd67699036..9b2bfda2c47 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -205,5 +205,5 @@ public interface StorageManager extends Manager { StoragePoolVO findLocalStorageOnHost(long hostId); - VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId); + VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 21360dbc668..8ba1ef9a687 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -981,7 +981,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } @Override - public VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId) { + public VMTemplateHostVO getTemplateHostRef(long zoneId, long tmpltId, boolean readyOnly) { List hosts = _hostDao.listSecondaryStorageHosts(zoneId); if( hosts == null || hosts.size() == 0) { return null; diff --git a/server/src/com/cloud/storage/dao/VMTemplateDao.java b/server/src/com/cloud/storage/dao/VMTemplateDao.java index 30e0f00837c..d684bd49fa7 100644 --- a/server/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDao.java @@ -59,7 +59,7 @@ public interface VMTemplateDao extends GenericDao { public List findIsosByIdAndPath(Long domainId, Long accountId, String path); public List listReadyTemplates(); public List listByAccountId(long accountId); - public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, + public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr); public long addTemplateToZone(VMTemplateVO tmplt, long zoneId); diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 25480a51494..537cd06d402 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -305,7 +305,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } @Override - public Set> 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> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List hypers, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady,boolean showDomr) { Transaction txn = Transaction.currentTxn(); txn.start(); @@ -332,10 +332,25 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem if ((templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.community)) { dataCenterJoin = " INNER JOIN data_center dc on (h.data_center_id = dc.id)"; } - + sql += guestOSJoin + templateHostRefJoin + dataCenterJoin; String whereClause = ""; + if ( !isIso ) { + if ( hypers.isEmpty() ) { + return templateZonePairList; + } else { + StringBuilder relatedHypers = new StringBuilder(); + for (HypervisorType hyper : hypers ) { + relatedHypers.append("'"); + relatedHypers.append(hyper.toString()); + relatedHypers.append("'"); + relatedHypers.append(","); + } + relatedHypers.setLength(relatedHypers.length()-1); + whereClause += " AND t.hypervisor_type IN (" + relatedHypers + ")"; + } + } if (account != null) { accountType = account.getType(); accountId = Long.toString(account.getId());