package org.opennaas.extensions.vcpe.manager.templates.mp;
import java.io.IOException;
import org.opennaas.extensions.vcpe.manager.VCPENetworkManagerException;
import org.opennaas.extensions.vcpe.manager.templates.common.SuggestedValues;
import org.opennaas.extensions.vcpe.manager.templates.common.UnitSuggestor;
import org.opennaas.extensions.vcpe.manager.templates.common.VLANSuggestor;
import org.opennaas.extensions.vcpe.model.IPNetworkDomain;
import org.opennaas.extensions.vcpe.model.Interface;
import org.opennaas.extensions.vcpe.model.Link;
import org.opennaas.extensions.vcpe.model.Router;
import org.opennaas.extensions.vcpe.model.VCPENetworkElement;
import org.opennaas.extensions.vcpe.model.VCPENetworkModel;
import org.opennaas.extensions.vcpe.model.helper.VCPENetworkModelHelper;
/**
*
* @author Isart Canyameres Gimenez (i2cat Foundation)
*
*/
public class MPTemplateSuggestor {
private MPTemplateDefaultValuesLoader defaultsLoader;
public MPTemplateSuggestor() {
defaultsLoader = new MPTemplateDefaultValuesLoader();
}
public void initialize() throws VCPENetworkManagerException {
try {
defaultsLoader.initialize();
} catch (IOException e) {
throw new VCPENetworkManagerException(e);
}
}
/**
*
* @param physicalModel
* containing ALL physical elements in the template, and nothing else
* @return physicalModel populated with suggested values
* @throws VCPENetworkManagerException
* if failed to suggest a valid vcpe physical model
*/
public VCPENetworkModel getSuggestionForPhysicalModel(VCPENetworkModel physicalModel) throws VCPENetworkManagerException {
if (!defaultsLoader.isInitialized())
throw new VCPENetworkManagerException("Suggestor is not initialized");
// suggestion made from default values
return defaultsLoader.loadDefaultPhysicalModel(physicalModel);
}
/**
* Populates given logicalModel with suggested values. Given physicalModel is used as read-only: It's used for suggesting, but it's not modified
* within this method.
*
* @param physicalModel
* containing ALL physical elements in the template, and nothing else
* @param logicalModel
* containing ALL logical elements in the template, and nothing else
* @return given logicalModel with logical elements populated with suggested values, no elements are added to logicalModel within this method.
* @throws VCPENetworkManagerException
* if failed to suggest a valid vcpe logical model
*/
public VCPENetworkModel getSuggestionForLogicalModel(VCPENetworkModel physicalModel, VCPENetworkModel logicalModel)
throws VCPENetworkManagerException {
if (!defaultsLoader.isInitialized())
throw new VCPENetworkManagerException("Suggestor is not initialized");
// suggestion made from default values
logicalModel = defaultsLoader.loadDefaultLogicalModel(logicalModel);
logicalModel = suggestVLANs(physicalModel, logicalModel);
logicalModel = suggestUnits(physicalModel, logicalModel);
return logicalModel;
}
private VCPENetworkModel suggestVLANs(VCPENetworkModel physicalModel, VCPENetworkModel logicalModel) {
Integer vlan;
VCPENetworkElement phyElement;
Interface phyIface;
Interface target;
SuggestedValues suggestedVLANs = new SuggestedValues();
// suggest VLANs for router interfaces
phyElement = (Router) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY);
phyIface = (Interface) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY_IFACE_UP1);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_1_IFACE_UP);
vlan = VLANSuggestor.suggestVLANWithPreference(phyElement, phyIface, suggestedVLANs, Long.valueOf(target.getVlan()).intValue());
target.setVlan(vlan);
phyElement = (Router) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY);
phyIface = (Interface) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY_IFACE_UP2);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_2_IFACE_UP);
vlan = VLANSuggestor.suggestVLANWithPreference(phyElement, phyIface, suggestedVLANs, Long.valueOf(target.getVlan()).intValue());
target.setVlan(vlan);
phyElement = (Router) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY);
phyIface = (Interface) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY_IFACE_DOWN);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_CLIENT_IFACE_DOWN);
vlan = VLANSuggestor.suggestVLANWithPreference(phyElement, phyIface, suggestedVLANs, Long.valueOf(target.getVlan()).intValue());
target.setVlan(vlan);
// update other endpoints of links with same vlans
Link link;
IPNetworkDomain net;
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN1_IFACE_DOWN);
link = (Link) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LINK_WAN1);
net = (IPNetworkDomain) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN1);
// Passing a logical element where a physical one is expected
updateIfaceVLANFromLink(net, target, link, suggestedVLANs);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN2_IFACE_DOWN);
link = (Link) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LINK_WAN2);
net = (IPNetworkDomain) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN2);
// Passing a logical element where a physical one is expected
updateIfaceVLANFromLink(net, target, link, suggestedVLANs);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LAN_CLIENT_IFACE_UP);
link = (Link) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LINK_LAN_CLIENT);
net = (IPNetworkDomain) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LAN_CLIENT);
// Passing a logical element where a physical one is expected
updateIfaceVLANFromLink(net, target, link, suggestedVLANs);
return logicalModel;
}
/**
* Sets iface vlan according to the other endpoint of given link.
*
* @param phyElement
* @param iface
* @param link
* @param suggestedVLANS
*/
private void updateIfaceVLANFromLink(VCPENetworkElement phyElement, Interface iface, Link link, SuggestedValues suggestedVLANs) {
long vlan = VCPENetworkModelHelper.updateIfaceVLANFromLink(iface, link);
suggestedVLANs.markAsSuggested(VCPENetworkModelHelper.generatePhysicalInterfaceKey(phyElement, iface), Long.valueOf(vlan).intValue());
}
private VCPENetworkModel suggestUnits(VCPENetworkModel physicalModel, VCPENetworkModel logicalModel) {
VCPENetworkElement phyElement;
IPNetworkDomain net;
Interface target;
Integer unit;
SuggestedValues suggestedUnits = new SuggestedValues();
// Suggest units from vlans
phyElement = (Router) VCPENetworkModelHelper.getElementByTemplateName(physicalModel, TemplateConstants.ROUTER_1_PHY);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_1_IFACE_UP);
unit = UnitSuggestor.suggestUnitFromVLAN(phyElement, target, suggestedUnits);
target.setPort(unit);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_2_IFACE_UP);
unit = UnitSuggestor.suggestUnitFromVLAN(phyElement, target, suggestedUnits);
target.setPort(unit);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_CLIENT_IFACE_DOWN);
unit = UnitSuggestor.suggestUnitFromVLAN(phyElement, target, suggestedUnits);
target.setPort(unit);
net = (IPNetworkDomain) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN1);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN1_IFACE_DOWN);
unit = UnitSuggestor.suggestUnitFromVLAN(net, target, suggestedUnits);
target.setPort(unit);
net = (IPNetworkDomain) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN2);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.WAN2_IFACE_DOWN);
unit = UnitSuggestor.suggestUnitFromVLAN(net, target, suggestedUnits);
target.setPort(unit);
net = (IPNetworkDomain) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LAN_CLIENT);
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LAN_CLIENT_IFACE_UP);
unit = UnitSuggestor.suggestUnitFromVLAN(net, target, suggestedUnits);
target.setPort(unit);
// Suggest units for LTs
Link lt1 = (Link) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LINK_LR_1_LR_CLIENT);
Link lt2 = (Link) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LINK_LR_2_LR_CLIENT);
lt1.getSource().setPort(UnitSuggestor.suggestUnit(phyElement, lt1.getSource(), suggestedUnits));
lt1.getSink().setPort(UnitSuggestor.suggestUnit(phyElement, lt1.getSink(), suggestedUnits));
lt2.getSource().setPort(UnitSuggestor.suggestUnit(phyElement, lt2.getSource(), suggestedUnits));
lt2.getSink().setPort(UnitSuggestor.suggestUnit(phyElement, lt2.getSink(), suggestedUnits));
// Suggest units for LOs
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_1_IFACE_LO);
target.setPort(UnitSuggestor.suggestUnit(phyElement, target, suggestedUnits));
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_2_IFACE_LO);
target.setPort(UnitSuggestor.suggestUnit(phyElement, target, suggestedUnits));
target = (Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalModel, TemplateConstants.LR_CLIENT_IFACE_LO);
target.setPort(UnitSuggestor.suggestUnit(phyElement, target, suggestedUnits));
return logicalModel;
}
}