package org.ovirt.engine.core.vdsbroker.vdsbroker; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.vdscommands.SetupNetworksVdsCommandParameters; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcStruct; public class SetupNetworksVDSCommand<T extends SetupNetworksVdsCommandParameters> extends VdsBrokerCommand<T> { public SetupNetworksVDSCommand(T parameters) { super(parameters); } @Override protected void ExecuteVdsBrokerCommand() { XmlRpcStruct bonds = new XmlRpcStruct(); XmlRpcStruct networks = new XmlRpcStruct(); Map<String, String> removeObj = new HashMap<String, String>(); removeObj.put("remove", "true"); // Networks for (network net : getParameters().getNetworks()) { Map<String, String> opts = new HashMap<String, String>(); VdsNetworkInterface i = findNetworkInterface(net.getname(), getParameters().getInterfaces(), getParameters().getBonds()); String type = (i.getBonded() != null && i.getBonded()) ? "bonding" : "nic"; opts.put(type, i.getName()); if (net.getvlan_id() != null) { opts.put("vlan", net.getvlan_id().toString()); } // TODO: add bootproto to network object switch (i.getBootProtocol()) { case Dhcp: opts.put(VdsProperties.bootproto, VdsProperties.dhcp); break; case StaticIp: if (!StringHelper.isNullOrEmpty(i.getAddress())) { opts.put("ipaddr", net.getaddr()); } if (!StringHelper.isNullOrEmpty(net.getsubnet())) { opts.put("netmask", net.getsubnet()); } if (!StringHelper.isNullOrEmpty(net.getgateway())) { opts.put("gateway", net.getgateway()); } break; } networks.add(net.getname(), opts); } // Removed Networks for (network net : getParameters().getRemovedNetworks()) { networks.add(net.getname(), removeObj); } // Bonds for (VdsNetworkInterface bond : getParameters().getBonds()) { XmlRpcStruct opts = new XmlRpcStruct(); opts.add("nics", getBondNics(bond, getParameters().getInterfaces())); // opts.add("nics", "eth1,eth2"); if (!StringHelper.isNullOrEmpty(bond.getBondOptions())) { opts.add("BONDING_OPTS", bond.getBondOptions()); } bonds.add(bond.getName(), opts); } // Removed Bonds for (VdsNetworkInterface bond : getParameters().getRemovedBonds()) { bonds.add(bond.getName(), removeObj); } // Options XmlRpcStruct options = new XmlRpcStruct(); if (getParameters().isCheckConnectivity()) { options.add(VdsProperties.connectivityCheck, "true"); } else { options.add(VdsProperties.connectivityCheck, "false"); } if (getParameters().getConectivityTimeout() >= 0) { options.add(VdsProperties.connectivityTimeout, (new Integer(getParameters().getConectivityTimeout())).toString()); } status = getBroker().setupNetworks(networks, bonds, options); ProceedProxyReturnValue(); } private List<String> getBondNics(VdsNetworkInterface bond, List<VdsNetworkInterface> interfaces) { List<String> nics = new ArrayList<String>(); for (VdsNetworkInterface i : interfaces) { if (bond.getName().equals(i.getBondName())) { nics.add(i.getName()); } } return nics; } private VdsNetworkInterface findNetworkInterface(String network, List<VdsNetworkInterface> interfaces, List<VdsNetworkInterface> bonds) { for (VdsNetworkInterface i : interfaces) { if (network.equals(i.getNetworkName())) { return i; } } for (VdsNetworkInterface i : bonds) { if (network.equals(i.getNetworkName())) { return i; } } return null; } }