package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AttachNetworkToVdsParameters; import org.ovirt.engine.core.common.businessentities.NetworkStatus; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; 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 DetachNetworkFromVdsInterfaceCommand<T extends AttachNetworkToVdsParameters> extends VdsNetworkCommand<T> { public DetachNetworkFromVdsInterfaceCommand(T paramenters) { super(paramenters); } @Override protected void executeCommand() { String bond = null; java.util.ArrayList<String> nics = new java.util.ArrayList<String>(); nics.add(NetworkUtils.StripVlan(getParameters().getInterface().getName())); Integer vlanId = NetworkUtils.GetVlanId(getParameters().getInterface().getName()); // vlan with bond // boolean isBond = // getParameters().getInterface().getname().startsWith("bond"); // //LINQ 31899 && NetworkParameters.Interface.name.Contains('.'); boolean isBond = getParameters().getInterface().getName().startsWith("bond") && getParameters().getInterface().getName().contains("."); // or just a bond... isBond = isBond || (getParameters().getInterface().getBonded() != null && getParameters().getInterface().getBonded()); // check if bond... if (isBond) { nics.clear(); bond = NetworkUtils.StripVlan(getParameters().getInterface().getName()); List<VdsNetworkInterface> interfaces = DbFacade.getInstance() .getInterfaceDAO().getAllInterfacesForVds(getParameters().getVdsId()); for (VdsNetworkInterface i : interfaces) { if (StringHelper.EqOp(i.getBondName(), bond)) { nics.add(NetworkUtils.StripVlan(i.getName())); } } } NetworkVdsmVDSCommandParameters parameters = new NetworkVdsmVDSCommandParameters(getParameters().getVdsId(), getParameters().getNetwork().getname(), vlanId, bond, nics.toArray(new String[] {}), getParameters() .getNetwork().getaddr(), getParameters().getNetwork().getsubnet(), getParameters().getNetwork() .getgateway(), getParameters().getNetwork().getstp(), getParameters().getBondingOptions(), getParameters().getBootProtocol()); VDSReturnValue retVal = Backend.getInstance().getResourceManager() .RunVdsCommand(VDSCommandType.RemoveNetwork, parameters); if (retVal.getSucceeded()) { // update vds network data retVal = Backend .getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.CollectVdsNetworkData, new VdsIdAndVdsVDSCommandParametersBase(getParameters().getVdsId())); if (retVal.getSucceeded()) { setSucceeded(true); } } } @Override protected boolean canDoAction() { List<VdsNetworkInterface> interfaces = DbFacade.getInstance().getInterfaceDAO() .getAllInterfacesForVds(getParameters().getVdsId()); // Interface iface = null; //LINQ 31899 interfaces.FirstOrDefault(i => // i.name == NetworkParameters.Interface.name); VdsNetworkInterface iface = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { return i.getName().equals(getParameters().getInterface().getName()); } }); if (iface == null) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_NOT_EXISTS); return false; } if (StringHelper.isNullOrEmpty(getParameters().getInterface().getNetworkName())) { getParameters().getInterface().setNetworkName(iface.getNetworkName()); } // set the network object if we don't got in the parameters if (getParameters().getNetwork() == null) { List<network> networks = DbFacade.getInstance().getNetworkDAO() .getAllForCluster(getVdsGroupId()); for (network n : networks) { if (n.getname().equals(iface.getNetworkName())) { getParameters().setNetwork(n); break; } } } if (StringHelper.isNullOrEmpty(iface.getNetworkName())) { if (iface.getBonded() != null && iface.getBonded() == true) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_NOT_ATTACCH_TO_NETWORK); } else { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_NOT_ATTACCH_TO_NETWORK); } return false; } else if (!StringHelper.EqOp(getParameters().getInterface().getNetworkName(), getParameters().getNetwork() .getname())) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_NOT_ATTACCH_TO_NETWORK); return false; } VDS vds = DbFacade.getInstance().getVdsDAO().get(getParameters().getVdsId()); // check if network in cluster and vds active if ((vds.getstatus() == VDSStatus.Up || vds.getstatus() == VDSStatus.Installing) && getParameters().getNetwork().getStatus() == NetworkStatus.Operational) { List<network> networks = DbFacade.getInstance().getNetworkDAO() .getAllForCluster(vds.getvds_group_id()); // if (true) //LINQ 31899 null != networks.FirstOrDefault(n => // n.name == NetworkParameters.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_CLUSTER_NETWORK_IN_USE); return false; } } return true; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_DETACH_NETWORK_FROM_VDS : AuditLogType.NETWORK_DETACH_NETWORK_FROM_VDS_FAILED; } }