This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push:
new 798b79f kvm: disable cpu features if feature starts with '-' (#3335)
798b79f is described below
commit 798b79fa5bd8c75af13f425a215618faaec02d89
Author: ustcweizhou <[email protected]>
AuthorDate: Mon May 27 15:13:38 2019 +0200
kvm: disable cpu features if feature starts with '-' (#3335)
When I use SandyBridge as custom cpu in my testing, vm failed to start due
to following error:
```
org.libvirt.LibvirtException: unsupported configuration: guest and host CPU
are not compatible: Host CPU does not provide required features: avx, xsave,
aes, tsc-deadline, x2apic, pclmuldq
```
With this patch, it works with the following setting in agent.properties:
```
guest.cpu.mode=custom
guest.cpu.model=SandyBridge
guest.cpu.features=-avx -xsave -aes -tsc-deadline -x2apic -pclmuldq
```
vm cpu is defined as below:
```
<cpu mode='custom' match='exact'>
<model fallback='allow'>SandyBridge</model>
<feature policy='disable' name='avx'/>
<feature policy='disable' name='xsave'/>
<feature policy='disable' name='aes'/>
<feature policy='disable' name='tsc-deadline'/>
<feature policy='disable' name='x2apic'/>
<feature policy='disable' name='pclmuldq'/>
</cpu>
```
---
.../hypervisor/kvm/resource/LibvirtVMDef.java | 6 ++++-
.../hypervisor/kvm/resource/LibvirtVMDefTest.java | 27 ++++++++++++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
index 1b37783..617c278 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
@@ -1360,7 +1360,11 @@ public class LibvirtVMDef {
if (_features != null) {
for (String feature : _features) {
- modeBuilder.append("<feature policy='require' name='" +
feature + "'/>");
+ if (feature.startsWith("-")) {
+ modeBuilder.append("<feature policy='disable' name='"
+ feature.substring(1) + "'/>");
+ } else {
+ modeBuilder.append("<feature policy='require' name='"
+ feature + "'/>");
+ }
}
}
diff --git
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
index 7d311e6..b0eaad4 100644
---
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
+++
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java
@@ -20,6 +20,8 @@
package com.cloud.hypervisor.kvm.resource;
import java.io.File;
+import java.util.Arrays;
+import java.util.List;
import java.util.Scanner;
import junit.framework.TestCase;
@@ -140,6 +142,31 @@ public class LibvirtVMDefTest extends TestCase {
}
@Test
+ public void testCpuModeDefCpuFeatures() {
+ LibvirtVMDef.CpuModeDef cpuModeDef = new LibvirtVMDef.CpuModeDef();
+ cpuModeDef.setMode("custom");
+ cpuModeDef.setModel("Nehalem");
+
+ String expected_start = "<cpu mode='custom' match='exact'><model
fallback='allow'>Nehalem</model>";
+ String expected_end = "</cpu>";
+
+ List<String> features1 = Arrays.asList("feature1", "feature2");
+ cpuModeDef.setFeatures(features1);
+ String expected1 = "<feature policy='require'
name='feature1'/><feature policy='require' name='feature2'/>";
+ assertEquals(expected_start + expected1 + expected_end,
cpuModeDef.toString());
+
+ List<String> features2 = Arrays.asList("-feature1", "-feature2");
+ cpuModeDef.setFeatures(features2);
+ String expected2 = "<feature policy='disable'
name='feature1'/><feature policy='disable' name='feature2'/>";
+ assertEquals(expected_start + expected2 + expected_end,
cpuModeDef.toString());
+
+ List<String> features3 = Arrays.asList("-feature1", "feature2");
+ cpuModeDef.setFeatures(features3);
+ String expected3 = "<feature policy='disable'
name='feature1'/><feature policy='require' name='feature2'/>";
+ assertEquals(expected_start + expected3 + expected_end,
cpuModeDef.toString());
+ }
+
+ @Test
public void testDiskDef() {
String filePath = "/var/lib/libvirt/images/disk.qcow2";
String diskLabel = "vda";