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.NetworkStatus; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.businessentities.network_cluster; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetVdsByVdsIdParameters; import org.ovirt.engine.core.common.queries.SearchParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; 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.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; @CustomLogFields({ @CustomLogField("NetworkName") }) public class AttachNetworkToVdsGroupCommand<T extends AttachNetworkToVdsGroupParameter> extends VdsGroupCommandBase<T> { private static LogCompat log = LogFactoryCompat.getLog(RunVmCommand.class); public AttachNetworkToVdsGroupCommand(T parameters) { super(parameters); setVdsGroupId(parameters.getVdsGroupId()); } private network getNetwork() { return getParameters().getNetwork(); } public String getNetworkName() { return getNetwork().getname(); } @Override protected void executeCommand() { if(createNetworkCluster()) { SetNetworkStatus(getVdsGroupId(), getNetwork()); setSucceeded(true); } } private boolean createNetworkCluster() { DbFacade.getInstance().getNetworkClusterDAO().save( new network_cluster(getVdsGroupId(), getNetwork().getId(), NetworkStatus.Operational.getValue(), false)); return true; } public static void SetNetworkStatus(Guid vdsGroupId, final network net) { NetworkStatus status = NetworkStatus.Operational; VDSGroup vdsGroup = DbFacade.getInstance().getVdsGroupDAO().get(vdsGroupId); // Search all vds in cluster that have the specify network, if not the // network is not active SearchParameters searchParams = new SearchParameters("hosts: cluster = " + vdsGroup.getname(), SearchType.VDS); searchParams.setMaxCount(Integer.MAX_VALUE); List<VDS> vdsList = (List) Backend.getInstance() .runInternalQuery(VdcQueryType.Search, searchParams).getReturnValue(); for (VDS vds : vdsList) { if (vds.getstatus() != VDSStatus.Up) { continue; } List<VdsNetworkInterface> interfaces = (List<VdsNetworkInterface>) Backend .getInstance() .runInternalQuery(VdcQueryType.GetVdsInterfacesByVdsId, new GetVdsByVdsIdParameters(vds.getvds_id())).getReturnValue(); // Interface iface = null; //LINQ 31899 interfaces.FirstOrDefault(i // => i.network_name == net.name); VdsNetworkInterface iface = LinqUtils.firstOrNull(interfaces, new Predicate<VdsNetworkInterface>() { @Override public boolean eval(VdsNetworkInterface i) { return StringHelper.EqOp(i.getNetworkName(), net.getname()); } }); if (iface == null) { status = NetworkStatus.NonOperational; break; } } List<network_cluster> all = DbFacade.getInstance() .getNetworkClusterDAO().getAllForCluster(vdsGroupId); for (network_cluster nc : all) { if (net.getId().equals(nc.getnetwork_id())) { nc.setstatus(status.getValue()); DbFacade.getInstance().getNetworkClusterDAO().updateStatus(nc); break; } } } @Override protected boolean canDoAction() { return super.canDoAction() && noConflictingNetwork() && VdsGroupExists(); } private boolean noConflictingNetwork() { if (networkExists()) { addCanDoActionMessage(VdcBllMessages.NETWORK_NETWORK_ALREADY_ATTACH_TO_CLUSTER); return false; } return true; } private boolean networkExists() { List<network> networks = DbFacade.getInstance().getNetworkDAO() .getAllForCluster(getVdsGroupId()); return LinqUtils.firstOrNull(networks, new Predicate<network>() { @Override public boolean eval(network nw) { return StringHelper.EqOp(nw.getname(), getNetworkName()); } }) != null; } private boolean VdsGroupExists() { if(!vdsGroupInDb()) { addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID); return false; } return true; } private boolean vdsGroupInDb() { return getVdsGroup() != null; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP : AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED; } }