package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.action.SetupNetworksParameters;
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.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.common.vdscommands.VdsIdAndVdsVDSCommandParametersBase;
import org.ovirt.engine.core.dal.VdcBllMessages;
public class SetupNetworksCommand<T extends SetupNetworksParameters> extends VdsCommand<T> {
public SetupNetworksCommand(T parameters) {
super(parameters);
setVdsId(parameters.getVdsId());
}
@Override
protected boolean canDoAction() {
boolean retVal = true;
if (getParameters().getConectivityTimeout() < 0) {
addCanDoActionMessage(VdcBllMessages.NETWORK_CONNECTIVITY_TIMEOUT_NEGATIVE);
retVal = false;
}
if (retVal && networksOrInterfacesEmpty()) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NO_NETWORKS_OR_INTERFACES);
retVal = false;
}
if (retVal) {
retVal = checkNetworksValidity();
}
if (retVal) {
retVal = checkBondsValidity();
}
return retVal;
}
private boolean networksOrInterfacesEmpty() {
T params = getParameters();
return params.getNetworks().isEmpty() &&
params.getRemovedNetworks().isEmpty() &&
params.getBonds().isEmpty() &&
params.getRemovedBonds().isEmpty();
}
private boolean checkBondsValidity() {
boolean retVal = true;
// Check that the same bond not exists in the removedBonds list
T params = getParameters();
if (params.getRemovedBonds().size() > 0) {
for (VdsNetworkInterface bond : params.getBonds()) {
for (VdsNetworkInterface removedBond : params.getRemovedBonds()) {
if (bond.getName().equals(removedBond.getName())) {
addCanDoActionMessage(VdcBllMessages.NETWORK_BOND_EXISTS_IN_ADD_AND_REMOVE);
retVal = false;
break;
}
}
}
}
if (retVal) {
boolean ifaceExists = false;
// Check that bond have at least one VdsNetworkInterface
for (VdsNetworkInterface bond : params.getBonds()) {
for (VdsNetworkInterface i : params.getInterfaces()) {
if (bond.getName().equals(i.getBondName())) {
ifaceExists = true;
break;
}
}
if (!ifaceExists) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NO_INTERFACE_FOR_BOND);
addCanDoActionMessage(String.format("$BondName %1$s", bond.getName()));
retVal = false;
break;
}
}
}
return retVal;
}
private boolean checkNetworksValidity() {
boolean retVal = true;
// Check that the same network not exists in the removedNetworks list
T params = getParameters();
if (params.getRemovedNetworks().size() > 0) {
for (network net : params.getNetworks()) {
for (network removedNet : params.getRemovedNetworks()) {
if (net.getname().equals(removedNet.getname())) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_EXISTS_IN_ADD_AND_REMOVE);
retVal = false;
break;
}
}
}
}
if (retVal) {
// Check that networks have at least one VdsNetworkInterface or bond
for (network net : params.getNetworks()) {
boolean ifaceExists = false;
for (VdsNetworkInterface i : params.getInterfaces()) {
if (net.getname().equals(i.getNetworkName())) {
ifaceExists = true;
break;
}
}
if (ifaceExists) {
continue;
}
for (VdsNetworkInterface bond : params.getBonds()) {
if (net.getname().equals(bond.getNetworkName())) {
ifaceExists = true;
break;
}
}
if (!ifaceExists) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_HAVE_NO_INERFACES);
addCanDoActionMessage(String.format("$NetworkName %1$s", net.getname()));
retVal = false;
break;
}
}
}
return retVal;
}
@Override
protected void executeCommand() {
T bckndCmdParams = getParameters();
SetupNetworksVdsCommandParameters vdsCmdParams = new SetupNetworksVdsCommandParameters(
getVdsId(),
bckndCmdParams.getNetworks(),
bckndCmdParams.getRemovedNetworks(),
bckndCmdParams.getBonds(),
bckndCmdParams.getRemovedBonds(),
bckndCmdParams.getInterfaces());
vdsCmdParams.setForce(bckndCmdParams.isForce());
vdsCmdParams.setCheckConnectivity(bckndCmdParams.isCheckConnectivity());
vdsCmdParams.setConectivityTimeout(bckndCmdParams.getConectivityTimeout());
VDSReturnValue retVal = Backend.getInstance().getResourceManager()
.RunVdsCommand(VDSCommandType.SetupNetworks, vdsCmdParams);
if (retVal != null && retVal.getSucceeded()) {
// Refresh VDS networking to DB
retVal = Backend
.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.CollectVdsNetworkData,
new VdsIdAndVdsVDSCommandParametersBase(bckndCmdParams.getVdsId()));
// Update cluster networks (i.e. check if need to activate each new network)
for (network net : bckndCmdParams.getNetworks()) {
AttachNetworkToVdsGroupCommand.SetNetworkStatus(getVdsGroupId(), net);
}
setSucceeded(true);
}
}
}