package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddBondParameters; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.vdscommands.NetworkVdsmVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.VdsIdAndVdsVDSCommandParametersBase; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.NetworkUtils; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; public class AddBondCommand<T extends AddBondParameters> extends VdsBondCommand<T> { public AddBondCommand(T parameters) { super(parameters); if (parameters.getNics() != null) { for (String nic : parameters.getNics()) { AppendCustomValue("Interfaces", nic, ", "); } } } @Override protected void executeCommand() { String address = getParameters().getAddress(); String subnet = StringHelper.isNullOrEmpty(getParameters().getSubnet()) ? getParameters().getNetwork() .getsubnet() : getParameters().getSubnet(); String gateway = StringHelper.isNullOrEmpty(getParameters().getGateway()) ? getParameters().getNetwork() .getgateway() : getParameters().getGateway(); NetworkVdsmVDSCommandParameters parameters = new NetworkVdsmVDSCommandParameters(getParameters().getVdsId(), getParameters().getNetwork().getname(), getParameters().getNetwork().getvlan_id(), getParameters() .getBondName(), getParameters().getNics(), address, subnet, gateway, getParameters() .getNetwork().getstp(), getParameters().getBondingOptions(), getParameters().getBootProtocol()); VDSReturnValue retVal = Backend.getInstance().getResourceManager() .RunVdsCommand(VDSCommandType.AddNetwork, parameters); if (retVal.getSucceeded()) { // update vds network data retVal = Backend .getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.CollectVdsNetworkData, new VdsIdAndVdsVDSCommandParametersBase(getParameters().getVdsId())); if (retVal.getSucceeded()) { // set network status (this can change the network status to // operational) VdsStatic vdsStatic = DbFacade.getInstance().getVdsStaticDAO().get(getParameters().getVdsId()); AttachNetworkToVdsGroupCommand.SetNetworkStatus(vdsStatic.getvds_group_id(), getParameters() .getNetwork()); setSucceeded(true); } } } @Override protected boolean canDoAction() { // check minimum 2 nics in bond if (getParameters().getNics().length < 2) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_PARAMETERS_INVALID); return false; } if (getParameters().getNetwork() == null) { addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_NOT_EXISTS); return false; } List<VdsNetworkInterface> interfaces = DbFacade.getInstance().getInterfaceDAO().getAllInterfacesForVds( getParameters().getVdsId()); // check that bond exists // Interface bond = null; //LINQ 31899 interfaces.FirstOrDefault(i => // i.name == BondParameters.BondName); VdsNetworkInterface bond = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface anInterface) { return anInterface.getName().equals(getParameters().getBondName()); } }); if (bond == null) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_NAME_EXISTS); return false; } // check that each nic is valid for (final String nic : getParameters().getNics()) { // Interface iface = null; //LINQ 31899 interfaces.FirstOrDefault(i // => i.name == nic); VdsNetworkInterface iface = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { return i.getName().equals(nic); } }); if (iface == null) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_NAME_EXISTS); return false; } else if (!StringHelper.isNullOrEmpty(iface.getBondName())) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_NAME_ALREAY_IN_USE); return false; } else if (!StringHelper.isNullOrEmpty(iface.getNetworkName())) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_NAME_ALREAY_IN_USE); return false; } else if (NetworkUtils.interfaceHasVlan(iface, interfaces)) { // check that one of the nics is not connected to vlan addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_IN_USE_BY_VLAN); return false; } } // check that the network not in use // Interface I = null; //LINQ 31899 interfaces.FirstOrDefault(n => // n.network_name == AddBondParameters.Network.name); VdsNetworkInterface I = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { if (i.getNetworkName() != null) { return i.getNetworkName().equals(getParameters().getNetwork().getname()); } return false; } }); if (I != null) { addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_ALREAY_ATTACH_TO_INTERFACE); return false; } // check that the network exists in current cluster List<network> networks = DbFacade.getInstance().getNetworkDAO() .getAllForCluster(getVds().getvds_group_id()); // if (true) //LINQ 31899 null == networks.FirstOrDefault(n => n.name == // AddBondParameters.Network.name)) if (null == LinqUtils.firstOrNull(networks, new Predicate<network>() { @Override public boolean eval(network network) { return network.getname().equals(getParameters().getNetwork().getname()); } })) { addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_NET_EXISTS_IN_CLUSTER); return false; } return true; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_ADD_BOND : AuditLogType.NETWORK_ADD_BOND_FAILED; } }