package org.ovirt.engine.core.utils.ovf;
import java.io.File;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.compat.Encoding;
import org.ovirt.engine.core.compat.Formatting;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.RefObject;
import org.ovirt.engine.core.compat.backendcompat.Path;
import org.ovirt.engine.core.compat.backendcompat.XmlDocument;
import org.ovirt.engine.core.compat.backendcompat.XmlTextWriter;
public abstract class OvfWriter implements IOvfBuilder {
protected String _fileName;
protected int _instanceId;
protected List<DiskImage> _images;
protected XmlTextWriter _writer;
protected XmlDocument _document;
public OvfWriter(RefObject<XmlDocument> document, List<DiskImage> images) {
_fileName = Path.GetTempFileName();
document.argvalue = new XmlDocument();
_document = document.argvalue;
_images = images;
_writer = new XmlTextWriter(_fileName, Encoding.UTF8);
WriteHeader();
}
private void WriteHeader() {
_instanceId = 0;
_writer.Formatting = Formatting.Indented;
_writer.Indentation = 4;
_writer.WriteStartDocument(false);
_writer.WriteStartElement("ovf", "Envelope", OVF_URI);
_writer.WriteAttributeString("xmlns", "ovf", null, OVF_URI);
_writer.WriteAttributeString("xmlns", "rasd", null, RASD_URI);
_writer.WriteAttributeString("xmlns", "vssd", null, VSSD_URI);
_writer.WriteAttributeString("xmlns", "xsi", null, XSI_URI);
// Setting the OVF version according to ENGINE (in 2.2 , version was set to "0.9")
_writer.WriteAttributeString("ovf", "version", null, Config.<String> GetValue(ConfigValues.VdcVersion));
}
private void CloseElements() {
_writer.WriteEndElement();
}
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", "href", null, OvfParser.CreateImageFile(image));
_writer.WriteAttributeString("ovf", "id", null, image.getId().toString());
_writer.WriteAttributeString("ovf", "size", null, (new Long(image.getsize())).toString());
_writer.WriteAttributeString("ovf", "description", null, image.getdescription());
_writer.WriteEndElement();
}
_writer.WriteEndElement();
}
@Override
public void BuildNetwork() {
_writer.WriteStartElement("Section");
_writer.WriteAttributeString("xsi", "type", null, "ovf:NetworkSection_Type");
_writer.WriteStartElement("Info");
_writer.WriteRaw("List of networks");
_writer.WriteEndElement();
_writer.WriteStartElement("Network");
_writer.WriteAttributeString("ovf", "name", null, "Network 1");
_writer.WriteEndElement();
_writer.WriteEndElement();
}
@Override
public void BuildDisk() {
_writer.WriteStartElement("Section");
_writer.WriteAttributeString("xsi", "type", null, "ovf:DiskSection_Type");
_writer.WriteStartElement("Info");
_writer.WriteRaw("List of Virtual Disks");
_writer.WriteEndElement();
for (DiskImage image : _images) {
_writer.WriteStartElement("Disk");
_writer.WriteAttributeString("ovf", "diskId", null, image.getId().toString());
_writer.WriteAttributeString("ovf", "size", null, (new Long(BytesToGigabyte(image.getsize()))).toString());
_writer.WriteAttributeString("ovf", "actual_size", null,
(new Long(BytesToGigabyte(image.getactual_size()))).toString());
_writer.WriteAttributeString("ovf", "vm_snapshot_id", null, (image.getvm_snapshot_id() != null) ? image
.getvm_snapshot_id().getValue().toString() : "");
if (image.getParentId().equals(Guid.Empty)) {
_writer.WriteAttributeString("ovf", "parentRef", null, "");
} else {
// LINQ 29456
// List<DiskImage> res = _images.SkipWhile(img => image.ParentId
// == img.image_guid).ToList();
int i = 0;
while (_images.get(i).getId().equals(image.getParentId()))
i++;
List<DiskImage> res = _images.subList(i, _images.size() - 1);
// LINQ 29456
if (res.size() > 0) {
_writer.WriteAttributeString("ovf", "parentRef", null, OvfParser.CreateImageFile(res.get(0)));
} else {
_writer.WriteAttributeString("ovf", "parentRef", null, "");
}
}
_writer.WriteAttributeString("ovf", "fileRef", null, OvfParser.CreateImageFile(image));
String format = "";
switch (image.getvolume_format()) {
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;
}
_writer.WriteAttributeString("ovf", "format", null, format);
_writer.WriteAttributeString("ovf", "volume-format", null, image.getvolume_format().toString());
_writer.WriteAttributeString("ovf", "volume-type", null, image.getvolume_type().toString());
_writer.WriteAttributeString("ovf", "disk-interface", null, image.getdisk_interface().toString());
_writer.WriteAttributeString("ovf", "disk-type", null, image.getdisk_type().toString());
_writer.WriteAttributeString("ovf", "boot", null, (new Boolean(image.getboot())).toString());
_writer.WriteAttributeString("ovf", "wipe-after-delete", null,
(new Boolean(image.getwipe_after_delete())).toString());
_writer.WriteEndElement();
}
_writer.WriteEndElement();
}
@Override
public void BuildVirtualSystem() {
// General Vm
_writer.WriteStartElement("Content");
_writer.WriteAttributeString("ovf", "id", null, "out");
_writer.WriteAttributeString("xsi", "type", null, "ovf:VirtualSystem_Type");
// General Data
WriteGeneralData();
// Application List
WriteAppList();
// Content Items
WriteContentItems();
_writer.WriteEndElement(); // End Content tag
}
protected abstract void WriteGeneralData();
protected abstract void WriteAppList();
protected abstract void WriteContentItems();
@Override
protected void finalize() throws Throwable {
Dispose();
super.finalize();
}
public void Dispose() {
if (_writer != null) {
CloseElements();
_writer.close();
_document.Load(_fileName);
}
deleteTmpFile();
}
public void deleteTmpFile() {
try {
File tmpFile = new File(_fileName);
if (tmpFile.exists()) {
tmpFile.delete();
}
} catch (Exception e) {
}
}
public void dispose() {
this.Dispose();
}
}