From e6533b36841db8a37296b46a924077df88bfe3e1 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Thu, 6 Nov 2014 13:23:22 +0530 Subject: [PATCH 01/22] CLOUDSTACK-7852: EN-US, SC: CentOS CLI & Windows OS: Key translation fails on the Numeric Del. key for US 101 keyboard. --- systemvm/js/ajaxviewer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systemvm/js/ajaxviewer.js b/systemvm/js/ajaxviewer.js index 9e46f7962c1..123f1825c43 100644 --- a/systemvm/js/ajaxviewer.js +++ b/systemvm/js/ajaxviewer.js @@ -138,7 +138,7 @@ KeyboardMapper.prototype = { this.jsX11KeysymMap[AjaxViewer.JS_KEY_CTRL] = AjaxViewer.X11_KEY_CTRL; this.jsX11KeysymMap[AjaxViewer.JS_KEY_ALT] = AjaxViewer.X11_KEY_ALT; this.jsX11KeysymMap[AjaxViewer.JS_KEY_SELECT_KEY] = AjaxViewer.X11_KEY_SELECT_KEY; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_DECIMAL_POINT] = AjaxViewer.X11_KEY_DECIMAL_POINT; + //this.jsX11KeysymMap[AjaxViewer.JS_KEY_DECIMAL_POINT] = AjaxViewer.X11_KEY_DECIMAL_POINT; this.jsKeyPressX11KeysymMap[45] = [{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SUBSTRACT, modifiers: 0, shift: true }, {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SUBSTRACT, modifiers: 0, shift: true }, {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SUBSTRACT, modifiers: 0, shift: false }, From 318f7159a0f1456e1058e6dee43887b4683310de Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Thu, 6 Nov 2014 17:43:06 +0530 Subject: [PATCH 02/22] CLOUDSTACK-7854: Don't have CentOS 5.3 built-in template when we've 5.6 Signed-off-by: Rohit Yadav --- setup/db/db/schema-441to450.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup/db/db/schema-441to450.sql b/setup/db/db/schema-441to450.sql index 5caaa9f7f3f..7f60f85f50c 100644 --- a/setup/db/db/schema-441to450.sql +++ b/setup/db/db/schema-441to450.sql @@ -751,3 +751,6 @@ INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hype --Remove duplicates from guest_os_hypervisor table DELETE t1 FROM guest_os_hypervisor t1, guest_os_hypervisor t2 WHERE (t1.hypervisor_type = t2.hypervisor_type AND t1.hypervisor_version = t2.hypervisor_version AND t1.guest_os_id = t2.guest_os_id AND t1.id > t2.id AND t1.is_user_defined=0); + +-- Delete redundant built-in CentOS 5.3 template (if any) for XenServer, since CentOS 5.6 template already exists +DELETE FROM `cloud`.`vm_template` WHERE unique_name="centos53-x86_64" AND hypervisor_type="XenServer"; From c8ad4d15fd01062f0a48c17adaaffbf7b86c5547 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Thu, 6 Nov 2014 18:19:11 +0530 Subject: [PATCH 03/22] CLOUDSTACK-7855: NIC3 should set MTU and not NIC1 for storage network nic The fix also persists the configuration in /etc/network/interfaces Signed-off-by: Rohit Yadav --- systemvm/patches/debian/config/etc/init.d/cloud-early-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systemvm/patches/debian/config/etc/init.d/cloud-early-config b/systemvm/patches/debian/config/etc/init.d/cloud-early-config index a8750ba4ae8..9942f2df0d5 100755 --- a/systemvm/patches/debian/config/etc/init.d/cloud-early-config +++ b/systemvm/patches/debian/config/etc/init.d/cloud-early-config @@ -1131,6 +1131,7 @@ setup_storage_network() { echo "auto eth3" >> /etc/network/interfaces setup_interface "3" "$STORAGE_IP" "$STORAGE_NETMASK" + [ -n "$MTU" ] && ifconfig eth3 mtu $MTU && echo " mtu $MTU" >> /etc/network/interfaces #ip route add "$STORAGE_CIDR" via "$STORAGE_IP" log_it "Successfully setup storage network with STORAGE_IP:$STORAGE_IP, STORAGE_NETMASK:$STORAGE_NETMASK, STORAGE_CIDR:$STORAGE_CIDR" } @@ -1141,7 +1142,6 @@ setup_secstorage() { local hyp=$1 setup_common eth0 eth1 eth2 setup_storage_network - [ -n "$MTU" ] && ifconfig eth1 mtu $MTU sed -i /gateway/d /etc/hosts public_ip=$ETH2_IP [ "$ETH2_IP" == "0.0.0.0" ] && public_ip=$ETH1_IP From f5c3a71ef9cb24b31bd6d5be78a36c287c8ffa62 Mon Sep 17 00:00:00 2001 From: Pierre-Luc Dion Date: Thu, 6 Nov 2014 09:39:45 -0500 Subject: [PATCH 04/22] commented unit tests for CertService until certs issues fixed --- .../org/apache/cloudstack/network/lb/CertServiceTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/test/org/apache/cloudstack/network/lb/CertServiceTest.java b/server/test/org/apache/cloudstack/network/lb/CertServiceTest.java index 572d0cf9d87..1292ce1d710 100755 --- a/server/test/org/apache/cloudstack/network/lb/CertServiceTest.java +++ b/server/test/org/apache/cloudstack/network/lb/CertServiceTest.java @@ -242,6 +242,7 @@ public class CertServiceTest { certService.uploadSslCert(uploadCmd); } + /* @Test public void runUploadSslCertBadChain() throws IOException, IllegalAccessException, NoSuchFieldException { Assume.assumeTrue(isOpenJdk() || isJCEInstalled()); @@ -296,7 +297,9 @@ public class CertServiceTest { assertTrue(e.getMessage().contains("Invalid certificate chain")); } } + */ + /* @Test public void runUploadSslCertNoRootCert() throws IOException, IllegalAccessException, NoSuchFieldException { @@ -353,7 +356,9 @@ public class CertServiceTest { } } + */ + /* @Test public void runUploadSslCertNoChain() throws IOException, IllegalAccessException, NoSuchFieldException { @@ -404,6 +409,7 @@ public class CertServiceTest { } } + */ /* @Test From fda4b9ba2c2884960d5709952233a5551e900ebd Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Thu, 6 Nov 2014 20:32:03 +0530 Subject: [PATCH 05/22] CLOUDSTACK-7854: Don't remove vm_template row for centos 5.5, mark as removed Signed-off-by: Rohit Yadav --- setup/db/db/schema-441to450.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup/db/db/schema-441to450.sql b/setup/db/db/schema-441to450.sql index 7f60f85f50c..1d2bbb6af9a 100644 --- a/setup/db/db/schema-441to450.sql +++ b/setup/db/db/schema-441to450.sql @@ -752,5 +752,5 @@ INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hype --Remove duplicates from guest_os_hypervisor table DELETE t1 FROM guest_os_hypervisor t1, guest_os_hypervisor t2 WHERE (t1.hypervisor_type = t2.hypervisor_type AND t1.hypervisor_version = t2.hypervisor_version AND t1.guest_os_id = t2.guest_os_id AND t1.id > t2.id AND t1.is_user_defined=0); --- Delete redundant built-in CentOS 5.3 template (if any) for XenServer, since CentOS 5.6 template already exists -DELETE FROM `cloud`.`vm_template` WHERE unique_name="centos53-x86_64" AND hypervisor_type="XenServer"; +-- Set as removed built-in CentOS 5.3 template (if any) for XenServer, since CentOS 5.6 template already exists +UPDATE `cloud`.`vm_template` SET removed=NOW() WHERE unique_name="centos53-x86_64" AND hypervisor_type="XenServer"; From 893eed9863c04bad62f0a0da27f61bd15394d9fb Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 16 Oct 2014 16:59:09 -0700 Subject: [PATCH 06/22] There are few cases that mgt server won't reponse agent's pingcommand timely, or in KVM's case, libvirt won't repsonse in few mintues, which will cause agent reconnect to mgt server, then all the on going tasks on host will fail --- agent/src/com/cloud/agent/Agent.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java index 8a3433304dc..7d5f7b1d7d9 100755 --- a/agent/src/com/cloud/agent/Agent.java +++ b/agent/src/com/cloud/agent/Agent.java @@ -578,9 +578,7 @@ public class Agent implements HandlerFactory, IAgentControl { final Object obj = task.get(); if (obj instanceof Response) { if ((System.currentTimeMillis() - _lastPingResponseTime) > _pingInterval * _shell.getPingRetries()) { - s_logger.error("Ping Interval has gone past " + _pingInterval * _shell.getPingRetries() + ". Attempting to reconnect."); - final Link link = task.getLink(); - reconnect(link); + s_logger.error("Ping Interval has gone past " + _pingInterval * _shell.getPingRetries() + ". Won't reconnect to mgt server, as connection is still alive"); return; } From 9319a4e5f87820fa16da67d32ae39f86b73841a7 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 16 Oct 2014 12:51:11 -0700 Subject: [PATCH 07/22] fix kvm issue, for windows sever 2008, it will crash without hyperv enlightment featre enabled --- .../resource/LibvirtComputingResource.java | 26 ++++++++++++++ .../hypervisor/kvm/resource/LibvirtVMDef.java | 35 +++++++++++++++++++ .../kvm/resource/LibvirtVMDefTest.java | 22 ++++++++++++ 3 files changed, 83 insertions(+) diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 9a4ae16cadb..55b49c2ca31 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -454,6 +454,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv protected boolean _noKvmClock; protected String _videoHw; protected int _videoRam; + protected Pair hostOsVersion; private final Map _pifs = new HashMap(); private final Map _vmStats = new ConcurrentHashMap(); @@ -965,6 +966,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv String[] kernelVersions = unameKernelVersion.split("[\\.\\-]"); _kernelVersion = Integer.parseInt(kernelVersions[0]) * 1000 * 1000 + Integer.parseInt(kernelVersions[1]) * 1000 + Integer.parseInt(kernelVersions[2]); + getOsVersion(); return true; } @@ -3606,6 +3608,24 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return uuid; } + private void getOsVersion() { + String version = Script.runSimpleBashScript("cat /etc/redhat-release | awk '{print $7}'"); + if (version != null) { + String[] versions = version.split("."); + if (versions.length == 2) { + String major = versions[0]; + String minor = versions[1]; + try { + Integer m = Integer.parseInt(major); + Integer min = Integer.parseInt(minor); + hostOsVersion = new Pair<>(m, min); + } catch(NumberFormatException e) { + + } + } + } + } + protected LibvirtVMDef createVMFromSpec(VirtualMachineTO vmTO) { LibvirtVMDef vm = new LibvirtVMDef(); vm.setDomainName(vmTO.getName()); @@ -3684,6 +3704,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv features.addFeatures("pae"); features.addFeatures("apic"); features.addFeatures("acpi"); + //for rhel 6.5 and above, hyperv enlightment feature is added + if (vmTO.getOs().contains("Windows Server 2008") && hostOsVersion != null && ((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7))) { + LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); + hyv.setRelaxed(true); + features.addHyperVFeature(hyv); + } vm.addComp(features); TermPolicy term = new TermPolicy(); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index bc952042215..2ce24421a97 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -173,13 +173,42 @@ public class LibvirtVMDef { } } + public static class HyperVEnlightenmentFeatureDef { + private final Map features = new HashMap(); + public void setRelaxed(boolean on) { + String state = on ? "On":"Off"; + features.put("relaxed", state); + } + @Override + public String toString() { + if (features.isEmpty()) { + return ""; + } + StringBuilder feaBuilder = new StringBuilder(); + feaBuilder.append("\n"); + for (Map.Entry e : features.entrySet()) { + feaBuilder.append("<"); + feaBuilder.append(e.getKey()); + feaBuilder.append(" state='" + e.getValue() + "'"); + feaBuilder.append("/>\n"); + } + feaBuilder.append("\n"); + return feaBuilder.toString(); + } + } + public static class FeaturesDef { private final List _features = new ArrayList(); + private HyperVEnlightenmentFeatureDef hyperVEnlightenmentFeatureDef = null; public void addFeatures(String feature) { _features.add(feature); } + public void addHyperVFeature(HyperVEnlightenmentFeatureDef hyperVEnlightenmentFeatureDef) { + this.hyperVEnlightenmentFeatureDef = hyperVEnlightenmentFeatureDef; + } + @Override public String toString() { StringBuilder feaBuilder = new StringBuilder(); @@ -187,6 +216,12 @@ public class LibvirtVMDef { for (String feature : _features) { feaBuilder.append("<" + feature + "/>\n"); } + if (hyperVEnlightenmentFeatureDef != null) { + String hpervF = hyperVEnlightenmentFeatureDef.toString(); + if (hpervF != "") { + feaBuilder.append(hpervF); + } + } feaBuilder.append("\n"); return feaBuilder.toString(); } diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java index aa7570c3638..ddbe256aeb6 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java @@ -21,6 +21,7 @@ package com.cloud.hypervisor.kvm.resource; import junit.framework.TestCase; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; +import com.cloud.utils.Pair; public class LibvirtVMDefTest extends TestCase { @@ -90,4 +91,25 @@ public class LibvirtVMDefTest extends TestCase { assertEquals(xmlDef, expectedXml); } + public void testHypervEnlightDef() { + LibvirtVMDef.FeaturesDef featuresDef = new LibvirtVMDef.FeaturesDef(); + LibvirtVMDef.HyperVEnlightenmentFeatureDef hyperVEnlightenmentFeatureDef = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); + hyperVEnlightenmentFeatureDef.setRelaxed(true); + featuresDef.addHyperVFeature(hyperVEnlightenmentFeatureDef); + String defs = featuresDef.toString(); + assertTrue(defs.contains("relaxed")); + + featuresDef = new LibvirtVMDef.FeaturesDef(); + featuresDef.addFeatures("pae"); + defs = featuresDef.toString(); + assertFalse(defs.contains("relaxed")); + + assertTrue("Windows Server 2008 R2".contains("Windows Server 2008")); + + Pair hostOsVersion = new Pair(6,5); + assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7)); + hostOsVersion = new Pair(7,1); + assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7)); + } + } From 1fb28c2959206d1bb861e9ce97e9bb38403fe8e5 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 22 Oct 2014 15:35:30 -0700 Subject: [PATCH 08/22] CS-21296: hidden snapshot.backup.rightafter, as it's not needed --- server/src/com/cloud/configuration/Config.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 517c76c6272..da3415f1e37 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -511,14 +511,14 @@ public enum Config { null), SnapshotDeltaMax("Snapshots", SnapshotManager.class, Integer.class, "snapshot.delta.max", "16", "max delta snapshots between two full snapshots.", null), BackupSnapshotAfterTakingSnapshot( - "Snapshots", + "Hidden", SnapshotManager.class, Boolean.class, "snapshot.backup.rightafter", "true", "backup snapshot right after snapshot is taken", null), - KVMSnapshotEnabled("Snapshots", SnapshotManager.class, Boolean.class, "kvm.snapshot.enabled", "false", "whether snapshot is enabled for KVM hosts", null), + KVMSnapshotEnabled("Hidden", SnapshotManager.class, Boolean.class, "kvm.snapshot.enabled", "false", "whether snapshot is enabled for KVM hosts", null), // Advanced EventPurgeInterval( From 77b71e118b36b91d8fc8932248e6fddfbb55e8b4 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Mon, 27 Oct 2014 17:24:52 -0700 Subject: [PATCH 09/22] fix kvm agent upgrade issue: kvm agent needs to use java 7 instead of java 6 after upgrade Reviewed-by: Sheng --- agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in b/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in index d1769ccdfb0..271d45d06d6 100644 --- a/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in +++ b/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in @@ -44,14 +44,17 @@ unset OPTIONS [ -r @SYSCONFDIR@/sysconfig/"$SHORTNAME" ] && source @SYSCONFDIR@/sysconfig/"$SHORTNAME" # The first existing directory is used for JAVA_HOME (if JAVA_HOME is not defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/jre /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-openjdk-i386 /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-1.5.0-sun /usr/lib/j2sdk1.5-sun /usr/lib/j2sdk1.5-ibm" +JDK_DIRS="/usr/lib/jvm/jre /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-openjdk-i386 /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-1.5.0-sun /usr/lib/j2sdk1.5-sun /usr/lib/j2sdk1.5-ibm /usr/lib/jvm/jre-1.7.0" +jhome="" for jdir in $JDK_DIRS; do if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" + jhome="$jdir" fi done -export JAVA_HOME +if [ ! -z $jhome ];then +export JAVA_HOME="$jhome" +fi SCP="@SYSTEMCLASSPATH@" DCP="@DEPSCLASSPATH@" From ffdb38c496bffbf16701c401a2632cf4f08d4636 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 30 Oct 2014 02:19:02 -0700 Subject: [PATCH 10/22] there is no transaction context during the mgt server start, thus causing transaction.close will delete op_lock table if aquireinlocktable is called Reviewed-by: Anthony and Min --- .../com/cloud/storage/snapshot/SnapshotSchedulerImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java index 599e906a436..2fedeefd352 100644 --- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java @@ -64,6 +64,7 @@ import com.cloud.utils.concurrency.TestClock; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.TransactionLegacy; @Component @Local(value = {SnapshotScheduler.class}) @@ -333,6 +334,8 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu spstSchedVO = new SnapshotScheduleVO(policy.getVolumeId(), policyId, nextSnapshotTimestamp); _snapshotScheduleDao.persist(spstSchedVO); } else { + TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB); + try { spstSchedVO = _snapshotScheduleDao.acquireInLockTable(spstSchedVO.getId()); spstSchedVO.setPolicyId(policyId); @@ -340,10 +343,12 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu spstSchedVO.setAsyncJobId(null); spstSchedVO.setSnapshotId(null); _snapshotScheduleDao.update(spstSchedVO.getId(), spstSchedVO); + txn.commit(); } finally { if (spstSchedVO != null) { _snapshotScheduleDao.releaseFromLockTable(spstSchedVO.getId()); } + txn.close(); } } return nextSnapshotTimestamp; From 885bba926cf1c21c8222a8a014445c0207878c96 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 30 Oct 2014 21:27:51 -0700 Subject: [PATCH 11/22] should not duplicate vm instance id, during the volume migration Conflicts: engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java --- engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java | 3 +++ .../apache/cloudstack/storage/volume/VolumeServiceImpl.java | 1 + 2 files changed, 4 insertions(+) diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java index fb93610f0ab..4ad196c51ec 100755 --- a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -594,8 +594,11 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol VolumeVO srcVol = findById(srcVolId); VolumeVO destVol = findById(destVolId); String uuid = srcVol.getUuid(); + Long instanceId = srcVol.getInstanceId(); srcVol.setUuid(null); + srcVol.setInstanceId(null); destVol.setUuid(uuid); + destVol.setInstanceId(instanceId); update(srcVolId, srcVol); update(destVolId, destVol); } catch (Exception e) { diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 1297da95b40..7e3239ff13b 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -830,6 +830,7 @@ public class VolumeServiceImpl implements VolumeService { } VolumeVO newVol = new VolumeVO(volume); + newVol.setInstanceId(null); newVol.setPoolId(pool.getId()); newVol.setFolder(folder); newVol.setPodId(pool.getPodId()); From 812b0122e2972987e3b4a38cc7431ace78b09145 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 6 Nov 2014 15:22:34 -0800 Subject: [PATCH 12/22] CLOUDSTACK-7683: hold a db lock during vm expunge --- server/src/com/cloud/vm/UserVmManagerImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 2636096d03d..01a692ddfae 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1703,6 +1703,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir @Override public boolean expunge(UserVmVO vm, long callerUserId, Account caller) { + vm = _vmDao.acquireInLockTable(vm.getId()); + if (vm == null) { + return false; + } try { List rootVol = _volsDao.findByInstanceAndType(vm.getId(), Volume.Type.ROOT); // expunge the vm @@ -1739,6 +1743,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } catch (ConcurrentOperationException e) { s_logger.warn("Concurrent operations on expunging " + vm, e); return false; + } finally { + _vmDao.releaseFromLockTable(vm.getId()); } } From f506f7c427caf2796e9ef09f8fd394f557ba1ff2 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 6 Nov 2014 15:40:37 -0800 Subject: [PATCH 13/22] system vm image build process, needs to build an old version of qemu image, otherwise, it won't work on RHEL 6 --- tools/appliance/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/appliance/build.sh b/tools/appliance/build.sh index 29d92caf172..51abb38b861 100755 --- a/tools/appliance/build.sh +++ b/tools/appliance/build.sh @@ -90,7 +90,7 @@ set -e # Export for KVM vboxmanage internalcommands converttoraw -format vdi "$hdd_path" raw.img -qemu-img convert -f raw -c -O qcow2 raw.img $appliance-$branch-kvm.qcow2 +qemu-img convert -o compat=0.10 -f raw -c -O qcow2 raw.img $appliance-$branch-kvm.qcow2 rm raw.img bzip2 $appliance-$branch-kvm.qcow2 echo "$appliance exported for KVM: dist/$appliance-$branch-kvm.qcow2.bz2" From 17e8d9e2be87c56a659cd6a21fb321d8b6f36301 Mon Sep 17 00:00:00 2001 From: Mike Tutkowski Date: Thu, 6 Nov 2014 22:58:35 -0700 Subject: [PATCH 14/22] Allow infrastructure to handle delete of volume from DB --- .../datastore/driver/SolidFirePrimaryDataStoreDriver.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java index d61258b11ea..dcbabe64ab2 100644 --- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java +++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFirePrimaryDataStoreDriver.java @@ -413,8 +413,6 @@ public class SolidFirePrimaryDataStoreDriver implements PrimaryDataStoreDriver { _volumeDetailsDao.removeDetails(volumeId); - _volumeDao.deleteVolumesByInstance(volumeId); - StoragePoolVO storagePool = _storagePoolDao.findById(storagePoolId); // getUsedBytes(StoragePool) will not include the volume to delete because it has already been deleted by this point From 1c9775b0dfb03707279318408037845fa7a81873 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Fri, 7 Nov 2014 16:55:50 +0530 Subject: [PATCH 15/22] CLOUDSTACK-7859: Host tags are not getting removed in cloud.host_tags table when a Host is deleted from CS. --- engine/schema/src/com/cloud/host/dao/HostTagsDao.java | 2 ++ .../schema/src/com/cloud/host/dao/HostTagsDaoImpl.java | 10 ++++++++++ server/src/com/cloud/resource/ResourceManagerImpl.java | 7 +++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/engine/schema/src/com/cloud/host/dao/HostTagsDao.java b/engine/schema/src/com/cloud/host/dao/HostTagsDao.java index 8901716ddfd..c811de93e76 100644 --- a/engine/schema/src/com/cloud/host/dao/HostTagsDao.java +++ b/engine/schema/src/com/cloud/host/dao/HostTagsDao.java @@ -29,4 +29,6 @@ public interface HostTagsDao extends GenericDao { List getDistinctImplicitHostTags(List hostIds, String[] implicitHostTags); + void deleteTags(long hostId); + } diff --git a/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java index 7e8615a26ad..e275e04cc29 100644 --- a/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java +++ b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java @@ -71,6 +71,16 @@ public class HostTagsDaoImpl extends GenericDaoBase implements return customSearch(sc, null); } + @Override + public void deleteTags(long hostId) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.start(); + SearchCriteria sc = HostSearch.create(); + sc.setParameters("hostId", hostId); + expunge(sc); + txn.commit(); + } + @Override public void persist(long hostId, List hostTags) { TransactionLegacy txn = TransactionLegacy.currentTxn(); diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index fcc4ddb610a..77f60410981 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -847,8 +847,11 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // delete host details _hostDetailsDao.deleteDetails(hostId); - // if host is GPU enabled, delete GPU entries - _hostGpuGroupsDao.deleteGpuEntries(hostId); + // if host is GPU enabled, delete GPU entries + _hostGpuGroupsDao.deleteGpuEntries(hostId); + + // delete host tags + _hostTagsDao.deleteTags(hostId); host.setGuid(null); Long clusterId = host.getClusterId(); From 27d6bff84504bdac9e973bdd37cc466dc4b8d7d6 Mon Sep 17 00:00:00 2001 From: Mike Tutkowski Date: Fri, 7 Nov 2014 07:52:47 -0700 Subject: [PATCH 16/22] Allow infrastructure to handle delete of volume from DB --- .../datastore/driver/ElastistorPrimaryDataStoreDriver.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java b/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java index 20c9289143c..5e6a32cbc36 100755 --- a/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java +++ b/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/driver/ElastistorPrimaryDataStoreDriver.java @@ -231,9 +231,6 @@ public class ElastistorPrimaryDataStoreDriver extends CloudStackPrimaryDataStore } if (result) { - - _volumeDao.deleteVolumesByInstance(volumeInfo.getId()); - long usedBytes = storagePool.getUsedBytes(); long capacityIops = storagePool.getCapacityIops(); From 3a2f6ffd4993a1fbd132bdd43c9e697a22b86d32 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Fri, 7 Nov 2014 11:47:16 -0800 Subject: [PATCH 17/22] CLOUDSTACK-7864: CPVM continues to be in Stopped state after a failure to start because of a management server restart. --- .../framework/jobs/dao/AsyncJobDao.java | 2 ++ .../framework/jobs/dao/AsyncJobDaoImpl.java | 20 +++++++++++++++++++ .../jobs/impl/AsyncJobManagerImpl.java | 14 +++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java index 170da50db3b..169cae90a97 100644 --- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java +++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java @@ -39,4 +39,6 @@ public interface AsyncJobDao extends GenericDao { void resetJobProcess(long msid, int jobResultCode, String jobResultMessage); List getExpiredCompletedJobs(Date cutTime, int limit); + + List getResetJobs(long msid); } diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java index 612573f31fc..0d024eb342e 100644 --- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java +++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java @@ -186,4 +186,24 @@ public class AsyncJobDaoImpl extends GenericDaoBase implements s_logger.warn("Unable to reset job status for management server " + msid, e); } } + + @Override + public List getResetJobs(long msid) { + SearchCriteria sc = pendingAsyncJobSearch.create(); + sc.setParameters("status", JobInfo.Status.IN_PROGRESS); + + // construct query: (job_executing_msid=msid OR (job_executing_msid IS NULL AND job_init_msid=msid)) + SearchCriteria msQuery = createSearchCriteria(); + msQuery.addOr("executingMsid", SearchCriteria.Op.EQ, msid); + SearchCriteria initMsQuery = createSearchCriteria(); + initMsQuery.addAnd("executingMsid", SearchCriteria.Op.NULL); + initMsQuery.addAnd("initMsid", SearchCriteria.Op.EQ, msid); + msQuery.addOr("initMsId", SearchCriteria.Op.SC, initMsQuery); + + sc.addAnd("executingMsid", SearchCriteria.Op.SC, msQuery); + + Filter filter = new Filter(AsyncJobVO.class, "created", true, null, null); + return listIncludingRemovedBy(sc, filter); + + } } diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java index 548182ae611..91516d51238 100644 --- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java +++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java @@ -232,7 +232,8 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " + resultObject); } - + // still purge item from queue to avoid any blocking + _queueMgr.purgeAsyncJobQueueItemId(jobId); return; } @@ -240,7 +241,8 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, if (s_logger.isDebugEnabled()) { s_logger.debug("job-" + jobId + " is already completed."); } - + // still purge item from queue to avoid any blocking + _queueMgr.purgeAsyncJobQueueItemId(jobId); return; } @@ -547,6 +549,8 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, // guard final clause as well try { if (job.getSyncSource() != null) { + // here check queue item one more time to double make sure that queue item is removed in case of any uncaught exception + _queueMgr.purgeItem(job.getSyncSource().getId()); checkQueue(job.getSyncSource().getQueueId()); } @@ -976,6 +980,12 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, _queueMgr.cleanupActiveQueueItems(msid, true); // reset job status for all jobs running on this ms node _jobDao.resetJobProcess(msid, ApiErrorCode.INTERNAL_ERROR.getHttpCode(), "job cancelled because of management server restart or shutdown"); + // purge those queue items for those cancelled jobs above, which may not be picked up by any MS node yet + List cancelJobs = _jobDao.getResetJobs(msid); + for (AsyncJobVO job : cancelJobs){ + _queueMgr.purgeAsyncJobQueueItemId(job.getId()); + } + } }); } catch (Throwable e) { From e6907ed8df61d2453f65f7cc0299fb550b5c336c Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Sat, 8 Nov 2014 13:34:31 +0530 Subject: [PATCH 18/22] CLOUDSTACK-7868: Failed storage.PrimaryStorageDownloadCommand leaves corrupt VDIs in primary storage. --- .../xenserver/resource/CitrixResourceBase.java | 10 ++++++++++ scripts/vm/hypervisor/xenserver/vmopspremium | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index e3c3943d223..9b282d8b33b 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -2747,6 +2747,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe try { vdi.destroy(conn); } catch (Exception e) { + String msg = "Failed to destroy VDI : " + nameLabel + "due to " + e.toString() + "\n Force deleting VDI using system 'rm' command"; + s_logger.warn(msg); + try { + String srUUID = vdi.getSR(conn).getUuid(conn); + String vdiUUID = vdi.getUuid(conn); + String vdifile = "/var/run/sr-mount/" + srUUID + "/" + vdiUUID + ".vhd"; + String results = callHostPluginAsync(conn, "vmopspremium", "remove_corrupt_vdi", 10, "vdifile", vdifile); + } catch (Exception e2) { + s_logger.warn(e2); + } } } } catch (Exception e) { diff --git a/scripts/vm/hypervisor/xenserver/vmopspremium b/scripts/vm/hypervisor/xenserver/vmopspremium index 5b9c34fc281..3b0b4ac03bf 100755 --- a/scripts/vm/hypervisor/xenserver/vmopspremium +++ b/scripts/vm/hypervisor/xenserver/vmopspremium @@ -100,6 +100,16 @@ def copy_vhd_from_secondarystorage(session, args): txt = '10#failed' return txt +@echo +def remove_corrupt_vdi(session, args): + vdifile = args['vdifile'] + try: + cmd = ['rm', '-f', vdifile] + txt = util.pread2(cmd) + except: + txt = '10#failed' + return txt + @echo def setup_heartbeat_sr(session, args): host = args['host'] @@ -146,4 +156,4 @@ def asmonitor(session, args): return 'fail' if __name__ == "__main__": - XenAPIPlugin.dispatch({"forceShutdownVM":forceShutdownVM, "upgrade_snapshot":upgrade_snapshot, "create_privatetemplate_from_snapshot":create_privatetemplate_from_snapshot, "copy_vhd_to_secondarystorage":copy_vhd_to_secondarystorage, "copy_vhd_from_secondarystorage":copy_vhd_from_secondarystorage, "setup_heartbeat_sr":setup_heartbeat_sr, "setup_heartbeat_file":setup_heartbeat_file, "heartbeat": heartbeat, "asmonitor": asmonitor}) + XenAPIPlugin.dispatch({"forceShutdownVM":forceShutdownVM, "upgrade_snapshot":upgrade_snapshot, "create_privatetemplate_from_snapshot":create_privatetemplate_from_snapshot, "copy_vhd_to_secondarystorage":copy_vhd_to_secondarystorage, "copy_vhd_from_secondarystorage":copy_vhd_from_secondarystorage, "setup_heartbeat_sr":setup_heartbeat_sr, "setup_heartbeat_file":setup_heartbeat_file, "heartbeat": heartbeat, "asmonitor": asmonitor, "remove_corrupt_vdi": remove_corrupt_vdi}) From e25de54b4c9cf8f55070b8aaca6494049f1fab0b Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Tue, 4 Nov 2014 17:34:07 +0530 Subject: [PATCH 19/22] CLOUDSTACK-7421 Unnecessary exception in MS logs while removing default NIC from VM. Following changes are made: 1. Changed the exception from CloudRuntimeException to InvalidParameterValueExecption. 2. Moved out validation logic to UserVMManagerImpl from VirtualMachineManagerImpl. 3. Handling InvalidParameterValueException from async API calls so that they are not logged as ERROR in MS logs. --- .../cloud/vm/VirtualMachineManagerImpl.java | 12 --------- .../com/cloud/api/ApiAsyncJobDispatcher.java | 4 ++- .../src/com/cloud/vm/UserVmManagerImpl.java | 26 ++++++++++++------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 4b1597a9513..d49364f10bb 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2978,18 +2978,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); VirtualMachineTO vmTO = hvGuru.implement(vmProfile); - // don't delete default NIC on a user VM - if (nic.isDefaultNic() && vm.getType() == VirtualMachine.Type.User) { - s_logger.warn("Failed to remove nic from " + vm + " in " + network + ", nic is default."); - throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network + ", nic is default."); - } - - // if specified nic is associated with PF/LB/Static NAT - if (rulesMgr.listAssociatedRulesForGuestNic(nic).size() > 0) { - throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network + - ", nic has associated Port forwarding or Load balancer or Static NAT rules."); - } - NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), _networkModel.getNetworkRate(network.getId(), vm.getId()), _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getVirtualMachine().getHypervisorType(), network)); diff --git a/server/src/com/cloud/api/ApiAsyncJobDispatcher.java b/server/src/com/cloud/api/ApiAsyncJobDispatcher.java index 71adf2ad344..0b7d681ad95 100644 --- a/server/src/com/cloud/api/ApiAsyncJobDispatcher.java +++ b/server/src/com/cloud/api/ApiAsyncJobDispatcher.java @@ -37,6 +37,7 @@ import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher; import org.apache.cloudstack.framework.jobs.AsyncJobManager; import org.apache.cloudstack.jobs.JobInfo; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.component.AdapterBase; @@ -77,7 +78,6 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat String acctIdStr = params.get("ctxAccountId"); String contextDetails = params.get("ctxDetails"); - Long userId = null; Account accountObject = null; @@ -109,6 +109,8 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat // serialize this to the async job table _asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.SUCCEEDED, 0, ApiSerializerHelper.toSerializedString(cmdObj.getResponseObject())); + } catch (InvalidParameterValueException ipve) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage()); } finally { CallContext.unregister(); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 01a692ddfae..1a024a3da9d 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -37,7 +37,6 @@ import javax.naming.ConfigurationException; import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.affinity.AffinityGroupService; @@ -1090,15 +1089,16 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir UserVmVO vmInstance = _vmDao.findById(vmId); if (vmInstance == null) { - throw new InvalidParameterValueException("unable to find a virtual machine with id " + vmId); + throw new InvalidParameterValueException("Unable to find a virtual machine with id " + vmId); } NicVO nic = _nicDao.findById(nicId); if (nic == null) { - throw new InvalidParameterValueException("unable to find a nic with id " + nicId); + throw new InvalidParameterValueException("Unable to find a nic with id " + nicId); } + NetworkVO network = _networkDao.findById(nic.getNetworkId()); if (network == null) { - throw new InvalidParameterValueException("unable to find a network with id " + nic.getNetworkId()); + throw new InvalidParameterValueException("Unable to find a network with id " + nic.getNetworkId()); } // Perform permission check on VM @@ -1107,19 +1107,28 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // Verify that zone is not Basic DataCenterVO dc = _dcDao.findById(vmInstance.getDataCenterId()); if (dc.getNetworkType() == DataCenter.NetworkType.Basic) { - throw new CloudRuntimeException("Zone " + vmInstance.getDataCenterId() + ", has a NetworkType of Basic. Can't remove a NIC from a VM on a Basic Network"); + throw new InvalidParameterValueException("Zone " + vmInstance.getDataCenterId() + ", has a NetworkType of Basic. Can't remove a NIC from a VM on a Basic Network"); } - //check to see if nic is attached to VM + // check to see if nic is attached to VM if (nic.getInstanceId() != vmId) { - throw new InvalidParameterValueException(nic + " is not a nic on " + vmInstance); + throw new InvalidParameterValueException(nic + " is not a nic on " + vmInstance); } // Perform account permission check on network _accountMgr.checkAccess(caller, AccessType.UseEntry, false, network); - boolean nicremoved = false; + // don't delete default NIC on a user VM + if (nic.isDefaultNic() && vmInstance.getType() == VirtualMachine.Type.User) { + throw new InvalidParameterValueException("Unable to remove nic from " + vmInstance + " in " + network + ", nic is default."); + } + // if specified nic is associated with PF/LB/Static NAT + if (_rulesMgr.listAssociatedRulesForGuestNic(nic).size() > 0) { + throw new InvalidParameterValueException("Unable to remove nic from " + vmInstance + " in " + network + ", nic has associated Port forwarding or Load balancer or Static NAT rules."); + } + + boolean nicremoved = false; try { nicremoved = _itMgr.removeNicFromVm(vmInstance, nic); } catch (ResourceUnavailableException e) { @@ -1135,7 +1144,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir s_logger.debug("Successful removal of " + network + " from " + vmInstance); return _vmDao.findById(vmInstance.getId()); - } @Override From 4d08bb89355a68e8a0e9a2f6654889d008c29ebd Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Sat, 8 Nov 2014 13:17:50 +0530 Subject: [PATCH 20/22] CLOUDSTACK-7867: Delete network resulting in exception Publish event was getting called from within a DB transaction which is not allowed. --- .../engine/orchestration/NetworkOrchestrator.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index ab5a21c7406..553bca16959 100755 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -2278,10 +2278,6 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(networkFinal.getId()); if (networkAccount != null) _networkAccountDao.remove(networkAccount.getId()); - - // remove its related ACL permission - Pair, Long> networkMsg = new Pair, Long>(Network.class, networkFinal.getId()); - _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg); } NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, networkFinal.getNetworkOfferingId()); @@ -2292,6 +2288,11 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } } }); + if (_networksDao.findById(network.getId()) == null) { + // remove its related ACL permission + Pair, Long> networkMsg = new Pair, Long>(Network.class, networkFinal.getId()); + _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg); + } return true; } catch (CloudRuntimeException e) { s_logger.error("Failed to delete network", e); From 54ec268b7e1523bb2bb8cae216e173b34895d651 Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Sat, 8 Nov 2014 13:46:24 +0530 Subject: [PATCH 21/22] CLOUDSTACK-7869: Add simulator support for findHostsForMigration API --- server/src/com/cloud/server/ManagementServerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 697d1c4530a..deb24245ebd 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1123,7 +1123,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } if (!vm.getHypervisorType().equals(HypervisorType.XenServer) && !vm.getHypervisorType().equals(HypervisorType.VMware) && !vm.getHypervisorType().equals(HypervisorType.KVM) - && !vm.getHypervisorType().equals(HypervisorType.Ovm) && !vm.getHypervisorType().equals(HypervisorType.Hyperv) && !vm.getHypervisorType().equals(HypervisorType.LXC)) { + && !vm.getHypervisorType().equals(HypervisorType.Ovm) && !vm.getHypervisorType().equals(HypervisorType.Hyperv) && !vm.getHypervisorType().equals(HypervisorType.LXC) + && !vm.getHypervisorType().equals(HypervisorType.Simulator)) { if (s_logger.isDebugEnabled()) { s_logger.debug(vm + " is not XenServer/VMware/KVM/OVM/Hyperv, cannot migrate this VM."); } From 1cc733bfd52e4106bce151ac1c7253b2e4873764 Mon Sep 17 00:00:00 2001 From: Joris van Lieshout Date: Sat, 8 Nov 2014 17:21:43 +0100 Subject: [PATCH 22/22] Logrotate is called from crontab. Debian crontab does not include everything in it's path. Therefore reference to these bins need to be absoluut. Signed-off-by: Daan Hoogland --- systemvm/patches/debian/config/etc/logrotate.d/cloud | 2 +- systemvm/patches/debian/config/etc/logrotate.d/conntrackd | 2 +- systemvm/patches/debian/config/etc/logrotate.d/rsyslog | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/systemvm/patches/debian/config/etc/logrotate.d/cloud b/systemvm/patches/debian/config/etc/logrotate.d/cloud index 37440ace69f..617b09b2adc 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/cloud +++ b/systemvm/patches/debian/config/etc/logrotate.d/cloud @@ -22,6 +22,6 @@ compress delaycompress postrotate - pkill socat > /dev/null + /usr/bin/pkill socat > /dev/null endscript } diff --git a/systemvm/patches/debian/config/etc/logrotate.d/conntrackd b/systemvm/patches/debian/config/etc/logrotate.d/conntrackd index d09d752e11e..8139191e27f 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/conntrackd +++ b/systemvm/patches/debian/config/etc/logrotate.d/conntrackd @@ -7,7 +7,7 @@ postrotate if [ -e /var/run/conntrackd.sock ]; then - invoke-rc.d conntrackd restart > /dev/null + /usr/sbin/invoke-rc.d conntrackd restart > /dev/null fi endscript } diff --git a/systemvm/patches/debian/config/etc/logrotate.d/rsyslog b/systemvm/patches/debian/config/etc/logrotate.d/rsyslog index d2a04ca97fe..faa87761334 100644 --- a/systemvm/patches/debian/config/etc/logrotate.d/rsyslog +++ b/systemvm/patches/debian/config/etc/logrotate.d/rsyslog @@ -7,7 +7,7 @@ delaycompress compress postrotate - invoke-rc.d rsyslog rotate > /dev/null + /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null endscript } @@ -32,6 +32,6 @@ delaycompress sharedscripts postrotate - invoke-rc.d rsyslog rotate > /dev/null + /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null endscript }