You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2014/11/10 10:36:45 UTC
[07/25] git commit: updated refs/heads/master to 55b6e34
fix kvm issue, for windows sever 2008, it will crash without hyperv enlightment featre enabled
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9319a4e5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9319a4e5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9319a4e5
Branch: refs/heads/master
Commit: 9319a4e5f87820fa16da67d32ae39f86b73841a7
Parents: 893eed9
Author: Edison Su <su...@gmail.com>
Authored: Thu Oct 16 12:51:11 2014 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Thu Nov 6 15:29:00 2014 -0800
----------------------------------------------------------------------
.../kvm/resource/LibvirtComputingResource.java | 26 +++++++++++++++
.../hypervisor/kvm/resource/LibvirtVMDef.java | 35 ++++++++++++++++++++
.../kvm/resource/LibvirtVMDefTest.java | 22 ++++++++++++
3 files changed, 83 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9319a4e5/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
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 9a4ae16..55b49c2 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<Integer,Integer> hostOsVersion;
private final Map <String, String> _pifs = new HashMap<String, String>();
private final Map<String, VmStats> _vmStats = new ConcurrentHashMap<String, VmStats>();
@@ -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();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9319a4e5/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
----------------------------------------------------------------------
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 bc95204..2ce2442 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<String, String> features = new HashMap<String,String>();
+ 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("<hyperv>\n");
+ for (Map.Entry<String, String> e : features.entrySet()) {
+ feaBuilder.append("<");
+ feaBuilder.append(e.getKey());
+ feaBuilder.append(" state='" + e.getValue() + "'");
+ feaBuilder.append("/>\n");
+ }
+ feaBuilder.append("</hyperv>\n");
+ return feaBuilder.toString();
+ }
+ }
+
public static class FeaturesDef {
private final List<String> _features = new ArrayList<String>();
+ 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("</features>\n");
return feaBuilder.toString();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9319a4e5/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
----------------------------------------------------------------------
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 aa7570c..ddbe256 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<Integer,Integer> hostOsVersion = new Pair<Integer,Integer>(6,5);
+ assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7));
+ hostOsVersion = new Pair<Integer,Integer>(7,1);
+ assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7));
+ }
+
}