Refactoring listTemplates and listIsos to new API framework.

This commit is contained in:
Kris McQueen 2010-08-31 14:50:30 -07:00
parent 7e7baba8e7
commit 4be6af476d
5 changed files with 355 additions and 346 deletions

View File

@ -26,43 +26,30 @@ import java.util.Map;
import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.api.BaseListCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.TemplateResponse;
import com.cloud.async.AsyncJobVO;
import com.cloud.dc.DataCenterVO;
import com.cloud.domain.DomainVO;
import com.cloud.host.HostVO;
import com.cloud.serializer.SerializerHelper;
import com.cloud.storage.GuestOS;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
import com.cloud.user.Account;
import com.cloud.user.UserContext;
import com.cloud.utils.Pair;
public class ListIsosCmd extends BaseCmd {
@Implementation(method="listTemplates")
public class ListIsosCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(ListIsosCmd.class.getName());
private static final String s_name = "listisosresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
static {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.BOOTABLE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.IS_READY, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ISO_FILTER, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.NAME, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ZONE_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.KEYWORD, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGESIZE, Boolean.FALSE));
}
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
@ -87,7 +74,7 @@ public class ListIsosCmd extends BaseCmd {
private Boolean ready;
@Parameter(name="isofilter", type=CommandType.STRING)
private String isoFilter;
private String isoFilter = TemplateFilter.selfexecutable.toString();
@Parameter(name="name", type=CommandType.STRING)
private String isoName;
@ -144,97 +131,49 @@ public class ListIsosCmd extends BaseCmd {
public String getName() {
return s_name;
}
@Override
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
String accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName());
Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName());
Long id = (Long) params.get(BaseCmd.Properties.ID.getName());
String name = (String) params.get(BaseCmd.Properties.NAME.getName());
Account account = (Account) params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName());
Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName());
String isoFilterString = (String) params.get(BaseCmd.Properties.ISO_FILTER.getName());
Boolean bootable = (Boolean)params.get(BaseCmd.Properties.BOOTABLE.getName());
String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName());
Long zoneId = (Long)params.get(BaseCmd.Properties.ZONE_ID.getName());
boolean isAdmin = false;
TemplateFilter isoFilter;
@Override @SuppressWarnings("unchecked")
public String getResponse() {
TemplateFilter isoFilterObj = null;
try {
if (isoFilterString == null) {
isoFilter = TemplateFilter.selfexecutable;
} else {
isoFilter = TemplateFilter.valueOf(isoFilterString);
}
} catch (IllegalArgumentException e) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid template filter.");
}
Long accountId = null;
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) {
isAdmin = true;
// validate domainId before proceeding
if (domainId != null) {
if ((account != null) && !getManagementServer().isChildDomain(account.getDomainId(), domainId)) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list events.");
}
if (accountName != null) {
Account userAccount = getManagementServer().findAccountByName(accountName, domainId);
if (userAccount != null) {
accountId = userAccount.getId();
} else {
throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find account " + accountName + " in domain " + domainId);
}
}
if (isoFilter == null) {
isoFilterObj = TemplateFilter.selfexecutable;
} else {
domainId = ((account == null) ? DomainVO.ROOT_DOMAIN : account.getDomainId());
isoFilterObj = TemplateFilter.valueOf(isoFilter);
}
} else {
accountId = account.getId();
accountName = account.getAccountName();
domainId = account.getDomainId();
} catch (IllegalArgumentException e) {
// how did we get this far? The request should've been rejected already before the response stage...
isoFilterObj = TemplateFilter.selfexecutable;
}
Long startIndex = Long.valueOf(0);
int pageSizeNum = 50;
if (pageSize != null) {
pageSizeNum = pageSize.intValue();
}
if (page != null) {
int pageNum = page.intValue();
if (pageNum > 0) {
startIndex = Long.valueOf(pageSizeNum * (pageNum-1));
boolean isAdmin = false;
boolean isAccountSpecific = true;
Account account = (Account)UserContext.current().getAccountObject();
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) {
isAdmin = true;
if ((accountName == null) || (domainId == null)) {
isAccountSpecific = false;
}
}
boolean onlyReady = (isoFilter == TemplateFilter.featured) ||
(isoFilter == TemplateFilter.selfexecutable) ||
(isoFilter == TemplateFilter.sharedexecutable) ||
(isoFilter == TemplateFilter.executable && accountId != null) ||
(isoFilter == TemplateFilter.community);
List<VMTemplateVO> isos = null;
try {
isos = getManagementServer().listTemplates(id, name, keyword, isoFilter, true, bootable, accountId, pageSize, startIndex, zoneId);
} catch (Exception e) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.getMessage());
}
int numTags = 0;
boolean onlyReady = (isoFilterObj == TemplateFilter.featured) ||
(isoFilterObj == TemplateFilter.selfexecutable) ||
(isoFilterObj == TemplateFilter.sharedexecutable) ||
(isoFilterObj == TemplateFilter.executable && isAccountSpecific) ||
(isoFilterObj == TemplateFilter.community);
List<VMTemplateVO> isos = (List<VMTemplateVO>)getResponseObject();
Map<Long, List<VMTemplateHostVO>> isoHostsMap = new HashMap<Long, List<VMTemplateHostVO>>();
for (VMTemplateVO iso : isos) {
List<VMTemplateHostVO> isoHosts = getManagementServer().listTemplateHostBy(iso.getId(), zoneId);
// TODO: implement
List<VMTemplateHostVO> isoHosts = getManagementServer().listTemplateHostBy(iso.getId(), zoneId);
if (iso.getName().equals("xs-tools.iso")) {
List<Long> xstoolsZones = new ArrayList<Long>();
// the xs-tools.iso is a special case since it will be available on every computing host in the zone and we want to return it once per zone
List<VMTemplateHostVO> xstoolsHosts = new ArrayList<VMTemplateHostVO>();
for (VMTemplateHostVO isoHost : isoHosts) {
// TODO: implement
HostVO host = getManagementServer().getHostBy(isoHost.getHostId());
if (!xstoolsZones.contains(Long.valueOf(host.getDataCenterId()))) {
xstoolsZones.add(Long.valueOf(host.getDataCenterId()));
@ -242,102 +181,93 @@ public class ListIsosCmd extends BaseCmd {
}
}
isoHostsMap.put(iso.getId(), xstoolsHosts);
numTags += xstoolsHosts.size();
} else {
isoHostsMap.put(iso.getId(), isoHosts);
numTags += isoHosts.size();
}
}
List<Object> isoTagList = new ArrayList<Object>();
List<Pair<String, Object>> isoTags = new ArrayList<Pair<String, Object>>();
List<TemplateResponse> response = new ArrayList<TemplateResponse>();
for (VMTemplateVO iso : isos) {
List<VMTemplateHostVO> isoHosts = isoHostsMap.get(iso.getId());
for (VMTemplateHostVO isoHost : isoHosts) {
if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) {
continue;
}
List<Pair<String, Object>> isoData = new ArrayList<Pair<String, Object>>();
isoData.add(new Pair<String, Object>(BaseCmd.Properties.ID.getName(), iso.getId().toString()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.NAME.getName(), iso.getName()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.DISPLAY_TEXT.getName(), iso.getDisplayText()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.IS_PUBLIC.getName(), Boolean.valueOf(iso.isPublicTemplate()).toString()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.CREATED.getName(), getDateString(isoHost.getCreated())));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.IS_READY.getName(), Boolean.valueOf(isoHost.getDownloadState()==Status.DOWNLOADED).toString()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.BOOTABLE.getName(), Boolean.valueOf(iso.isBootable()).toString()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.IS_FEATURED.getName(), Boolean.valueOf(iso.isFeatured()).toString()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.CROSS_ZONES.getName(), Boolean.valueOf(iso.isCrossZones()).toString()));
GuestOS os = getManagementServer().findGuestOSById(iso.getGuestOSId());
if(os != null) {
isoData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_ID.getName(), os.getId()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_NAME.getName(), os.getDisplayName()));
} else {
isoData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_ID.getName(), -1));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_NAME.getName(), ""));
}
// add account ID and name
Account owner = getManagementServer().findAccountById(iso.getAccountId());
if (owner != null) {
isoData.add(new Pair<String, Object>(BaseCmd.Properties.ACCOUNT.getName(), owner.getAccountName()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN_ID.getName(), owner.getDomainId()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN.getName(), getManagementServer().findDomainIdById(owner.getDomainId()).getName()));
}
// Add the zone ID
HostVO host = getManagementServer().getHostBy(isoHost.getHostId());
isoData.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_ID.getName(), host.getDataCenterId()));
List<VMTemplateHostVO> isoHosts = isoHostsMap.get(iso.getId());
for (VMTemplateHostVO isoHost : isoHosts) {
if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) {
continue;
}
TemplateResponse isoResponse = new TemplateResponse();
isoResponse.setId(iso.getId());
isoResponse.setName(iso.getName());
isoResponse.setDisplayText(iso.getDisplayText());
isoResponse.setPublic(iso.isPublicTemplate());
isoResponse.setCreated(isoHost.getCreated());
isoResponse.setReady(isoHost.getDownloadState() == Status.DOWNLOADED);
isoResponse.setBootable(iso.isBootable());
isoResponse.setFeatured(iso.isFeatured());
isoResponse.setCrossZones(iso.isCrossZones());
// TODO: implement
GuestOS os = getManagementServer().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 = getManagementServer().findAccountById(iso.getAccountId());
if (owner != null) {
isoResponse.setAccount(owner.getAccountName());
isoResponse.setDomainId(owner.getDomainId());
// TODO: implement
isoResponse.setDomainName(getManagementServer().findDomainIdById(owner.getDomainId()).getName());
}
// Add the zone ID
// TODO: implement
HostVO host = getManagementServer().getHostBy(isoHost.getHostId());
DataCenterVO datacenter = getManagementServer().getDataCenterBy(host.getDataCenterId());
isoData.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_NAME.getName(), datacenter.getName()));
isoResponse.setZoneId(host.getDataCenterId());
isoResponse.setZoneName(datacenter.getName());
// If the user is an admin, add the template download status
if (isAdmin || account.getId().longValue() == 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();
}
isoData.add(new Pair<String, Object>(BaseCmd.Properties.ISO_STATUS.getName(), isoStatus));
} else {
isoData.add(new Pair<String, Object>(BaseCmd.Properties.ISO_STATUS.getName(), "Successfully Installed"));
}
// 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) {
isoData.add(new Pair<String, Object>(BaseCmd.Properties.SIZE.getName(), isoSize));
isoResponse.setSize(isoSize);
}
AsyncJobVO asyncJob = getManagementServer().findInstancePendingAsyncJob("vm_template", iso.getId());
if(asyncJob != null) {
isoData.add(new Pair<String, Object>(BaseCmd.Properties.JOB_ID.getName(), asyncJob.getId().toString()));
isoData.add(new Pair<String, Object>(BaseCmd.Properties.JOB_STATUS.getName(), String.valueOf(asyncJob.getStatus())));
isoResponse.setJobId(asyncJob.getId());
isoResponse.setJobStatus(asyncJob.getStatus());
}
isoTagList.add(isoData);
}
response.add(isoResponse);
}
}
Object[] iTag = new Object[isoTagList.size()];
for (int i = 0; i < isoTagList.size(); i++) {
iTag[i] = isoTagList.get(i);
}
Pair<String, Object> isoTag = new Pair<String, Object>("iso", iTag);
isoTags.add(isoTag);
return isoTags;
return SerializerHelper.toSerializedString(response);
}
}

View File

@ -20,16 +20,17 @@ package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.api.BaseListCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.TemplateResponse;
import com.cloud.async.AsyncJobVO;
import com.cloud.dc.DataCenterVO;
import com.cloud.host.HostVO;
import com.cloud.serializer.SerializerHelper;
import com.cloud.storage.GuestOS;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
@ -37,29 +38,13 @@ import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
import com.cloud.storage.template.TemplateConstants;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
import com.cloud.user.UserContext;
public class ListTemplatesCmd extends BaseCmd {
@Implementation(method="listTemplates")
public class ListTemplatesCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(ListTemplatesCmd.class.getName());
private static final String s_name = "listtemplatesresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
static {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.NAME, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.IS_READY, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.TEMPLATE_FILTER, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ZONE_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.KEYWORD, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGESIZE, Boolean.FALSE));
}
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
@ -119,135 +104,90 @@ public class ListTemplatesCmd extends BaseCmd {
public String getName() {
return s_name;
}
@Override
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
String accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName());
Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName());
Long id = (Long) params.get(BaseCmd.Properties.ID.getName());
String name = (String) params.get(BaseCmd.Properties.NAME.getName());
String templateFilterString = (String) params.get(BaseCmd.Properties.TEMPLATE_FILTER.getName());
String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName());
Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName());
Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName());
Long zoneId = (Long)params.get(BaseCmd.Properties.ZONE_ID.getName());
boolean isAdmin = false;
Long accountId = null;
if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) {
isAdmin = true;
if (domainId != null) {
if ((account != null) && !getManagementServer().isChildDomain(account.getDomainId(), domainId)) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list templates.");
}
if (accountName != null) {
account = getManagementServer().findActiveAccount(accountName, domainId);
if (account == null) {
throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find account " + accountName + " in domain " + domainId);
}
accountId = account.getId();
}
}
} else {
accountId = account.getId();
accountName = account.getAccountName();
domainId = account.getDomainId();
}
TemplateFilter templateFilter;
@Override @SuppressWarnings("unchecked")
public String getResponse() {
TemplateFilter templateFilterObj;
try {
templateFilter = TemplateFilter.valueOf(templateFilterString);
templateFilterObj = TemplateFilter.valueOf(templateFilter);
} catch (IllegalArgumentException e) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid template filter.");
// how did we get this far? The request should've been rejected already before the response stage...
templateFilterObj = TemplateFilter.selfexecutable;
}
Long startIndex = Long.valueOf(0);
int pageSizeNum = 50;
if (pageSize != null) {
pageSizeNum = pageSize.intValue();
}
if (page != null) {
int pageNum = page.intValue();
if (pageNum > 0) {
startIndex = Long.valueOf(pageSizeNum * (pageNum-1));
boolean isAdmin = false;
boolean isAccountSpecific = true;
Account account = (Account)UserContext.current().getAccountObject();
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) {
isAdmin = true;
if ((accountName == null) || (domainId == null)) {
isAccountSpecific = false;
}
}
boolean onlyReady = (templateFilter == TemplateFilter.featured) ||
(templateFilter == TemplateFilter.selfexecutable) ||
(templateFilter == TemplateFilter.sharedexecutable) ||
(templateFilter == TemplateFilter.executable && accountId != null) ||
(templateFilter == TemplateFilter.community);
boolean showDomr = (templateFilter != TemplateFilter.selfexecutable);
List<VMTemplateVO> templates = null;
try {
templates = getManagementServer().listTemplates(id, name, keyword, templateFilter, false, null, accountId, pageSize, startIndex, zoneId);
} catch (Exception e) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.getMessage());
}
List<Object> tTagList = new ArrayList<Object>();
List<Pair<String, Object>> templateTags = new ArrayList<Pair<String, Object>>();
boolean onlyReady = (templateFilterObj == TemplateFilter.featured) ||
(templateFilterObj == TemplateFilter.selfexecutable) ||
(templateFilterObj == TemplateFilter.sharedexecutable) ||
(templateFilterObj == TemplateFilter.executable && isAccountSpecific) ||
(templateFilterObj == TemplateFilter.community);
boolean showDomr = (templateFilterObj != TemplateFilter.selfexecutable);
// get the response
List<VMTemplateVO> templates = (List<VMTemplateVO>)getResponseObject();
List<TemplateResponse> response = new ArrayList<TemplateResponse>();
for (VMTemplateVO template : templates) {
if (!showDomr && template.getId() == TemplateConstants.DEFAULT_SYSTEM_VM_DB_ID) {
continue;
}
List<VMTemplateHostVO> templateHostRefsForTemplate = getManagementServer().listTemplateHostBy(template.getId(), zoneId);
for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) {
if (onlyReady && templateHostRef.getDownloadState() != Status.DOWNLOADED) {
continue;
}
List<Pair<String, Object>> templateData = new ArrayList<Pair<String, Object>>();
templateData.add(new Pair<String, Object>(BaseCmd.Properties.ID.getName(), template.getId().toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.NAME.getName(), template.getName()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.DISPLAY_TEXT.getName(), template.getDisplayText()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.IS_PUBLIC.getName(), Boolean.valueOf(template.isPublicTemplate()).toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.CREATED.getName(), getDateString(templateHostRef.getCreated())));
if(template.getRemoved() != null){
templateData.add(new Pair<String, Object>(BaseCmd.Properties.REMOVED.getName(), getDateString(template.getRemoved())));
if (!showDomr && template.getId() == TemplateConstants.DEFAULT_SYSTEM_VM_DB_ID) {
continue;
}
List<VMTemplateHostVO> templateHostRefsForTemplate = getManagementServer().listTemplateHostBy(template.getId(), zoneId);
for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) {
if (onlyReady && templateHostRef.getDownloadState() != Status.DOWNLOADED) {
continue;
}
templateData.add(new Pair<String, Object>(BaseCmd.Properties.IS_READY.getName(), Boolean.valueOf(templateHostRef.getDownloadState()==Status.DOWNLOADED).toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.IS_FEATURED.getName(), Boolean.valueOf(template.isFeatured()).toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.PASSWORD_ENABLED.getName(), Boolean.valueOf(template.getEnablePassword()).toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.CROSS_ZONES.getName(), Boolean.valueOf(template.isCrossZones()).toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.FORMAT.getName(), template.getFormat()));
TemplateResponse templateResponse = new TemplateResponse();
templateResponse.setId(template.getId());
templateResponse.setName(template.getName());
templateResponse.setDisplayText(template.getDisplayText());
templateResponse.setPublic(template.isPublicTemplate());
templateResponse.setCreated(templateHostRef.getCreated());
if (template.getRemoved() != null) {
templateResponse.setRemoved(template.getRemoved());
}
templateResponse.setReady(templateHostRef.getDownloadState()==Status.DOWNLOADED);
templateResponse.setFeatured(template.isFeatured());
templateResponse.setPasswordEnabled(template.getEnablePassword());
templateResponse.setCrossZones(template.isCrossZones());
templateResponse.setFormat(template.getFormat());
GuestOS os = getManagementServer().findGuestOSById(template.getGuestOSId());
if (os != null) {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_ID.getName(), os.getId()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_NAME.getName(), os.getDisplayName()));
templateResponse.setOsTypeId(os.getId());
templateResponse.setOsTypeName(os.getDisplayName());
} else {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_ID.getName(), -1));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.OS_TYPE_NAME.getName(), ""));
templateResponse.setOsTypeId(-1L);
templateResponse.setOsTypeName("");
}
// add account ID and name
Account owner = getManagementServer().findAccountById(template.getAccountId());
if (owner != null) {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.ACCOUNT.getName(), owner.getAccountName()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN_ID.getName(), owner.getDomainId()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN.getName(), getManagementServer().findDomainIdById(owner.getDomainId()).getName()));
templateResponse.setAccount(owner.getAccountName());
templateResponse.setDomainId(owner.getDomainId());
templateResponse.setDomainName(getManagementServer().findDomainIdById(owner.getDomainId()).getName());
}
HostVO host = getManagementServer().getHostBy(templateHostRef.getHostId());
DataCenterVO datacenter = getManagementServer().getDataCenterBy(host.getDataCenterId());
// Add the zone ID
templateData.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_ID.getName(), host.getDataCenterId()));
DataCenterVO datacenter = getManagementServer().getDataCenterBy(host.getDataCenterId());
templateData.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_NAME.getName(), datacenter.getName()));
templateResponse.setZoneId(host.getDataCenterId());
templateResponse.setZoneName(datacenter.getName());
// If the user is an admin, add the template download status
if (isAdmin || account.getId().longValue() == template.getAccountId()) {
// add download status
@ -262,37 +202,29 @@ public class ListTemplatesCmd extends BaseCmd {
} else {
templateStatus = templateHostRef.getErrorString();
}
templateData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_STATUS.getName(), templateStatus));
templateResponse.setStatus(templateStatus);
} else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Download Complete"));
templateResponse.setStatus("Download Complete");
} else {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Successfully Installed"));
templateResponse.setStatus("Successfully Installed");
}
}
long templateSize = templateHostRef.getSize();
if (templateSize > 0) {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.SIZE.getName(), templateSize));
templateResponse.setSize(templateSize);
}
AsyncJobVO asyncJob = getManagementServer().findInstancePendingAsyncJob("vm_template", template.getId());
if(asyncJob != null) {
templateData.add(new Pair<String, Object>(BaseCmd.Properties.JOB_ID.getName(), asyncJob.getId().toString()));
templateData.add(new Pair<String, Object>(BaseCmd.Properties.JOB_STATUS.getName(), String.valueOf(asyncJob.getStatus())));
if (asyncJob != null) {
templateResponse.setJobId(asyncJob.getId());
templateResponse.setJobStatus(asyncJob.getStatus());
}
tTagList.add(templateData);
}
}
Object[] tTag = new Object[tTagList.size()];
for (int i = 0; i < tTagList.size(); i++) {
tTag[i] = tTagList.get(i);
}
Pair<String, Object> templateTag = new Pair<String, Object>("template", tTag);
templateTags.add(templateTag);
return templateTags;
response.add(templateResponse);
}
}
return SerializerHelper.toSerializedString(response);
}
}

View File

@ -4,6 +4,7 @@ import java.util.Date;
import com.cloud.api.ResponseObject;
import com.cloud.serializer.Param;
import com.cloud.storage.Storage.ImageFormat;
public class TemplateResponse implements ResponseObject {
@Param(name="id")
@ -21,12 +22,24 @@ public class TemplateResponse implements ResponseObject {
@Param(name="created")
private Date created;
@Param(name="removed")
private Date removed;
@Param(name="isready", propName="ready")
private boolean isReady;
@Param(name="passwordenabled")
private boolean passwordEnabled;
@Param(name="format")
private ImageFormat format;
@Param(name="bootable")
private boolean bootable;
@Param(name="isfeatured")
private boolean featured;
@Param(name="crossZones")
private boolean crossZones;
@ -48,6 +61,18 @@ public class TemplateResponse implements ResponseObject {
@Param(name="zonename")
private String zoneName;
@Param(name="status")
private String status;
@Param(name="size")
private Long size;
@Param(name="jobid")
private Long jobId;
@Param(name="jobstatus")
private Integer jobStatus;
@Param(name="domain")
private String domainName;
@ -142,6 +167,14 @@ public class TemplateResponse implements ResponseObject {
this.created = created;
}
public Date getRemoved() {
return removed;
}
public void setRemoved(Date removed) {
this.removed = removed;
}
public boolean isReady() {
return isReady;
}
@ -158,6 +191,30 @@ public class TemplateResponse implements ResponseObject {
this.passwordEnabled = passwordEnabled;
}
public ImageFormat getFormat() {
return format;
}
public void setFormat(ImageFormat format) {
this.format = format;
}
public boolean isBootable() {
return bootable;
}
public void setBootable(boolean bootable) {
this.bootable = bootable;
}
public boolean isFeatured() {
return featured;
}
public void setFeatured(boolean featured) {
this.featured = featured;
}
public boolean isCrossZones() {
return crossZones;
}
@ -166,6 +223,38 @@ public class TemplateResponse implements ResponseObject {
this.crossZones = crossZones;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Long getSize() {
return size;
}
public void setSize(Long size) {
this.size = size;
}
public Long getJobId() {
return jobId;
}
public void setJobId(Long jobId) {
this.jobId = jobId;
}
public Integer getJobStatus() {
return jobStatus;
}
public void setJobStatus(Integer jobStatus) {
this.jobStatus = jobStatus;
}
public long getDomainId() {
return domainId;
}

View File

@ -43,6 +43,8 @@ import com.cloud.api.commands.ListEventsCmd;
import com.cloud.api.commands.ListGuestOsCategoriesCmd;
import com.cloud.api.commands.ListGuestOsCmd;
import com.cloud.api.commands.ListHostsCmd;
import com.cloud.api.commands.ListIsosCmd;
import com.cloud.api.commands.ListTemplatesCmd;
import com.cloud.api.commands.LockAccountCmd;
import com.cloud.api.commands.LockUserCmd;
import com.cloud.api.commands.RebootSystemVmCmd;
@ -104,7 +106,6 @@ import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeStats;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
import com.cloud.storage.preallocatedlun.PreallocatedLunVO;
import com.cloud.user.Account;
import com.cloud.user.AccountVO;
@ -1628,20 +1629,18 @@ public interface ManagementServer {
List<VMTemplateVO> listPermittedTemplates(long accountId);
/**
* Lists templates that match the specified criteria
* @param templateId - (optional) id of the template to return template host references for
* @param name a name (possibly partial) to search for
* @param keyword a keyword (using partial match) to search for, currently only searches name
* @param templateFilter - the category of template to return
* @param isIso whether this is an ISO search or non-ISO search
* @param bootable if null will return both bootable and non-bootable ISOs, else will return only one or the other, depending on the boolean value
* @param accountId parameter to use when searching for owner of template
* @param pageSize size of search results
* @param startIndex index in to search results to use
* @param zoneId optional zoneid to limit search
* @return list of templates
* List ISOs that match the specified criteria.
* @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters.
* @return list of ISOs
*/
List<VMTemplateVO> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Integer pageSize, Long startIndex, Long zoneId) throws InvalidParameterValueException;
List<VMTemplateVO> listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException;
/**
* List templates that match the specified criteria.
* @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters.
* @return list of ISOs
*/
List<VMTemplateVO> listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException;
/**
* Search for disk offerings based on search criteria

View File

@ -54,7 +54,6 @@ import com.cloud.alert.AlertVO;
import com.cloud.alert.dao.AlertDao;
import com.cloud.api.BaseCmd;
import com.cloud.api.ServerApiException;
import com.cloud.api.commands.AssociateIPAddrCmd;
import com.cloud.api.commands.AuthorizeNetworkGroupIngressCmd;
import com.cloud.api.commands.CancelMaintenanceCmd;
import com.cloud.api.commands.CancelPrimaryStorageMaintenanceCmd;
@ -82,6 +81,8 @@ import com.cloud.api.commands.ListEventsCmd;
import com.cloud.api.commands.ListGuestOsCategoriesCmd;
import com.cloud.api.commands.ListGuestOsCmd;
import com.cloud.api.commands.ListHostsCmd;
import com.cloud.api.commands.ListIsosCmd;
import com.cloud.api.commands.ListTemplatesCmd;
import com.cloud.api.commands.LockAccountCmd;
import com.cloud.api.commands.LockUserCmd;
import com.cloud.api.commands.PrepareForMaintenanceCmd;
@ -114,21 +115,20 @@ import com.cloud.async.executor.DeleteDomainParam;
import com.cloud.async.executor.DeleteRuleParam;
import com.cloud.async.executor.DeleteTemplateParam;
import com.cloud.async.executor.DeployVMParam;
import com.cloud.async.executor.DisassociateIpAddressParam;
import com.cloud.async.executor.LoadBalancerParam;
import com.cloud.async.executor.NetworkGroupIngressParam;
import com.cloud.async.executor.SecurityGroupParam;
import com.cloud.async.executor.UpdateLoadBalancerParam;
import com.cloud.async.executor.VMOperationParam;
import com.cloud.async.executor.VolumeOperationParam;
import com.cloud.async.executor.VMOperationParam.VmOp;
import com.cloud.async.executor.VolumeOperationParam;
import com.cloud.async.executor.VolumeOperationParam.VolumeOp;
import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.configuration.ConfigurationVO;
import com.cloud.configuration.ResourceLimitVO;
import com.cloud.configuration.ResourceCount.ResourceType;
import com.cloud.configuration.ResourceLimitVO;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.configuration.dao.ResourceLimitDao;
import com.cloud.consoleproxy.ConsoleProxyManager;
@ -138,8 +138,8 @@ import com.cloud.dc.DataCenterIpAddressVO;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.PodVlanMapVO;
import com.cloud.dc.VlanVO;
import com.cloud.dc.Vlan.VlanType;
import com.cloud.dc.VlanVO;
import com.cloud.dc.dao.AccountVlanMapDao;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
@ -203,21 +203,21 @@ import com.cloud.storage.GuestOSCategoryVO;
import com.cloud.storage.GuestOSVO;
import com.cloud.storage.LaunchPermissionVO;
import com.cloud.storage.Snapshot;
import com.cloud.storage.Snapshot.SnapshotType;
import com.cloud.storage.SnapshotPolicyVO;
import com.cloud.storage.SnapshotScheduleVO;
import com.cloud.storage.SnapshotVO;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.StorageStats;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.VolumeStats;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.Snapshot.SnapshotType;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.storage.dao.DiskTemplateDao;
import com.cloud.storage.dao.GuestOSCategoryDao;
@ -227,9 +227,9 @@ import com.cloud.storage.dao.SnapshotDao;
import com.cloud.storage.dao.SnapshotPolicyDao;
import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
import com.cloud.storage.dao.VMTemplateHostDao;
import com.cloud.storage.dao.VolumeDao;
import com.cloud.storage.dao.VMTemplateDao.TemplateFilter;
import com.cloud.storage.preallocatedlun.PreallocatedLunVO;
import com.cloud.storage.preallocatedlun.dao.PreallocatedLunDao;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
@ -251,12 +251,12 @@ import com.cloud.user.dao.UserDao;
import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.uservm.UserVm;
import com.cloud.utils.DateUtil;
import com.cloud.utils.DateUtil.IntervalType;
import com.cloud.utils.EnumUtils;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.PasswordGenerator;
import com.cloud.utils.StringUtils;
import com.cloud.utils.DateUtil.IntervalType;
import com.cloud.utils.component.Adapters;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.concurrency.NamedThreadFactory;
@ -4181,7 +4181,66 @@ public class ManagementServerImpl implements ManagementServer {
}
@Override
public List<VMTemplateVO> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Integer pageSize, Long startIndex, Long zoneId) throws InvalidParameterValueException {
public List<VMTemplateVO> listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException {
TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter());
Long accountId = null;
Account account = (Account)UserContext.current().getAccountObject();
Long domainId = cmd.getDomainId();
String accountName = cmd.getAccountName();
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) {
// validate domainId before proceeding
if ((domainId != null) && (accountName != null)) {
if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) {
throw new InvalidParameterValueException("Invalid domain id (" + domainId + ") given, unable to list events.");
}
Account userAccount = _accountDao.findActiveAccount(accountName, domainId);
if (userAccount != null) {
accountId = userAccount.getId();
} else {
throw new InvalidParameterValueException("Failed to list ISOs. Unable to find account " + accountName + " in domain " + domainId);
}
} else if (account != null) {
accountId = account.getId();
}
} else {
accountId = account.getId();
}
return listTemplates(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), accountId, cmd.getPageSizeVal().intValue(), cmd.getStartIndex(), cmd.getZoneId());
}
@Override
public List<VMTemplateVO> listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException {
TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter());
Long accountId = null;
Account account = (Account)UserContext.current().getAccountObject();
Long domainId = cmd.getDomainId();
String accountName = cmd.getAccountName();
if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) {
// validate domainId before proceeding
if ((domainId != null) && (accountName != null)) {
if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) {
throw new InvalidParameterValueException("Invalid domain id (" + domainId + ") given, unable to list events.");
}
Account userAccount = _accountDao.findActiveAccount(accountName, domainId);
if (userAccount != null) {
accountId = userAccount.getId();
} else {
throw new InvalidParameterValueException("Failed to list ISOs. Unable to find account " + accountName + " in domain " + domainId);
}
} else if (account != null) {
accountId = account.getId();
}
} else {
accountId = account.getId();
}
return listTemplates(cmd.getId(), cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, accountId, cmd.getPageSizeVal().intValue(), cmd.getStartIndex(), cmd.getZoneId());
}
private List<VMTemplateVO> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Integer pageSize, Long startIndex, Long zoneId) throws InvalidParameterValueException {
VMTemplateVO template = null;
if (templateId != null) {
template = _templateDao.findById(templateId);