mirror of https://github.com/apache/cloudstack.git
fix listtempalte and listiso, if there are multiple secondary storage
This commit is contained in:
parent
d02e4fb37f
commit
f7414b83aa
|
|
@ -161,7 +161,7 @@ public interface ResponseGenerator {
|
|||
RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn);
|
||||
|
||||
void createTemplateResponse(List<TemplateResponse> responses, Pair<Long, Long> templateZonePair, boolean isAdmin,
|
||||
Account account);
|
||||
Account account, boolean readyOnly);
|
||||
|
||||
ListResponse<TemplateResponse> createTemplateResponse2(VirtualMachineTemplate template, Long zoneId);
|
||||
|
||||
|
|
@ -187,7 +187,7 @@ public interface ResponseGenerator {
|
|||
|
||||
EventResponse createEventResponse(Event event);
|
||||
|
||||
ListResponse<TemplateResponse> createIsoResponse(Set<Pair<Long,Long>> isoZonePairSet, boolean onlyReady, Account account, Boolean isBootable);
|
||||
ListResponse<TemplateResponse> createIsoResponse(Set<Pair<Long,Long>> isoZonePairSet, boolean onlyReady, Account account, Boolean isBootable, boolean readyOnly);
|
||||
|
||||
TemplateResponse createIsoResponse(VirtualMachineTemplate result);
|
||||
|
||||
|
|
|
|||
|
|
@ -124,6 +124,17 @@ public class ListIsosCmd extends BaseListCmd {
|
|||
public Long getZoneId() {
|
||||
return zoneId;
|
||||
}
|
||||
|
||||
public boolean listInReadyState() {
|
||||
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);
|
||||
// Show only those that are downloaded.
|
||||
TemplateFilter templateFilter = TemplateFilter.valueOf(getIsoFilter());
|
||||
boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable)
|
||||
|| (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community);
|
||||
return onlyReady;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
|
|
@ -160,7 +171,7 @@ public class ListIsosCmd extends BaseListCmd {
|
|||
isAdmin = true;
|
||||
}
|
||||
|
||||
ListResponse<TemplateResponse> response = _responseGenerator.createIsoResponse(isoZonePairSet, isAdmin, account, bootable);
|
||||
ListResponse<TemplateResponse> response = _responseGenerator.createIsoResponse(isoZonePairSet, isAdmin, account, bootable, listInReadyState());
|
||||
response.setResponseName(getCommandName());
|
||||
this.setResponseObject(response);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,6 +105,17 @@ public class ListTemplatesCmd extends BaseListCmd {
|
|||
public Long getZoneId() {
|
||||
return zoneId;
|
||||
}
|
||||
|
||||
public boolean listInReadyState() {
|
||||
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);
|
||||
// Show only those that are downloaded.
|
||||
TemplateFilter templateFilter = TemplateFilter.valueOf(getTemplateFilter());
|
||||
boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable)
|
||||
|| (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community);
|
||||
return onlyReady;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
|
|
@ -133,7 +144,7 @@ public class ListTemplatesCmd extends BaseListCmd {
|
|||
List<TemplateResponse> templateResponses = new ArrayList<TemplateResponse>();
|
||||
|
||||
for (Pair<Long, Long> template : templateZonePairSet) {
|
||||
_responseGenerator.createTemplateResponse(templateResponses, template, isAdmin, account);
|
||||
_responseGenerator.createTemplateResponse(templateResponses, template, isAdmin, account, listInReadyState());
|
||||
}
|
||||
|
||||
response.setResponses(templateResponses);
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ package com.cloud.api.response;
|
|||
|
||||
import java.util.Date;
|
||||
|
||||
import com.cloud.api.ApiConstants;
|
||||
import com.cloud.serializer.Param;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
|
@ -113,6 +114,12 @@ public class TemplateResponse extends BaseResponse {
|
|||
@SerializedName("sourcetemplateid") @Param(description="the template ID of the parent template if present")
|
||||
private Long sourcetemplateId;
|
||||
|
||||
@SerializedName(ApiConstants.HOST_ID) @Param(description="the ID of the secondary storage host for the template")
|
||||
private Long hostId;
|
||||
|
||||
@SerializedName("hostname") @Param(description="the name of the secondary storage host for the template")
|
||||
private String hostName;
|
||||
|
||||
public Long getObjectId() {
|
||||
return getId();
|
||||
}
|
||||
|
|
@ -348,4 +355,20 @@ public class TemplateResponse extends BaseResponse {
|
|||
public void setSourceTemplateId(Long sourcetemplateId) {
|
||||
this.sourcetemplateId = sourcetemplateId;
|
||||
}
|
||||
|
||||
public Long getHostId() {
|
||||
return hostId;
|
||||
}
|
||||
|
||||
public void setHostId(Long hostId) {
|
||||
this.hostId = hostId;
|
||||
}
|
||||
|
||||
public String getHostName() {
|
||||
return hostName;
|
||||
}
|
||||
|
||||
public void setHostName(String hostName) {
|
||||
this.hostName = hostName;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -478,20 +478,13 @@ public class ApiDBUtils {
|
|||
return _volumeDao.getHypervisorType(volumeId);
|
||||
}
|
||||
|
||||
public static List<VMTemplateHostVO> listTemplateHostBy(long templateId, Long zoneId) {
|
||||
public static List<VMTemplateHostVO> listTemplateHostBy(long templateId, Long zoneId, boolean readyOnly) {
|
||||
if (zoneId != null) {
|
||||
VMTemplateVO vmTemplate = findTemplateById(templateId);
|
||||
if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) {
|
||||
return _templateHostDao.listByTemplateId(templateId);
|
||||
} else {
|
||||
List<VMTemplateHostVO> templates = new ArrayList<VMTemplateHostVO>();
|
||||
List<HostVO> secondaryStorageHosts = _storageMgr.getSecondaryStorageHosts(zoneId);
|
||||
if (!secondaryStorageHosts.isEmpty()) {
|
||||
for (HostVO ssh : secondaryStorageHosts) {
|
||||
templates.addAll(_templateHostDao.listByHostTemplate(ssh.getId(), templateId));
|
||||
}
|
||||
}
|
||||
return templates;
|
||||
return _templateHostDao.listByZoneTemplate(zoneId, templateId, readyOnly);
|
||||
}
|
||||
} else {
|
||||
return _templateHostDao.listByOnlyTemplateId(templateId);
|
||||
|
|
|
|||
|
|
@ -1449,12 +1449,21 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void createTemplateResponse(List<TemplateResponse> responses, Pair<Long, Long> templateZonePair, boolean isAdmin, Account account) {
|
||||
List<VMTemplateHostVO> templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(templateZonePair.first(), templateZonePair.second());
|
||||
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());
|
||||
|
||||
for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) {
|
||||
|
||||
if (readyOnly) {
|
||||
if (templateHostRef.getDownloadState() != Status.DOWNLOADED) {
|
||||
continue;
|
||||
}
|
||||
for (TemplateResponse res : responses) {
|
||||
if (res.getId() == templateHostRef.getTemplateId()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
TemplateResponse templateResponse = new TemplateResponse();
|
||||
templateResponse.setId(template.getId());
|
||||
templateResponse.setName(template.getName());
|
||||
|
|
@ -1491,8 +1500,11 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||
}
|
||||
|
||||
HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId());
|
||||
templateResponse.setHostId(host.getId());
|
||||
templateResponse.setHostName(host.getName());
|
||||
|
||||
DataCenterVO datacenter = ApiDBUtils.findZoneById(host.getDataCenterId());
|
||||
|
||||
|
||||
// Add the zone ID
|
||||
templateResponse.setZoneId(host.getDataCenterId());
|
||||
templateResponse.setZoneName(datacenter.getName());
|
||||
|
|
@ -1986,7 +1998,7 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ListResponse<TemplateResponse> createIsoResponse(Set<Pair<Long, Long>> isoZonePairSet, boolean isAdmin, Account account, Boolean isBootable) {
|
||||
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>();
|
||||
|
|
@ -2022,7 +2034,7 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||
}
|
||||
}
|
||||
|
||||
List<VMTemplateHostVO> isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), isoZonePair.second());
|
||||
List<VMTemplateHostVO> isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), isoZonePair.second(), readyOnly);
|
||||
for (VMTemplateHostVO isoHost : isoHosts) {
|
||||
TemplateResponse isoResponse = new TemplateResponse();
|
||||
isoResponse.setId(iso.getId());
|
||||
|
|
|
|||
|
|
@ -1624,7 +1624,7 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
|
||||
HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor());
|
||||
return listTemplates(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), accountId, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType,
|
||||
isAccountSpecific, true);
|
||||
isAccountSpecific, true, cmd.listInReadyState());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -1646,11 +1646,11 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor());
|
||||
|
||||
return listTemplates(cmd.getId(), cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, accountId, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType,
|
||||
isAccountSpecific, showDomr);
|
||||
isAccountSpecific, showDomr, cmd.listInReadyState());
|
||||
}
|
||||
|
||||
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) {
|
||||
Long startIndex, Long zoneId, HypervisorType hyperType, boolean isAccountSpecific, boolean showDomr, boolean onlyReady) {
|
||||
|
||||
Account caller = UserContext.current().getCaller();
|
||||
VMTemplateVO template = null;
|
||||
|
|
@ -1669,10 +1669,6 @@ public class ManagementServerImpl implements ManagementServer {
|
|||
}
|
||||
}
|
||||
|
||||
// Show only those that are downloaded.
|
||||
boolean onlyReady = (templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.selfexecutable) || (templateFilter == TemplateFilter.sharedexecutable)
|
||||
|| (templateFilter == TemplateFilter.executable && isAccountSpecific) || (templateFilter == TemplateFilter.community);
|
||||
|
||||
Account account = null;
|
||||
DomainVO domain = null;
|
||||
if (accountId != null) {
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ public interface VMTemplateHostDao extends GenericDao<VMTemplateHostVO, Long> {
|
|||
|
||||
boolean templateAvailable(long templateId, long hostId);
|
||||
|
||||
List<VMTemplateHostVO> listByZoneTemplate(long dcId, long templateId);
|
||||
List<VMTemplateHostVO> listByZoneTemplate(long dcId, long templateId, boolean readyOnly);
|
||||
|
||||
void deleteByHost(Long hostId);
|
||||
|
||||
|
|
|
|||
|
|
@ -24,15 +24,22 @@ import java.sql.SQLException;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.storage.VMTemplateHostVO;
|
||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
|
|
@ -40,7 +47,8 @@ import com.cloud.utils.db.Transaction;
|
|||
@Local(value={VMTemplateHostDao.class})
|
||||
public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long> implements VMTemplateHostDao {
|
||||
public static final Logger s_logger = Logger.getLogger(VMTemplateHostDaoImpl.class.getName());
|
||||
|
||||
@Inject
|
||||
HostDao _hostDao;
|
||||
protected final SearchBuilder<VMTemplateHostVO> HostSearch;
|
||||
protected final SearchBuilder<VMTemplateHostVO> TemplateSearch;
|
||||
protected final SearchBuilder<VMTemplateHostVO> HostTemplateSearch;
|
||||
|
|
@ -49,6 +57,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
|
|||
protected final SearchBuilder<VMTemplateHostVO> HostTemplatePoolSearch;
|
||||
protected final SearchBuilder<VMTemplateHostVO> TemplateStatusSearch;
|
||||
protected final SearchBuilder<VMTemplateHostVO> TemplateStatesSearch;
|
||||
protected SearchBuilder<VMTemplateHostVO> ZONE_TEMPLATE_SEARCH;
|
||||
|
||||
|
||||
protected static final String UPDATE_TEMPLATE_HOST_REF =
|
||||
|
|
@ -71,12 +80,6 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
|
|||
"SELECT * FROM template_host_ref t "
|
||||
+ " where t.template_id=? and t.download_state=?";
|
||||
|
||||
protected static final String ZONE_TEMPLATE_SEARCH=
|
||||
"SELECT t.id, t.host_id, t.pool_id, t.template_id, t.created, t.last_updated, t.job_id, "
|
||||
+ "t.download_pct, t.size, t.physical_size, t.download_state, t.error_str, t.local_path, "
|
||||
+ "t.install_path, t.url, t.destroyed, t.is_copy FROM template_host_ref t, host h"
|
||||
+ " where t.host_id = h.id and h.data_center_id=? and t.template_id=? ";
|
||||
|
||||
public VMTemplateHostDaoImpl () {
|
||||
HostSearch = createSearchBuilder();
|
||||
HostSearch.and("host_id", HostSearch.entity().getHostId(), SearchCriteria.Op.EQ);
|
||||
|
|
@ -116,9 +119,21 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
|
|||
PoolTemplateSearch = createSearchBuilder();
|
||||
PoolTemplateSearch.and("pool_id", PoolTemplateSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
|
||||
PoolTemplateSearch.and("template_id", PoolTemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
|
||||
PoolTemplateSearch.done();
|
||||
PoolTemplateSearch.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
boolean result = super.configure(name, params);
|
||||
ZONE_TEMPLATE_SEARCH = createSearchBuilder();
|
||||
ZONE_TEMPLATE_SEARCH.and("template_id", ZONE_TEMPLATE_SEARCH.entity().getTemplateId(), SearchCriteria.Op.EQ);
|
||||
ZONE_TEMPLATE_SEARCH.and("state", ZONE_TEMPLATE_SEARCH.entity().getDownloadState(), SearchCriteria.Op.EQ);
|
||||
SearchBuilder<HostVO> hostSearch = _hostDao.createSearchBuilder();
|
||||
hostSearch.and("zone_id", hostSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
ZONE_TEMPLATE_SEARCH.join("tmplHost", hostSearch, hostSearch.entity().getId(), ZONE_TEMPLATE_SEARCH.entity().getHostId(), JoinBuilder.JoinType.INNER);
|
||||
ZONE_TEMPLATE_SEARCH.done();
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(VMTemplateHostVO instance) {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
|
|
@ -275,25 +290,18 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<VMTemplateHostVO> listByZoneTemplate(long dcId, long templateId) {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
PreparedStatement pstmt = null;
|
||||
List<VMTemplateHostVO> result = new ArrayList<VMTemplateHostVO>();
|
||||
try {
|
||||
String sql = ZONE_TEMPLATE_SEARCH;
|
||||
pstmt = txn.prepareStatement(sql);
|
||||
|
||||
pstmt.setLong(1, dcId);
|
||||
pstmt.setLong(2, templateId);
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
while (rs.next()) {
|
||||
result.add(toEntityBean(rs, false));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("Exception: ", e);
|
||||
public List<VMTemplateHostVO> listByZoneTemplate(long dcId, long templateId, boolean readyOnly) {
|
||||
SearchCriteria<VMTemplateHostVO> sc = ZONE_TEMPLATE_SEARCH.create();
|
||||
sc.setParameters("template_id", templateId);
|
||||
sc.setJoinParameters("tmplHost", "zone_id", dcId);
|
||||
if (readyOnly) {
|
||||
sc.setParameters("state", VMTemplateHostVO.Status.DOWNLOADED);
|
||||
List<VMTemplateHostVO> tmplHost = new ArrayList<VMTemplateHostVO>();
|
||||
tmplHost.add(findOneBy(sc));
|
||||
return tmplHost;
|
||||
} else {
|
||||
return listBy(sc);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -535,7 +535,7 @@ public class DownloadMonitorImpl implements DownloadMonitor {
|
|||
if( tmplt.isPublicTemplate() || tmplt.isFeatured() ) {
|
||||
continue;
|
||||
}
|
||||
List<VMTemplateHostVO> tmpltHosts = _vmTemplateHostDao.listByZoneTemplate(dcId, tmplt.getId());
|
||||
List<VMTemplateHostVO> tmpltHosts = _vmTemplateHostDao.listByZoneTemplate(dcId, tmplt.getId(), false);
|
||||
for ( VMTemplateHostVO tmpltHost : tmpltHosts ) {
|
||||
if ( tmpltHost.getDownloadState() == Status.DOWNLOADED || tmpltHost.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) {
|
||||
iter.remove();
|
||||
|
|
|
|||
Loading…
Reference in New Issue