1. limit xs-tools in xenserver related java file

2. don't populate xs-tools to template_host_ref
3. introduce a new template type PERHOST, which doesn't need to be populated to secondary storage
This commit is contained in:
anthony 2010-11-29 18:19:06 -08:00
parent 76b31ab7b8
commit d3325de5ae
12 changed files with 71 additions and 97 deletions

View File

@ -81,7 +81,8 @@ public class Storage {
public static enum TemplateType { public static enum TemplateType {
SYSTEM, /*routing, system vm template*/ SYSTEM, /*routing, system vm template*/
BUILTIN /*buildin template*/ BUILTIN, /*buildin template*/
PERHOST /* every host has this template, don't need to install it in secondary storage */
} }
public static enum StoragePoolType { public static enum StoragePoolType {

View File

@ -3890,25 +3890,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
public Type getType() { public Type getType() {
return com.cloud.host.Host.Type.Routing; return com.cloud.host.Host.Type.Routing;
} }
protected void getPVISO(StartupStorageCommand sscmd) {
Connection conn = getConnection();
try {
Set<VDI> vids = VDI.getByNameLabel(conn, "xs-tools.iso");
if (vids.isEmpty())
return;
VDI pvISO = vids.iterator().next();
String uuid = pvISO.getUuid(conn);
Map<String, TemplateInfo> pvISOtmlt = new HashMap<String, TemplateInfo>();
TemplateInfo tmplt = new TemplateInfo("xs-tools.iso", uuid, pvISO.getVirtualSize(conn), pvISO.getVirtualSize(conn), true, false);
pvISOtmlt.put("xs-tools", tmplt);
sscmd.setTemplateInfo(pvISOtmlt);
} catch (XenAPIException e) {
s_logger.debug("Can't get xs-tools.iso: " + e.toString());
} catch (XmlRpcException e) {
s_logger.debug("Can't get xs-tools.iso: " + e.toString());
}
}
protected boolean can_bridge_firewall() { protected boolean can_bridge_firewall() {
return false; return false;
@ -4158,8 +4139,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
StartupStorageCommand sscmd = initializeLocalSR(); StartupStorageCommand sscmd = initializeLocalSR();
if (sscmd != null) { if (sscmd != null) {
/* report pv driver iso */
getPVISO(sscmd);
return new StartupCommand[] { cmd, sscmd }; return new StartupCommand[] { cmd, sscmd };
} }

View File

@ -64,7 +64,7 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
@Column (name="size") @Column (name="size")
private long size; private long size;
@Column (name="physicalSize") @Column (name="physical_size")
private long physicalSize; private long physicalSize;
@Column (name="download_state") @Column (name="download_state")

View File

@ -262,6 +262,10 @@ public class VMTemplateVO implements VirtualMachineTemplate {
public String getUrl() { public String getUrl() {
return url; return url;
}
public void setUrl(String url) {
this.url = url;
} }
@Override @Override

View File

@ -115,6 +115,7 @@ import com.cloud.storage.GuestOSCategoryVO;
import com.cloud.storage.Snapshot; import com.cloud.storage.Snapshot;
import com.cloud.storage.Snapshot.Type; import com.cloud.storage.Snapshot.Type;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.StorageStats; import com.cloud.storage.StorageStats;
@ -1996,30 +1997,27 @@ public class ApiResponseHelper implements ResponseGenerator {
@Override @Override
public ListResponse<TemplateResponse> createIsoResponse(List<? extends VirtualMachineTemplate> isos, Long zoneId, boolean onlyReady, boolean isAdmin, Account account) { public ListResponse<TemplateResponse> createIsoResponse(List<? extends VirtualMachineTemplate> isos, Long zoneId, boolean onlyReady, boolean isAdmin, Account account) {
Map<Long, List<VMTemplateHostVO>> isoHostsMap = new HashMap<Long, List<VMTemplateHostVO>>(); Map<Long, List<VMTemplateHostVO>> isoHostsMap = new HashMap<Long, List<VMTemplateHostVO>>();
for (VirtualMachineTemplate iso : isos) {
// TODO: implement
List<VMTemplateHostVO> isoHosts = ApiDBUtils.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 = ApiDBUtils.findHostById(isoHost.getHostId());
if (!xstoolsZones.contains(Long.valueOf(host.getDataCenterId()))) {
xstoolsZones.add(Long.valueOf(host.getDataCenterId()));
xstoolsHosts.add(isoHost);
}
}
isoHostsMap.put(iso.getId(), xstoolsHosts);
} else {
isoHostsMap.put(iso.getId(), isoHosts);
}
}
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>(); ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>(); List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>();
for (VirtualMachineTemplate iso : isos) { for (VirtualMachineTemplate iso : isos) {
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.setReady(true);
isoResponse.setBootable(iso.isBootable());
isoResponse.setFeatured(iso.isFeatured());
isoResponse.setCrossZones(iso.isCrossZones());
isoResponse.setPublic(iso.isPublicTemplate());
isoResponse.setObjectName("iso");
isoResponses.add(isoResponse);
response.setResponses(isoResponses);
continue;
}
List<VMTemplateHostVO> isoHosts = isoHostsMap.get(iso.getId()); List<VMTemplateHostVO> isoHosts = isoHostsMap.get(iso.getId());
for (VMTemplateHostVO isoHost : isoHosts) { for (VMTemplateHostVO isoHost : isoHosts) {
if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) { if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) {

View File

@ -61,6 +61,7 @@ import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase; import com.cloud.resource.DiscovererBase;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
@ -474,6 +475,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
_agentMgr.registerForHostEvents(this, true, false, true); _agentMgr.registerForHostEvents(this, true, false, true);
createXsToolsISO();
return true; return true;
} }
@ -502,37 +504,26 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
return false; return false;
} }
private void createPVTemplate(long Hostid, StartupStorageCommand cmd) { private void createXsToolsISO() {
Map<String, TemplateInfo> tmplts = cmd.getTemplateInfo(); String isoName = "xs-tools.iso";
if ((tmplts != null) && !tmplts.isEmpty()) { VMTemplateVO tmplt = _tmpltDao.findByTemplateName(isoName);
TemplateInfo xenPVISO = tmplts.get("xs-tools"); Long id;
if (xenPVISO != null) { if (tmplt == null) {
VMTemplateVO tmplt = _tmpltDao.findByTemplateName(xenPVISO.getTemplateName()); id = _tmpltDao.getNextInSequence(Long.class, "id");
Long id; VMTemplateVO template = new VMTemplateVO(id, isoName, isoName, ImageFormat.ISO, true, true,
if (tmplt == null) { TemplateType.PERHOST, null, null, true, 64,
id = _tmpltDao.getNextInSequence(Long.class, "id"); Account.ACCOUNT_ID_SYSTEM, null, "xen-pv-drv-iso", false, 1, false, HypervisorType.None);
VMTemplateVO template = new VMTemplateVO(id, xenPVISO.getTemplateName(), xenPVISO.getTemplateName(), ImageFormat.ISO , true, true, null, "/opt/xensource/packages/iso/xs-tools-5.5.0.iso", null, true, 64, Account.ACCOUNT_ID_SYSTEM, null, "xen-pv-drv-iso", false, 1, false, HypervisorType.None); _tmpltDao.persist(template);
_tmpltDao.persist(template); } else {
} else { id = tmplt.getId();
id = _tmpltDao.findByTemplateName(xenPVISO.getTemplateName()).getId(); tmplt.setTemplateType(TemplateType.PERHOST);
} tmplt.setUrl(null);
_tmpltDao.update(id, tmplt);
VMTemplateHostVO tmpltHost = _vmTemplateHostDao.findByHostTemplate(Hostid, id);
if (tmpltHost == null) {
VMTemplateHostVO vmTemplateHost = new VMTemplateHostVO(Hostid, id, new Date(), 100, VMTemplateStorageResourceAssoc.Status.DOWNLOADED, null, null, null, "iso/users/2/xs-tools", null);
vmTemplateHost.setSize(xenPVISO.getSize());
_vmTemplateHostDao.persist(vmTemplateHost);
}
}
} }
} }
@Override @Override
public void processConnect(HostVO agent, StartupCommand cmd) throws ConnectionException { public void processConnect(HostVO agent, StartupCommand cmd) throws ConnectionException {
if (cmd instanceof StartupStorageCommand) {
createPVTemplate(agent.getId(), (StartupStorageCommand)cmd);
}
} }
@Override @Override

View File

@ -37,6 +37,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
@ -217,6 +218,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
TmpltsInZoneSearch = createSearchBuilder(); TmpltsInZoneSearch = createSearchBuilder();
TmpltsInZoneSearch.and("removed", TmpltsInZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL); TmpltsInZoneSearch.and("removed", TmpltsInZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
TmpltsInZoneSearch.and("avoidtype", TmpltsInZoneSearch.entity().getTemplateType(), SearchCriteria.Op.NEQ);
TmpltsInZoneSearch.join("tmpltzone", tmpltZoneSearch, tmpltZoneSearch.entity().getTemplateId(), TmpltsInZoneSearch.entity().getId(), JoinBuilder.JoinType.INNER); TmpltsInZoneSearch.join("tmpltzone", tmpltZoneSearch, tmpltZoneSearch.entity().getTemplateId(), TmpltsInZoneSearch.entity().getId(), JoinBuilder.JoinType.INNER);
tmpltZoneSearch.done(); tmpltZoneSearch.done();
TmpltsInZoneSearch.done(); TmpltsInZoneSearch.done();
@ -385,6 +387,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
@DB @DB
public List<VMTemplateVO> listAllInZone(long dataCenterId) { public List<VMTemplateVO> listAllInZone(long dataCenterId) {
SearchCriteria<VMTemplateVO> sc = TmpltsInZoneSearch.create(); SearchCriteria<VMTemplateVO> sc = TmpltsInZoneSearch.create();
sc.setParameters("avoidtype", TemplateType.PERHOST.toString());
sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId); sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId);
return listBy(sc); return listBy(sc);
} }

View File

@ -437,12 +437,6 @@ public class DownloadMonitorImpl implements DownloadMonitor {
} }
} }
for (Iterator<VMTemplateVO> i = allTemplates.iterator();i.hasNext();) {
if (i.next().getName().startsWith("xs-tools")) {
i.remove();
}
}
toBeDownloaded.addAll(allTemplates); toBeDownloaded.addAll(allTemplates);
for (VMTemplateVO tmplt: allTemplates) { for (VMTemplateVO tmplt: allTemplates) {

View File

@ -1285,7 +1285,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
throw new PermissionDeniedException(msg + ". Permission denied."); throw new PermissionDeniedException(msg + ". Permission denied.");
} }
if ((template != null) && (!template.isPublicTemplate() && (account.getId() != template.getAccountId()) && (!template.getName().startsWith("xs-tools")))) { if ((template != null) && (!template.isPublicTemplate() && (account.getId() != template.getAccountId()) && (template.getTemplateType() != TemplateType.PERHOST))) {
throw new PermissionDeniedException(msg + ". Permission denied."); throw new PermissionDeniedException(msg + ". Permission denied.");
} }

View File

@ -151,6 +151,7 @@ import com.cloud.storage.GuestOSVO;
import com.cloud.storage.SnapshotVO; import com.cloud.storage.SnapshotVO;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.StorageManager; import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateHostVO;
@ -730,34 +731,37 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
} else if (vm.getState() != State.Running) { } else if (vm.getState() != State.Running) {
return true; return true;
} }
String isoPath;
VMTemplateVO tmplt = _templateDao.findById(isoId);
if ( tmplt == null ) {
s_logger.warn("ISO: " + isoId +" does not exist");
return false;
}
// Get the path of the ISO // Get the path of the ISO
Pair<String, String> isoPathPair = _storageMgr.getAbsoluteIsoPath(isoId, vm.getDataCenterId()); Pair<String, String> isoPathPair = null;
String isoPath; if ( tmplt.getTemplateType() == TemplateType.PERHOST ) {
String isoName = _templateDao.findById(isoId).getName(); isoPath = tmplt.getName();
} else {
if (isoPathPair == null) { isoPathPair = _storageMgr.getAbsoluteIsoPath(isoId, vm.getDataCenterId());
// we can't send a null path to the ServerResource, so return false if we are unable to find the isoPath if (isoPathPair == null) {
if (isoName.startsWith("xs-tools"))
isoPath = isoName;
else {
s_logger.warn("Couldn't get absolute iso path"); s_logger.warn("Couldn't get absolute iso path");
return false; return false;
} else {
isoPath = isoPathPair.first();
} }
}
} else {
isoPath = isoPathPair.first();
}
String vmName = vm.getInstanceName(); String vmName = vm.getInstanceName();
HostVO host = _hostDao.findById(vm.getHostId()); HostVO host = _hostDao.findById(vm.getHostId());
if (host == null) if (host == null) {
return false; s_logger.warn("Host: " + vm.getHostId() +" does not exist");
return false;
}
AttachIsoCommand cmd = new AttachIsoCommand(vmName, isoPath, attach); AttachIsoCommand cmd = new AttachIsoCommand(vmName, isoPath, attach);
if(isoPathPair != null) if (isoPathPair != null) {
cmd.setStoreUrl(isoPathPair.second()); cmd.setStoreUrl(isoPathPair.second());
}
Answer a = _agentMgr.easySend(vm.getHostId(), cmd); Answer a = _agentMgr.easySend(vm.getHostId(), cmd);
return (a != null); return (a != null);
} }

View File

@ -2,7 +2,7 @@
use cloud; use cloud;
START TRANSACTION; START TRANSACTION;
DELETE FROM template_host_ref WHERE install_path LIKE '%xs-tools%'
DELETE FROM configuration where name='upgrade.url'; DELETE FROM configuration where name='upgrade.url';
DELETE FROM configuration where name='router.template.id'; DELETE FROM configuration where name='router.template.id';
INSERT INTO configuration (category, instance, component, name, value, description) INSERT INTO configuration (category, instance, component, name, value, description)
@ -15,6 +15,5 @@ UPDATE vm_template set unique_name='routing_old' where id=1;
INSERT INTO vm_template (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones) INSERT INTO vm_template (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
VALUES (10, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://download.cloud.com/releases/2.2/systemvm.vhd.bz2', 'bcc7f290f4c27ab4d0fe95d1012829ea', 0, 'SystemVM Template', 'VHD', 15, 0, 1); VALUES (10, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://download.cloud.com/releases/2.2/systemvm.vhd.bz2', 'bcc7f290f4c27ab4d0fe95d1012829ea', 0, 'SystemVM Template', 'VHD', 15, 0, 1);
Update configuration set name='storage.max.volume.size' where name='max.volume.size.mb'; Update configuration set name='storage.max.volume.size' where name='max.volume.size.mb';
ALTER TABLE `vm_instance` DROP COLUMN `group`;
COMMIT; COMMIT;

View File

@ -3,4 +3,5 @@ SET foreign_key_checks = 0;
-- --
-- Schema upgrade from 2.1 to 2.2 -- Schema upgrade from 2.1 to 2.2
-- --
ALTER TABLE `cloud`.`template_host_ref` ADD COLUMN `physicalSize` bigint unsigned NOT NULL DEFAULT 0; ALTER TABLE `cloud`.`template_host_ref` ADD COLUMN `physical_size` bigint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `vm_instance` DROP COLUMN `group`