package org.ovirt.engine.core.utils.ovf;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.common.businessentities.ArchitectureType;
import org.ovirt.engine.core.common.businessentities.VmEntityType;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.osinfo.OsRepository;
import org.ovirt.engine.core.common.utils.SimpleDependencyInjector;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.utils.ovf.xml.XmlDocument;
import org.ovirt.engine.core.utils.ovf.xml.XmlNode;
public class OvfTemplateReader extends OvfReader {
protected VmTemplate _vmTemplate;
private final OsRepository osRepository = SimpleDependencyInjector.getInstance().get(OsRepository.class);
public OvfTemplateReader(XmlDocument document,
VmTemplate vmTemplate,
List<DiskImage> images,
List<VmNetworkInterface> interfaces) {
super(document, images, interfaces, vmTemplate);
_vmTemplate = vmTemplate;
}
@Override
protected void readOsSection(XmlNode section) {
_vmTemplate.setId(new Guid(section.attributes.get("ovf:id").getValue()));
XmlNode node = selectSingleNode(section, "Description");
if (node != null) {
int osId = osRepository.getOsIdByUniqueName(node.innerText);
_vmTemplate.setOsId(osId);
_vmTemplate.setClusterArch(osRepository.getArchitectureFromOS(osId));
}
else {
_vmTemplate.setClusterArch(ArchitectureType.undefined);
}
}
@Override
protected void readDiskImageItem(XmlNode node) {
final Guid guid = new Guid(selectSingleNode(node, "rasd:InstanceId", _xmlNS).innerText);
DiskImage image = _images.stream().filter(d -> d.getImageId().equals(guid)).findFirst().orElse(null);
image.setId(OvfParser.getImageGroupIdFromImageFile(selectSingleNode(node,
"rasd:HostResource", _xmlNS).innerText));
if (StringUtils.isNotEmpty(selectSingleNode(node, "rasd:Parent", _xmlNS).innerText)) {
image.setParentId(new Guid(selectSingleNode(node, "rasd:Parent", _xmlNS).innerText));
}
if (StringUtils.isNotEmpty(selectSingleNode(node, "rasd:Template", _xmlNS).innerText)) {
image.setImageTemplateId(new Guid(selectSingleNode(node, "rasd:Template", _xmlNS).innerText));
}
image.setAppList(selectSingleNode(node, "rasd:ApplicationList", _xmlNS).innerText);
if (StringUtils.isNotEmpty(selectSingleNode(node, "rasd:StorageId", _xmlNS).innerText)) {
image.setStorageIds(new ArrayList<>(Arrays.asList(new Guid(selectSingleNode(node, "rasd:StorageId",
_xmlNS).innerText))));
}
if (StringUtils.isNotEmpty(selectSingleNode(node, "rasd:StoragePoolId", _xmlNS).innerText)) {
image.setStoragePoolId(new Guid(selectSingleNode(node, "rasd:StoragePoolId", _xmlNS).innerText));
}
final Date creationDate = OvfParser.utcDateStringToLocaDate(
selectSingleNode(node, "rasd:CreationDate", _xmlNS).innerText);
if (creationDate != null) {
image.setCreationDate(creationDate);
}
final Date lastModified = OvfParser.utcDateStringToLocaDate(
selectSingleNode(node, "rasd:LastModified", _xmlNS).innerText);
if (lastModified != null) {
image.setLastModified(lastModified);
}
readManagedVmDevice(node, image.getId());
}
@Override
protected void readGeneralData(XmlNode content) {
// General Vm
XmlNode node = selectSingleNode(content, OvfProperties.NAME);
if (node != null) {
_vmTemplate.setName(node.innerText);
name = _vmTemplate.getName();
}
node = selectSingleNode(content, OvfProperties.TEMPLATE_ID);
if (node != null) {
if (StringUtils.isNotEmpty(node.innerText)) {
_vmTemplate.setId(new Guid(node.innerText));
}
}
node = selectSingleNode(content, OvfProperties.IS_DISABLED);
if (node != null) {
_vmTemplate.setDisabled(Boolean.parseBoolean(node.innerText));
}
node = selectSingleNode(content, OvfProperties.TRUSTED_SERVICE);
if (node != null) {
_vmTemplate.setTrustedService(Boolean.parseBoolean(node.innerText));
}
node = selectSingleNode(content, OvfProperties.TEMPLATE_TYPE);
if (node != null) {
_vmTemplate.setTemplateType(VmEntityType.valueOf(node.innerText));
}
node = selectSingleNode(content, OvfProperties.BASE_TEMPLATE_ID);
if (node != null) {
_vmTemplate.setBaseTemplateId(Guid.createGuidFromString(node.innerText));
} else {
// in case base template is missing, we assume it is a base template
_vmTemplate.setBaseTemplateId(_vmTemplate.getId());
}
node = selectSingleNode(content, OvfProperties.TEMPLATE_VERSION_NUMBER);
if (node != null) {
_vmTemplate.setTemplateVersionNumber(Integer.parseInt(node.innerText));
}
node = selectSingleNode(content, OvfProperties.TEMPLATE_VERSION_NAME);
if (node != null) {
_vmTemplate.setTemplateVersionName(node.innerText);
}
node = selectSingleNode(content, "AutoStartup");
if (node != null) {
_vmTemplate.setAutoStartup(Boolean.parseBoolean(node.innerText));
}
}
@Override
protected String getDefaultDisplayTypeStringRepresentation() {
return OvfProperties.TEMPLATE_DEFAULT_DISPLAY_TYPE;
}
}