package org.ovirt.engine.api.restapi.types;
import static org.ovirt.engine.api.restapi.types.IntegerMapper.mapMinusOneToNull;
import static org.ovirt.engine.api.restapi.types.IntegerMapper.mapNullToMinusOne;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.api.model.Bios;
import org.ovirt.engine.api.model.Boot;
import org.ovirt.engine.api.model.BootMenu;
import org.ovirt.engine.api.model.Cluster;
import org.ovirt.engine.api.model.Cpu;
import org.ovirt.engine.api.model.CpuProfile;
import org.ovirt.engine.api.model.CpuTopology;
import org.ovirt.engine.api.model.CustomProperties;
import org.ovirt.engine.api.model.DisplayDisconnectAction;
import org.ovirt.engine.api.model.Domain;
import org.ovirt.engine.api.model.HighAvailability;
import org.ovirt.engine.api.model.Icon;
import org.ovirt.engine.api.model.Io;
import org.ovirt.engine.api.model.MemoryPolicy;
import org.ovirt.engine.api.model.Quota;
import org.ovirt.engine.api.model.TimeZone;
import org.ovirt.engine.api.model.Usb;
import org.ovirt.engine.api.model.UsbType;
import org.ovirt.engine.api.model.VmBase;
import org.ovirt.engine.api.model.VmType;
import org.ovirt.engine.api.restapi.utils.CustomPropertiesParser;
import org.ovirt.engine.api.restapi.utils.GuidUtils;
import org.ovirt.engine.api.restapi.utils.UsbMapperUtils;
import org.ovirt.engine.core.common.businessentities.ConsoleDisconnectAction;
import org.ovirt.engine.core.common.businessentities.OriginType;
public class VmBaseMapper {
protected static final int BYTES_PER_MB = 1024 * 1024;
/**
* Common for VM, template and instance type
*/
protected static void mapCommonModelToEntity(org.ovirt.engine.core.common.businessentities.VmBase entity, VmBase model) {
if (model.isSetName()) {
entity.setName(model.getName());
}
if (model.isSetMemory()) {
entity.setMemSizeMb((int) (model.getMemory() / BYTES_PER_MB));
}
if (model.isSetIo() && model.getIo().isSetThreads()) {
entity.setNumOfIoThreads(model.getIo().getThreads());
}
if (model.isSetDescription()) {
entity.setDescription(model.getDescription());
}
if (model.isSetCpu() && model.getCpu().isSetTopology()) {
if (model.getCpu().getTopology().getCores() != null) {
entity.setCpuPerSocket(model.getCpu().getTopology().getCores());
}
if (model.getCpu().getTopology().getSockets() != null) {
entity.setNumOfSockets(model.getCpu().getTopology().getSockets());
}
if (model.getCpu().getTopology().getThreads() != null) {
entity.setThreadsPerCpu(model.getCpu().getTopology().getThreads());
}
}
if (model.isSetHighAvailability()) {
if (model.getHighAvailability().isSetEnabled()) {
entity.setAutoStartup(model.getHighAvailability().isEnabled());
}
if (model.getHighAvailability().isSetPriority()) {
entity.setPriority(model.getHighAvailability().getPriority());
}
}
if (model.isSetDisplay()) {
if (model.getDisplay().isSetType()) {
entity.setDefaultDisplayType(null); // let backend decide which video device to use
}
if (model.getDisplay().isSetMonitors()) {
entity.setNumOfMonitors(model.getDisplay().getMonitors());
}
if (model.getDisplay().isSetSingleQxlPci()) {
entity.setSingleQxlPci(model.getDisplay().isSingleQxlPci());
}
if (model.getDisplay().isSetSmartcardEnabled()) {
entity.setSmartcardEnabled(model.getDisplay().isSmartcardEnabled());
}
}
if (model.isSetMigrationDowntime()) {
entity.setMigrationDowntime(mapMinusOneToNull(model.getMigrationDowntime()));
}
if (model.isSetMigration()) {
MigrationOptionsMapper.copyMigrationOptions(model.getMigration(), entity);
}
if (model.isSetCustomCpuModel()) {
entity.setCustomCpuName(model.getCustomCpuModel());
}
if (model.isSetCustomEmulatedMachine()) {
entity.setCustomEmulatedMachine(model.getCustomEmulatedMachine());
}
if (model.isSetMemoryPolicy() && model.getMemoryPolicy().isSetGuaranteed()) {
Long memGuaranteed = model.getMemoryPolicy().getGuaranteed() / BYTES_PER_MB;
entity.setMinAllocatedMem(memGuaranteed.intValue());
}
if (model.isSetMemoryPolicy() && model.getMemoryPolicy().isSetMax()) {
Long maxMemory = model.getMemoryPolicy().getMax() / BYTES_PER_MB;
entity.setMaxMemorySizeMb(maxMemory.intValue());
}
if (model.isSetOs()) {
Boot boot = model.getOs().getBoot();
if (boot != null && boot.isSetDevices() && boot.getDevices().isSetDevices()) {
entity.setDefaultBootSequence(VmMapper.map(model.getOs().getBoot(), null));
}
}
if (model.isSetCustomCompatibilityVersion()) {
entity.setCustomCompatibilityVersion(VersionMapper.map(model.getCustomCompatibilityVersion()));
}
if (model.isSetLease()) {
entity.setLeaseStorageDomainId(StorageDomainLeaseMapper.map(model.getLease()));
}
}
/**
* Common for VM and template
*/
protected static void mapVmBaseModelToEntity(org.ovirt.engine.core.common.businessentities.VmBase entity, VmBase model) {
mapCommonModelToEntity(entity, model);
if (model.isSetId()) {
entity.setId(GuidUtils.asGuid(model.getId()));
}
if (model.isSetComment()) {
entity.setComment(model.getComment());
}
if (model.isSetCluster() && model.getCluster().getId() != null) {
entity.setClusterId(GuidUtils.asGuid(model.getCluster().getId()));
}
if (model.isSetOs()) {
if (model.getOs().isSetType()) {
entity.setOsId(VmMapper.mapOsType(model.getOs().getType()));
}
if (model.getOs().isSetKernel()) {
entity.setKernelUrl(model.getOs().getKernel());
}
if (model.getOs().isSetInitrd()) {
entity.setInitrdUrl(model.getOs().getInitrd());
}
if (model.getOs().isSetCmdline()) {
entity.setKernelParams(model.getOs().getCmdline());
}
}
if (model.isSetBios()) {
if (model.getBios().isSetBootMenu()) {
entity.setBootMenuEnabled(model.getBios().getBootMenu().isEnabled());
}
}
if (model.isSetCpuShares()) {
entity.setCpuShares(model.getCpuShares());
}
if (model.isSetDisplay()) {
if (model.getDisplay().isSetAllowOverride()) {
entity.setAllowConsoleReconnect(model.getDisplay().isAllowOverride());
}
if (model.getDisplay().isSetKeyboardLayout()) {
String layout = model.getDisplay().getKeyboardLayout();
if (layout.isEmpty()) {
layout = null; // uniquely represent unset keyboard layout as null
}
entity.setVncKeyboardLayout(layout);
}
if (model.getDisplay().isSetFileTransferEnabled()) {
entity.setSpiceFileTransferEnabled(model.getDisplay().isFileTransferEnabled());
}
if (model.getDisplay().isSetCopyPasteEnabled()) {
entity.setSpiceCopyPasteEnabled(model.getDisplay().isCopyPasteEnabled());
}
if (model.getDisplay().isSetDisconnectAction()) {
DisplayDisconnectAction action = DisplayDisconnectAction.fromValue(model.getDisplay().getDisconnectAction());
entity.setConsoleDisconnectAction(map(action, null));
}
}
if (model.isSetTimeZone()) {
if (model.getTimeZone().isSetName()) {
String timezone = model.getTimeZone().getName();
if (timezone.isEmpty()) {
timezone = null; // normalize default timezone representation
}
entity.setTimeZone(timezone);
}
}
if (model.isSetOrigin()) {
entity.setOrigin(VmMapper.map(model.getOrigin(), (OriginType) null));
}
if (model.isSetStateless()) {
entity.setStateless(model.isStateless());
}
if (model.isSetDeleteProtected()) {
entity.setDeleteProtected(model.isDeleteProtected());
}
if (model.isSetSso() && model.getSso().isSetMethods()) {
entity.setSsoMethod(SsoMapper.map(model.getSso(), null));
}
if (model.isSetType()) {
entity.setVmType(VmMapper.map(model.getType(), null));
}
if (model.isSetTunnelMigration()) {
entity.setTunnelMigration(model.isTunnelMigration());
}
if (model.isSetSerialNumber()) {
SerialNumberMapper.copySerialNumber(model.getSerialNumber(), entity);
}
if (model.isSetStartPaused()) {
entity.setRunAndPause(model.isStartPaused());
}
if (model.isSetCpuProfile() && model.getCpuProfile().isSetId()) {
entity.setCpuProfileId(GuidUtils.asGuid(model.getCpuProfile().getId()));
}
if (model.isSetCustomProperties()) {
entity.setCustomProperties(CustomPropertiesParser.parse(model.getCustomProperties().getCustomProperties()));
}
if (model.isSetLargeIcon() && model.getLargeIcon().isSetId()) {
entity.setLargeIconId(GuidUtils.asGuid(model.getLargeIcon().getId()));
}
if (model.isSetSmallIcon() && model.getSmallIcon().isSetId()) {
entity.setSmallIconId(GuidUtils.asGuid(model.getSmallIcon().getId()));
}
if (model.isSetQuota() && model.getQuota().isSetId()) {
entity.setQuotaId(GuidUtils.asGuid(model.getQuota().getId()));
}
if (model.isSetLease()) {
entity.setLeaseStorageDomainId(StorageDomainLeaseMapper.map(model.getLease()));
}
}
/**
* Common for VM, template and instance type
*/
protected static void mapCommonEntityToModel(VmBase model, org.ovirt.engine.core.common.businessentities.VmBase entity) {
model.setId(entity.getId().toString());
model.setName(entity.getName());
model.setDescription(entity.getDescription());
model.setMemory((long) entity.getMemSizeMb() * BYTES_PER_MB);
Io io = model.getIo();
if (io == null) {
io = new Io();
model.setIo(io);
}
io.setThreads(entity.getNumOfIoThreads());
if (entity.getCreationDate() != null) {
model.setCreationTime(DateMapper.map(entity.getCreationDate(), null));
}
if (entity.getUsbPolicy() != null) {
Usb usb = new Usb();
usb.setEnabled(UsbMapperUtils.getIsUsbEnabled(entity.getUsbPolicy()));
UsbType usbType = UsbMapperUtils.getUsbType(entity.getUsbPolicy());
if (usbType != null) {
usb.setType(usbType);
}
model.setUsb(usb);
}
CpuTopology topology = new CpuTopology();
topology.setSockets(entity.getNumOfSockets());
topology.setCores(entity.getCpuPerSocket());
topology.setThreads(entity.getThreadsPerCpu());
model.setCpu(new Cpu());
model.getCpu().setTopology(topology);
model.setHighAvailability(new HighAvailability());
model.getHighAvailability().setEnabled(entity.isAutoStartup());
model.getHighAvailability().setPriority(entity.getPriority());
model.setMigrationDowntime(mapNullToMinusOne(entity.getMigrationDowntime()));
model.setMigration(MigrationOptionsMapper.map(entity, null));
if (entity.getCustomEmulatedMachine() != null) {
model.setCustomEmulatedMachine(entity.getCustomEmulatedMachine());
}
if (entity.getCustomCpuName() != null) {
model.setCustomCpuModel(entity.getCustomCpuName());
}
MemoryPolicy policy = new MemoryPolicy();
policy.setGuaranteed((long)entity.getMinAllocatedMem() * (long)BYTES_PER_MB);
policy.setMax((long)entity.getMaxMemorySizeMb() * (long)BYTES_PER_MB);
model.setMemoryPolicy(policy);
if (entity.getCustomCompatibilityVersion() != null) {
model.setCustomCompatibilityVersion(VersionMapper.map(entity.getCustomCompatibilityVersion()));
}
model.setLease(StorageDomainLeaseMapper.map(entity.getLeaseStorageDomainId()));
}
/**
* Common for VM and template
*/
protected static void mapVmBaseEntityToModel(VmBase model, org.ovirt.engine.core.common.businessentities.VmBase entity) {
mapCommonEntityToModel(model, entity);
model.setComment(entity.getComment());
if (entity.getClusterId() != null) {
Cluster cluster = new Cluster();
cluster.setId(entity.getClusterId().toString());
model.setCluster(cluster);
}
if (entity.getVmType() != null) {
model.setType(map(entity.getVmType(), null));
}
if (entity.getOrigin() != null) {
model.setOrigin(map(entity.getOrigin(), null));
}
model.setBios(new Bios());
model.getBios().setBootMenu(new BootMenu());
model.getBios().getBootMenu().setEnabled(entity.isBootMenuEnabled());
if(entity.getTimeZone() != null) {
model.setTimeZone(new TimeZone());
model.getTimeZone().setName(entity.getTimeZone());
}
if (entity.getVmInit() != null && entity.getVmInit().getDomain() != null && StringUtils.isNotBlank(entity.getVmInit().getDomain())) {
Domain domain = new Domain();
domain.setName(entity.getVmInit().getDomain());
model.setDomain(domain);
}
model.setStateless(entity.isStateless());
model.setDeleteProtected(entity.isDeleteProtected());
model.setSso(SsoMapper.map(entity.getSsoMethod(), null));
model.setTunnelMigration(entity.getTunnelMigration());
if (entity.getSerialNumberPolicy() != null) {
model.setSerialNumber(SerialNumberMapper.map(entity, null));
}
model.setStartPaused(entity.isRunAndPause());
if (entity.getCpuProfileId() != null) {
CpuProfile cpuProfile = new CpuProfile();
cpuProfile.setId(entity.getCpuProfileId().toString());
model.setCpuProfile(cpuProfile);
}
if (!StringUtils.isEmpty(entity.getCustomProperties())) {
CustomProperties hooks = new CustomProperties();
hooks.getCustomProperties().addAll(CustomPropertiesParser.parse(entity.getCustomProperties(), false));
model.setCustomProperties(hooks);
}
model.setCpuShares(entity.getCpuShares());
if (entity.getLargeIconId() != null) {
if (!model.isSetLargeIcon()) {
model.setLargeIcon(new Icon());
}
model.getLargeIcon().setId(entity.getLargeIconId().toString());
}
if (entity.getSmallIconId() != null) {
if (!model.isSetSmallIcon()) {
model.setSmallIcon(new Icon());
}
model.getSmallIcon().setId(entity.getSmallIconId().toString());
}
if (entity.getQuotaId()!=null) {
Quota quota = new Quota();
quota.setId(entity.getQuotaId().toString());
model.setQuota(quota);
}
model.setLease(StorageDomainLeaseMapper.map(entity.getLeaseStorageDomainId()));
}
@Mapping(from = DisplayDisconnectAction.class, to = ConsoleDisconnectAction.class)
public static ConsoleDisconnectAction map(DisplayDisconnectAction action, ConsoleDisconnectAction incoming) {
if (action == null) {
return ConsoleDisconnectAction.LOCK_SCREEN;
}
switch (action) {
case NONE:
return ConsoleDisconnectAction.NONE;
case LOCK_SCREEN:
return ConsoleDisconnectAction.LOCK_SCREEN;
case LOGOUT:
return ConsoleDisconnectAction.LOGOUT;
case REBOOT:
return ConsoleDisconnectAction.REBOOT;
case SHUTDOWN:
return ConsoleDisconnectAction.SHUTDOWN;
default:
return null;
}
}
@Mapping(from = ConsoleDisconnectAction.class, to = DisplayDisconnectAction.class)
public static DisplayDisconnectAction map(ConsoleDisconnectAction action, DisplayDisconnectAction incoming) {
if (action == null) {
return DisplayDisconnectAction.LOCK_SCREEN;
}
switch (action) {
case NONE:
return DisplayDisconnectAction.NONE;
case LOCK_SCREEN:
return DisplayDisconnectAction.LOCK_SCREEN;
case LOGOUT:
return DisplayDisconnectAction.LOGOUT;
case REBOOT:
return DisplayDisconnectAction.REBOOT;
case SHUTDOWN:
return DisplayDisconnectAction.SHUTDOWN;
default:
return null;
}
}
@Mapping(from = OriginType.class, to = String.class)
public static String map(OriginType type, String incoming) {
return type.name().toLowerCase();
}
@Mapping(from = org.ovirt.engine.core.common.businessentities.VmType.class, to = VmType.class)
public static VmType map(org.ovirt.engine.core.common.businessentities.VmType type, VmType incoming) {
switch (type) {
case Desktop:
return VmType.DESKTOP;
case Server:
return VmType.SERVER;
default:
return null;
}
}
}