package org.ovirt.engine.core.bll.storage;
import java.util.List;
import org.ovirt.engine.core.bll.AttachNetworkToVdsGroupCommand;
import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters;
import org.ovirt.engine.core.common.businessentities.VDSGroup;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.common.businessentities.network;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.linq.LinqUtils;
import org.ovirt.engine.core.utils.linq.Predicate;
public class UpdateNetworkCommand<T extends AddNetworkStoragePoolParameters> extends StorageHandlingCommandBase<T> {
private List<VDSGroup> _clusters;
public UpdateNetworkCommand(T parameters) {
super(parameters);
}
@Override
protected void executeCommand() {
DbFacade.getInstance().getNetworkDAO().update(getParameters().getNetwork());
for (VDSGroup cluster : _clusters) {
AttachNetworkToVdsGroupCommand.SetNetworkStatus(cluster.getID(), getParameters().getNetwork());
}
setSucceeded(true);
}
@Override
protected boolean canDoAction() {
List<network> networks = DbFacade.getInstance().getNetworkDAO().getAll();
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__NETWORK);
if (getStoragePool() == null) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST);
return false;
}
// check that network name not start with 'bond'
if (getParameters().getNetwork().getname().toLowerCase().startsWith("bond")) {
addCanDoActionMessage(VdcBllMessages.NETWORK_CANNOT_CONTAIN_BOND_NAME);
return false;
}
// check vlan is valid
if (getParameters().getNetwork().getvlan_id() != null) {
if (!AddNetworkCommand.IsVlanInRange(getParameters().getNetwork().getvlan_id())) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_VLAN_OUT_OF_RANGE);
return false;
}
// else if (false) //LINQ networks.FirstOrDefault(n => n.vlan_id ==
// AddNetworkParameters.Network.vlan_id.Value
// //LINQ && n.storage_pool_id ==
// AddNetworkParameters.Network.storage_pool_id
// //LINQ && n.id != AddNetworkParameters.Network.id) != null)
else if (null != LinqUtils.firstOrNull(networks, new Predicate<network>() {
@Override
public boolean eval(network n) {
if (n.getvlan_id() != null) {
return n.getvlan_id().equals(getParameters().getNetwork().getvlan_id())
&& n.getstorage_pool_id().equals(getParameters().getNetwork().getstorage_pool_id())
&& !n.getId().equals(getParameters().getNetwork().getId());
}
return false;
}
})) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_VLAN_IN_USE);
return false;
}
}
// check that network not exsits
// network oldNetwork = null; //LINQ networks.FirstOrDefault(n => n.id
// == AddNetworkParameters.Network.id);
network oldNetwork = LinqUtils.firstOrNull(networks, new Predicate<network>() {
@Override
public boolean eval(network n) {
return n.getId().equals(getParameters().getNetwork().getId());
}
});
if (oldNetwork == null) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_NOT_EXISTS);
return false;
}
// check defalut network name is not renamed
String defaultNetwork = Config.<String> GetValue(ConfigValues.ManagementNetwork);
if (oldNetwork.getname().equals(defaultNetwork) &&
!getParameters().getNetwork().getname().equals(defaultNetwork)) {
addCanDoActionMessage(VdcBllMessages.NETWORK_CAN_NOT_REMOVE_DEFAULT_NETWORK);
return false;
}
// network net = null; //LINQ networks.FirstOrDefault(n =>
// n.name.Trim().ToLower() ==
// AddNetworkParameters.Network.name.Trim().ToLower()
// LINQ && n.id != AddNetworkParameters.Network.id &&
// AddNetworkParameters.Network.storage_pool_id == n.storage_pool_id);
network net = LinqUtils.firstOrNull(networks, new Predicate<network>() {
@Override
public boolean eval(network n) {
return n.getname().trim().toLowerCase()
.equals(getParameters().getNetwork().getname().trim().toLowerCase())
&& !n.getId().equals(getParameters().getNetwork().getId())
&& getParameters().getNetwork().getstorage_pool_id().equals(n.getstorage_pool_id());
}
});
if (net != null) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_IN_USE);
return false;
}
// check if the network in use with running vm
_clusters = DbFacade.getInstance().getVdsGroupDAO().getAllForStoragePool(getStoragePool().getId());
for (VDSGroup cluster : _clusters) {
List<VmStatic> vms = DbFacade.getInstance().getVmStaticDAO().getAllByGroupAndNetworkName(cluster.getID(),
getParameters().getNetwork().getname());
if (vms.size() > 0) {
addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_IN_USE_BY_VM);
return false;
}
}
return RemoveNetworkCommand.CommonNetworkValidation(oldNetwork, getReturnValue().getCanDoActionMessages());
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(UpdateEntity.class);
return super.getValidationGroups();
}
}