/**
*
*/
package org.opennaas.extensions.vcpe.manager.templates.sp;
import static com.google.common.collect.Iterables.filter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.opennaas.extensions.router.model.utils.IPUtilsHelper;
import org.opennaas.extensions.vcpe.manager.VCPENetworkManagerException;
import org.opennaas.extensions.vcpe.manager.model.VCPEManagerModel;
import org.opennaas.extensions.vcpe.manager.model.VCPEPhysicalInfrastructure;
import org.opennaas.extensions.vcpe.manager.templates.ITemplate;
import org.opennaas.extensions.vcpe.model.BGP;
import org.opennaas.extensions.vcpe.model.Domain;
import org.opennaas.extensions.vcpe.model.Interface;
import org.opennaas.extensions.vcpe.model.Link;
import org.opennaas.extensions.vcpe.model.LogicalRouter;
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.VRRP;
import org.opennaas.extensions.vcpe.model.helper.VCPENetworkModelHelper;
/**
* @author Isart Canyameres Gimenez (i2cat Foundation)
* @author Jordi
*/
public class SingleProviderTemplate implements ITemplate {
private static final String BGP_TEMPLATE = "/templates/sp/bgpModel.properties";
private String templateType = ITemplate.SP_VCPE_TEMPLATE;
private Properties bgpProps;
private SPTemplateSuggestor suggestor;
/**
* @throws VCPENetworkManagerException
*
*/
public SingleProviderTemplate() throws VCPENetworkManagerException {
try {
suggestor = new SPTemplateSuggestor();
bgpProps = new Properties();
bgpProps.load(this.getClass().getResourceAsStream(BGP_TEMPLATE));
} catch (IOException e) {
throw new VCPENetworkManagerException("can't load the template properties");
}
}
public String getTemplateType() {
return templateType;
}
/**
* Generate the model
*
* @return VCPENetworkModel
*/
@Override
public VCPENetworkModel buildModel(VCPENetworkModel initialModel) throws VCPENetworkManagerException {
VCPENetworkModel model = new VCPENetworkModel();
model.setId(initialModel.getId());
model.setName(initialModel.getName());
model.setOwner(initialModel.getOwner());
model.setClientIpRange(initialModel.getClientIpRange());
model.setNocIpRange(initialModel.getNocIpRange());
model.setTemplateType(initialModel.getTemplateType());
// FIXME TEMPORAL CODE. REMOVE WHEN REFACTOR IS COMPLETED. initialModel will be a complete model.
// Generate the physical model
VCPENetworkModel phy = generateAndMapPhysicalElements(initialModel);
// checkPhysicalAvailability(physicalElements, managerModel);
// Generate the logical model
VCPENetworkModel logical = generateAndMapLogicalElements(phy, initialModel);
// set VRRP configuration
// model.setVrrp(configureVRRP(logical));
model.setVrrp(logical.getVrrp());
model.setBgp(generateBGPConfig(logical));
// Add all elements
List<VCPENetworkElement> elements = new ArrayList<VCPENetworkElement>();
model.setElements(elements);
elements.addAll(logical.getElements());
return model;
}
@Override
public VCPENetworkModel getPhysicalInfrastructureSuggestion() throws VCPENetworkManagerException {
VCPENetworkModel generated = generatePhysicalElements();
VCPENetworkModel mappedFromProperties = suggestor.getSuggestionForPhysicalModel(generated);
// TODO MUST CHECK MAPPED ELEMENTS EXIST IN PHYSICAL TOPOLOGY
return mappedFromProperties;
}
@Override
public VCPENetworkModel getLogicalInfrastructureSuggestion(VCPENetworkModel physicalInfrastructure) throws VCPENetworkManagerException {
// complete physicalInfrastructure
VCPENetworkModel phy = generateAndMapPhysicalElements(physicalInfrastructure);
VCPENetworkModel generated = generateLogicalElements();
VCPENetworkModel mappedWithPhy = mapLogicalAndPhysical(phy, generated);
VCPENetworkModel suggested = suggestor.getSuggestionForLogicalModel(mappedWithPhy);
// TODO MUST CHECK MAPPED ELEMENTS EXIST IN PHYSICAL INFRASTRUCTURE
return suggested;
}
// FIXME TEMPORAL METHOD. REMOVE WHEN REFACTOR IS FINISHED
private VCPENetworkModel generateAndMapPhysicalElements(VCPENetworkModel initialModel) {
VCPENetworkModel generated = generatePhysicalElements();
VCPENetworkModel mappedFromProperties = suggestor.getSuggestionForPhysicalModel(generated);
VCPENetworkModel mapped = mapPhysicalElementsFromInputModel(mappedFromProperties, initialModel);
// TODO MUST CHECK MAPPED ELEMENTS EXIST IN PHYSICAL TOPOLOGY
return mapped;
}
// FIXME TEMPORAL METHOD. REMOVE WHEN REFACTOR IS FINISHED
private VCPENetworkModel generateAndMapLogicalElements(VCPENetworkModel phy, VCPENetworkModel initialModel) {
VCPENetworkModel suggested = getLogicalInfrastructureSuggestion(phy);
VCPENetworkModel mapped = mapLogicalElementsFromInputModel(suggested, initialModel);
// TODO MUST CHECK MAPPED ELEMENTS EXIST IN PHYSICAL TOPOLOGY
return mapped;
}
private VCPENetworkModel generatePhysicalElements() {
Router core = new Router();
core.setTemplateName(SPTemplateConstants.CORE_PHY_ROUTER);
Interface coreMaster = new Interface();
coreMaster.setTemplateName(SPTemplateConstants.CORE_PHY_INTERFACE_MASTER);
Interface coreBkp = new Interface();
coreBkp.setTemplateName(SPTemplateConstants.CORE_PHY_INTERFACE_BKP);
Interface coreLo = new Interface();
coreLo.setTemplateName(SPTemplateConstants.CORE_PHY_LO_INTERFACE);
List<Interface> coreInterfaces = new ArrayList<Interface>();
coreInterfaces.add(coreMaster);
coreInterfaces.add(coreBkp);
coreInterfaces.add(coreLo);
core.setInterfaces(coreInterfaces);
Router r1 = new Router();
r1.setTemplateName(SPTemplateConstants.CPE1_PHY_ROUTER);
Interface inter1 = new Interface();
inter1.setTemplateName(SPTemplateConstants.INTER1_PHY_INTERFACE_LOCAL);
Interface inter1other = new Interface();
inter1other.setTemplateName(SPTemplateConstants.INTER1_PHY_INTERFACE_AUTOBAHN);
Interface down1 = new Interface();
down1.setTemplateName(SPTemplateConstants.DOWN1_PHY_INTERFACE_LOCAL);
Interface down1other = new Interface();
down1other.setTemplateName(SPTemplateConstants.DOWN1_PHY_INTERFACE_AUTOBAHN);
Interface up1 = new Interface();
up1.setTemplateName(SPTemplateConstants.UP1_PHY_INTERFACE_LOCAL);
Interface client1 = new Interface();
client1.setTemplateName(SPTemplateConstants.CLIENT1_PHY_INTERFACE_AUTOBAHN);
Interface lo1 = new Interface();
lo1.setTemplateName(SPTemplateConstants.LO1_PHY_INTERFACE);
List<Interface> r1Interfaces = new ArrayList<Interface>();
r1Interfaces.add(inter1);
r1Interfaces.add(down1);
r1Interfaces.add(up1);
r1Interfaces.add(lo1);
r1.setInterfaces(r1Interfaces);
Router r2 = new Router();
r2.setTemplateName(SPTemplateConstants.CPE2_PHY_ROUTER);
Interface inter2 = new Interface();
inter2.setTemplateName(SPTemplateConstants.INTER2_PHY_INTERFACE_LOCAL);
Interface inter2other = new Interface();
inter2other.setTemplateName(SPTemplateConstants.INTER2_PHY_INTERFACE_AUTOBAHN);
Interface down2 = new Interface();
down2.setTemplateName(SPTemplateConstants.DOWN2_PHY_INTERFACE_LOCAL);
Interface down2other = new Interface();
down2other.setTemplateName(SPTemplateConstants.DOWN2_PHY_INTERFACE_AUTOBAHN);
Interface up2 = new Interface();
up2.setTemplateName(SPTemplateConstants.UP2_PHY_INTERFACE_LOCAL);
Interface client2 = new Interface();
client2.setTemplateName(SPTemplateConstants.CLIENT2_PHY_INTERFACE_AUTOBAHN);
Interface lo2 = new Interface();
lo2.setTemplateName(SPTemplateConstants.LO2_PHY_INTERFACE);
List<Interface> r2Interfaces = new ArrayList<Interface>();
r2Interfaces.add(inter2);
r2Interfaces.add(down2);
r2Interfaces.add(up2);
r2Interfaces.add(lo2);
r2.setInterfaces(r2Interfaces);
Domain autobahn = new Domain();
autobahn.setTemplateName(SPTemplateConstants.AUTOBAHN);
List<Interface> autobahnInterfaces = new ArrayList<Interface>();
autobahnInterfaces.add(inter1other);
autobahnInterfaces.add(inter2other);
autobahnInterfaces.add(down1other);
autobahnInterfaces.add(down2other);
autobahnInterfaces.add(client1);
autobahnInterfaces.add(client2);
autobahn.setInterfaces(autobahnInterfaces);
List<VCPENetworkElement> elements = new ArrayList<VCPENetworkElement>();
elements.add(core);
elements.addAll(core.getInterfaces());
elements.add(r1);
elements.addAll(r1.getInterfaces());
elements.add(r2);
elements.addAll(r2.getInterfaces());
elements.add(autobahn);
elements.addAll(autobahn.getInterfaces());
VCPENetworkModel model = new VCPENetworkModel();
model.setElements(elements);
model.setTemplateType(getTemplateType());
model.setCreated(false);
return model;
}
private VCPENetworkModel generateLogicalElements() {
// LogicalRouter 1
Router vcpe1 = new LogicalRouter();
vcpe1.setTemplateName(SPTemplateConstants.VCPE1_ROUTER);
List<Interface> interfaces = new ArrayList<Interface>();
vcpe1.setInterfaces(interfaces);
Interface inter1 = new Interface();
Interface down1 = new Interface();
Interface up1 = new Interface();
Interface lo1 = new Interface();
interfaces.add(inter1);
interfaces.add(down1);
interfaces.add(up1);
interfaces.add(lo1);
inter1.setTemplateName(SPTemplateConstants.INTER1_INTERFACE_LOCAL);
down1.setTemplateName(SPTemplateConstants.DOWN1_INTERFACE_LOCAL);
up1.setTemplateName(SPTemplateConstants.UP1_INTERFACE_LOCAL);
lo1.setTemplateName(SPTemplateConstants.LO1_INTERFACE);
// LogicalRouter 2
Router vcpe2 = new LogicalRouter();
vcpe2.setTemplateName(SPTemplateConstants.VCPE2_ROUTER);
interfaces = new ArrayList<Interface>();
vcpe2.setInterfaces(interfaces);
Interface inter2 = new Interface();
Interface down2 = new Interface();
Interface up2 = new Interface();
Interface lo2 = new Interface();
interfaces.add(inter2);
interfaces.add(down2);
interfaces.add(up2);
interfaces.add(lo2);
inter2.setTemplateName(SPTemplateConstants.INTER2_INTERFACE_LOCAL);
down2.setTemplateName(SPTemplateConstants.DOWN2_INTERFACE_LOCAL);
up2.setTemplateName(SPTemplateConstants.UP2_INTERFACE_LOCAL);
lo2.setTemplateName(SPTemplateConstants.LO2_INTERFACE);
// BoD
// Notice these logical interfaces are not inside a BoD object (by now)
List<Interface> bodInterfaces = new ArrayList<Interface>();
Interface inter1other = new Interface();
Interface down1other = new Interface();
Interface inter2other = new Interface();
Interface down2other = new Interface();
Interface client1other = new Interface();
Interface client2other = new Interface();
bodInterfaces.add(inter1other);
bodInterfaces.add(down1other);
bodInterfaces.add(inter2other);
bodInterfaces.add(down2other);
bodInterfaces.add(client1other);
bodInterfaces.add(client2other);
inter1other.setTemplateName(SPTemplateConstants.INTER1_INTERFACE_AUTOBAHN);
down1other.setTemplateName(SPTemplateConstants.DOWN1_INTERFACE_AUTOBAHN);
inter2other.setTemplateName(SPTemplateConstants.INTER2_INTERFACE_AUTOBAHN);
down2other.setTemplateName(SPTemplateConstants.DOWN2_INTERFACE_AUTOBAHN);
client1other.setTemplateName(SPTemplateConstants.CLIENT1_INTERFACE_AUTOBAHN);
client2other.setTemplateName(SPTemplateConstants.CLIENT2_INTERFACE_AUTOBAHN);
// noc network interface
// Notice these logical interfaces are not inside a router object (by now)
Interface up1other = new Interface();
Interface up2other = new Interface();
Interface corelo = new Interface();
up1other.setTemplateName(SPTemplateConstants.UP1_INTERFACE_PEER);
up2other.setTemplateName(SPTemplateConstants.UP2_INTERFACE_PEER);
corelo.setTemplateName(SPTemplateConstants.CORE_LO_INTERFACE);
// LINKS
// Inter links
Link linkInter1local = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.INTER1_LINK_LOCAL, SPTemplateConstants.LINK_TYPE_ETH,
inter1, inter1other);
Link linkInter1other = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.INTER_LINK_AUTOBAHN,
SPTemplateConstants.LINK_TYPE_AUTOBAHN, inter1other, inter2other);
Link linkInter2local = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.INTER2_LINK_LOCAL, SPTemplateConstants.LINK_TYPE_ETH,
inter2, inter2other);
// Down links
Link linkDown1local = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.DOWN1_LINK_LOCAL, SPTemplateConstants.LINK_TYPE_ETH, down1,
down1other);
Link linkDown1other = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.DOWN1_LINK_AUTOBAHN,
SPTemplateConstants.LINK_TYPE_AUTOBAHN, down1other, client1other);
Link linkDown2local = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.DOWN2_LINK_LOCAL, SPTemplateConstants.LINK_TYPE_ETH, down2,
down2other);
Link linkDown2other = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.DOWN2_LINK_AUTOBAHN,
SPTemplateConstants.LINK_TYPE_AUTOBAHN, down2other, client2other);
// Up links
Link linkUp1 = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.UP1_LINK, SPTemplateConstants.LINK_TYPE_LT, up1, up1other);
Link linkUp2 = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.UP2_LINK, SPTemplateConstants.LINK_TYPE_LT, up2, up2other);
// Virtual links
Link linkInter = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.INTER_LINK, SPTemplateConstants.LINK_TYPE_VIRTUAL, inter1,
inter2);
List<Link> subLinks = new ArrayList<Link>();
subLinks.add(linkInter1local);
subLinks.add(linkInter1other);
subLinks.add(linkInter2local);
linkInter.setImplementedBy(subLinks);
Link linkdown1 = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.DOWN1_LINK, SPTemplateConstants.LINK_TYPE_VIRTUAL, down1,
client1other);
subLinks = new ArrayList<Link>();
subLinks.add(linkDown1local);
subLinks.add(linkDown1other);
linkdown1.setImplementedBy(subLinks);
Link linkdown2 = VCPENetworkModelHelper.createLink(null, SPTemplateConstants.DOWN2_LINK, SPTemplateConstants.LINK_TYPE_VIRTUAL, down2,
client2other);
subLinks.add(linkDown2local);
subLinks.add(linkDown2other);
linkdown2.setImplementedBy(subLinks);
List<VCPENetworkElement> elements = new ArrayList<VCPENetworkElement>();
elements.add(vcpe1);
elements.addAll(vcpe1.getInterfaces());
elements.add(vcpe2);
elements.addAll(vcpe2.getInterfaces());
elements.addAll(bodInterfaces);
elements.add(up1other);
elements.add(up2other);
elements.add(corelo);
elements.add(linkInter);
elements.addAll(linkInter.getImplementedBy());
elements.add(linkdown1);
elements.addAll(linkdown1.getImplementedBy());
elements.add(linkdown2);
elements.addAll(linkdown2.getImplementedBy());
elements.add(linkUp1);
elements.add(linkUp2);
// configure VRRP
VRRP vrrp = new VRRP();
vrrp.setMasterRouter(vcpe1);
vrrp.setMasterInterface(down1);
vrrp.setBackupRouter(vcpe2);
vrrp.setBackupInterface(down2);
VCPENetworkModel model = new VCPENetworkModel();
model.setElements(elements);
model.setTemplateType(getTemplateType());
model.setCreated(false);
model.setVrrp(vrrp);
model.setBgp(new BGP());
return model;
}
private VCPENetworkModel mapPhysicalElementsFromInputModel(VCPENetworkModel model, VCPENetworkModel inputModel) {
// TODO update ALL elements with data in inputModel (everything may have changed)
// Client phy interfaces may not be present in inputModel
// select client1 interface using inputModel
Interface inputClient1 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(inputModel,
SPTemplateConstants.CLIENT1_PHY_INTERFACE_AUTOBAHN);
if (inputClient1 != null) {
Interface client1 = (Interface) VCPENetworkModelHelper
.getElementByTemplateName(model, SPTemplateConstants.CLIENT1_PHY_INTERFACE_AUTOBAHN);
client1.setName(inputClient1.getName());
client1.setPhysicalInterfaceName(inputClient1.getPhysicalInterfaceName());
}
// select client2 interface using inputModel
Interface inputClient2 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(inputModel,
SPTemplateConstants.CLIENT2_PHY_INTERFACE_AUTOBAHN);
if (inputClient2 != null) {
Interface client2 = (Interface) VCPENetworkModelHelper
.getElementByTemplateName(model, SPTemplateConstants.CLIENT2_PHY_INTERFACE_AUTOBAHN);
client2.setName(inputClient2.getName());
client2.setPhysicalInterfaceName(inputClient2.getPhysicalInterfaceName());
}
return model;
}
private VCPENetworkModel mapLogicalElementsFromInputModel(VCPENetworkModel model, VCPENetworkModel inputModel) {
// TODO update ALL elements with data in inputModel (everything may have changed)
// Core router
Router coreinput = (Router) VCPENetworkModelHelper.getElementByTemplateName(inputModel, SPTemplateConstants.CORE_PHY_ROUTER);
Router core = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CORE_PHY_ROUTER);
Interface coremasterinput = (Interface) VCPENetworkModelHelper.getElementByTemplateName(coreinput.getInterfaces(),
SPTemplateConstants.UP1_INTERFACE_PEER);
Interface coremaster = (Interface) VCPENetworkModelHelper.getElementByTemplateName(core.getInterfaces(),
SPTemplateConstants.UP1_INTERFACE_PEER);
Interface corebkpinput = (Interface) VCPENetworkModelHelper.getElementByTemplateName(coreinput.getInterfaces(),
SPTemplateConstants.UP2_INTERFACE_PEER);
Interface corebkp = (Interface) VCPENetworkModelHelper.getElementByTemplateName(core.getInterfaces(),
SPTemplateConstants.UP2_INTERFACE_PEER);
if (coremasterinput != null) {
VCPENetworkModelHelper.updateInterface(coremaster, coremasterinput.getName(), coremasterinput.getVlan(), coremasterinput.getIpAddress(),
coremasterinput.getPhysicalInterfaceName(), coremasterinput.getPort());
}
if (corebkpinput != null) {
VCPENetworkModelHelper.updateInterface(corebkp, corebkpinput.getName(), corebkpinput.getVlan(), corebkpinput.getIpAddress(),
corebkpinput.getPhysicalInterfaceName(), corebkpinput.getPort());
}
// LR1
Router vcpe1input = (Router) VCPENetworkModelHelper.getElementByTemplateName(inputModel, SPTemplateConstants.VCPE1_ROUTER);
Router vcpe1 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.VCPE1_ROUTER);
vcpe1.setName(vcpe1input.getName() + "-" + inputModel.getName());
Interface inter1input = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe1input.getInterfaces(),
SPTemplateConstants.INTER1_INTERFACE_LOCAL);
Interface down1input = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe1input.getInterfaces(),
SPTemplateConstants.DOWN1_INTERFACE_LOCAL);
Interface up1input = (Interface) VCPENetworkModelHelper
.getElementByTemplateName(vcpe1input.getInterfaces(), SPTemplateConstants.UP1_INTERFACE_LOCAL);
Interface lo1input = (Interface) VCPENetworkModelHelper
.getElementByTemplateName(vcpe1input.getInterfaces(), SPTemplateConstants.LO1_INTERFACE);
Interface inter1 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe1.getInterfaces(),
SPTemplateConstants.INTER1_INTERFACE_LOCAL);
Interface down1 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe1.getInterfaces(),
SPTemplateConstants.DOWN1_INTERFACE_LOCAL);
Interface up1 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe1.getInterfaces(), SPTemplateConstants.UP1_INTERFACE_LOCAL);
Interface lo1 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe1.getInterfaces(), SPTemplateConstants.LO1_INTERFACE);
if (inter1input != null)
VCPENetworkModelHelper.updateInterface(inter1, inter1input.getName(), inter1input.getVlan(), inter1input.getIpAddress(),
inter1input.getPhysicalInterfaceName(),
inter1input.getPort());
if (down1input != null)
VCPENetworkModelHelper.updateInterface(down1, down1input.getName(), down1input.getVlan(), down1input.getIpAddress(),
down1input.getPhysicalInterfaceName(),
down1input.getPort());
if (up1input != null)
VCPENetworkModelHelper.updateInterface(up1, up1input.getName(), up1input.getVlan(), up1input.getIpAddress(),
up1input.getPhysicalInterfaceName(),
up1input.getPort());
if (lo1input != null)
VCPENetworkModelHelper.updateInterface(lo1, lo1input.getName(), lo1input.getVlan(), lo1input.getIpAddress(),
lo1input.getPhysicalInterfaceName(),
lo1input.getPort());
// LR2
Router vcpe2input = (Router) VCPENetworkModelHelper.getElementByTemplateName(inputModel, SPTemplateConstants.VCPE2_ROUTER);
Router vcpe2 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.VCPE2_ROUTER);
vcpe2.setName(vcpe2input.getName() + "-" + inputModel.getName());
Interface inter2input = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe2input.getInterfaces(),
SPTemplateConstants.INTER2_INTERFACE_LOCAL);
Interface down2input = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe2input.getInterfaces(),
SPTemplateConstants.DOWN2_INTERFACE_LOCAL);
Interface up2input = (Interface) VCPENetworkModelHelper
.getElementByTemplateName(vcpe2input.getInterfaces(), SPTemplateConstants.UP2_INTERFACE_LOCAL);
Interface lo2input = (Interface) VCPENetworkModelHelper
.getElementByTemplateName(vcpe2input.getInterfaces(), SPTemplateConstants.LO2_INTERFACE);
Interface inter2 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe2.getInterfaces(),
SPTemplateConstants.INTER2_INTERFACE_LOCAL);
Interface down2 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe2.getInterfaces(),
SPTemplateConstants.DOWN2_INTERFACE_LOCAL);
Interface up2 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe2.getInterfaces(), SPTemplateConstants.UP2_INTERFACE_LOCAL);
Interface lo2 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(vcpe2.getInterfaces(), SPTemplateConstants.LO2_INTERFACE);
if (inter2input != null)
VCPENetworkModelHelper.updateInterface(inter2, inter2input.getName(), inter2input.getVlan(), inter2input.getIpAddress(),
inter2input.getPhysicalInterfaceName(),
inter2input.getPort());
if (down2input != null)
VCPENetworkModelHelper.updateInterface(down2, down2input.getName(), down2input.getVlan(), down2input.getIpAddress(),
down2input.getPhysicalInterfaceName(),
down2input.getPort());
if (up2input != null)
VCPENetworkModelHelper.updateInterface(up2, up2input.getName(), up2input.getVlan(), up2input.getIpAddress(),
up2input.getPhysicalInterfaceName(),
up2input.getPort());
if (lo2input != null)
VCPENetworkModelHelper.updateInterface(lo2, lo2input.getName(), lo2input.getVlan(), lo2input.getIpAddress(),
lo2input.getPhysicalInterfaceName(),
lo2input.getPort());
// BOD
Interface client1input = (Interface) VCPENetworkModelHelper.getElementByTemplateName(inputModel,
SPTemplateConstants.CLIENT1_INTERFACE_AUTOBAHN);
Interface client2input = (Interface) VCPENetworkModelHelper.getElementByTemplateName(inputModel,
SPTemplateConstants.CLIENT2_INTERFACE_AUTOBAHN);
Interface client1 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CLIENT1_INTERFACE_AUTOBAHN);
Interface client2 = (Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CLIENT2_INTERFACE_AUTOBAHN);
VCPENetworkModelHelper.updateInterface(client1, client1input.getName(), client1input.getVlan(), client1input.getIpAddress(),
client1input.getPhysicalInterfaceName(), client1input.getPort());
VCPENetworkModelHelper.updateInterface(client2, client2input.getName(), client2input.getVlan(), client2input.getIpAddress(),
client2input.getPhysicalInterfaceName(), client2input.getPort());
// Update BoD client phy interfaces from data in logical ones
Interface client1phy = (Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CLIENT1_PHY_INTERFACE_AUTOBAHN);
client1phy.setName(client1input.getPhysicalInterfaceName());
client1phy.setPhysicalInterfaceName(client1input.getPhysicalInterfaceName());
Interface client2phy = (Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CLIENT2_PHY_INTERFACE_AUTOBAHN);
client2phy.setName(client2input.getPhysicalInterfaceName());
client2phy.setPhysicalInterfaceName(client2input.getPhysicalInterfaceName());
// VRRP
if (inputModel.getVrrp().getGroup() != null)
model.getVrrp().setGroup(inputModel.getVrrp().getGroup());
if (inputModel.getVrrp().getPriorityMaster() != null)
model.getVrrp().setPriorityMaster(inputModel.getVrrp().getPriorityMaster());
if (inputModel.getVrrp().getPriorityBackup() != null)
model.getVrrp().setPriorityBackup(inputModel.getVrrp().getPriorityBackup());
if (inputModel.getVrrp().getVirtualIPAddress() != null)
model.getVrrp().setVirtualIPAddress(inputModel.getVrrp().getVirtualIPAddress());
// BGP
if (inputModel.getBgp().getClientASNumber() != null)
model.getBgp().setClientASNumber(inputModel.getBgp().getClientASNumber());
if (inputModel.getBgp().getNocASNumber() != null)
model.getBgp().setNocASNumber(inputModel.getBgp().getNocASNumber());
if (inputModel.getBgp().getCustomerPrefixes() != null && !inputModel.getBgp().getCustomerPrefixes().isEmpty())
model.getBgp().setCustomerPrefixes(inputModel.getBgp().getCustomerPrefixes());
mapDependantLogicalElements(model);
return model;
}
private VCPENetworkModel mapDependantLogicalElements(VCPENetworkModel model) {
// vlans of direct links should be equal
model = updateInterfacesVlanFromLinks(model);
return model;
}
private VCPENetworkModel updateInterfacesVlanFromLinks(VCPENetworkModel model) {
List<Interface> allIfaces = VCPENetworkModelHelper.getInterfaces(model.getElements());
List<Interface> toUpdate = new ArrayList<Interface>(6);
toUpdate.add((Interface) VCPENetworkModelHelper.getElementByTemplateName(allIfaces, SPTemplateConstants.INTER1_INTERFACE_AUTOBAHN));
toUpdate.add((Interface) VCPENetworkModelHelper.getElementByTemplateName(allIfaces, SPTemplateConstants.INTER2_INTERFACE_AUTOBAHN));
toUpdate.add((Interface) VCPENetworkModelHelper.getElementByTemplateName(allIfaces, SPTemplateConstants.DOWN1_INTERFACE_AUTOBAHN));
toUpdate.add((Interface) VCPENetworkModelHelper.getElementByTemplateName(allIfaces, SPTemplateConstants.DOWN2_INTERFACE_AUTOBAHN));
// TODO Question: should the appl be able to modify up peer vlans (they are in core router)???
toUpdate.add((Interface) VCPENetworkModelHelper.getElementByTemplateName(allIfaces, SPTemplateConstants.UP1_INTERFACE_PEER));
toUpdate.add((Interface) VCPENetworkModelHelper.getElementByTemplateName(allIfaces, SPTemplateConstants.UP2_INTERFACE_PEER));
List<Link> allLinks = VCPENetworkModelHelper.getLinks(model.getElements());
List<Link> toUpdateLinks = new ArrayList<Link>(6);
toUpdateLinks.add((Link) VCPENetworkModelHelper.getElementByTemplateName(allLinks, SPTemplateConstants.INTER1_LINK_LOCAL));
toUpdateLinks.add((Link) VCPENetworkModelHelper.getElementByTemplateName(allLinks, SPTemplateConstants.INTER2_LINK_LOCAL));
toUpdateLinks.add((Link) VCPENetworkModelHelper.getElementByTemplateName(allLinks, SPTemplateConstants.DOWN1_LINK_LOCAL));
toUpdateLinks.add((Link) VCPENetworkModelHelper.getElementByTemplateName(allLinks, SPTemplateConstants.DOWN2_LINK_LOCAL));
// TODO Question: should the appl be able to modify up peer vlans???
toUpdateLinks.add((Link) VCPENetworkModelHelper.getElementByTemplateName(allLinks, SPTemplateConstants.UP1_LINK));
toUpdateLinks.add((Link) VCPENetworkModelHelper.getElementByTemplateName(allLinks, SPTemplateConstants.UP2_LINK));
for (Link link : toUpdateLinks) {
if (toUpdate.contains(link.getSource())) {
VCPENetworkModelHelper.updateIfaceVLANFromLink(link.getSource(), link);
} else {
VCPENetworkModelHelper.updateIfaceVLANFromLink(link.getSink(), link);
}
}
return model;
}
private VCPENetworkModel mapLogicalAndPhysical(VCPENetworkModel physicalInfrastructure, VCPENetworkModel logicalInfrastructure) {
// put all physical elements in logicalInfrastructure
logicalInfrastructure.getElements().addAll(physicalInfrastructure.getElements());
// put up logical interfaces into core router
Router core = (Router) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.CORE_PHY_ROUTER);
core.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.UP1_INTERFACE_PEER));
core.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.UP2_INTERFACE_PEER));
core.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.CORE_LO_INTERFACE));
// put bod logical interfaces into bod
Domain bod = (Domain) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.AUTOBAHN);
bod.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.CLIENT1_INTERFACE_AUTOBAHN));
bod.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.CLIENT2_INTERFACE_AUTOBAHN));
bod.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.INTER1_INTERFACE_AUTOBAHN));
bod.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.DOWN1_INTERFACE_AUTOBAHN));
bod.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.INTER2_INTERFACE_AUTOBAHN));
bod.getInterfaces().add(
(Interface) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.DOWN2_INTERFACE_AUTOBAHN));
// Assign logical routers to physical ones
Router phyRouter = (Router) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.CPE1_PHY_ROUTER);
LogicalRouter logRouter = (LogicalRouter) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure,
SPTemplateConstants.VCPE1_ROUTER);
logRouter.setPhysicalRouter(phyRouter);
phyRouter = (Router) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.CPE2_PHY_ROUTER);
logRouter = (LogicalRouter) VCPENetworkModelHelper.getElementByTemplateName(logicalInfrastructure, SPTemplateConstants.VCPE2_ROUTER);
logRouter.setPhysicalRouter(phyRouter);
return logicalInfrastructure;
}
private ConfigureBGPRequestParameters generateBGPParameters(VCPENetworkModel model) {
BGP bgp = model.getBgp();
ConfigureBGPRequestParameters params = new ConfigureBGPRequestParameters();
params.clientIPRanges = bgp.getCustomerPrefixes();
params.clientASNumber = bgp.getClientASNumber();
params.remoteASNum = bgp.getNocASNumber();
params.loAddr1 = ((Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.LO1_INTERFACE))
.getIpAddress();
params.upRemoteAddr1 = ((Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.UP1_INTERFACE_PEER))
.getIpAddress();
params.interAddr1 = ((Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.INTER1_INTERFACE_LOCAL))
.getIpAddress();
params.loAddr2 = ((Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.LO2_INTERFACE))
.getIpAddress();
params.upRemoteAddr2 = ((Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.UP2_INTERFACE_PEER))
.getIpAddress();
params.interAddr2 = ((Interface) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.INTER2_INTERFACE_LOCAL))
.getIpAddress();
return params;
}
private BGP generateBGPConfig(VCPENetworkModel initialModel) {
BGP bgp = initialModel.getBgp();
ConfigureBGPRequestParameters bgpParams = generateBGPParameters(initialModel);
// FACTORY 1
String router1id = IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.loAddr1)[0];
Properties props1 = (Properties) bgpProps.clone();
props1.setProperty("as.asnum", bgpParams.clientASNumber);
props1.setProperty("bgp.routerid", router1id); // no mask
props1.setProperty("bgp.group.0.peeras", bgpParams.remoteASNum);
props1.setProperty("bgp.group.0.session.0.peeras", bgpParams.remoteASNum);
props1.setProperty("bgp.group.0.session.0.peername", IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.upRemoteAddr1)[0]); // no
// mask
props1.setProperty("bgp.group.1.peeras", bgpParams.clientASNumber);
props1.setProperty("bgp.group.1.session.0.peeras", bgpParams.clientASNumber);
props1.setProperty("bgp.group.1.session.0.peername", IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.interAddr2)[0]); // no mask
// prefixes
props1.setProperty("prefixlist.2.prefixes.size", Integer.toString(bgp.getCustomerPrefixes().size() + 1));
props1.setProperty("prefixlist.2.prefix." + 0, IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.loAddr1)[0] + "/32");
for (int i = 0; i < bgp.getCustomerPrefixes().size(); i++) {
props1.setProperty("prefixlist.2.prefix." + (i + 1), bgp.getCustomerPrefixes().get(i));
}
// policies
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entries.size", Integer.toString(bgp.getCustomerPrefixes().size() + 1));
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + 0 + ".type", "routeFilterEntry");
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + 0 + ".address",
IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.loAddr1)[0] + "/32");
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + 0 + ".option", "exact");
for (int i = 0; i < bgp.getCustomerPrefixes().size(); i++) {
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + (i + 1) + ".type", "routeFilterEntry");
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + (i + 1) + ".address", bgp.getCustomerPrefixes().get(i));
props1.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + (i + 1) + ".option", "exact");
}
BGPModelFactory factory1 = new BGPModelFactory(props1);
bgp.setBgpConfigForMaster(factory1.createRouterWithBGP());
// FACTORY 2
String router2id = IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.loAddr2)[0];
Properties props2 = (Properties) bgpProps.clone();
props2.setProperty("as.asnum", bgpParams.clientASNumber);
props2.setProperty("bgp.routerid", router2id); // no mask
props2.setProperty("bgp.group.0.peeras", bgpParams.remoteASNum);
props2.setProperty("bgp.group.0.session.0.peeras", bgpParams.remoteASNum);
props2.setProperty("bgp.group.0.session.0.peername", IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.upRemoteAddr2)[0]); // no
// mask
props2.setProperty("bgp.group.1.peeras", bgpParams.clientASNumber);
props2.setProperty("bgp.group.1.session.0.peeras", bgpParams.clientASNumber);
props2.setProperty("bgp.group.1.session.0.peername", IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.interAddr1)[0]); // no mask
// prefixes
props2.setProperty("prefixlist.2.prefixes.size", Integer.toString(bgp.getCustomerPrefixes().size() + 1));
props2.setProperty("prefixlist.2.prefix." + 0, IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.loAddr2)[0] + "/32");
for (int i = 0; i < bgp.getCustomerPrefixes().size(); i++) {
props2.setProperty("prefixlist.2.prefix." + (i + 1), bgp.getCustomerPrefixes().get(i));
}
// policies
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entries.size", Integer.toString(bgp.getCustomerPrefixes().size() + 1));
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + 0 + ".type", "routeFilterEntry");
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + 0 + ".address",
IPUtilsHelper.composedIPAddressToIPAddressAndMask(bgpParams.loAddr2)[0] + "/32");
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + 0 + ".option", "exact");
for (int i = 0; i < bgp.getCustomerPrefixes().size(); i++) {
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + (i + 1) + ".type", "routeFilterEntry");
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + (i + 1) + ".address", bgp.getCustomerPrefixes().get(i));
props2.setProperty("policy.0.rule.0.condition.0.filterlist.0.entry." + (i + 1) + ".option", "exact");
}
BGPModelFactory factory2 = new BGPModelFactory(props2);
bgp.setBgpConfigForBackup(factory2.createRouterWithBGP());
return bgp;
}
private void checkPhysicalAvailability(List<VCPENetworkElement> toBeChecked, VCPEManagerModel managerModel) throws VCPENetworkManagerException {
checkExistenceInPhysicalInsfrastructure(toBeChecked, managerModel.getPhysicalInfrastructure());
}
private void checkExistenceInPhysicalInsfrastructure(List<VCPENetworkElement> toBeChecked, VCPEPhysicalInfrastructure phyInfrastructure) {
List<VCPENetworkElement> availablePhysicalElements = phyInfrastructure.getAllElements();
for (Domain domain : filter(toBeChecked, Domain.class)) {
if (!availablePhysicalElements.contains(domain))
throw new VCPENetworkManagerException("Domain " + domain.getName() + " is not available in physical insfrastructure");
Domain phyInfrDomain = (Domain) availablePhysicalElements.get(availablePhysicalElements.indexOf(domain));
for (Interface iface : domain.getInterfaces()) {
if (!phyInfrDomain.getInterfaces().contains(iface))
throw new VCPENetworkManagerException(
"Interface " + iface.getName() + " for domain " + domain.getName() + " is not available in physical insfrastructure");
}
}
for (Router router : filter(toBeChecked, Router.class)) {
if (!availablePhysicalElements.contains(router))
throw new VCPENetworkManagerException("Router " + router.getName() + " is not available in physical insfrastructure");
Router phyInfrRouter = (Router) availablePhysicalElements.get(availablePhysicalElements.indexOf(router));
for (Interface iface : router.getInterfaces()) {
if (!phyInfrRouter.getInterfaces().contains(iface))
throw new VCPENetworkManagerException(
"Interface " + iface.getName() + " for router " + router.getName() + " is not available in physical insfrastructure");
}
}
for (Link link : filter(toBeChecked, Link.class)) {
if (!availablePhysicalElements.contains(link))
throw new VCPENetworkManagerException("Link " + link.getName() + " is not available in physical insfrastructure");
}
}
}