package org.ovirt.engine.core.utils.ovf;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.common.FeatureSupported;
import org.ovirt.engine.core.common.businessentities.UsbPolicy;
import org.ovirt.engine.core.common.businessentities.VmBase;
import org.ovirt.engine.core.common.businessentities.VmDevice;
import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType;
import org.ovirt.engine.core.common.businessentities.VmInit;
import org.ovirt.engine.core.common.businessentities.VmPayload;
import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType;
import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.osinfo.OsRepository;
import org.ovirt.engine.core.common.utils.SimpleDependencyInjector;
import org.ovirt.engine.core.common.utils.VmDeviceCommonUtils;
import org.ovirt.engine.core.common.utils.VmDeviceType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.utils.VmInitUtils;
import org.ovirt.engine.core.utils.customprop.DevicePropertiesUtils;
import org.ovirt.engine.core.utils.ovf.xml.XmlDocument;
import org.ovirt.engine.core.utils.ovf.xml.XmlTextWriter;
public abstract class OvfWriter implements IOvfBuilder {
protected int _instanceId;
protected List<DiskImage> _images;
protected XmlTextWriter _writer;
protected XmlDocument _document;
protected VmBase vmBase;
private Version version;
private OsRepository osRepository = SimpleDependencyInjector.getInstance().get(OsRepository.class);
public OvfWriter(VmBase vmBase, List<DiskImage> images, Version version) {
_document = new XmlDocument();
_images = images;
_writer = new XmlTextWriter();
this.vmBase = vmBase;
this.version = version;
writeHeader();
}
protected Version getVersion() {
return version;
}
private void writeHeader() {
_instanceId = 0;
_writer.writeStartDocument(false);
_writer.setPrefix(OVF_PREFIX, OVF_URI);
_writer.setPrefix(RASD_PREFIX, RASD_URI);
_writer.setPrefix(VSSD_PREFIX, VSSD_URI);
_writer.setPrefix(XSI_PREFIX, XSI_URI);
_writer.writeStartElement(OVF_URI, "Envelope");
_writer.writeNamespace(OVF_PREFIX, OVF_URI);
_writer.writeNamespace(RASD_PREFIX, RASD_URI);
_writer.writeNamespace(VSSD_PREFIX, VSSD_URI);
_writer.writeNamespace(XSI_PREFIX, XSI_URI);
// Setting the OVF version according to ENGINE (in 2.2 , version was set to "0.9")
_writer.writeAttributeString(OVF_URI, "version", Config.getValue(ConfigValues.VdcVersion));
}
protected long bytesToGigabyte(long bytes) {
return bytes / 1024 / 1024 / 1024;
}
@Override
public void buildReference() {
_writer.writeStartElement("References");
for (DiskImage image : _images) {
_writer.writeStartElement("File");
_writer.writeAttributeString(OVF_URI, "href", OvfParser.createImageFile(image));
_writer.writeAttributeString(OVF_URI, "id", image.getImageId().toString());
_writer.writeAttributeString(OVF_URI, "size", String.valueOf(image.getSize()));
_writer.writeAttributeString(OVF_URI, "description", StringUtils.defaultString(image.getDescription()));
_writer.writeAttributeString(OVF_URI, "disk_storage_type", image.getDiskStorageType().name());
_writer.writeAttributeString(OVF_URI, "cinder_volume_type", StringUtils.defaultString(image.getCinderVolumeType()));
_writer.writeEndElement();
}
_writer.writeEndElement();
}
protected void writeVmInit() {
if (vmBase.getVmInit() != null) {
VmInit vmInit = vmBase.getVmInit();
_writer.writeStartElement("VmInit");
if (vmInit.getHostname() != null) {
_writer.writeAttributeString(OVF_URI, "hostname", vmInit.getHostname());
}
if (vmInit.getDomain() != null) {
_writer.writeAttributeString(OVF_URI, "domain", vmInit.getDomain());
}
if (vmInit.getTimeZone() != null) {
_writer.writeAttributeString(OVF_URI, "timeZone", vmInit.getTimeZone());
}
if (vmInit.getAuthorizedKeys() != null) {
_writer.writeAttributeString(OVF_URI, "authorizedKeys", vmInit.getAuthorizedKeys());
}
if (vmInit.getRegenerateKeys() != null) {
_writer.writeAttributeString(OVF_URI, "regenerateKeys", vmInit.getRegenerateKeys().toString());
}
if (vmInit.getDnsSearch() != null) {
_writer.writeAttributeString(OVF_URI, "dnsSearch", vmInit.getDnsSearch());
}
if (vmInit.getDnsServers() != null) {
_writer.writeAttributeString(OVF_URI, "dnsServers", vmInit.getDnsServers());
}
if (vmInit.getNetworks() != null) {
_writer.writeAttributeString(OVF_URI, "networks", VmInitUtils.networkListToJson(vmInit.getNetworks()));
}
if (vmInit.getWinKey() != null) {
_writer.writeAttributeString(OVF_URI, "winKey", vmInit.getWinKey());
}
if (vmInit.getRootPassword() != null) {
_writer.writeAttributeString(OVF_URI, "rootPassword", vmInit.getRootPassword());
}
if (vmInit.getCustomScript() != null) {
_writer.writeAttributeString(OVF_URI, "customScript", vmInit.getCustomScript());
}
_writer.writeEndElement();
}
}
@Override
public void buildNetwork() {
_writer.writeStartElement("Section");
_writer.writeAttributeString(XSI_URI, "type", OVF_PREFIX + ":NetworkSection_Type");
_writer.writeStartElement("Info");
_writer.writeRaw("List of networks");
_writer.writeEndElement();
_writer.writeStartElement("Network");
_writer.writeAttributeString(OVF_URI, "name", "Network 1");
_writer.writeEndElement();
_writer.writeEndElement();
}
@Override
public void buildDisk() {
_writer.writeStartElement("Section");
_writer.writeAttributeString(XSI_URI, "type", OVF_PREFIX + ":DiskSection_Type");
_writer.writeStartElement("Info");
_writer.writeRaw("List of Virtual Disks");
_writer.writeEndElement();
for (DiskImage image : _images) {
DiskVmElement dve = image.getDiskVmElementForVm(vmBase.getId());
_writer.writeStartElement("Disk");
_writer.writeAttributeString(OVF_URI, "diskId", image.getImageId().toString());
_writer.writeAttributeString(OVF_URI, "size", String.valueOf(bytesToGigabyte(image.getSize())));
_writer.writeAttributeString(OVF_URI,
"actual_size",
String.valueOf(bytesToGigabyte(image.getActualSizeInBytes())));
_writer.writeAttributeString(OVF_URI, "vm_snapshot_id", (image.getVmSnapshotId() != null) ? image
.getVmSnapshotId().toString() : "");
if (image.getParentId().equals(Guid.Empty)) {
_writer.writeAttributeString(OVF_URI, "parentRef", "");
} else {
int i = 0;
while (_images.get(i).getImageId().equals(image.getParentId())) {
i++;
}
List<DiskImage> res = _images.subList(i, _images.size() - 1);
if (res.size() > 0) {
_writer.writeAttributeString(OVF_URI, "parentRef", OvfParser.createImageFile(res.get(0)));
} else {
_writer.writeAttributeString(OVF_URI, "parentRef", "");
}
}
_writer.writeAttributeString(OVF_URI, "fileRef", OvfParser.createImageFile(image));
String format = "";
switch (image.getVolumeFormat()) {
case RAW:
format = "http://www.vmware.com/specifications/vmdk.html#sparse";
break;
case COW:
format = "http://www.gnome.org/~markmc/qcow-image-format.html";
break;
case Unassigned:
break;
default:
break;
}
_writer.writeAttributeString(OVF_URI, "format", format);
_writer.writeAttributeString(OVF_URI, "volume-format", image.getVolumeFormat().toString());
_writer.writeAttributeString(OVF_URI, "volume-type", image.getVolumeType().toString());
_writer.writeAttributeString(OVF_URI, "disk-interface", dve.getDiskInterface().toString());
_writer.writeAttributeString(OVF_URI, "boot", String.valueOf(dve.isBoot()));
if (FeatureSupported.passDiscardSupported(version)) {
_writer.writeAttributeString(OVF_URI, "pass-discard", String.valueOf(dve.isPassDiscard()));
}
if (image.getDiskAlias() != null) {
_writer.writeAttributeString(OVF_URI, "disk-alias", image.getDiskAlias());
}
if (image.getDiskDescription() != null) {
_writer.writeAttributeString(OVF_URI, "disk-description", image.getDiskDescription());
}
_writer.writeAttributeString(OVF_URI, "wipe-after-delete",
String.valueOf(image.isWipeAfterDelete()));
_writer.writeEndElement();
}
_writer.writeEndElement();
}
@Override
public void buildVirtualSystem() {
// General Vm
_writer.writeStartElement("Content");
_writer.writeAttributeString(OVF_URI, "id", "out");
_writer.writeAttributeString(XSI_URI, "type", OVF_PREFIX + ":VirtualSystem_Type");
// General Data
writeGeneralData();
// Application List
writeAppList();
// Content Items
writeContentItems();
_writer.writeEndElement(); // End Content tag
}
protected void writeGeneralData() {
if (vmBase.getDescription() != null) {
_writer.writeElement(OvfProperties.DESCRIPTION, vmBase.getDescription());
}
if (vmBase.getComment() != null) {
_writer.writeElement(OvfProperties.COMMENT, vmBase.getComment());
}
_writer.writeElement(OvfProperties.CREATION_DATE, OvfParser.localDateToUtcDateString(vmBase.getCreationDate()));
_writer.writeElement(OvfProperties.EXPORT_DATE, OvfParser.localDateToUtcDateString(new Date()));
_writer.writeElement(OvfProperties.DELETE_PROTECTED, String.valueOf(vmBase.isDeleteProtected()));
if (vmBase.getSsoMethod() != null) {
_writer.writeElement(OvfProperties.SSO_METHOD, vmBase.getSsoMethod().toString());
}
_writer.writeElement(OvfProperties.IS_SMARTCARD_ENABLED, String.valueOf(vmBase.isSmartcardEnabled()));
if (vmBase.getNumOfIoThreads() != 0) {
_writer.writeElement(OvfProperties.NUM_OF_IOTHREADS, String.valueOf(vmBase.getNumOfIoThreads()));
}
_writer.writeElement(OvfProperties.TIMEZONE, vmBase.getTimeZone());
_writer.writeElement(OvfProperties.DEFAULT_BOOT_SEQUENCE, String.valueOf(vmBase.getDefaultBootSequence().getValue()));
if (!StringUtils.isBlank(vmBase.getInitrdUrl())) {
_writer.writeElement(OvfProperties.INITRD_URL, vmBase.getInitrdUrl());
}
if (!StringUtils.isBlank(vmBase.getKernelUrl())) {
_writer.writeElement(OvfProperties.KERNEL_URL, vmBase.getKernelUrl());
}
if (!StringUtils.isBlank(vmBase.getKernelParams())) {
_writer.writeElement(OvfProperties.KERNEL_PARAMS, vmBase.getKernelParams());
}
_writer.writeElement(OvfProperties.GENERATION, String.valueOf(vmBase.getDbGeneration()));
if (vmBase.getCustomCompatibilityVersion() != null) {
_writer.writeElement(OvfProperties.CUSTOM_COMPATIBILITY_VERSION, String.valueOf(vmBase.getCustomCompatibilityVersion()));
}
_writer.writeElement(OvfProperties.CLUSTER_COMPATIBILITY_VERSION, String.valueOf(version));// cluster version the VM/Snapshot originates from
_writer.writeElement(OvfProperties.VM_TYPE, String.valueOf(vmBase.getVmType().getValue()));
if (vmBase.getTunnelMigration() != null) {
_writer.writeElement(OvfProperties.TUNNEL_MIGRATION, String.valueOf(vmBase.getTunnelMigration()));
}
if (vmBase.getVncKeyboardLayout() != null) {
_writer.writeElement(OvfProperties.VNC_KEYBOARD_LAYOUT, vmBase.getVncKeyboardLayout());
}
_writer.writeElement(OvfProperties.MIN_ALLOCATED_MEMORY, String.valueOf(vmBase.getMinAllocatedMem()));
_writer.writeElement(OvfProperties.IS_STATELESS, String.valueOf(vmBase.isStateless()));
_writer.writeElement(OvfProperties.IS_RUN_AND_PAUSE, String.valueOf(vmBase.isRunAndPause()));
_writer.writeElement(OvfProperties.AUTO_STARTUP, String.valueOf(vmBase.isAutoStartup()));
_writer.writeElement(OvfProperties.PRIORITY, String.valueOf(vmBase.getPriority()));
if (vmBase.getCreatedByUserId() != null) {
_writer.writeElement(OvfProperties.CREATED_BY_USER_ID, String.valueOf(vmBase.getCreatedByUserId()));
}
if (vmBase.getMigrationDowntime() != null) {
_writer.writeElement(OvfProperties.MIGRATION_DOWNTIME, String.valueOf(vmBase.getMigrationDowntime()));
}
writeVmInit();
if (vmBase.getMigrationSupport() != null) {
_writer.writeElement(OvfProperties.MIGRATION_SUPPORT, String.valueOf(vmBase.getMigrationSupport().getValue()));
}
// TODO dedicated to multiple hosts - are we breaking any standard here?
if (vmBase.getDedicatedVmForVdsList().size() > 0) {
for (Guid hostId : vmBase.getDedicatedVmForVdsList()) {
_writer.writeElement(OvfProperties.DEDICATED_VM_FOR_VDS, String.valueOf(hostId));
}
}
if (vmBase.getSerialNumberPolicy() != null) {
_writer.writeElement(OvfProperties.SERIAL_NUMBER_POLICY, String.valueOf(vmBase.getSerialNumberPolicy().getValue()));
}
if (vmBase.getCustomSerialNumber() != null) {
_writer.writeElement(OvfProperties.CUSTOM_SERIAL_NUMBER, vmBase.getCustomSerialNumber());
}
_writer.writeElement(OvfProperties.IS_BOOT_MENU_ENABLED, String.valueOf(vmBase.isBootMenuEnabled()));
_writer.writeElement(OvfProperties.IS_SPICE_FILE_TRANSFER_ENABLED, String.valueOf(vmBase.isSpiceFileTransferEnabled()));
_writer.writeElement(OvfProperties.IS_SPICE_COPY_PASTE_ENABLED, String.valueOf(vmBase.isSpiceCopyPasteEnabled()));
_writer.writeElement(OvfProperties.ALLOW_CONSOLE_RECONNECT, String.valueOf(vmBase.isAllowConsoleReconnect()));
if (vmBase.getAutoConverge() != null) {
_writer.writeElement(OvfProperties.IS_AUTO_CONVERGE, String.valueOf(vmBase.getAutoConverge()));
}
if (vmBase.getMigrateCompressed() != null) {
_writer.writeElement(OvfProperties.IS_MIGRATE_COMPRESSED, String.valueOf(vmBase.getMigrateCompressed()));
}
if (vmBase.getMigrationPolicyId() != null) {
_writer.writeElement(OvfProperties.MIGRATION_POLICY_ID, String.valueOf(vmBase.getMigrationPolicyId()));
}
writeCustomEmulatedMachine();
writeCustomCpuName();
_writer.writeElement(OvfProperties.PREDEFINED_PROPERTIES, vmBase.getPredefinedProperties());
_writer.writeElement(OvfProperties.USER_DEFINED_PROPERTIES, vmBase.getUserDefinedProperties());
_writer.writeElement(OvfProperties.MAX_MEMORY_SIZE_MB, String.valueOf(vmBase.getMaxMemorySizeMb()));
if (vmBase.getLeaseStorageDomainId() != null) {
_writer.writeElement(OvfProperties.VM_LEASE, vmBase.getLeaseStorageDomainId().toString());
}
}
protected void writeCustomEmulatedMachine() {
_writer.writeElement(OvfProperties.CUSTOM_EMULATED_MACHINE, vmBase.getCustomEmulatedMachine());
}
protected void writeCustomCpuName() {
_writer.writeElement(OvfProperties.CUSTOM_CPU_NAME, vmBase.getCustomCpuName());
}
protected abstract void writeAppList();
protected void writeContentItems() {
writeOS();
startHardware();
writeInfo();
writeSystem();
writeCpu();
writeMemory();
writeDrive();
writeNetwork();
writeUsb();
writeMonitors();
writeGraphics();
writeCd();
writeOtherDevices();
endHardware();
}
protected void writeManagedDeviceInfo(VmBase vmBase, Guid deviceId) {
VmDevice vmDevice = vmBase.getManagedDeviceMap().get(deviceId);
if (deviceId != null && vmDevice != null && vmDevice.getAddress() != null) {
writeVmDeviceInfo(vmDevice);
}
}
protected void writeOtherDevices() {
List<VmDevice> devices = vmBase.getUnmanagedDeviceList();
Collection<VmDevice> managedDevices = vmBase.getManagedDeviceMap().values();
for (VmDevice device : managedDevices) {
if (VmDeviceCommonUtils.isSpecialDevice(device.getDevice(), device.getType())) {
devices.add(device);
}
}
for (VmDevice vmDevice : devices) {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.OTHER);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(vmDevice.getId().getDeviceId().toString());
_writer.writeEndElement();
writeVmDeviceInfo(vmDevice);
_writer.writeEndElement(); // item
}
}
protected void writeMonitors() {
Collection<VmDevice> devices = vmBase.getManagedDeviceMap().values();
int numOfMonitors = vmBase.getNumOfMonitors();
int i = 0;
for (VmDevice vmDevice : devices) {
if (vmDevice.getType() == VmDeviceGeneralType.VIDEO) {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw("Graphical Controller");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(vmDevice.getId().getDeviceId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.Monitor);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "VirtualQuantity");
// we should write number of monitors for each entry for backward compatibility
_writer.writeRaw(String.valueOf(numOfMonitors));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "SinglePciQxl");
_writer.writeRaw(String.valueOf(vmBase.getSingleQxlPci()));
_writer.writeEndElement();
writeVmDeviceInfo(vmDevice);
_writer.writeEndElement(); // item
if (i++ == numOfMonitors) {
break;
}
}
}
}
protected void writeGraphics() {
Collection<VmDevice> devices = vmBase.getManagedDeviceMap().values();
for (VmDevice vmDevice : devices) {
if (vmDevice.getType() == VmDeviceGeneralType.GRAPHICS) {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw("Graphical Framebuffer");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(vmDevice.getId().getDeviceId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.Graphics);
_writer.writeEndElement();
writeVmDeviceInfo(vmDevice);
_writer.writeEndElement(); // item
}
}
}
protected void writeCd() {
Collection<VmDevice> devices = vmBase.getManagedDeviceMap().values();
for (VmDevice vmDevice : devices) {
if (vmDevice.getDevice().equals(VmDeviceType.CDROM.getName())) {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw("CDROM");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(vmDevice.getId().getDeviceId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.CD);
_writer.writeEndElement();
writeVmDeviceInfo(vmDevice);
_writer.writeEndElement(); // item
break; // only one CD is currently supported
}
}
}
private void writeVmDeviceInfo(VmDevice vmDevice) {
_writer.writeElement(OvfProperties.VMD_TYPE, String.valueOf(vmDevice.getType().getValue()));
_writer.writeElement(OvfProperties.VMD_DEVICE, String.valueOf(vmDevice.getDevice()));
_writer.writeElement(OvfProperties.VMD_ADDRESS, vmDevice.getAddress());
_writer.writeElement(OvfProperties.VMD_BOOT_ORDER, String.valueOf(vmDevice.getBootOrder()));
_writer.writeElement(OvfProperties.VMD_IS_PLUGGED, String.valueOf(vmDevice.isPlugged()));
_writer.writeElement(OvfProperties.VMD_IS_READONLY, String.valueOf(vmDevice.getReadOnly()));
_writer.writeElement(OvfProperties.VMD_ALIAS, String.valueOf(vmDevice.getAlias()));
if (vmDevice.getSpecParams() != null && vmDevice.getSpecParams().size() != 0
&& !VmPayload.isPayload(vmDevice.getSpecParams())) {
_writer.writeStartElement(OvfProperties.VMD_SPEC_PARAMS);
_writer.writeMap(vmDevice.getSpecParams());
_writer.writeEndElement();
}
if (vmDevice.getCustomProperties() != null && !vmDevice.getCustomProperties().isEmpty()) {
_writer.writeElement(OvfProperties.VMD_CUSTOM_PROP,
DevicePropertiesUtils.getInstance().convertProperties(vmDevice.getCustomProperties()));
}
if (vmDevice.getSnapshotId() != null) {
_writer.writeElement(OvfProperties.VMD_SNAPSHOT_PROP, String.valueOf(vmDevice.getSnapshotId()));
}
}
@Override
public String getStringRepresentation() {
return _writer.getStringXML();
}
protected String getBackwardCompatibleUsbPolicy(UsbPolicy usbPolicy) {
if (usbPolicy == null) {
return UsbPolicy.DISABLED.name();
}
return usbPolicy.toString();
}
protected void writeOS() {
_writer.writeStartElement("Section");
_writer.writeAttributeString(OVF_URI, "id", vmBase.getId().toString());
_writer.writeAttributeString(OVF_URI, "required", "false");
_writer.writeAttributeString(XSI_URI, "type", OVF_PREFIX + ":OperatingSystemSection_Type");
_writer.writeElement("Info", "Guest Operating System");
_writer.writeElement("Description", osRepository.getUniqueOsNames().get(vmBase.getOsId()));
_writer.writeEndElement();
}
protected void startHardware() {
_writer.writeStartElement("Section");
_writer.writeAttributeString(XSI_URI, "type", OVF_PREFIX + ":VirtualHardwareSection_Type");
}
protected void endHardware() {
_writer.writeEndElement();
}
protected void writeInfo() {
_writer.writeStartElement("Info");
_writer.writeRaw(String.format("%1$s CPU, %2$s Memory", vmBase.getNumOfCpus(), vmBase.getMemSizeMb()));
_writer.writeEndElement();
}
protected void writeSystem() {
_writer.writeStartElement("System");
_writer.writeStartElement(VSSD_URI, "VirtualSystemType");
_writer.writeRaw(String.format("%1$s %2$s", Config.<String>getValue(ConfigValues.OvfVirtualSystemType),
Config.<String>getValue(ConfigValues.VdcVersion)));
_writer.writeEndElement();
_writer.writeEndElement();
}
protected void writeCpu() {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw(String.format("%1$s virtual cpu", vmBase.getNumOfCpus()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Description");
_writer.writeRaw("Number of virtual CPU");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(String.valueOf(++_instanceId));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.CPU);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "num_of_sockets");
_writer.writeRaw(String.valueOf(vmBase.getNumOfSockets()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "cpu_per_socket");
_writer.writeRaw(String.valueOf(vmBase.getCpuPerSocket()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "threads_per_cpu");
_writer.writeRaw(String.valueOf(vmBase.getThreadsPerCpu()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "max_num_of_vcpus");
_writer.writeRaw(String.valueOf(maxNumOfVcpus()));
_writer.writeEndElement();
_writer.writeEndElement(); // item
}
protected abstract Integer maxNumOfVcpus();
protected void writeMemory() {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw(String.format("%1$s MB of memory", vmBase.getMemSizeMb()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Description");
_writer.writeRaw("Memory Size");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(String.valueOf(++_instanceId));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.Memory);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "AllocationUnits");
_writer.writeRaw("MegaBytes");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "VirtualQuantity");
_writer.writeRaw(String.valueOf(vmBase.getMemSizeMb()));
_writer.writeEndElement();
_writer.writeEndElement(); // item
}
protected void writeDrive() {
for (DiskImage image : _images) {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw(image.getDiskAlias());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(image.getImageId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.DiskImage);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "HostResource");
_writer.writeRaw(OvfParser.createImageFile(image));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Parent");
_writer.writeRaw(image.getParentId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Template");
_writer.writeRaw(image.getImageTemplateId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ApplicationList");
_writer.writeRaw(image.getAppList());
_writer.writeEndElement();
if (image.getStorageIds() != null && image.getStorageIds().size() > 0) {
_writer.writeStartElement(RASD_URI, "StorageId");
_writer.writeRaw(image.getStorageIds().get(0).toString());
_writer.writeEndElement();
}
if (image.getStoragePoolId() != null) {
_writer.writeStartElement(RASD_URI, "StoragePoolId");
_writer.writeRaw(image.getStoragePoolId().toString());
_writer.writeEndElement();
}
_writer.writeStartElement(RASD_URI, "CreationDate");
_writer.writeRaw(OvfParser.localDateToUtcDateString(image.getCreationDate()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "LastModified");
_writer.writeRaw(OvfParser.localDateToUtcDateString(image.getLastModified()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "last_modified_date");
_writer.writeRaw(OvfParser.localDateToUtcDateString(image.getLastModifiedDate()));
_writer.writeEndElement();
writeManagedDeviceInfo(vmBase, image.getId());
_writer.writeEndElement(); // item
}
}
protected void writeUsb() {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
_writer.writeRaw("USB Controller");
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(String.valueOf(++_instanceId));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.USB);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "UsbPolicy");
_writer.writeRaw(getBackwardCompatibleUsbPolicy(vmBase.getUsbPolicy()));
_writer.writeEndElement();
_writer.writeEndElement(); // item
}
protected void writeNetwork() {
for (VmNetworkInterface iface : vmBase.getInterfaces()) {
_writer.writeStartElement("Item");
_writer.writeStartElement(RASD_URI, "Caption");
String networkName = iface.getNetworkName() != null ? iface.getNetworkName() : "[No Network]";
_writer.writeRaw("Ethernet adapter on " + networkName);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "InstanceId");
_writer.writeRaw(iface.getId().toString());
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceType");
_writer.writeRaw(OvfHardware.Network);
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "OtherResourceType");
if (StringUtils.isNotEmpty(iface.getVnicProfileName())) {
_writer.writeRaw(iface.getVnicProfileName());
}
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "ResourceSubType");
if (iface.getType() != null) {
_writer.writeRaw(iface.getType().toString());
}
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Connection");
if (iface.getNetworkName() != null) {
_writer.writeRaw(iface.getNetworkName());
}
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Linked");
_writer.writeRaw(String.valueOf(iface.isLinked()));
_writer.writeEndElement();
_writer.writeStartElement(RASD_URI, "Name");
_writer.writeRaw(iface.getName());
_writer.writeEndElement();
writeMacAddress(iface);
_writer.writeStartElement(RASD_URI, "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(String.valueOf(VmInterfaceType.forValue(
iface.getType()).getSpeed()));
}
_writer.writeEndElement();
writeManagedDeviceInfo(vmBase, iface.getId());
_writer.writeEndElement(); // item
}
}
protected abstract void writeMacAddress(VmNetworkInterface iface);
}