diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java index 98137a3cca3..87ac50ef9a3 100644 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -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 { diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 5ce50a7296c..73f3a5d036c 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -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 vids = VDI.getByNameLabel(conn, "xs-tools.iso"); - if (vids.isEmpty()) - return; - VDI pvISO = vids.iterator().next(); - String uuid = pvISO.getUuid(conn); - Map pvISOtmlt = new HashMap(); - 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 }; } diff --git a/core/src/com/cloud/storage/VMTemplateHostVO.java b/core/src/com/cloud/storage/VMTemplateHostVO.java index 4c06593dfea..77cbe8d8dd7 100755 --- a/core/src/com/cloud/storage/VMTemplateHostVO.java +++ b/core/src/com/cloud/storage/VMTemplateHostVO.java @@ -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") diff --git a/core/src/com/cloud/storage/VMTemplateVO.java b/core/src/com/cloud/storage/VMTemplateVO.java index 39ec9196ced..0b24d70d828 100755 --- a/core/src/com/cloud/storage/VMTemplateVO.java +++ b/core/src/com/cloud/storage/VMTemplateVO.java @@ -262,6 +262,10 @@ public class VMTemplateVO implements VirtualMachineTemplate { public String getUrl() { return url; + } + + public void setUrl(String url) { + this.url = url; } @Override diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 1faa4626fc1..b6849bb3226 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -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 createIsoResponse(List isos, Long zoneId, boolean onlyReady, boolean isAdmin, Account account) { Map> isoHostsMap = new HashMap>(); - for (VirtualMachineTemplate iso : isos) { - // TODO: implement - List isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), zoneId); - if (iso.getName().equals("xs-tools.iso")) { - List xstoolsZones = new ArrayList(); - // 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 xstoolsHosts = new ArrayList(); - 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 response = new ListResponse(); List isoResponses = new ArrayList(); 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 isoHosts = isoHostsMap.get(iso.getId()); for (VMTemplateHostVO isoHost : isoHosts) { if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) { diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 80674b1529b..245ae669e89 100644 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -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 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 diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index bdd423a38e8..610f25c0a27 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -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 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 implem @DB public List listAllInZone(long dataCenterId) { SearchCriteria sc = TmpltsInZoneSearch.create(); + sc.setParameters("avoidtype", TemplateType.PERHOST.toString()); sc.setJoinParameters("tmpltzone", "zoneId", dataCenterId); return listBy(sc); } diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index f1ebe51e6fd..2cfe21e9567 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -437,12 +437,6 @@ public class DownloadMonitorImpl implements DownloadMonitor { } } - for (Iterator i = allTemplates.iterator();i.hasNext();) { - if (i.next().getName().startsWith("xs-tools")) { - i.remove(); - } - } - toBeDownloaded.addAll(allTemplates); for (VMTemplateVO tmplt: allTemplates) { diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 7b9423c3175..b9935096afe 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -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."); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 86846891986..10f876a6a81 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -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 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 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); } diff --git a/setup/db/data-21to22.sql b/setup/db/data-21to22.sql index 35b5da2e851..a13fa0a9946 100644 --- a/setup/db/data-21to22.sql +++ b/setup/db/data-21to22.sql @@ -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; diff --git a/setup/db/schema-21to22.sql b/setup/db/schema-21to22.sql index 7bf8e1339cd..ebfb3a35d3e 100644 --- a/setup/db/schema-21to22.sql +++ b/setup/db/schema-21to22.sql @@ -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`