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 {
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 {

View File

@ -3890,25 +3890,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
public Type getType() {
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() {
return false;
@ -4158,8 +4139,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
StartupStorageCommand sscmd = initializeLocalSR();
if (sscmd != null) {
/* report pv driver iso */
getPVISO(sscmd);
return new StartupCommand[] { cmd, sscmd };
}

View File

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

View File

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

View File

@ -115,6 +115,7 @@ import com.cloud.storage.GuestOSCategoryVO;
import com.cloud.storage.Snapshot;
import com.cloud.storage.Snapshot.Type;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.StorageStats;
@ -1996,30 +1997,27 @@ public class ApiResponseHelper implements ResponseGenerator {
@Override
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>>();
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>();
List<TemplateResponse> isoResponses = new ArrayList<TemplateResponse>();
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());
for (VMTemplateHostVO isoHost : isoHosts) {
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.ServerResource;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO;
@ -474,6 +475,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
_agentMgr.registerForHostEvents(this, true, false, true);
createXsToolsISO();
return true;
}
@ -502,37 +504,26 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
return false;
}
private void createPVTemplate(long Hostid, StartupStorageCommand cmd) {
Map<String, TemplateInfo> tmplts = cmd.getTemplateInfo();
if ((tmplts != null) && !tmplts.isEmpty()) {
TemplateInfo xenPVISO = tmplts.get("xs-tools");
if (xenPVISO != null) {
VMTemplateVO tmplt = _tmpltDao.findByTemplateName(xenPVISO.getTemplateName());
Long id;
if (tmplt == null) {
id = _tmpltDao.getNextInSequence(Long.class, "id");
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);
} else {
id = _tmpltDao.findByTemplateName(xenPVISO.getTemplateName()).getId();
}
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);
}
}
private void createXsToolsISO() {
String isoName = "xs-tools.iso";
VMTemplateVO tmplt = _tmpltDao.findByTemplateName(isoName);
Long id;
if (tmplt == null) {
id = _tmpltDao.getNextInSequence(Long.class, "id");
VMTemplateVO template = new VMTemplateVO(id, isoName, isoName, ImageFormat.ISO, true, true,
TemplateType.PERHOST, null, null, true, 64,
Account.ACCOUNT_ID_SYSTEM, null, "xen-pv-drv-iso", false, 1, false, HypervisorType.None);
_tmpltDao.persist(template);
} else {
id = tmplt.getId();
tmplt.setTemplateType(TemplateType.PERHOST);
tmplt.setUrl(null);
_tmpltDao.update(id, tmplt);
}
}
@Override
public void processConnect(HostVO agent, StartupCommand cmd) throws ConnectionException {
if (cmd instanceof StartupStorageCommand) {
createPVTemplate(agent.getId(), (StartupStorageCommand)cmd);
}
}
@Override

View File

@ -37,6 +37,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.Storage;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
import com.cloud.user.Account;
import com.cloud.utils.component.Inject;
@ -217,6 +218,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
TmpltsInZoneSearch = createSearchBuilder();
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);
tmpltZoneSearch.done();
TmpltsInZoneSearch.done();
@ -385,6 +387,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
@DB
public List<VMTemplateVO> listAllInZone(long dataCenterId) {
SearchCriteria<VMTemplateVO> sc = TmpltsInZoneSearch.create();
sc.setParameters("avoidtype", TemplateType.PERHOST.toString());
sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId);
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);
for (VMTemplateVO tmplt: allTemplates) {

View File

@ -1285,7 +1285,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
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.");
}

View File

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

View File

@ -2,7 +2,7 @@
use cloud;
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='router.template.id';
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)
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';
ALTER TABLE `vm_instance` DROP COLUMN `group`;
COMMIT;

View File

@ -3,4 +3,5 @@ SET foreign_key_checks = 0;
--
-- 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`