Merge pull request #1013 from jharshman/CLOUDSTACK-9004

[4.7] CLOUDSTACK-9004: Add features to HyperVEnlightenmentFeatureDefAdd function to set vapic, spinlock and retries
Add function to get retry value
Modify toString to output appropriate XML for spinlock value if set

* pr/1013:
  CLOUDSTACK-9004: Add features to HyperVEnlightenmentFeatureDef

Signed-off-by: Daan Hoogland <daan@onecht.net>
This commit is contained in:
Daan Hoogland 2015-12-04 15:07:16 +01:00
commit 79b054ae22
2 changed files with 51 additions and 10 deletions

View File

@ -191,22 +191,57 @@ 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);
enum Enlight {
RELAX("relaxed"),
VAPIC("vapic"),
SPIN("spinlocks");
private final String featureName;
Enlight(String featureName) { this.featureName = featureName; }
String getFeatureName() { return featureName; }
static boolean isValidFeature(String featureName) {
Enlight[] enlights = Enlight.values();
for(Enlight e : enlights) {
if(e.getFeatureName().equals(featureName))
return true;
}
return false;
}
}
private final Map<String, String> features = new HashMap<String, String>();
private int retries = 4096; // set to sane default
public void setFeature(String feature, boolean on) {
if(on && Enlight.isValidFeature(feature))
setFeature(feature);
}
private void setFeature(String feature) {
features.put(feature, "on");
}
public void setRetries(int retry) {
if(retry>=retries)
retries=retry;
}
public int getRetries() {
return retries;
}
@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() + "'");
if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'");
else feaBuilder.append(" state='" + e.getValue() + "'");
feaBuilder.append("/>\n");
}
feaBuilder.append("</hyperv>\n");

View File

@ -94,16 +94,22 @@ public class LibvirtVMDefTest extends TestCase {
public void testHypervEnlightDef() {
LibvirtVMDef.FeaturesDef featuresDef = new LibvirtVMDef.FeaturesDef();
LibvirtVMDef.HyperVEnlightenmentFeatureDef hyperVEnlightenmentFeatureDef = new LibvirtVMDef.HyperVEnlightenmentFeatureDef();
hyperVEnlightenmentFeatureDef.setRelaxed(true);
hyperVEnlightenmentFeatureDef.setFeature("relaxed", true);
hyperVEnlightenmentFeatureDef.setFeature("vapic", true);
hyperVEnlightenmentFeatureDef.setFeature("spinlocks", true);
hyperVEnlightenmentFeatureDef.setRetries(8096);
featuresDef.addHyperVFeature(hyperVEnlightenmentFeatureDef);
String defs = featuresDef.toString();
assertTrue(defs.contains("relaxed"));
assertTrue(defs.contains("vapic"));
assertTrue(defs.contains("spinlocks"));
featuresDef = new LibvirtVMDef.FeaturesDef();
featuresDef.addFeatures("pae");
defs = featuresDef.toString();
assertFalse(defs.contains("relaxed"));
assertFalse(defs.contains("vapic"));
assertFalse(defs.contains("spinlocks"));
assertTrue("Windows Server 2008 R2".contains("Windows Server 2008"));
Pair<Integer,Integer> hostOsVersion = new Pair<Integer,Integer>(6,5);