package org.ovirt.engine.core.utils.ovf;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.BootSequence;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.businessentities.DisplayType;
import org.ovirt.engine.core.common.businessentities.OriginType;
import org.ovirt.engine.core.common.businessentities.UsbPolicy;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmInterfaceType;
import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
import org.ovirt.engine.core.common.businessentities.VmOsType;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.common.businessentities.VmType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.RefObject;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.compat.backendcompat.XmlDocument;
import org.ovirt.engine.core.compat.backendcompat.XmlNode;
import org.ovirt.engine.core.compat.backendcompat.XmlNodeList;
import org.ovirt.engine.core.utils.linq.LinqUtils;
import org.ovirt.engine.core.utils.linq.Predicate;
public class OvfVmReader extends OvfReader {
private static final String EXPORT_ONLY_PREFIX = "exportonly_";
protected VM _vm;
public OvfVmReader(XmlDocument document, VM vm, java.util.ArrayList<DiskImage> images) {
super(document, images);
_vm = vm;
}
@Override
protected void ReadOsSection(XmlNode section) {
_vm.getStaticData().setId(new Guid(section.Attributes.get("ovf:id").getValue()));
XmlNode node = section.SelectSingleNode("Description");
if (node != null) {
_vm.getStaticData().setos(VmOsType.valueOf(node.InnerText));
} else {
_vm.getStaticData().setos(VmOsType.Unassigned);
}
}
@Override
protected void ReadHardwareSection(XmlNode section) {
XmlNodeList list = section.SelectNodes("Item");
for (XmlNode node : list) {
String resourceType = node.SelectSingleNode("rasd:ResourceType", _xmlNS).InnerText;
if (StringHelper.EqOp(resourceType, OvfHardware.CPU)) {
_vm.getStaticData().setnum_of_sockets(
Integer.parseInt(node.SelectSingleNode("rasd:num_of_sockets", _xmlNS).InnerText));
_vm.getStaticData().setcpu_per_socket(
Integer.parseInt(node.SelectSingleNode("rasd:cpu_per_socket", _xmlNS).InnerText));
} else if (StringHelper.EqOp(resourceType, OvfHardware.Memory)) {
_vm.getStaticData().setmem_size_mb(
Integer.parseInt(node.SelectSingleNode("rasd:VirtualQuantity", _xmlNS).InnerText));
} else if (StringHelper.EqOp(resourceType, OvfHardware.DiskImage)) {
final Guid guid = new Guid(node.SelectSingleNode("rasd:InstanceId", _xmlNS).InnerText);
// DiskImage image = null; //LINQ _images.FirstOrDefault(img =>
// img.image_guid == guid);
DiskImage image = LinqUtils.firstOrNull(_images, new Predicate<DiskImage>() {
@Override
public boolean eval(DiskImage diskImage) {
return diskImage.getId().equals(guid);
}
});
String drive = node.SelectSingleNode("rasd:Caption", _xmlNS).InnerText;
if (drive.startsWith("Drive ")) {
image.setinternal_drive_mapping(drive.substring(6));
}
image.setimage_group_id(OvfParser.GetImageGrupIdFromImageFile(node.SelectSingleNode(
"rasd:HostResource", _xmlNS).InnerText));
if (!StringHelper.isNullOrEmpty(node.SelectSingleNode("rasd:Parent", _xmlNS).InnerText)) {
image.setParentId(new Guid(node.SelectSingleNode("rasd:Parent", _xmlNS).InnerText));
}
if (!StringHelper.isNullOrEmpty(node.SelectSingleNode("rasd:Template", _xmlNS).InnerText)) {
image.setit_guid(new Guid(node.SelectSingleNode("rasd:Template", _xmlNS).InnerText));
}
image.setappList(node.SelectSingleNode("rasd:ApplicationList", _xmlNS).InnerText);
if (!StringHelper.isNullOrEmpty(node.SelectSingleNode("rasd:StorageId", _xmlNS).InnerText)) {
image.setstorage_id(new Guid(node.SelectSingleNode("rasd:StorageId", _xmlNS).InnerText));
}
if (!StringHelper.isNullOrEmpty(node.SelectSingleNode("rasd:StoragePoolId", _xmlNS).InnerText)) {
image.setstorage_pool_id(new Guid(node.SelectSingleNode("rasd:StoragePoolId", _xmlNS).InnerText));
}
java.util.Date creationDate = new java.util.Date(0);
RefObject<java.util.Date> tempRefObject = new RefObject<java.util.Date>(creationDate);
boolean tempVar = OvfParser.UtcDateStringToLocaDate(
node.SelectSingleNode("rasd:CreationDate", _xmlNS).InnerText, tempRefObject);
creationDate = tempRefObject.argvalue;
if (tempVar) {
image.setcreation_date(creationDate);
}
java.util.Date lastModified = new java.util.Date(0);
RefObject<java.util.Date> tempRefObject2 = new RefObject<java.util.Date>(lastModified);
boolean tempVar2 = OvfParser.UtcDateStringToLocaDate(
node.SelectSingleNode("rasd:LastModified", _xmlNS).InnerText, tempRefObject2);
lastModified = tempRefObject2.argvalue;
if (tempVar2) {
image.setlastModified(lastModified);
}
java.util.Date last_modified_date = new java.util.Date(0);
RefObject<java.util.Date> tempRefObject3 = new RefObject<java.util.Date>(last_modified_date);
boolean tempVar3 = OvfParser.UtcDateStringToLocaDate(
node.SelectSingleNode("rasd:last_modified_date", _xmlNS).InnerText, tempRefObject3);
last_modified_date = tempRefObject3.argvalue;
if (tempVar3) {
image.setlast_modified_date(last_modified_date);
}
} else if (StringHelper.EqOp(resourceType, OvfHardware.Network)) {
VmNetworkInterface iface = new VmNetworkInterface();
if (!StringHelper.isNullOrEmpty(node.SelectSingleNode("rasd:ResourceSubType", _xmlNS).InnerText)) {
iface.setType(Integer.parseInt(node.SelectSingleNode("rasd:ResourceSubType", _xmlNS).InnerText));
}
iface.setNetworkName(node.SelectSingleNode("rasd:Connection", _xmlNS).InnerText);
iface.setName(node.SelectSingleNode("rasd:Name", _xmlNS).InnerText);
iface.setMacAddress((node.SelectSingleNode("rasd:MACAddress", _xmlNS) != null) ? node.SelectSingleNode(
"rasd:MACAddress", _xmlNS).InnerText : "");
iface.setSpeed((node.SelectSingleNode("rasd:speed", _xmlNS) != null) ? Integer
.parseInt(node.SelectSingleNode("rasd:speed", _xmlNS).InnerText)
: VmInterfaceType.forValue(iface.getType()).getSpeed());
_vm.getInterfaces().add(iface);
} else if (StringHelper.EqOp(resourceType, OvfHardware.USB)) {
_vm.getStaticData().setusb_policy(
UsbPolicy.valueOf(node.SelectSingleNode("rasd:UsbPolicy", _xmlNS).InnerText));
} else if (StringHelper.EqOp(resourceType, OvfHardware.Monitor)) {
_vm.getStaticData().setnum_of_monitors(
Integer.parseInt(node.SelectSingleNode("rasd:VirtualQuantity", _xmlNS).InnerText));
}
}
}
@Override
protected void ReadGeneralData() {
// General Vm
XmlNode content = _document.SelectSingleNode("//*/Content");
XmlNode node = content.SelectSingleNode("Name");
if (node != null) {
_vm.getStaticData().setvm_name(node.InnerText);
name = _vm.getStaticData().getvm_name();
}
node = content.SelectSingleNode("TemplateId");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.getStaticData().setvmt_guid(new Guid(node.InnerText));
}
}
node = content.SelectSingleNode("TemplateName");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setvmt_name(node.InnerText);
}
}
node = content.SelectSingleNode("Description");
if (node != null) {
_vm.getStaticData().setdescription(node.InnerText);
}
node = content.SelectSingleNode("Domain");
if (node != null) {
_vm.getStaticData().setdomain(node.InnerText);
}
node = content.SelectSingleNode("CreationDate");
java.util.Date creationDate = new java.util.Date(0);
RefObject<java.util.Date> tempRefObject = new RefObject<java.util.Date>(creationDate);
boolean tempVar = node != null && OvfParser.UtcDateStringToLocaDate(node.InnerText, tempRefObject);
creationDate = tempRefObject.argvalue;
if (tempVar) {
_vm.getStaticData().setcreation_date(creationDate);
}
node = content.SelectSingleNode("IsInitilized");
if (node != null) {
_vm.getStaticData().setis_initialized(Boolean.parseBoolean(node.InnerText));
}
node = content.SelectSingleNode("IsAutoSuspend");
if (node != null) {
_vm.getStaticData().setis_auto_suspend(Boolean.parseBoolean(node.InnerText));
}
node = content.SelectSingleNode("TimeZone");
if (node != null) {
_vm.getStaticData().settime_zone(node.InnerText);
}
node = content.SelectSingleNode("IsStateless");
if (node != null) {
_vm.getStaticData().setis_stateless(Boolean.parseBoolean(node.InnerText));
}
XmlNodeList list = content.SelectNodes("Section");
for (XmlNode section : list) {
String value = section.Attributes.get("xsi:type").getValue();
// C# TO JAVA CONVERTER NOTE: The following 'switch' operated on a
// string member and was converted to Java 'if-else' logic:
// switch (value)
// ORIGINAL LINE: case "ovf:OperatingSystemSection_Type":
if (StringHelper.EqOp(value, "ovf:OperatingSystemSection_Type")) {
ReadOsSection(section);
}
// ORIGINAL LINE: case "ovf:VirtualHardwareSection_Type":
else if (StringHelper.EqOp(value, "ovf:VirtualHardwareSection_Type")) {
ReadHardwareSection(section);
}
}
node = content.SelectSingleNode("Origin");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setorigin(OriginType.forValue(Integer.parseInt(node.InnerText)));
}
}
node = content.SelectSingleNode("initrd_url");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setinitrd_url((node.InnerText));
}
}
node = content.SelectSingleNode("default_boot_sequence");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setdefault_boot_sequence(BootSequence.forValue(Integer.parseInt(node.InnerText)));
}
}
node = content.SelectSingleNode("kernel_url");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setkernel_url((node.InnerText));
}
}
node = content.SelectSingleNode("kernel_params");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setkernel_params((node.InnerText));
}
}
OvfLogEventHandler<VmStatic> handler = new VMStaticOvfLogHandler(_vm.getStaticData());
// Gets a list of all the aliases of the fields that should be logged in
// ovd For each one of these fields, the proper value will be read from
// the ovf and field in vm static
List<String> aliases = handler.getAliases();
for (String alias : aliases) {
String value = readEventLogValue(content, alias);
if (!StringHelper.isNullOrEmpty(value)) {
handler.addValueForAlias(alias, value);
}
}
node = content.SelectSingleNode("app_list");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setapp_list(node.InnerText);
}
}
// if no app list in VM, get it from one of the leafs
else if(_images != null && _images.size() > 0) {
int root = GetFirstImage(_images, _images.get(0));
if (root != -1) {
for(int i=0; i<_images.size(); i++) {
int x = GetNextImage(_images, _images.get(i));
if (x == -1) {
_vm.setapp_list(_images.get(i).getappList());
}
}
} else {
_vm.setapp_list(_images.get(0).getappList());
}
}
node = content.SelectSingleNode("VmType");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setvm_type(VmType.forValue(Integer.parseInt(node.InnerText)));
}
}
node = content.SelectSingleNode("DefaultDisplayType");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setdefault_display_type(DisplayType.forValue(Integer.parseInt(node.InnerText)));
}
}
node = content.SelectSingleNode("MinAllocatedMem");
if (node != null) {
if (!StringHelper.isNullOrEmpty(node.InnerText)) {
_vm.setMinAllocatedMem(Integer.parseInt(node.InnerText));
}
}
}
// function returns the index of the image that has no parent
private static int GetFirstImage(java.util.ArrayList<DiskImage> images, DiskImage curr) {
for (int i = 0; i < images.size(); i++) {
if (curr.getParentId().equals(images.get(i).getId())) {
return i;
}
}
return -1;
}
// function returns the index of image that is it's child
private static int GetNextImage(java.util.ArrayList<DiskImage> images, DiskImage curr) {
for (int i = 0; i < images.size(); i++) {
if (images.get(i).getParentId().equals(curr.getId())) {
return i;
}
}
return -1;
}
private String readEventLogValue(XmlNode content, String name) {
StringBuilder fullNameSB = new StringBuilder(EXPORT_ONLY_PREFIX);
fullNameSB.append(name);
XmlNode node = content.SelectSingleNode(fullNameSB.toString());
if (node != null) {
return node.InnerText;
}
return null;
}
}