From 7454f0f24a3dfff4d83ff7a447b19c5fff495326 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 23 Aug 2010 16:02:45 -0700 Subject: [PATCH 1/4] Incremental checkin for volume lineage --- api/src/com/cloud/storage/Volume.java | 11 +++++++ .../com/cloud/storage/StorageResource.java | 8 ++--- core/src/com/cloud/storage/VolumeVO.java | 33 ++++++++++++++++--- .../com/cloud/storage/StorageManagerImpl.java | 19 ++++++++--- setup/db/create-schema.sql | 2 ++ 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java index c7a981eeb41..f43f5a5be74 100755 --- a/api/src/com/cloud/storage/Volume.java +++ b/api/src/com/cloud/storage/Volume.java @@ -37,6 +37,9 @@ public interface Volume extends PartOf, OwnedBy, BasedOn { Destroyed } + enum SourceType { + Snapshot,DiskOffering,Template,Blank + } /** * @return the volume name */ @@ -75,4 +78,12 @@ public interface Volume extends PartOf, OwnedBy, BasedOn { Long getPoolId(); State getState(); + + SourceType getSourceType(); + + void setSourceType(SourceType sourceType); + + void setSourceId(Long sourceId); + + Long getSourceId(); } diff --git a/core/src/com/cloud/storage/StorageResource.java b/core/src/com/cloud/storage/StorageResource.java index c80509708a4..7ad29f10c83 100755 --- a/core/src/com/cloud/storage/StorageResource.java +++ b/core/src/com/cloud/storage/StorageResource.java @@ -195,7 +195,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv String path = rootdiskFolder + File.separator + "rootdisk"; long totalSize = getVolumeSize(path); - VolumeVO vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), rootdiskFolder, path, totalSize, Volume.VolumeType.ROOT); + VolumeVO vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), rootdiskFolder, path, totalSize, Volume.VolumeType.ROOT); vols.add(vol); // Get the datadisk volume @@ -203,7 +203,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv path = datadiskFolder + File.separator + datadiskName; totalSize = getVolumeSize(path); - vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), datadiskFolder, path, totalSize, Volume.VolumeType.DATADISK); + vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), datadiskFolder, path, totalSize, Volume.VolumeType.DATADISK); vols.add(vol); } @@ -216,7 +216,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv String path = getVolumeName(imagePath, null); long totalSize = getVolumeSize(path); - VolumeVO vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.ROOT); + VolumeVO vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.ROOT); vols.add(vol); @@ -225,7 +225,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv totalSize = getVolumeSize(path); - vol = new VolumeVO(null, null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.DATADISK); + vol = new VolumeVO(null, -1, -1, -1, -1, new Long(-1), null, path, totalSize, Volume.VolumeType.DATADISK); vols.add(vol); } diff --git a/core/src/com/cloud/storage/VolumeVO.java b/core/src/com/cloud/storage/VolumeVO.java index e80a02a6d1d..48ccc908c99 100755 --- a/core/src/com/cloud/storage/VolumeVO.java +++ b/core/src/com/cloud/storage/VolumeVO.java @@ -149,6 +149,13 @@ public class VolumeVO implements Volume { @Enumerated(value=EnumType.STRING) private State state; + @Column(name="source_type") + @Enumerated(value=EnumType.STRING) + Volume.SourceType sourceType; + + @Column(name="source_id") + Long sourceId; + /** * Constructor for data disk. * @param type @@ -178,8 +185,7 @@ public class VolumeVO implements Volume { } // Real Constructor - public VolumeVO(long id, VolumeType type, String name, long dcId, long domainId, long accountId, long diskOfferingId, long size) { - this.id = id; + public VolumeVO(VolumeType type, String name, long dcId, long domainId, long accountId, long diskOfferingId, long size) { this.volumeType = type; this.name = name; this.dataCenterId = dcId; @@ -212,8 +218,7 @@ public class VolumeVO implements Volume { } - public VolumeVO(Long id, String name, long dcId, long podId, long accountId, long domainId, Long instanceId, String folder, String path, long size, Volume.VolumeType vType) { - this.id = id; + public VolumeVO(String name, long dcId, long podId, long accountId, long domainId, Long instanceId, String folder, String path, long size, Volume.VolumeType vType) { this.name = name; this.accountId = accountId; this.domainId = domainId; @@ -510,4 +515,24 @@ public class VolumeVO implements Volume { public String toString() { return new StringBuilder("Vol[").append(id).append("|vm=").append(instanceId).append("|").append(volumeType).append("]").toString(); } + + @Override + public SourceType getSourceType() { + return this.sourceType; + } + + @Override + public void setSourceType(SourceType sourceType) { + this.sourceType = sourceType; + } + + @Override + public void setSourceId(Long sourceId){ + this.sourceId = sourceId; + } + + @Override + public Long getSourceId(){ + return this.sourceId; + } } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 76091274ccd..99c13301707 100644 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -102,6 +102,7 @@ import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Volume.MirrorState; +import com.cloud.storage.Volume.SourceType; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.allocator.StoragePoolAllocator; import com.cloud.storage.dao.DiskOfferingDao; @@ -233,7 +234,7 @@ public class StorageManagerImpl implements StorageManager { long deviceId = 0; Transaction txn = Transaction.currentTxn(); txn.start(); - rootVol = new VolumeVO(rootDisk.getVolumeId(), VolumeType.ROOT, rootDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), rootDisk.getDiskOfferingId(), rootDisk.getSize()); + rootVol = new VolumeVO(VolumeType.ROOT, rootDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), rootDisk.getDiskOfferingId(), rootDisk.getSize()); if (rootDisk.getTemplateId() != null) { rootVol.setTemplateId(rootDisk.getTemplateId()); } @@ -242,7 +243,7 @@ public class StorageManagerImpl implements StorageManager { rootVol = _volsDao.persist(rootVol); vols.add(rootVol); for (DiskCharacteristics dataDisk : dataDisks) { - dataVol = new VolumeVO(dataDisk.getVolumeId(), VolumeType.DATADISK, dataDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), dataDisk.getDiskOfferingId(), dataDisk.getSize()); + dataVol = new VolumeVO(VolumeType.DATADISK, dataDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), dataDisk.getDiskOfferingId(), dataDisk.getSize()); dataVol.setDeviceId(deviceId++); dataVol.setInstanceId(vm.getId()); dataVol = _volsDao.persist(dataVol); @@ -484,7 +485,7 @@ public class StorageManagerImpl implements StorageManager { // Create the Volume object and save it so that we can return it to the user Account account = _accountDao.findById(accountId); - VolumeVO volume = new VolumeVO(null, userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); + VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); volume.setPoolId(null); volume.setDataCenterId(dc.getId()); volume.setPodId(null); @@ -499,6 +500,8 @@ public class StorageManagerImpl implements StorageManager { volume.setInstanceId(null); volume.setUpdated(new Date()); volume.setStatus(AsyncInstanceCreateStatus.Creating); + volume.setSourceType(SourceType.Snapshot); + volume.setSourceId(snapshot.getId()); volume = _volsDao.persist(volume); volumeId = volume.getId(); @@ -853,18 +856,24 @@ public class StorageManagerImpl implements StorageManager { if (Storage.ImageFormat.ISO == template.getFormat()) { rootVol = new VolumeVO(VolumeType.ROOT, vm.getId(), vm.getInstanceName() + "-ROOT", dc.getId(), pod.getId(), account.getId(), account.getDomainId(),(size>0)? size : diskOffering.getDiskSizeInBytes()); rootVol.setDiskOfferingId(diskOffering.getId()); + rootVol.setSourceType(SourceType.Template); + rootVol.setSourceId(template.getId()); rootVol.setDeviceId(0l); rootVol = _volsDao.persist(rootVol); } else { rootVol = new VolumeVO(VolumeType.ROOT, vm.getId(), template.getId(), vm.getInstanceName() + "-ROOT", dc.getId(), pod.getId(), account.getId(), account.getDomainId(), offering.isRecreatable()); rootVol.setDiskOfferingId(offering.getId()); rootVol.setTemplateId(template.getId()); + rootVol.setSourceId(template.getId()); + rootVol.setSourceType(SourceType.Template); rootVol.setDeviceId(0l); rootVol = _volsDao.persist(rootVol); if (diskOffering != null && diskOffering.getDiskSizeInBytes() > 0) { dataVol = new VolumeVO(VolumeType.DATADISK, vm.getId(), vm.getInstanceName() + "-DATA", dc.getId(), pod.getId(), account.getId(), account.getDomainId(), (size>0)? size : diskOffering.getDiskSizeInBytes()); dataVol.setDiskOfferingId(diskOffering.getId()); + dataVol.setSourceType(SourceType.DiskOffering); + dataVol.setSourceId(diskOffering.getId()); dataVol.setDeviceId(1l); dataVol = _volsDao.persist(dataVol); } @@ -1572,7 +1581,7 @@ public class StorageManagerImpl implements StorageManager { // Create the Volume object and save it so that we can return it to the user Account account = _accountDao.findById(accountId); - VolumeVO volume = new VolumeVO(null, userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); + VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); volume.setPoolId(null); volume.setDataCenterId(dc.getId()); volume.setPodId(null); @@ -1585,6 +1594,8 @@ public class StorageManagerImpl implements StorageManager { volume.setUpdated(new Date()); volume.setStatus(AsyncInstanceCreateStatus.Creating); volume.setDomainId(account.getDomainId()); + volume.setSourceId(diskOffering.getId()); + volume.setSourceType(SourceType.DiskOffering); volume = _volsDao.persist(volume); AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 43098ef070c..cba1fea9f28 100644 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -250,6 +250,8 @@ CREATE TABLE `cloud`.`volumes` ( `removed` datetime COMMENT 'Date removed. not null if removed', `status` varchar(32) COMMENT 'Async API volume creation status', `state` varchar(32) COMMENT 'State machine', + `source_id` bigint unsigned COMMENT 'id for the source', + `source_type` varchar(32) COMMENT 'source from which the volume is created -- snapshot, diskoffering, template, blank', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 7f771cbe243255d74fbfe5755c0ea19d41819072 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 23 Aug 2010 16:17:18 -0700 Subject: [PATCH 2/4] bug 5883: Final checkin for volume lineage status 5853: RESOLVED FIXED --- server/src/com/cloud/api/BaseCmd.java | 2 ++ server/src/com/cloud/api/commands/ListVolumesCmd.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/api/BaseCmd.java b/server/src/com/cloud/api/BaseCmd.java index e9072b732b4..4c630bd734c 100644 --- a/server/src/com/cloud/api/BaseCmd.java +++ b/server/src/com/cloud/api/BaseCmd.java @@ -337,6 +337,8 @@ public abstract class BaseCmd { STATE("state", BaseCmd.TYPE_STRING, "state"), STOPPED_VMS("stoppedvms", BaseCmd.TYPE_LONG, "stoppedvms"), STORAGE("storage", BaseCmd.TYPE_LONG, "storage"), + SOURCE_ID("sourceid", BaseCmd.TYPE_LONG, "sourceid"), + SOURCE_TYPE("sourcetype",BaseCmd.TYPE_STRING,"sourcetype"), STORAGE_TYPE("storagetype", BaseCmd.TYPE_STRING, "storageType"), SUCCESS("success", BaseCmd.TYPE_BOOLEAN, "success"), SUM_ACROSS_ZONE("sumacrosszone", BaseCmd.TYPE_BOOLEAN, "sumAcrossZone"), diff --git a/server/src/com/cloud/api/commands/ListVolumesCmd.java b/server/src/com/cloud/api/commands/ListVolumesCmd.java index a4680be0441..b856e4eae2f 100644 --- a/server/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/server/src/com/cloud/api/commands/ListVolumesCmd.java @@ -223,7 +223,9 @@ public class ListVolumesCmd extends BaseCmd{ Long poolId = volume.getPoolId(); String poolName = (poolId == null) ? "none" : getManagementServer().findPoolById(poolId).getName(); volumeData.add(new Pair(BaseCmd.Properties.STORAGE.getName(), poolName)); - + volumeData.add(new Pair(BaseCmd.Properties.SOURCE_ID.getName(),volume.getSourceId())); + volumeData.add(new Pair(BaseCmd.Properties.SOURCE_TYPE.getName(),volume.getSourceType().toString())); + vTag[i++] = volumeData; } Pair volumeTag = new Pair("volume", vTag); From 67e1eee981dd028a9717ade05852d17b89d88604 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 23 Aug 2010 16:27:40 -0700 Subject: [PATCH 3/4] Adding to migration script --- setup/db/migration/schema-21to22.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup/db/migration/schema-21to22.sql b/setup/db/migration/schema-21to22.sql index 108ed2a9e20..dff1e91ae52 100644 --- a/setup/db/migration/schema-21to22.sql +++ b/setup/db/migration/schema-21to22.sql @@ -7,3 +7,5 @@ ALTER TABLE `cloud`.`data_center` MODIFY COLUMN `guest_network_cidr` varchar(18) ALTER TABLE `cloud`.`resource_count` ADD COLUMN `domain_id` bigint unsigned; -- add the new column ALTER TABLE `cloud`.`resource_count` MODIFY COLUMN `account_id` bigint unsigned; -- modify the column to allow NULL values ALTER TABLE `cloud`.`storage_pool` add COLUMN STATUS varchar(32) not null; -- new status column for maintenance mode support for primary storage +ALTER TABLE `cloud`.`volumes` ADD COLUMN `source_id` bigint unsigned; -- id for the source +ALTER TABLE `cloud`.`volumes` ADD COLUMN `source_type` varchar(32); --source from which the volume is created i.e. snapshot, diskoffering, template, blank From 0366dd093c63d386a882c6c26dbbd3b24c0adf4c Mon Sep 17 00:00:00 2001 From: Anthony Xu Date: Mon, 23 Aug 2010 18:01:39 -0700 Subject: [PATCH 4/4] use slaveconnection instead of masterconnection for all host plugin calls. tested by creating domr and user vm and migrating them 1. if you add host for kvm , you need specify kvm://ip_address, otherwiset there is no to differ kvm and xenserver hosts, edison cloud you please test this, may need some minor fixes. 2. if you want to session inside your plugin call, you can not use the one which is passed in, due to it is a slavesession, you need to call get_xapi_session() to get a new local session and use it. I have modified some of these, I may ignore some. Please let me know if you see XENAPI_PLUGIN_EXCEPTION. --- client/tomcatconf/components.xml.in | 1 + .../xen/resource/CitrixResourceBase.java | 39 ++++++++++++++++-- .../vm/hypervisor/xenserver/hostvmstats.py | 8 +--- scripts/vm/hypervisor/xenserver/vmops | 41 +++++++++++++++---- .../kvm/discoverer/KvmServerDiscoverer.java | 4 +- .../xen/discoverer/XcpServerDiscoverer.java | 37 ++++++++--------- 6 files changed, 89 insertions(+), 41 deletions(-) diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 986ac065f6d..ce698854bbe 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -149,6 +149,7 @@ + diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 24997f1110a..bdb4de079a1 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -3491,9 +3491,25 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected String callHostPlugin(String plugin, String cmd, String... params) { Map args = new HashMap(); + Session slaveSession = null; + Connection slaveConn = null; try { - Connection conn = getConnection(); - Host host = Host.getByUuid(conn, _host.uuid); + URL slaveUrl = null; + try { + slaveUrl = new URL("http://" + _host.ip); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + slaveConn = new Connection(slaveUrl, 10); + slaveSession = Session.slaveLocalLoginWithPassword(slaveConn, _username, _password); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Slave logon successful. session= " + slaveSession); + } + Host host = Host.getByUuid(slaveConn, _host.uuid); + + for (int i = 0; i < params.length; i += 2) { args.put(params[i], params[i + 1]); } @@ -3502,7 +3518,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args)); } - String result = host.callPlugin(conn, plugin, cmd, args); + String result = host.callPlugin(slaveConn, plugin, cmd, args); if (s_logger.isTraceEnabled()) { s_logger.trace("callHostPlugin Result: " + result); } @@ -3511,6 +3527,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.toString()); } catch (XmlRpcException e) { s_logger.debug("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + e.getMessage()); + } finally { + if( slaveSession != null) { + try { + slaveSession.localLogout(slaveConn); + } catch (Exception e) { + } + } } return null; } @@ -3979,6 +4002,10 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.debug("Can't get xs-tools.iso: " + e.toString()); } } + + protected boolean can_bridge_firewall() { + return false; + } protected boolean getHostInfo() throws IllegalArgumentException{ Connection conn = getConnection(); @@ -3998,7 +4025,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return false; } - _canBridgeFirewall = Boolean.valueOf(callHostPlugin("vmops", "can_bridge_firewall", "host_uuid", _host.uuid)); + _canBridgeFirewall = can_bridge_firewall(); Nic privateNic = getLocalNetwork(conn, name); if (privateNic == null) { @@ -4008,6 +4035,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.warn("Unable to determine the private network for host " + _host.ip); return false; } + _privateNetworkName = name; privateNic = getLocalNetwork(conn, name); if (privateNic == null) { s_logger.warn("Unable to get private network " + name); @@ -4026,6 +4054,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } } else { guestNic = privateNic; + _guestNetworkName = _privateNetworkName; } _host.guestNetwork = guestNic.nr.uuid; _host.guestPif = guestNic.pr.uuid; @@ -4039,6 +4068,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } } else { publicNic = guestNic; + _publicNetworkName = _guestNetworkName; } _host.publicPif = publicNic.pr.uuid; _host.publicNetwork = publicNic.nr.uuid; @@ -4061,6 +4091,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR _host.storagePif2 = storageNic2.pr.uuid; s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.ip); + s_logger.info("Guest Network is " + _guestNetworkName + " for host " + _host.ip); s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.ip); s_logger.info("Storage Network 1 is " + _storageNetworkName1 + " for host " + _host.ip); s_logger.info("Storage Network 2 is " + _storageNetworkName2 + " for host " + _host.ip); diff --git a/scripts/vm/hypervisor/xenserver/hostvmstats.py b/scripts/vm/hypervisor/xenserver/hostvmstats.py index 89af959db61..8aa3eede4f9 100644 --- a/scripts/vm/hypervisor/xenserver/hostvmstats.py +++ b/scripts/vm/hypervisor/xenserver/hostvmstats.py @@ -7,14 +7,8 @@ import time import logging logging.basicConfig(filename='/tmp/xapilog',level=logging.DEBUG) -def get_xapi_session(): - xapi = XenAPI.xapi_local(); - xapi.login_with_password("","") - return xapi._session - -def get_stats(collect_host_stats, consolidation_function, interval, start_time): +def get_stats(session, collect_host_stats, consolidation_function, interval, start_time): try: - session = get_xapi_session() if collect_host_stats == "true" : url = "http://localhost/rrd_updates?" diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 3ac93f4abd5..dfc0c1d168e 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -4,6 +4,7 @@ import os, sys, time import XenAPIPlugin +import XenAPI sys.path.append("/opt/xensource/sm/") import SR, VDI, SRCommand, util, lvutil from util import CommandException @@ -35,13 +36,20 @@ def echo(fn): return res return wrapped + +def get_xapi_session(): + xapi = XenAPI.xapi_local(); + xapi.login_with_password("","") + return xapi._session + @echo def gethostvmstats(session, args): collect_host_stats = args['collectHostStats'] consolidation_function = args['consolidationFunction'] interval = args['interval'] start_time = args['startTime'] - result = hostvmstats.get_stats(collect_host_stats, consolidation_function, interval, start_time) + session = get_xapi_session() + result = hostvmstats.get_stats(session, collect_host_stats, consolidation_function, interval, start_time) return result @echo @@ -454,7 +462,9 @@ def heartbeat(session, args): txt='fail' return txt -def get_private_nic(session, args): +def get_private_nic( args): + session = get_xapi_session() + vms = session.xenapi.VM.get_all() host_uuid = args.get('host_uuid') host = session.xenapi.host.get_by_uuid(host_uuid) piflist = session.xenapi.host.get_PIFs(host) @@ -481,7 +491,7 @@ def can_bridge_firewall(session, args): util.pread2(['iptables', '-D', 'FORWARD', '-j', 'RH-Firewall-1-INPUT']) except: util.SMlog('Chain BRIDGE-FIREWALL already exists') - privnic = get_private_nic(session, args) + privnic = get_private_nic(args) result = 'true' try: util.pread2(['/bin/bash', '-c', 'iptables -n -L FORWARD | grep BRIDGE-FIREWALL']) @@ -496,8 +506,8 @@ def can_bridge_firewall(session, args): if not os.path.exists('/var/run/cloud'): os.makedirs('/var/run/cloud') - cleanup_rules_for_dead_vms(session) - cleanup_rules(session) + cleanup_rules_for_dead_vms() + cleanup_rules() return result @@ -875,6 +885,8 @@ def get_rule_log_for_vm(session, vmName): def get_rule_logs_for_vms(session, args): host_uuid = args.pop('host_uuid') try: + session = get_xapi_session() + thishost = session.xenapi.host.get_by_uuid(host_uuid) hostrec = session.xenapi.host.get_record(thishost) vms = hostrec.get('resident_VMs') @@ -897,7 +909,9 @@ def get_rule_logs_for_vms(session, args): return ";".join(result) @echo -def cleanup_rules_for_dead_vms(session): +def cleanup_rules_for_dead_vms(): + try: + session = get_xapi_session() vms = session.xenapi.VM.get_all() cleaned = 0 for vm_name in [session.xenapi.VM.get_name_label(x) for x in vms]: @@ -913,9 +927,16 @@ def cleanup_rules_for_dead_vms(session): cleaned = cleaned+1 util.SMlog("Cleaned up rules for " + str(cleaned) + " vms") + except: + util.SMlog("Failed to cleanup rules for dead vms!") + + @echo -def cleanup_rules(session): +def cleanup_rules(): + try: + session = get_xapi_session() + chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2" chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n') cleaned = 0 @@ -942,6 +963,8 @@ def cleanup_rules(session): destroy_network_rules_for_vm(session, {'vmName':vmname}) util.SMlog("Cleaned up rules for " + str(len(cleanup)) + " chains") + except: + util.SMlog("Failed to cleanup rules !") @echo def check_rule_log_for_vm(vmName, vmID, vmIP, domID, signature, seqno): @@ -1005,6 +1028,8 @@ def remove_rule_log_for_vm(vmName): @echo def network_rules(session, args): + try: + session = get_xapi_session() vm_name = args.get('vmName') vmName = vm_name vm_ip = args.get('vmIP') @@ -1101,6 +1126,8 @@ def network_rules(session, args): return 'false' return 'true' + except: + util.SMlog("Failed to network rule !") diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index 19c1aea8bee..2f043069012 100644 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -99,8 +99,8 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, String password) throws DiscoveryException { Map> resources = new HashMap>(); Map details = new HashMap(); - if (!uri.getScheme().equals("http")) { - String msg = "urlString is not http so we're not taking care of the discovery for this: " + uri; + if (!uri.getScheme().equals("kvm")) { + String msg = "urlString is not kvm so we're not taking care of the discovery for this: " + uri; s_logger.debug(msg); return null; } diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index e7017710f9e..cc1fb72b343 100644 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -53,6 +53,7 @@ import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.xen.resource.CitrixResourceBase; import com.cloud.hypervisor.xen.resource.XcpServerResource; import com.cloud.hypervisor.xen.resource.XenServerConnectionPool; +import com.cloud.hypervisor.xen.resource.XenServerResource; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; import com.cloud.resource.ServerResource; @@ -170,15 +171,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L if (_hostDao.findByGuid(record.uuid) != null) { s_logger.debug("Skipping " + record.address + " because " + record.uuid + " is already in the database."); continue; - } - - - if (!checkServer(conn, dcId, podId, host, record)) { - continue; - } - + } + + CitrixResourceBase resource = createServerResource(dcId, podId, record); s_logger.info("Found host " + record.hostname + " ip=" + record.address + " product version=" + prodVersion); - CitrixResourceBase resource = createServerResource(record); Map details = new HashMap(); Map params = new HashMap(); @@ -379,22 +375,21 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L return true; } - - protected boolean checkServer(Connection conn, long dcId, Long podId, Host host, Host.Record record) { + + protected CitrixResourceBase createServerResource(long dcId, Long podId, Host.Record record) { String prodBrand = record.softwareVersion.get("product_brand").trim(); String prodVersion = record.softwareVersion.get("product_version").trim(); - if(!prodBrand.equals("XenCloudPlatform") || !prodVersion.equals("0.1.1")) { - String msg = "Only support XCP 0.1.1, but this one is " + prodBrand + " " + prodVersion; - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); - s_logger.debug(msg); - throw new RuntimeException(msg); - } - return true; - } - - protected CitrixResourceBase createServerResource(Host.Record record) { - return new XcpServerResource(); + if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1")) + return new XcpServerResource(); + + if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0")) + return new XenServerResource(); + + String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion; + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); + s_logger.debug(msg); + throw new RuntimeException(msg); } protected void serverConfig() {