package org.ovirt.engine.core.utils.ovf; import java.util.Map; import org.ovirt.engine.core.common.businessentities.DiskImage; 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.VmStatic; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Match; import org.ovirt.engine.core.compat.RefObject; import org.ovirt.engine.core.compat.Regex; import org.ovirt.engine.core.compat.RegexOptions; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.compat.backendcompat.XmlDocument; public class OvfVmWriter extends OvfWriter { private static final String EXPORT_ONLY_PREFIX = "exportonly_"; protected VM _vm; public OvfVmWriter(RefObject<XmlDocument> document, VM vm, java.util.ArrayList<DiskImage> images) { super(document, images); _vm = vm; } @Override protected void WriteGeneralData() { _writer.WriteStartElement("Name"); _writer.WriteRaw(_vm.getStaticData().getvm_name()); _writer.WriteEndElement(); _writer.WriteStartElement("TemplateId"); _writer.WriteRaw(_vm.getStaticData().getvmt_guid().toString()); _writer.WriteEndElement(); _writer.WriteStartElement("TemplateName"); _writer.WriteRaw(_vm.getvmt_name().toString()); _writer.WriteEndElement(); _writer.WriteStartElement("Description"); _writer.WriteRaw(_vm.getStaticData().getdescription()); _writer.WriteEndElement(); _writer.WriteStartElement("Domain"); _writer.WriteRaw(_vm.getStaticData().getdomain()); _writer.WriteEndElement(); _writer.WriteStartElement("CreationDate"); _writer.WriteRaw(OvfParser.LocalDateToUtcDateString(_vm.getStaticData().getcreation_date())); _writer.WriteEndElement(); _writer.WriteStartElement("IsInitilized"); _writer.WriteRaw((new Boolean(_vm.getStaticData().getis_initialized())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("IsAutoSuspend"); _writer.WriteRaw((new Boolean(_vm.getStaticData().getis_auto_suspend())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("TimeZone"); _writer.WriteRaw(_vm.getStaticData().gettime_zone()); _writer.WriteEndElement(); _writer.WriteStartElement("IsStateless"); _writer.WriteRaw((new Boolean(_vm.getStaticData().getis_stateless())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("Origin"); _writer.WriteRaw((new Integer(_vm.getorigin().getValue())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("default_boot_sequence"); _writer.WriteRaw((new Integer(_vm.getdefault_boot_sequence().getValue())).toString()); _writer.WriteEndElement(); if (!StringHelper.isNullOrEmpty(_vm.getinitrd_url())) { _writer.WriteStartElement("initrd_url"); _writer.WriteRaw(_vm.getinitrd_url()); _writer.WriteEndElement(); } if (!StringHelper.isNullOrEmpty(_vm.getkernel_url())) { _writer.WriteStartElement("kernel_url"); _writer.WriteRaw(_vm.getkernel_url()); _writer.WriteEndElement(); } if (!StringHelper.isNullOrEmpty(_vm.getkernel_params())) { _writer.WriteStartElement("kernel_params"); _writer.WriteRaw(_vm.getkernel_params()); _writer.WriteEndElement(); } if (!StringHelper.isNullOrEmpty(_vm.getapp_list())) { _writer.WriteStartElement("app_list"); _writer.WriteRaw(_vm.getapp_list()); _writer.WriteEndElement(); } _writer.WriteStartElement("VmType"); _writer.WriteRaw((new Integer(_vm.getvm_type().getValue())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("DefaultDisplayType"); _writer.WriteRaw((new Integer(_vm.getdefault_display_type().getValue())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("MinAllocatedMem"); _writer.WriteRaw((new Integer(_vm.getMinAllocatedMem())).toString()); _writer.WriteEndElement(); OvfLogEventHandler<VmStatic> handler = new VMStaticOvfLogHandler(_vm.getStaticData()); // Gets a map that its keys are aliases to fields that should be OVF // logged. Map<String, String> aliasesValuesMap = handler.getAliasesValuesMap(); for (Map.Entry<String, String> entry : aliasesValuesMap.entrySet()) { writeLogEvent(entry.getKey(), entry.getValue()); } } private void writeLogEvent(String name, String value) { StringBuilder fullNameSB = new StringBuilder(EXPORT_ONLY_PREFIX); fullNameSB.append(name); _writer.WriteStartElement(fullNameSB.toString()); _writer.WriteRaw(value); _writer.WriteEndElement(); } @Override protected void WriteAppList() { if (_images.size() > 0) { if (StringHelper.isNullOrEmpty(_images.get(0).getappList())) { return; } String[] apps = _images.get(0).getappList().split("[,]", -1); for (String app : apps) { String product = app; String version = ""; Match match = Regex.Match(app, "(.*) ([0-9.]+)", RegexOptions.Singleline | RegexOptions.IgnoreCase); if (match.Groups().size() > 1) { product = match.Groups().get(1).getValue(); // match.Groups[1].getValue(); } if (match.Groups().size() > 2) { version = match.Groups().get(2).getValue(); // match.Groups[2].getValue(); } _writer.WriteStartElement("ProductSection"); _writer.WriteAttributeString("ovf", "class", null, product); _writer.WriteStartElement("Info"); _writer.WriteRaw(app); _writer.WriteEndElement(); _writer.WriteStartElement("Product"); _writer.WriteRaw(product); _writer.WriteEndElement(); _writer.WriteStartElement("Version"); _writer.WriteRaw(version); _writer.WriteEndElement(); _writer.WriteEndElement(); } } } @Override protected void WriteContentItems() { // os _writer.WriteStartElement("Section"); _writer.WriteAttributeString("ovf", "id", null, _vm.getStaticData().getId().toString()); _writer.WriteAttributeString("ovf", "required", null, "false"); _writer.WriteAttributeString("xsi", "type", null, "ovf:OperatingSystemSection_Type"); _writer.WriteStartElement("Info"); _writer.WriteRaw("Guest Operating System"); _writer.WriteEndElement(); _writer.WriteStartElement("Description"); _writer.WriteRaw(_vm.getStaticData().getos().name()); _writer.WriteEndElement(); _writer.WriteEndElement(); // hardware _writer.WriteStartElement("Section"); _writer.WriteAttributeString("xsi", "type", null, "ovf:VirtualHardwareSection_Type"); _writer.WriteStartElement("Info"); _writer.WriteRaw(String.format("%1$s CPU, %2$s Memeory", _vm.getStaticData().getnum_of_cpus(), _vm .getStaticData().getmem_size_mb())); _writer.WriteEndElement(); _writer.WriteStartElement("System"); _writer.WriteStartElement("vssd:VirtualSystemType"); _writer.WriteRaw(String.format("%1$s %2$s", Config.<String> GetValue(ConfigValues.OvfVirtualSystemType), Config.<String> GetValue(ConfigValues.VdcVersion))); _writer.WriteEndElement(); _writer.WriteEndElement(); // item cpu _writer.WriteStartElement("Item"); _writer.WriteStartElement("rasd:Caption"); _writer.WriteRaw(String.format("%1$s virtual cpu", _vm.getStaticData().getnum_of_cpus())); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:Description"); _writer.WriteRaw("Number of virtual CPU"); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:InstanceId"); _writer.WriteRaw(((Integer) (++_instanceId)).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceType"); _writer.WriteRaw(OvfHardware.CPU); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:num_of_sockets"); _writer.WriteRaw((new Integer(_vm.getStaticData().getnum_of_sockets())).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:cpu_per_socket"); _writer.WriteRaw((new Integer(_vm.getStaticData().getcpu_per_socket())).toString()); _writer.WriteEndElement(); _writer.WriteEndElement(); // item // item memory _writer.WriteStartElement("Item"); _writer.WriteStartElement("rasd:Caption"); _writer.WriteRaw(String.format("%1$s MB of memory", _vm.getStaticData().getmem_size_mb())); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:Description"); _writer.WriteRaw("Memory Size"); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:InstanceId"); _writer.WriteRaw(((Integer) (++_instanceId)).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceType"); _writer.WriteRaw(OvfHardware.Memory); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:AllocationUnits"); _writer.WriteRaw("MegaBytes"); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:VirtualQuantity"); _writer.WriteRaw((new Integer(_vm.getStaticData().getmem_size_mb())).toString()); _writer.WriteEndElement(); _writer.WriteEndElement(); // item // item drive for (DiskImage image : _images) { _writer.WriteStartElement("Item"); _writer.WriteStartElement("rasd:Caption"); _writer.WriteRaw(String.format("Drive %1$s", image.getinternal_drive_mapping())); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:InstanceId"); _writer.WriteRaw(image.getId().toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceType"); _writer.WriteRaw(OvfHardware.DiskImage); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:HostResource"); _writer.WriteRaw(OvfParser.CreateImageFile(image)); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:Parent"); _writer.WriteRaw(image.getParentId().toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:Template"); _writer.WriteRaw(image.getit_guid().toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ApplicationList"); _writer.WriteRaw(image.getappList()); _writer.WriteEndElement(); if (image.getstorage_id() != null) { _writer.WriteStartElement("rasd:StorageId"); _writer.WriteRaw(image.getstorage_id().getValue().toString()); _writer.WriteEndElement(); } if (image.getstorage_pool_id() != null) { _writer.WriteStartElement("rasd:StoragePoolId"); _writer.WriteRaw(image.getstorage_pool_id().getValue().toString()); _writer.WriteEndElement(); } _writer.WriteStartElement("rasd:CreationDate"); _writer.WriteRaw(OvfParser.LocalDateToUtcDateString(image.getcreation_date())); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:LastModified"); _writer.WriteRaw(OvfParser.LocalDateToUtcDateString(image.getlastModified())); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:last_modified_date"); _writer.WriteRaw(OvfParser.LocalDateToUtcDateString(image.getlast_modified_date())); _writer.WriteEndElement(); _writer.WriteEndElement(); // item } // item network for (VmNetworkInterface iface : _vm.getInterfaces()) { _writer.WriteStartElement("Item"); _writer.WriteStartElement("rasd:Caption"); _writer.WriteRaw("Ethernet adapter on " + iface.getNetworkName()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:InstanceId"); _writer.WriteRaw(((Integer) (++_instanceId)).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceType"); _writer.WriteRaw(OvfHardware.Network); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceSubType"); if (iface.getType() != null) { _writer.WriteRaw(iface.getType().toString()); } _writer.WriteEndElement(); _writer.WriteStartElement("rasd:Connection"); _writer.WriteRaw(iface.getNetworkName()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:Name"); _writer.WriteRaw(iface.getName()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:MACAddress"); _writer.WriteRaw(iface.getMacAddress()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:speed"); // version prior to 2.3 may not have speed so we get it by type if (iface.getSpeed() != null) { _writer.WriteRaw(iface.getSpeed().toString()); } else { _writer.WriteRaw(Integer.toString(VmInterfaceType.forValue( iface.getType()).getSpeed())); } _writer.WriteEndElement(); _writer.WriteEndElement(); // item } // item usb _writer.WriteStartElement("Item"); _writer.WriteStartElement("rasd:Caption"); _writer.WriteRaw("USB Controller"); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:InstanceId"); _writer.WriteRaw(((Integer) (++_instanceId)).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceType"); _writer.WriteRaw(OvfHardware.USB); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:UsbPolicy"); _writer.WriteRaw(_vm.getStaticData().getusb_policy().toString()); _writer.WriteEndElement(); _writer.WriteEndElement(); // item // monitor _writer.WriteStartElement("Item"); _writer.WriteStartElement("rasd:Caption"); _writer.WriteRaw("Graphical Controller"); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:InstanceId"); _writer.WriteRaw(((Integer) (++_instanceId)).toString()); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:ResourceType"); _writer.WriteRaw(OvfHardware.Monitor); _writer.WriteEndElement(); _writer.WriteStartElement("rasd:VirtualQuantity"); _writer.WriteRaw((new Integer(_vm.getStaticData().getnum_of_monitors())).toString()); _writer.WriteEndElement(); _writer.WriteEndElement(); // item } }