package org.opennaas.extensions.vcpe.manager.templates.common; import java.util.ArrayList; import java.util.List; import org.opennaas.extensions.vcpe.manager.VCPENetworkManagerException; import org.opennaas.extensions.vcpe.manager.isfree.IsFreeChecker; import org.opennaas.extensions.vcpe.model.Interface; import org.opennaas.extensions.vcpe.model.VCPENetworkElement; import org.opennaas.extensions.vcpe.model.helper.VCPENetworkModelHelper; public class UnitSuggestor { public static int suggestUnitFromVLAN(VCPENetworkElement phyElement, Interface phyIface, SuggestedValues suggestedUnits) { int selectedUnit = Long.valueOf(phyIface.getVlan()).intValue(); if (isUnitAvailable(selectedUnit, phyElement, phyIface, suggestedUnits)) { suggestedUnits.markAsSuggested(VCPENetworkModelHelper.generatePhysicalInterfaceKey(phyElement, phyIface), selectedUnit); return selectedUnit; } return suggestUnit(phyElement, phyIface, suggestedUnits); } public static int suggestUnit(VCPENetworkElement phyElement, Interface phyIface, SuggestedValues suggestedUnits) { List<Integer> candidates = getUnits(phyElement, phyIface); Integer selectedUnit = null; for (Integer unit : candidates) { if (isUnitAvailable(unit, phyElement, phyIface, suggestedUnits)) { selectedUnit = unit; break; } } if (selectedUnit == null) throw new VCPENetworkManagerException( "Unable to find an available unit for interface " + VCPENetworkModelHelper.generatePhysicalInterfaceKey( phyElement, phyIface)); suggestedUnits.markAsSuggested(VCPENetworkModelHelper.generatePhysicalInterfaceKey(phyElement, phyIface), selectedUnit); return selectedUnit; } public static boolean isUnitAvailable(int unitNum, VCPENetworkElement phyElement, Interface iface, SuggestedValues suggestedUnits) { return (!suggestedUnits.isAlreadySuggested(VCPENetworkModelHelper.generatePhysicalInterfaceKey(phyElement, iface), unitNum)) && IsFreeChecker.isInterfaceFree(null, phyElement.getName(), iface.getPhysicalInterfaceName() + "." + unitNum); } /** * Obtain units given phyInterface in given phyElement is capable to work with. * * TODO should read from config file. TODO It may happen that each interface has different unit ranges, or that different users can access * different units * * @param phyRouter * @param phyIface * @return */ private static List<Integer> getUnits(VCPENetworkElement phyElement, Interface phyIface) { int min = 1; int max = 4095; List<Integer> vlans = new ArrayList<Integer>(max - min + 1); for (int i = min; i <= max; i++) { vlans.add(i); } return vlans; } }