package org.ovirt.engine.api.restapi.types; import org.ovirt.engine.api.common.util.StatusUtils; import org.ovirt.engine.api.model.Bonding; import org.ovirt.engine.api.model.BootProtocol; import org.ovirt.engine.api.model.HostNIC; import org.ovirt.engine.api.model.IP; import org.ovirt.engine.api.model.MAC; import org.ovirt.engine.api.model.Network; import org.ovirt.engine.api.model.NicStatus; import org.ovirt.engine.api.model.Option; import org.ovirt.engine.api.model.Options; import org.ovirt.engine.core.common.businessentities.InterfaceStatus; import org.ovirt.engine.core.common.businessentities.NetworkBootProtocol; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; public class HostNicMapper { private static final String OPTIONS_DELIMITER = "\\ "; private static final String OPTIONS_EQ = "\\="; private static final String[] BONDING_MODS = new String[]{"Active-Backup", "Load balance (balance-xor)", null, "Dynamic link aggregation (802.3ad)", "Adaptive transmit load balancing (balance-tlb)"}; @Mapping(from = HostNIC.class, to = VdsNetworkInterface.class) public static VdsNetworkInterface map(HostNIC model, VdsNetworkInterface template) { VdsNetworkInterface entity = template != null ? template : new VdsNetworkInterface(); if (model.isSetId()) { entity.setId(new Guid(model.getId())); } if (model.isSetNetwork() && model.getNetwork().isSetName()) { entity.setNetworkName(model.getNetwork().getName()); } if (model.isSetName()) { entity.setName(model.getName()); } if (model.isSetIp()) { if (model.getIp().isSetAddress()) { entity.setAddress(model.getIp().getAddress()); } if (model.getIp().isSetGateway()) { entity.setGateway(model.getIp().getGateway()); } if (model.getIp().isSetNetmask()) { entity.setSubnet(model.getIp().getNetmask()); } } if (model.isSetMac() && model.getMac().isSetAddress()) { entity.setMacAddress(model.getMac().getAddress()); } if(model.isSetBonding() && model.getBonding().isSetOptions()){ StringBuffer buf = new StringBuffer(); for(Option opt : model.getBonding().getOptions().getOptions()){ buf.append(opt.getName() + "=" + opt.getValue() + " "); } entity.setBondOptions(buf.toString().substring(0, buf.length() - 1)); } if(model.isSetBootProtocol()){ NetworkBootProtocol networkBootProtocol = map(BootProtocol.fromValue(model.getBootProtocol()), null); if(networkBootProtocol != null){ entity.setBootProtocol(networkBootProtocol); } } return entity; } @Mapping(from = VdsNetworkInterface.class, to = HostNIC.class) public static HostNIC map(VdsNetworkInterface entity, HostNIC template) { HostNIC model = template != null ? template : new HostNIC(); if (entity.getId() != null) { model.setId(entity.getId().toString()); } if (entity.getNetworkName() != null) { model.setNetwork(new Network()); model.getNetwork().setName(entity.getNetworkName()); } if (entity.getName() != null) { model.setName(entity.getName()); } if (entity.getAddress() != null || entity.getGateway() != null || entity.getSubnet() != null) { model.setIp(new IP()); if (entity.getAddress() != null) { model.getIp().setAddress(entity.getAddress()); } if (entity.getGateway() != null) { model.getIp().setGateway(entity.getGateway()); } if (entity.getSubnet() != null) { model.getIp().setNetmask(entity.getSubnet()); } } if (entity.getMacAddress() != null) { model.setMac(new MAC()); model.getMac().setAddress(entity.getMacAddress()); } if(entity.getStatistics().getStatus()!=InterfaceStatus.None){ NicStatus nicStatus = map(entity.getStatistics().getStatus(),null); if(nicStatus!=null){ model.setStatus(StatusUtils.create(nicStatus)); } } if(entity.getSpeed()!=null && entity.getSpeed()>0){ model.setSpeed(entity.getSpeed() * 1000L * 1000); } if(!StringHelper.isNullOrEmpty(entity.getBondOptions())){ if(model.getBonding() == null) model.setBonding(new Bonding()); model.getBonding().setOptions(new Options()); for(String opt : entity.getBondOptions().split(OPTIONS_DELIMITER)){ String[] option_pair = opt.split(OPTIONS_EQ); if(option_pair.length == 2){ Option option = new Option(); option.setName(option_pair[0]); option.setValue(option_pair[1]); option.setType(getType(option_pair)); model.getBonding().getOptions().getOptions().add(option); } } } BootProtocol bootProtocol = map(entity.getBootProtocol(), null); if(bootProtocol!=null){ model.setBootProtocol(bootProtocol.value()); } return model; } private static String getType(final String[] optionPair) { if(!StringHelper.isNullOrEmpty(optionPair[0]) && optionPair[0].equals("mode") && !StringHelper.isNullOrEmpty(optionPair[1])){ Integer mode = tryParse(optionPair[1]); if(mode != null && mode > 0 && mode < 6){ return BONDING_MODS[mode - 1]; } } return null; } public static Integer tryParse(String text) { try { return new Integer(text); } catch (NumberFormatException e) { return null; } } @Mapping(from = InterfaceStatus.class, to = NicStatus.class) public static NicStatus map(InterfaceStatus interfaceStatus, NicStatus template) { if(interfaceStatus!=null){ switch (interfaceStatus) { case Up: return NicStatus.UP; case Down: return NicStatus.DOWN; default: return null; } } return null; } @Mapping(from = NetworkBootProtocol.class, to = BootProtocol.class) public static BootProtocol map(NetworkBootProtocol networkBootProtocol, BootProtocol template) { if(networkBootProtocol!=null){ switch (networkBootProtocol) { case Dhcp: return BootProtocol.DHCP; case StaticIp: return BootProtocol.STATIC; default: return null; } } return null; } @Mapping(from = BootProtocol.class, to = NetworkBootProtocol.class) public static NetworkBootProtocol map(BootProtocol bootProtocol, NetworkBootProtocol template) { if(bootProtocol!=null){ switch (bootProtocol) { case DHCP: return NetworkBootProtocol.Dhcp; case STATIC: return NetworkBootProtocol.StaticIp; default: return null; } } return null; } }