package org.ovirt.engine.api.restapi.types; import java.math.BigDecimal; import org.ovirt.engine.api.common.util.StatusUtils; import org.ovirt.engine.api.model.CPU; import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.model.CpuTopology; import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.HostStatus; import org.ovirt.engine.api.model.HostType; import org.ovirt.engine.api.model.IscsiDetails; import org.ovirt.engine.api.model.KSM; import org.ovirt.engine.api.model.PowerManagement; import org.ovirt.engine.api.model.Option; import org.ovirt.engine.api.model.Options; import org.ovirt.engine.api.model.TransparentHugePages; import org.ovirt.engine.api.model.VmSummary; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.common.businessentities.VdsSpmStatus; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.VdsTransparentHugePagesState; import org.ovirt.engine.core.common.queries.ValueObjectMap; import org.ovirt.engine.core.common.queries.ValueObjectPair; import org.ovirt.engine.core.compat.Guid; public class HostMapper { public static Long BYTES_IN_MEGABYTE = 1024L * 1024L; // REVISIT retrieve from configuration private static final int DEFAULT_VDSM_PORT = 54321; @Mapping(from = Host.class, to = VdsStatic.class) public static VdsStatic map(Host model, VdsStatic template) { VdsStatic entity = template != null ? template : new VdsStatic(); if (model.isSetId()) { entity.setId(new Guid(model.getId())); } if (model.isSetName()) { entity.setvds_name(model.getName()); } if (model.isSetCluster() && model.getCluster().isSetId()) { entity.setvds_group_id(new Guid(model.getCluster().getId())); } if (model.isSetAddress()) { entity.sethost_name(model.getAddress()); } if (model.isSetPort() && model.getPort() > 0) { entity.setport(model.getPort()); } else { entity.setport(DEFAULT_VDSM_PORT); } if (model.isSetPowerManagement()) { entity = map(model.getPowerManagement(), entity); } return entity; } @Mapping(from = PowerManagement.class, to = VdsStatic.class) public static VdsStatic map(PowerManagement model, VdsStatic template) { VdsStatic entity = template != null ? template : new VdsStatic(); if (model.isSetType()) { entity.setpm_type(model.getType()); } if (model.isSetEnabled()) { entity.setpm_enabled(model.isEnabled()); } if (model.isSetAddress()) { entity.setManagmentIp(model.getAddress()); } if (model.isSetUsername()) { entity.setpm_user(model.getUsername()); } if (model.isSetPassword()) { entity.setpm_password(model.getPassword()); } if (model.isSetOptions()) { entity.setpm_options(map(model.getOptions(), null)); } return entity; } @Mapping(from = Options.class, to = String.class) public static String map(Options model, String template) { StringBuilder buf = template != null ? new StringBuilder(template) : new StringBuilder(); for (Option option : model.getOptions()) { String opt = map(option, null); if (opt != null) { if (buf.length() > 0) { buf.append(","); } buf.append(opt); } } return buf.toString(); } @Mapping(from = Option.class, to = String.class) public static String map(Option model, String template) { if (model.isSetName() && (!model.getName().isEmpty()) && model.isSetValue() && (!model.getValue().isEmpty())) { return model.getName() + "=" + model.getValue(); } else { return template; } } @Mapping(from = VDS.class, to = Host.class) public static Host map(VDS entity, Host template) { Host model = template != null ? template : new Host(); model.setId(entity.getvds_id().toString()); model.setName(entity.getvds_name()); if (entity.getvds_group_id() != null) { Cluster cluster = new Cluster(); cluster.setId(entity.getvds_group_id().toString()); model.setCluster(cluster); } model.setAddress(entity.gethost_name()); if (entity.getport() > 0) { model.setPort(entity.getport()); } HostStatus status = map(entity.getstatus(), null); model.setStatus(StatusUtils.create(status)); if (status==HostStatus.NON_OPERATIONAL) { model.getStatus().setDetail(entity.getNonOperationalReason().name().toLowerCase()); } model.setStorageManager(entity.getspm_status() == VdsSpmStatus.SPM); model.setKsm(new KSM()); model.getKsm().setEnabled(Boolean.TRUE.equals(entity.getksm_state())); model.setTransparentHugepages(new TransparentHugePages()); model.getTransparentHugepages().setEnabled(!(entity.getTransparentHugePagesState() == null || entity.getTransparentHugePagesState() == VdsTransparentHugePagesState.Never)); if (entity.getIScsiInitiatorName() != null) { model.setIscsi(new IscsiDetails()); model.getIscsi().setInitiator(entity.getIScsiInitiatorName()); } model.setPowerManagement(map(entity, (PowerManagement)null)); CPU cpu = new CPU(); if (entity.getcpu_cores()!=null) { CpuTopology cpuTopology = new CpuTopology(); cpuTopology.setCores(entity.getcpu_cores()); cpuTopology.setSockets(entity.getcpu_sockets()); cpu.setTopology(cpuTopology); } cpu.setName(entity.getcpu_model()); if (entity.getcpu_speed_mh()!=null) { cpu.setSpeed(new BigDecimal(entity.getcpu_speed_mh())); } model.setCpu(cpu); VmSummary vmSummary = new VmSummary(); vmSummary.setActive(entity.getvm_active()); vmSummary.setMigrating(entity.getvm_migrating()); vmSummary.setTotal(entity.getvm_count()); model.setSummary(vmSummary); if (entity.getvds_type() != null) { HostType type = map(entity.getvds_type(), null); model.setType(type != null ? type.value() : null); } model.setMemory(entity.getphysical_mem_mb()==null ? 0 : entity.getphysical_mem_mb()*BYTES_IN_MEGABYTE); return model; } @Mapping(from = VDS.class, to = PowerManagement.class) public static PowerManagement map(VDS entity, PowerManagement template) { PowerManagement model = template != null ? template : new PowerManagement(); model.setType(entity.getpm_type()); model.setEnabled(entity.getpm_enabled()); model.setAddress(entity.getManagmentIp()); model.setUsername(entity.getpm_user()); if (entity.getPmOptionsMap() != null) { model.setOptions(map(entity.getPmOptionsMap(), null)); } return model; } @Mapping(from = ValueObjectMap.class, to = Options.class) public static Options map(ValueObjectMap entity, Options template) { Options model = template != null ? template : new Options(); for (ValueObjectPair option : entity.getValuePairs()) { model.getOptions().add(map(option, null)); } return model; } @Mapping(from = ValueObjectPair.class, to = Option.class) public static Option map(ValueObjectPair entity, Option template) { Option model = template != null ? template : new Option(); model.setName((String)entity.getKey()); model.setValue((String)entity.getValue()); return model; } @Mapping(from = VDSStatus.class, to = HostStatus.class) public static HostStatus map(VDSStatus entityStatus, HostStatus template) { switch (entityStatus) { case Unassigned: return HostStatus.UNASSIGNED; case Down: return HostStatus.DOWN; case Maintenance: return HostStatus.MAINTENANCE; case Up: return HostStatus.UP; case NonResponsive: return HostStatus.NON_RESPONSIVE; case Error: return HostStatus.ERROR; case Installing: return HostStatus.INSTALLING; case InstallFailed: return HostStatus.INSTALL_FAILED; case Reboot: return HostStatus.REBOOT; case PreparingForMaintenance: return HostStatus.PREPARING_FOR_MAINTENANCE; case NonOperational: return HostStatus.NON_OPERATIONAL; case PendingApproval: return HostStatus.PENDING_APPROVAL; case Initializing: return HostStatus.INITIALIZING; case Problematic: return HostStatus.CONNECTING; default: return null; } } @Mapping(from = VDSType.class, to = HostType.class) public static HostType map(VDSType type, HostType template) { switch (type) { case VDS: return HostType.RHEL; case oVirtNode: return HostType.RHEV_H; default: return null; } } }