Skip to content

Commit 0eb8030

Browse files
committed
tests and changes
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 6f2d2d4 commit 0eb8030

File tree

3 files changed

+109
-24
lines changed

3 files changed

+109
-24
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ public boolean parseDomainXML(String domXML) {
391391
}
392392
extractCpuTuneDef(rootElement);
393393
extractCpuModeDef(rootElement);
394+
extractBootDef(rootElement);
394395
return true;
395396
} catch (ParserConfigurationException e) {
396397
logger.debug(e.toString());
@@ -581,28 +582,25 @@ private void extractCpuModeDef(final Element rootElement){
581582
}
582583
}
583584

584-
private void extractBootDef(final Element rootElement) {
585+
protected void extractBootDef(final Element rootElement) {
586+
bootType = GuestDef.BootType.BIOS;
587+
bootMode = GuestDef.BootMode.LEGACY;
585588
Element osElement = (Element) rootElement.getElementsByTagName("os").item(0);
586-
if (osElement != null) {
587-
NodeList loaderList = osElement.getElementsByTagName("loader");
588-
if (loaderList.getLength() > 0) {
589-
Element loader = (Element) loaderList.item(0);
590-
String type = loader.getAttribute("type");
591-
String secure = loader.getAttribute("secure");
592-
if ("pflash".equalsIgnoreCase(type) || loader.getTextContent().toLowerCase().contains("uefi")) {
593-
bootType = GuestDef.BootType.UEFI;
594-
} else {
595-
bootType = GuestDef.BootType.BIOS;
596-
}
597-
if ("yes".equalsIgnoreCase(secure)) {
598-
bootMode = GuestDef.BootMode.SECURE;
599-
} else {
600-
bootMode = GuestDef.BootMode.LEGACY;
601-
}
602-
} else {
603-
bootType = GuestDef.BootType.BIOS;
604-
bootMode = GuestDef.BootMode.LEGACY;
605-
}
589+
if (osElement == null) {
590+
return;
591+
}
592+
NodeList loaderList = osElement.getElementsByTagName("loader");
593+
if (loaderList.getLength() == 0) {
594+
return;
595+
}
596+
Element loader = (Element) loaderList.item(0);
597+
String type = loader.getAttribute("type");
598+
String secure = loader.getAttribute("secure");
599+
if ("pflash".equalsIgnoreCase(type) || loader.getTextContent().toLowerCase().contains("uefi")) {
600+
bootType = GuestDef.BootType.UEFI;
601+
}
602+
if ("yes".equalsIgnoreCase(secure)) {
603+
bootMode = GuestDef.BootMode.SECURE;
606604
}
607605
}
608606
}

plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@
2020
package com.cloud.hypervisor.kvm.resource;
2121

2222
import java.io.File;
23+
import java.io.IOException;
24+
import java.io.StringReader;
2325
import java.util.List;
2426

27+
import javax.xml.parsers.DocumentBuilder;
28+
import javax.xml.parsers.ParserConfigurationException;
29+
2530
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef;
2631
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
2732
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef;
@@ -31,10 +36,15 @@
3136

3237
import junit.framework.TestCase;
3338
import org.apache.cloudstack.utils.qemu.QemuObject;
39+
import org.apache.cloudstack.utils.security.ParserUtils;
3440
import org.junit.Assert;
3541
import org.junit.Test;
3642
import org.junit.runner.RunWith;
3743
import org.mockito.junit.MockitoJUnitRunner;
44+
import org.w3c.dom.Document;
45+
import org.w3c.dom.Element;
46+
import org.xml.sax.InputSource;
47+
import org.xml.sax.SAXException;
3848

3949
@RunWith(MockitoJUnitRunner.class)
4050
public class LibvirtDomainXMLParserTest extends TestCase {
@@ -386,4 +396,84 @@ public void testDomainXMLParserWithoutModelName() {
386396
Assert.assertEquals("CPU cores count is parsed", 4, libvirtDomainXMLParser.getCpuModeDef().getCoresPerSocket());
387397
Assert.assertEquals("CPU threads count is parsed", 2, libvirtDomainXMLParser.getCpuModeDef().getThreadsPerCore());
388398
}
399+
400+
private LibvirtDomainXMLParser parseElementFromXML(String xml) {
401+
LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser();
402+
DocumentBuilder builder;
403+
try {
404+
builder = ParserUtils.getSaferDocumentBuilderFactory().newDocumentBuilder();
405+
InputSource is = new InputSource();
406+
is.setCharacterStream(new StringReader(xml));
407+
Document doc = builder.parse(is);
408+
Element element = doc.getDocumentElement();
409+
parser.extractBootDef(element);
410+
} catch (ParserConfigurationException | IOException | SAXException e) {
411+
Assert.fail("Failed to parse XML: " + e.getMessage());
412+
}
413+
return parser;
414+
}
415+
416+
@Test
417+
public void extractBootDefParsesUEFISecureBootCorrectly() {
418+
String xml = "<domain type='kvm'>" +
419+
"<os>" +
420+
"<loader type='pflash' secure='yes'>/path/to/uefi/loader</loader>" +
421+
"</os>" +
422+
"</domain>";
423+
424+
LibvirtDomainXMLParser parser = parseElementFromXML(xml);
425+
426+
assertEquals(LibvirtVMDef.GuestDef.BootType.UEFI, parser.getBootType());
427+
assertEquals(LibvirtVMDef.GuestDef.BootMode.SECURE, parser.getBootMode());
428+
}
429+
430+
@Test
431+
public void extractBootDefParsesUEFILegacyBootCorrectly() {
432+
String xml = "<domain type='kvm'>" +
433+
"<os>" +
434+
"<loader type='pflash' secure='no'>/path/to/uefi/loader</loader>" +
435+
"</os>" +
436+
"</domain>";
437+
438+
LibvirtDomainXMLParser parser = parseElementFromXML(xml);
439+
440+
assertEquals(LibvirtVMDef.GuestDef.BootType.UEFI, parser.getBootType());
441+
assertEquals(LibvirtVMDef.GuestDef.BootMode.LEGACY, parser.getBootMode());
442+
}
443+
444+
@Test
445+
public void extractBootDefDefaultsToBIOSLegacyWhenNoLoaderPresent() {
446+
String xml = "<domain type='kvm'>" +
447+
"<os>" +
448+
"<type arch='x86_64'>hvm</type>" +
449+
"</os>" +
450+
"</domain>";
451+
452+
LibvirtDomainXMLParser parser = parseElementFromXML(xml);
453+
454+
assertEquals(LibvirtVMDef.GuestDef.BootType.BIOS, parser.getBootType());
455+
assertEquals(LibvirtVMDef.GuestDef.BootMode.LEGACY, parser.getBootMode());
456+
}
457+
458+
@Test
459+
public void extractBootDefHandlesEmptyOSSection() {
460+
String xml = "<domain type='kvm'>" +
461+
"<os></os>" +
462+
"</domain>";
463+
464+
LibvirtDomainXMLParser parser = parseElementFromXML(xml);
465+
466+
assertEquals(LibvirtVMDef.GuestDef.BootType.BIOS, parser.getBootType());
467+
assertEquals(LibvirtVMDef.GuestDef.BootMode.LEGACY, parser.getBootMode());
468+
}
469+
470+
@Test
471+
public void extractBootDefHandlesMissingOSSection() {
472+
String xml = "<domain type='kvm'></domain>";
473+
474+
LibvirtDomainXMLParser parser = parseElementFromXML(xml);
475+
476+
assertEquals(LibvirtVMDef.GuestDef.BootType.BIOS, parser.getBootType());
477+
assertEquals(LibvirtVMDef.GuestDef.BootMode.LEGACY, parser.getBootMode());
478+
}
389479
}

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,9 +1140,6 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
11401140
allDetails.put(VmDetailConstants.CPU_SPEED, String.valueOf(validatedServiceOffering.getSpeed()));
11411141
}
11421142
}
1143-
if (!template.isDeployAsIs() && unmanagedInstance.getBootType() != null) {
1144-
allDetails.put(unmanagedInstance.getBootType(), unmanagedInstance.getBootMode());
1145-
}
11461143

11471144
if (!migrateAllowed && host != null && !hostSupportsServiceOfferingAndTemplate(host, validatedServiceOffering, template)) {
11481145
throw new InvalidParameterValueException(String.format("Service offering: %s or template: %s is not compatible with host: %s of unmanaged VM: %s", serviceOffering.getUuid(), template.getUuid(), host.getUuid(), instanceName));

0 commit comments

Comments
 (0)