package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
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.compat.StringHelper;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogField;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogFields;
import org.ovirt.engine.core.utils.NetworkUtils;
import org.ovirt.engine.core.utils.linq.LinqUtils;
import org.ovirt.engine.core.utils.linq.Predicate;
@CustomLogFields({ @CustomLogField("NetworkName") })
public class DetachNetworkToVdsGroupCommand<T extends AttachNetworkToVdsGroupParameter> extends
VdsGroupCommandBase<T> {
public DetachNetworkToVdsGroupCommand(T parameters) {
super(parameters);
}
@Override
protected void executeCommand() {
DbFacade.getInstance().getNetworkClusterDAO().remove(getParameters().getVdsGroupId(),
getParameters().getNetwork().getId());
setSucceeded(true);
}
@Override
protected boolean canDoAction() {
// check that we are not removing the management network
if (StringHelper.EqOp(getParameters().getNetwork().getname(),
Config.<String> GetValue(ConfigValues.ManagementNetwork))) {
addCanDoActionMessage(VdcBllMessages.NETWORK_CANNOT_REMOVE_MANAGEMENT_NETWORK);
return false;
}
// check that there is no vm running with this network
List<VmStatic> vms = DbFacade.getInstance().getVmStaticDAO().getAllByGroupAndNetworkName(
getParameters().getVdsGroupId(), getParameters().getNetwork().getname());
if (vms.size() > 0) {
addCanDoActionMessage(VdcBllMessages.NETWORK_CANNOT_REMOVE_NETWORK_IN_USE_BY_VM);
getReturnValue().getCanDoActionMessages().add(String.format("$NetworkName %1$s",
getParameters().getNetwork().getname()));
return false;
}
// chech that no template is using this network
List<VmTemplate> templates = DbFacade.getInstance().getVmTemplateDAO()
.getAllForVdsGroup(getParameters().getVdsGroupId());
for (VmTemplate tmpl : templates) {
List<VmNetworkInterface> interfaces = DbFacade.getInstance()
.getVmNetworkInterfaceDAO().getAllForTemplate(tmpl.getId());
// if (true) //LINQ 31899 interfaces.FirstOrDefault(t =>
// t.network_name == AttachNetworkToClusterParameter.Network.name)
// != null)
if (LinqUtils.firstOrNull(interfaces, new Predicate<VmNetworkInterface>() {
@Override
public boolean eval(VmNetworkInterface t) {
return t.getNetworkName().equals(getParameters().getNetwork().getname());
}
}) != null) {
addCanDoActionMessage(VdcBllMessages.NETWORK_CANNOT_REMOVE_NETWORK_IN_USE_BY_TEMPLATE);
return false;
}
}
// check if network in use by vm
String query = "Vms: cluster = " + getVdsGroup().getname();
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 != null && ret.getSucceeded()) {
List<IVdcQueryable> vmList = (List<IVdcQueryable>) ret.getReturnValue();
for (IVdcQueryable vm_helper : vmList) {
VM vm = (VM) vm_helper;
List<VmNetworkInterface> interfaces = DbFacade.getInstance()
.getVmNetworkInterfaceDAO().getAllForVm(vm.getvm_guid());
// Interface iface = null; //LINQ interfaces.FirstOrDefault(i =>
// i.network_name ==
// AttachNetworkToClusterParameter.Network.name);
VmNetworkInterface iface = LinqUtils.firstOrNull(interfaces, new Predicate<VmNetworkInterface>() {
@Override
public boolean eval(VmNetworkInterface i) {
return i.getNetworkName().equals(getParameters().getNetwork().getname());
}
});
if (iface != null) {
addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_IN_USE_BY_VM);
return false;
}
}
}
if (getParameters().getNetwork().getname().equals(NetworkUtils.EngineNetwork)) {
getReturnValue().getCanDoActionMessages()
.add(VdcBllMessages.NETWORK_DEFAULT_UPDATE_NAME_INVALID.toString());
return false;
}
return true;
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.NETWORK_DETACH_NETWORK_TO_VDS_GROUP
: AuditLogType.NETWORK_DETACH_NETWORK_TO_VDS_GROUP_FAILED;
}
public String getNetworkName() {
return getParameters().getNetwork().getname();
}
}