package org.ovirt.engine.api.restapi.types;
import org.ovirt.engine.api.common.util.StatusUtils;
import org.ovirt.engine.api.common.util.TimeZoneMapping;
import org.ovirt.engine.api.model.Boot;
import org.ovirt.engine.api.model.Cluster;
import org.ovirt.engine.api.model.CPU;
import org.ovirt.engine.api.model.CpuTopology;
import org.ovirt.engine.api.model.Display;
import org.ovirt.engine.api.model.DisplayType;
import org.ovirt.engine.api.model.Domain;
import org.ovirt.engine.api.model.HighAvailability;
import org.ovirt.engine.api.model.OperatingSystem;
import org.ovirt.engine.api.model.OsType;
import org.ovirt.engine.api.model.Template;
import org.ovirt.engine.api.model.TemplateStatus;
import org.ovirt.engine.api.model.Usb;
import org.ovirt.engine.api.model.VmType;
import org.ovirt.engine.core.common.businessentities.OriginType;
import org.ovirt.engine.core.common.businessentities.UsbPolicy;
import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.compat.Guid;
public class TemplateMapper {
private static final int BYTES_PER_MB = 1024 * 1024;
@Mapping(from = Template.class, to = VmTemplate.class)
public static VmTemplate map(Template model, VmTemplate incoming) {
VmTemplate entity = incoming != null ? incoming : new VmTemplate();
if (model.isSetName()) {
entity.setname(model.getName());
}
if (model.isSetId()) {
entity.setId(new Guid(model.getId()));
}
if (model.isSetDescription()) {
entity.setdescription(model.getDescription());
}
if (model.isSetCluster() && model.getCluster().getId() != null) {
entity.setvds_group_id(new Guid(model.getCluster().getId()));
}
if (model.isSetHighAvailability()) {
if (model.getHighAvailability().isSetEnabled()) {
entity.setauto_startup(model.getHighAvailability().isEnabled());
}
if (model.getHighAvailability().isSetPriority()) {
entity.setpriority(model.getHighAvailability().getPriority());
}
}
if (model.isSetStateless()) {
entity.setis_stateless(model.isStateless());
}
if (model.isSetType()) {
VmType vmType = VmType.fromValue(model.getType());
if (vmType != null) {
entity.setvm_type(VmMapper.map(vmType, null));
}
}
if (model.isSetOrigin()) {
entity.setorigin(VmMapper.map(model.getOrigin(), (OriginType)null));
}
if (model.isSetMemory()) {
entity.setmem_size_mb((int)(model.getMemory() / BYTES_PER_MB));
}
if (model.isSetCpu() && model.getCpu().isSetTopology()) {
if (model.getCpu().getTopology().isSetCores()) {
entity.setcpu_per_socket(model.getCpu().getTopology().getCores());
}
if (model.getCpu().getTopology().isSetSockets()) {
entity.setnum_of_sockets(model.getCpu().getTopology().getSockets());
}
}
if (model.isSetOs()) {
if (model.getOs().isSetType()) {
OsType osType = OsType.fromValue(model.getOs().getType());
if (osType != null) {
entity.setos(VmMapper.map(osType, null));
}
}
if (model.getOs().isSetBoot() && model.getOs().getBoot().size() > 0) {
entity.setdefault_boot_sequence(VmMapper.map(model.getOs().getBoot(), null));
}
if (model.getOs().isSetKernel()) {
entity.setkernel_url(model.getOs().getKernel());
}
if (model.getOs().isSetInitrd()) {
entity.setinitrd_url(model.getOs().getInitrd());
}
if (model.getOs().isSetCmdline()) {
entity.setkernel_params(model.getOs().getCmdline());
}
}
if (model.isSetDisplay()) {
if (model.getDisplay().isSetType()) {
DisplayType displayType = DisplayType.fromValue(model.getDisplay().getType());
if (displayType != null) {
entity.setdefault_display_type(VmMapper.map(displayType, null));
}
}
if (model.getDisplay().isSetMonitors()) {
entity.setnum_of_monitors(model.getDisplay().getMonitors());
}
}
if (model.isSetDomain() && model.getDomain().isSetName()) {
entity.setdomain(model.getDomain().getName());
}
if (model.isSetTimezone()) {
entity.settime_zone(TimeZoneMapping.getWindows(model.getTimezone()));
}
if (model.isSetUsb()) {
entity.setusb_policy(model.getUsb().isEnabled() ? UsbPolicy.Enabled : UsbPolicy.Disabled);
}
return entity;
}
@Mapping(from = Template.class, to = VmStatic.class)
public static VmStatic map(Template model, VmStatic incoming) {
VmStatic staticVm = incoming != null ? incoming : new VmStatic();
if (model.isSetName()) {
staticVm.setvm_name(model.getName());
}
if (model.isSetId()) {
staticVm.setId(new Guid(model.getId()));
}
if (model.isSetDescription()) {
staticVm.setdescription(model.getDescription());
}
if (model.isSetCluster() && model.getCluster().getId() != null) {
staticVm.setvds_group_id(new Guid(model.getCluster().getId()));
}
if (model.isSetHighAvailability()) {
if (model.getHighAvailability().isSetEnabled()) {
staticVm.setauto_startup(model.getHighAvailability().isEnabled());
}
if (model.getHighAvailability().isSetPriority()) {
staticVm.setpriority(model.getHighAvailability().getPriority());
}
}
if (model.isSetStateless()) {
staticVm.setis_stateless(model.isStateless());
}
if (model.isSetType()) {
VmType vmType = VmType.fromValue(model.getType());
if (vmType != null) {
staticVm.setvm_type(VmMapper.map(vmType, null));
}
}
if (model.isSetOrigin()) {
staticVm.setorigin(VmMapper.map(model.getOrigin(), (OriginType)null));
}
if (model.isSetMemory()) {
staticVm.setmem_size_mb((int)(model.getMemory() / BYTES_PER_MB));
}
if (model.isSetCpu() && model.getCpu().isSetTopology()) {
if (model.getCpu().getTopology().isSetCores()) {
staticVm.setcpu_per_socket(model.getCpu().getTopology().getCores());
}
if (model.getCpu().getTopology().isSetSockets()) {
staticVm.setnum_of_sockets(model.getCpu().getTopology().getSockets());
}
}
if (model.isSetOs()) {
if (model.getOs().isSetType()) {
OsType osType = OsType.fromValue(model.getOs().getType());
if (osType != null) {
staticVm.setos(VmMapper.map(osType, null));
}
}
if (model.getOs().isSetBoot() && model.getOs().getBoot().size() > 0) {
staticVm.setdefault_boot_sequence(VmMapper.map(model.getOs().getBoot(), null));
}
if (model.getOs().isSetKernel()) {
staticVm.setkernel_url(model.getOs().getKernel());
}
if (model.getOs().isSetInitrd()) {
staticVm.setinitrd_url(model.getOs().getInitrd());
}
if (model.getOs().isSetCmdline()) {
staticVm.setkernel_params(model.getOs().getCmdline());
}
}
if (model.isSetDisplay()) {
if (model.getDisplay().isSetType()) {
DisplayType displayType = DisplayType.fromValue(model.getDisplay().getType());
if (displayType != null) {
staticVm.setdefault_display_type(VmMapper.map(displayType, null));
}
}
if (model.getDisplay().isSetMonitors()) {
staticVm.setnum_of_monitors(model.getDisplay().getMonitors());
}
}
if (model.isSetDomain() && model.getDomain().isSetName()) {
staticVm.setdomain(model.getDomain().getName());
}
if (model.isSetTimezone()) {
staticVm.settime_zone(TimeZoneMapping.getWindows(model.getTimezone()));
}
if (model.isSetUsb()) {
staticVm.setusb_policy(model.getUsb().isEnabled() ? UsbPolicy.Enabled : UsbPolicy.Disabled);
}
return staticVm;
}
@Mapping(from = VmTemplate.class, to = Template.class)
public static Template map(VmTemplate entity, Template incoming) {
Template model = incoming != null ? incoming : new Template();
model.setId(entity.getId().toString());
model.setName(entity.getname());
model.setDescription(entity.getdescription());
model.setMemory((long)entity.getmem_size_mb() * BYTES_PER_MB);
model.setHighAvailability(new HighAvailability());
model.getHighAvailability().setEnabled(entity.getauto_startup());
model.getHighAvailability().setPriority(entity.getpriority());
model.setStateless(entity.getis_stateless());
if (entity.getvm_type() != null) {
model.setType(VmMapper.map(entity.getvm_type(), null));
}
if (entity.getorigin() != null) {
model.setOrigin(VmMapper.map(entity.getorigin(), null));
}
if (entity.getstatus() != null) {
model.setStatus(StatusUtils.create(map(entity.getstatus(), null)));
}
if (entity.getos() != null ||
entity.getdefault_boot_sequence() != null ||
entity.getkernel_url() != null ||
entity.getinitrd_url() != null ||
entity.getkernel_params() != null) {
OperatingSystem os = new OperatingSystem();
if (entity.getos() != null) {
OsType osType = VmMapper.map(entity.getos(), null);
if (osType != null) {
os.setType(osType.value());
}
}
if (entity.getdefault_boot_sequence() != null) {
for (Boot boot : VmMapper.map(entity.getdefault_boot_sequence(), null)) {
os.getBoot().add(boot);
}
}
os.setKernel(entity.getkernel_url());
os.setInitrd(entity.getinitrd_url());
os.setCmdline(entity.getkernel_params());
model.setOs(os);
}
if (entity.getvds_group_id() != null) {
Cluster cluster = new Cluster();
cluster.setId(entity.getvds_group_id().toString());
model.setCluster(cluster);
}
CpuTopology topology = new CpuTopology();
topology.setSockets(entity.getnum_of_sockets());
topology.setCores(entity.getnum_of_cpus() / entity.getnum_of_sockets());
model.setCpu(new CPU());
model.getCpu().setTopology(topology);
if (entity.getdefault_display_type() != null) {
model.setDisplay(new Display());
model.getDisplay().setType(VmMapper.map(entity.getdefault_display_type(), null));
model.getDisplay().setMonitors(entity.getnum_of_monitors());
}
if (entity.getcreation_date() != null) {
model.setCreationTime(DateMapper.map(entity.getcreation_date(), null));
}
if (entity.getdomain()!=null && !entity.getdomain().isEmpty()) {
Domain domain = new Domain();
domain.setName(entity.getdomain());
model.setDomain(domain);
}
if (entity.getusb_policy()!=null) {
Usb usb = new Usb();
usb.setEnabled(entity.getusb_policy()==UsbPolicy.Enabled ? true : false);
model.setUsb(usb);
}
model.setTimezone(TimeZoneMapping.getJava(entity.gettime_zone()));
return model;
}
@Mapping(from = VmTemplateStatus.class, to = TemplateStatus.class)
public static TemplateStatus map(VmTemplateStatus entityStatus, TemplateStatus incoming) {
switch (entityStatus) {
case OK:
return TemplateStatus.OK;
case Locked:
return TemplateStatus.LOCKED;
case Illegal:
return TemplateStatus.ILLEGAL;
default:
return null;
}
}
}