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.NetworkBootProtocol; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.queries.GetAllChildVlanInterfacesQueryParameters; 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.Guid; 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 AttachNetworkToVdsInterfaceCommand<T extends AttachNetworkToVdsParameters> extends VdsNetworkCommand<T> { public AttachNetworkToVdsInterfaceCommand(T parameters) { super(parameters); } @Override protected void executeCommand() { String bond = null; String address = getParameters().getAddress(); String subnet = StringHelper.isNullOrEmpty(getParameters().getSubnet()) ? getParameters().getNetwork() .getsubnet() : getParameters().getSubnet(); String gateway = StringHelper.isNullOrEmpty(getParameters().getGateway()) ? "" : getParameters().getGateway(); java.util.ArrayList<String> nics = new java.util.ArrayList<String>(); nics.add(getParameters().getInterface().getName()); // check if bond... if (getParameters().getInterface().getBonded() != null && getParameters().getInterface().getBonded()) { nics.clear(); bond = getParameters().getInterface().getName(); List<VdsNetworkInterface> interfaces = DbFacade.getInstance().getInterfaceDAO().getAllInterfacesForVds( getParameters().getVdsId()); for (VdsNetworkInterface i : interfaces) { if (StringHelper.EqOp(i.getBondName(), getParameters().getInterface().getName())) { nics.add(i.getName()); } } } NetworkVdsmVDSCommandParameters parameters = new NetworkVdsmVDSCommandParameters(getParameters().getVdsId(), getParameters().getNetwork().getname(), getParameters().getNetwork().getvlan_id(), bond, nics.toArray(new String[] {}), 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()) { Guid groupId = DbFacade.getInstance().getVdsDAO().get(getParameters().getVdsId()).getvds_group_id(); AttachNetworkToVdsGroupCommand.SetNetworkStatus(groupId, getParameters().getNetwork()); setSucceeded(true); } } } @Override protected boolean canDoAction() { List<VdsNetworkInterface> interfaces = DbFacade.getInstance().getInterfaceDAO() .getAllInterfacesForVds(getParameters().getVdsId()); // check that interface exists // LINQ 31899 // Interface iface = null; // interfaces.FirstOrDefault(i => i.name == // AttachNetworkToVdsParameters.Interface.name); VdsNetworkInterface iface = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { return StringHelper.EqOp(i.getName(), getParameters().getInterface().getName()); } }); if (iface == null) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_NOT_EXISTS); return false; } // check if the parameters interface is part of a bond if (!StringHelper.isNullOrEmpty(getParameters().getInterface().getBondName())) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_ALREADY_IN_BOND); return false; } // Check that the specify interface has no network if (!StringHelper.isNullOrEmpty(iface.getNetworkName())) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_ALREADY_HAVE_NETWORK); return false; } if (!NetworkUtils.EngineNetwork.equals(getParameters().getNetwork().getname()) && !StringHelper.isNullOrEmpty(getParameters().getGateway())) { addCanDoActionMessage(VdcBllMessages.NETWORK_ATTACH_ILLEGAL_GATEWAY); return false; } // check that the required not attached to other interface // iface = null; //LINQ 31899 interfaces.FirstOrDefault(i => // i.network_name == AttachNetworkToVdsParameters.Network.name); iface = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { return StringHelper.EqOp(i.getNetworkName(), getParameters().getNetwork().getname()); } }); if (iface != 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 == // AttachNetworkToVdsParameters.Network.name)) if (null == LinqUtils.firstOrNull(networks, new Predicate<network>() { @Override public boolean eval(network network) { return StringHelper.EqOp(network.getname(), getParameters().getNetwork().getname()); } })) { addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_NET_EXISTS_IN_CLUSTER); return false; } // check address exists in static ip if (getParameters().getBootProtocol() == NetworkBootProtocol.StaticIp) { if (StringHelper.isNullOrEmpty(getParameters().getAddress())) { addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_ADDR_MANDATORY_IN_STATIC_IP); return false; } } // check that nic have no vlans if (getParameters().getNetwork().getvlan_id() == null) { VdcQueryReturnValue ret = Backend.getInstance().runInternalQuery( VdcQueryType.GetAllChildVlanInterfaces, new GetAllChildVlanInterfacesQueryParameters(getParameters().getVdsId(), getParameters() .getInterface())); java.util.ArrayList<VdsNetworkInterface> vlanIfaces = (java.util.ArrayList<VdsNetworkInterface>) ret.getReturnValue(); if (vlanIfaces.size() > 0) { addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_CONNECT_TO_VLAN); return false; } } return true; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS : AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_FAILED; } }