package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.RemoveBondParameters; import org.ovirt.engine.core.common.businessentities.IVdcQueryable; import org.ovirt.engine.core.common.businessentities.NetworkBootProtocol; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.SearchParameters; import org.ovirt.engine.core.common.queries.SearchReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; 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 RemoveBondCommand<T extends RemoveBondParameters> extends VdsBondCommand<T> { public RemoveBondCommand(T parameters) { super(parameters); } private String _network; private java.util.ArrayList<String> _interfaces; @Override protected void executeCommand() { VdsNetworkInterface bond = null; List<VdsNetworkInterface> all = DbFacade.getInstance().getInterfaceDAO() .getAllInterfacesForVds(getParameters().getVdsId()); for (VdsNetworkInterface iface : all) { if (StringHelper.EqOp(iface.getName(), getParameters().getBondName())) { bond = iface; break; } } NetworkVdsmVDSCommandParameters parameters = new NetworkVdsmVDSCommandParameters(getParameters().getVdsId(), _network, NetworkUtils.GetVlanId(bond.getName()), NetworkUtils.StripVlan(getParameters().getBondName()), _interfaces.toArray(new String[] {}), null, null, null, false, null, NetworkBootProtocol.None); 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> vdsInterfaces = DbFacade.getInstance().getInterfaceDAO().getAllInterfacesForVds(getParameters().getVdsId()); // check that bond exists // Interface bond = null; //LINQ 31899 interfaces.FirstOrDefault(i => // i.name == BondParameters.BondName); final VdsNetworkInterface bond = LinqUtils.firstOrNull(vdsInterfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { return i.getName().equals(getParameters().getBondName()); } }); if (bond == null) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_NOT_EXISTS); return false; } if (bond.getBonded() != null && bond.getBonded().equals(false)) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_NOT_EXISTS); return false; } _network = bond.getNetworkName(); if (StringHelper.isNullOrEmpty(_network)) { addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_HAVE_ATTACHED_VLANS); return false; } // interfaces = null; //LINQ interfaces.Where(i => i.bond_name == // NetworkUtils.StripVlan(bond.name)).ToList(); vdsInterfaces = LinqUtils.filter(vdsInterfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { if (i.getBondName() != null) { return i.getBondName().equals(NetworkUtils.StripVlan(bond.getName())); } return false; } }); _interfaces = new java.util.ArrayList<String>(); for (VdsNetworkInterface iface : vdsInterfaces) { _interfaces.add(iface.getName()); } 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) { List<network> networks = DbFacade.getInstance().getNetworkDAO() .getAllForCluster(vds.getvds_group_id()); // if (true) //LINQ 31899 null != networks.FirstOrDefault(n => // n.name == bond.network_name)) if (null != LinqUtils.firstOrNull(networks, new Predicate<network>() { @Override public boolean eval(network n) { return n.getname().equals(bond.getName()); } })) { addCanDoActionMessage(VdcBllMessages.NETWORK_CLUSTER_NETWORK_IN_USE); return false; } } // check if network in use by vm String query = "Vms: cluster = " + vds.getvds_group_name(); SearchParameters searchParams = new SearchParameters(query, SearchType.VM); searchParams.setMaxCount(Integer.MAX_VALUE); VdcQueryReturnValue tempVar = Backend.getInstance().runInternalQuery(VdcQueryType.Search, searchParams); SearchReturnValue ret = (SearchReturnValue) ((tempVar instanceof SearchReturnValue) ? tempVar : null); if (ret.getSucceeded()) { Iterable<IVdcQueryable> vmList = (Iterable<IVdcQueryable>) ret.getReturnValue(); for (IVdcQueryable vm_helper : vmList) { VM vm = (VM) vm_helper; if (vm.getstatus() != VMStatus.Down) { List<VmNetworkInterface> vmInterfaces = DbFacade.getInstance().getVmNetworkInterfaceDAO() .getAllForVm(vm.getvm_guid()); // Interface iface = null; //LINQ 31899 // interfaces.FirstOrDefault(i => i.network_name == // bond.network_name); VmNetworkInterface iface = LinqUtils.firstOrNull(vmInterfaces, new Predicate<VmNetworkInterface>() { @Override public boolean eval(VmNetworkInterface i) { if (i.getNetworkName() != null) { return i.getNetworkName().equals(bond.getNetworkName()); } return false; } }); if (iface != null) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_IN_USE_BY_VM); return false; } } } } return true; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_REMOVE_BOND : AuditLogType.NETWORK_REMOVE_BOND_FAILED; } }