fixed several template issues

merge createtemplateresponse and createteisoresponse

on UI template
only show template corresponding hypervisor exists
This commit is contained in:
anthony 2011-06-29 15:52:40 -07:00
parent e16e0597c9
commit 446d08187b
16 changed files with 279 additions and 591 deletions

View File

@ -156,13 +156,10 @@ public interface ResponseGenerator {
VirtualMachineTemplate findTemplateById(Long templateId);
void createTemplateResponse(List<TemplateResponse> responses, Pair<Long, Long> templateZonePair, boolean isAdmin,
Account account, boolean readyOnly);
ListResponse<TemplateResponse> createTemplateResponse2(VirtualMachineTemplate template, Long zoneId);
ListResponse<TemplateResponse> createIsoResponses(VirtualMachineTemplate template, Long zoneId);
List<TemplateResponse> createTemplateResponses(long templateId, long zoneId, boolean readyOnly);
List<TemplateResponse> createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly);
ListResponse<SecurityGroupResponse> createSecurityGroupResponses(List<? extends SecurityGroupRules> networkGroups);
SecurityGroupResponse createSecurityGroupResponseFromIngressRule(List<? extends IngressRule> 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<TemplateResponse> createIsoResponse(Set<Pair<Long,Long>> isoZonePairSet, boolean onlyReady, Account account, Boolean isBootable, boolean readyOnly);
TemplateResponse createIsoResponse(VirtualMachineTemplate result);
List<CapacityResponse> createCapacityResponse(List<? extends Capacity> result, DecimalFormat format);
@ -203,4 +192,6 @@ public interface ResponseGenerator {
Long getSecurityGroupId(String groupName, long accountId);
List<TemplateResponse> createIsoResponses(long isoId, long zoneId, boolean readyOnly);
}

View File

@ -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<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> 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());

View File

@ -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<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> 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");
}
}
}

View File

@ -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<Pair<Long, Long>> isoZonePairSet = _mgr.listIsos(this);
TemplateFilter isoFilterObj = null;
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> templateResponses = new ArrayList<TemplateResponse>();
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<Long, Long> iso : isoZonePairSet) {
List<TemplateResponse> responses = new ArrayList<TemplateResponse>();
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<TemplateResponse> response = _responseGenerator.createIsoResponse(isoZonePairSet, isAdmin, account, bootable, listInReadyState());
response.setResponses(templateResponses);
response.setResponseName(getCommandName());
this.setResponseObject(response);
}
}

View File

@ -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<Pair<Long, Long>> templateZonePairSet = _mgr.listTemplates(this);
boolean isAdmin = false;
Account account = UserContext.current().getCaller();
if ((account == null) || BaseCmd.isAdmin(account.getType())) {
isAdmin = true;
}
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> templateResponses = new ArrayList<TemplateResponse>();
for (Pair<Long, Long> template : templateZonePairSet) {
_responseGenerator.createTemplateResponse(templateResponses, template, isAdmin, account, listInReadyState());
List<TemplateResponse> responses = new ArrayList<TemplateResponse>();
responses = _responseGenerator.createTemplateResponses(template.first(), template.second(), listInReadyState());
templateResponses.addAll(responses);
}
response.setResponses(templateResponses);

View File

@ -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<TemplateResponse> response = _responseGenerator.createIsoResponses(template, zoneId);
response.setResponseName(getCommandName());
if (template != null) {
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> 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");

View File

@ -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<TemplateResponse> response = _responseGenerator.createTemplateResponse2(template, zoneId);
response.setResponseName(getCommandName());
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> 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");

View File

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

View File

@ -1447,225 +1447,209 @@ public class ApiResponseHelper implements ResponseGenerator {
}
@Override
public void createTemplateResponse(List<TemplateResponse> responses, Pair<Long, Long> templateZonePair, boolean isAdmin, Account account, boolean readyOnly) {
List<VMTemplateHostVO> templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(templateZonePair.first(), templateZonePair.second(), readyOnly);
VMTemplateVO template = ApiDBUtils.findTemplateById(templateZonePair.first());
public List<TemplateResponse> createTemplateResponses(long templateId, long zoneId, boolean readyOnly) {
VirtualMachineTemplate template = findTemplateById(templateId);
List<TemplateResponse> responses = new ArrayList<TemplateResponse>();
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<TemplateResponse> createIsoResponses(long isoId, long zoneId, boolean readyOnly) {
VirtualMachineTemplate iso = findTemplateById(isoId);
List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>();
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<TemplateResponse> createTemplateResponse2(VirtualMachineTemplate template, Long zoneId) {
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> responses = new ArrayList<TemplateResponse>();
List<DataCenterVO> zones = null;
if ((zoneId != null) && (zoneId != -1)) {
zones = new ArrayList<DataCenterVO>();
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<TemplateResponse> createIsoResponses(VirtualMachineTemplate template, Long zoneId) {
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> responses = new ArrayList<TemplateResponse>();
List<DataCenterVO> zones = null;
if ((zoneId != null) && (zoneId != -1)) {
zones = new ArrayList<DataCenterVO>();
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<TemplateResponse> 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<TemplateResponse> createIsoResponse(Set<Pair<Long, Long>> isoZonePairSet, boolean isAdmin, Account account, Boolean isBootable, boolean readyOnly) {
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>();
for (Pair<Long, Long> 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<VMTemplateHostVO> 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<CapacityVO> sumCapacities(List<? extends Capacity> hostCapacities) {
Map<String, Long> totalCapacityMap = new HashMap<String, Long>();

View File

@ -142,7 +142,7 @@ public interface HostDao extends GenericDao<HostVO, Long> {
HostVO findConsoleProxyHost(String name, Type type);
List<HypervisorType> getAvailHypervisorInZone(long hostId, long zoneId);
List<HypervisorType> getAvailHypervisorInZone(Long hostId, Long zoneId);
/**
* Returns a list of host ids given the conditions.

View File

@ -828,10 +828,14 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
}
@Override
public List<HypervisorType> getAvailHypervisorInZone(long hostId, long zoneId) {
public List<HypervisorType> getAvailHypervisorInZone(Long hostId, Long zoneId) {
SearchCriteria<HostVO> 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<HostVO> hosts = listBy(sc);
List<HypervisorType> hypers = new ArrayList<HypervisorType>(4);

View File

@ -1655,6 +1655,8 @@ public class ManagementServerImpl implements ManagementServer {
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, 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<HypervisorType> hypers = null;
if( ! isIso ) {
hypers = _hostDao.getAvailHypervisorInZone(null, null);
}
Set<Pair<Long, Long>> templateZonePairSet = new HashSet<Pair<Long, Long>>();
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) {

View File

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

View File

@ -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<HostVO> hosts = _hostDao.listSecondaryStorageHosts(zoneId);
if( hosts == null || hosts.size() == 0) {
return null;

View File

@ -59,7 +59,7 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long> {
public List<VMTemplateVO> findIsosByIdAndPath(Long domainId, Long accountId, String path);
public List<VMTemplateVO> listReadyTemplates();
public List<VMTemplateVO> listByAccountId(long accountId);
public Set<Pair<Long, Long>> 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, List<HypervisorType> 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);

View File

@ -305,7 +305,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
}
@Override
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) {
public Set<Pair<Long, Long>> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, List<HypervisorType> 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<VMTemplateVO, Long> 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());