package org.ovirt.engine.core.vdsbroker.vdsbroker; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.common.businessentities.NetworkStatus; import org.ovirt.engine.core.common.businessentities.NonOperationalReason; 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.vdscommands.VdsIdAndVdsVDSCommandParametersBase; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.vdsbroker.ResourceManager; public class CollectVdsNetworkDataVDSCommand<P extends VdsIdAndVdsVDSCommandParametersBase> extends GetCapabilitiesVDSCommand<P> { public CollectVdsNetworkDataVDSCommand(P parameters) { super(parameters); } @Override protected void ExecuteVdsBrokerCommand() { // call getVdsCapabilities verb super.ExecuteVdsBrokerCommand(); // update to db UpdateNetworkToDb(getVds()); ProceedProxyReturnValue(); } // function return true when vds networks not match it's cluster networks // in this case we need to set the vds to non-operational public static boolean UpdateNetworkToDb(VDS vds) { boolean returnValue = false; VDSGroup vdsGroup = DbFacade.getInstance().getVdsGroupDAO().get(vds.getvds_group_id()); List<VdsNetworkInterface> dbIfaces = DbFacade.getInstance().getInterfaceDAO().getAllInterfacesForVds(vds.getvds_id()); List<String> updatedIfaces = new ArrayList<String>(); // First we check what interfaces need to update/delete for (VdsNetworkInterface dbIface : dbIfaces) { boolean found = false; for (VdsNetworkInterface vdsIface : vds.getInterfaces()) { if (dbIface.getName().equals(vdsIface.getName())) { // we preserve only the ID from the Database // everything else is what we got from getVdsCapabilities vdsIface.setId(dbIface.getId()); DbFacade.getInstance().getInterfaceDAO().updateInterfaceForVds(vdsIface); updatedIfaces.add(vdsIface.getName()); found = true; break; } } if (!found) { DbFacade.getInstance().getInterfaceDAO().removeInterfaceFromVds(dbIface.getId()); DbFacade.getInstance().getInterfaceDAO().removeStatisticsForVds(dbIface.getId()); } } // now all that left is add the interfaces that not exists in the Database for (VdsNetworkInterface vdsIface : vds.getInterfaces()) { if (!updatedIfaces.contains(vdsIface.getName())) { DbFacade.getInstance().getInterfaceDAO().saveInterfaceForVds(vdsIface); DbFacade.getInstance().getInterfaceDAO().saveStatisticsForVds(vdsIface.getStatistics()); } } // here we check if the vds networks match it's cluster networks boolean hasChanges = false; List<network> clusterNetworks = DbFacade.getInstance().getNetworkDAO() .getAllForCluster(vds.getvds_group_id()); network tempNetwork; java.util.List<network> networks = vds.getNetworks(); for (network net : clusterNetworks) { // LINQ 29456 // if (vds.Networks.FirstOrDefault(n => n.name == net.name) == null) tempNetwork = null; String outterNetworkName = net.getname(); if (outterNetworkName != null) { for (network tempNet : networks) { if (outterNetworkName.equals(tempNet.getname())) { tempNetwork = tempNet; break; } } } // LINQ 29456 if (net.getStatus() == NetworkStatus.Operational && tempNetwork == null) { hasChanges = true; break; } } if (hasChanges && vds.getstatus() != VDSStatus.Maintenance) { ResourceManager.getInstance() .getEventListener() .VdsNonOperational(vds.getvds_id(), NonOperationalReason.NETWORK_UNREACHABLE, true, true, Guid.Empty); returnValue = true; } return returnValue; } }