|
20 | 20 | package com.cloud.hypervisor.kvm.resource; |
21 | 21 |
|
22 | 22 | import java.io.File; |
| 23 | +import java.io.IOException; |
| 24 | +import java.io.StringReader; |
23 | 25 | import java.util.List; |
24 | 26 |
|
| 27 | +import javax.xml.parsers.DocumentBuilder; |
| 28 | +import javax.xml.parsers.ParserConfigurationException; |
| 29 | + |
25 | 30 | import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; |
26 | 31 | import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; |
27 | 32 | import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; |
|
31 | 36 |
|
32 | 37 | import junit.framework.TestCase; |
33 | 38 | import org.apache.cloudstack.utils.qemu.QemuObject; |
| 39 | +import org.apache.cloudstack.utils.security.ParserUtils; |
34 | 40 | import org.junit.Assert; |
35 | 41 | import org.junit.Test; |
36 | 42 | import org.junit.runner.RunWith; |
37 | 43 | 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; |
38 | 48 |
|
39 | 49 | @RunWith(MockitoJUnitRunner.class) |
40 | 50 | public class LibvirtDomainXMLParserTest extends TestCase { |
@@ -386,4 +396,84 @@ public void testDomainXMLParserWithoutModelName() { |
386 | 396 | Assert.assertEquals("CPU cores count is parsed", 4, libvirtDomainXMLParser.getCpuModeDef().getCoresPerSocket()); |
387 | 397 | Assert.assertEquals("CPU threads count is parsed", 2, libvirtDomainXMLParser.getCpuModeDef().getThreadsPerCore()); |
388 | 398 | } |
| 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 | + } |
389 | 479 | } |
0 commit comments