Skip to content

Commit d6f63ab

Browse files
committed
server,kvm: detect boot options for vm import
Fixes #11184 Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 1cbf1cd commit d6f63ab

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef;
4949
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogAction;
5050
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogModel;
51+
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.GuestDef;
5152

5253
public class LibvirtDomainXMLParser {
5354
protected Logger logger = LogManager.getLogger(getClass());
@@ -63,6 +64,8 @@ public class LibvirtDomainXMLParser {
6364
private LibvirtVMDef.CpuTuneDef cpuTuneDef;
6465
private LibvirtVMDef.CpuModeDef cpuModeDef;
6566
private String name;
67+
private GuestDef.BootType bootType;
68+
private GuestDef.BootMode bootMode;
6669

6770
public boolean parseDomainXML(String domXML) {
6871
DocumentBuilder builder;
@@ -516,6 +519,14 @@ public LibvirtVMDef.CpuModeDef getCpuModeDef() {
516519
return cpuModeDef;
517520
}
518521

522+
public GuestDef.BootType getBootType() {
523+
return bootType;
524+
}
525+
526+
public GuestDef.BootMode getBootMode() {
527+
return bootMode;
528+
}
529+
519530
private void extractCpuTuneDef(final Element rootElement) {
520531
NodeList cpuTunesList = rootElement.getElementsByTagName("cputune");
521532
if (cpuTunesList.getLength() > 0) {
@@ -569,4 +580,29 @@ private void extractCpuModeDef(final Element rootElement){
569580
}
570581
}
571582
}
583+
584+
private void extractBootDef(final Element rootElement) {
585+
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+
}
606+
}
607+
}
572608
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public String toString() {
6565
}
6666
}
6767

68-
enum BootType {
68+
public enum BootType {
6969
UEFI("UEFI"), BIOS("BIOS");
7070

7171
String _type;
@@ -80,7 +80,7 @@ public String toString() {
8080
}
8181
}
8282

83-
enum BootMode {
83+
public enum BootMode {
8484
LEGACY("LEGACY"), SECURE("SECURE");
8585

8686
String _mode;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir
135135
instance.setNics(getUnmanagedInstanceNics(parser.getInterfaces()));
136136
instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource, conn, domain.getName()));
137137
instance.setVncPassword(getFormattedVncPassword(parser.getVncPasswd()));
138+
if (parser.getBootType() != null) {
139+
instance.setBootType(parser.getBootType().toString());
140+
}
141+
if (parser.getBootMode() != null) {
142+
instance.setBootMode(parser.getBootMode().toString());
143+
}
138144

139145
return instance;
140146
} catch (Exception e) {

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

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

11421145
if (!migrateAllowed && host != null && !hostSupportsServiceOfferingAndTemplate(host, validatedServiceOffering, template)) {
11431146
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)