package org.opennaas.extensions.vcpe.manager.templates.mp; import java.util.ArrayList; import java.util.Arrays; import java.util.List; 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.LogicalRouter; import org.opennaas.extensions.vcpe.model.PhysicalRouter; 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; import org.opennaas.extensions.vcpe.model.routing.RoutingConfiguration; public class MPTemplateModelBuilder { /** * * @return a newly created VCPENetworkModel with the structure required for MP-vCPE template. */ public static VCPENetworkModel generateModel() { return mapLogicalAndPhysical(generatePhysicalElements(), generateLogicalElements()); } /** * * @return a newly created VCPENetworkModel containing all physical elements required for MP-vCPE template. */ public static VCPENetworkModel generatePhysicalElements() { List<Interface> interfaces; // Physical Router Router phyRouter = new PhysicalRouter(); phyRouter.setTemplateName(TemplateConstants.ROUTER_1_PHY); interfaces = new ArrayList<Interface>(); phyRouter.setInterfaces(interfaces); Interface phyRouterUp1 = createInterface(TemplateConstants.ROUTER_1_PHY_IFACE_UP1); Interface phyRouterUp2 = createInterface(TemplateConstants.ROUTER_1_PHY_IFACE_UP2); Interface phyRouterDown = createInterface(TemplateConstants.ROUTER_1_PHY_IFACE_DOWN); Interface phyRouterLo = createInterface(TemplateConstants.ROUTER_1_PHY_IFACE_LO); Interface phyRouterLt = createInterface(TemplateConstants.ROUTER_1_PHY_IFACE_LT); interfaces.add(phyRouterUp1); interfaces.add(phyRouterUp2); interfaces.add(phyRouterDown); interfaces.add(phyRouterLo); interfaces.add(phyRouterLt); List<VCPENetworkElement> elements = new ArrayList<VCPENetworkElement>(); elements.add(phyRouter); elements.addAll(phyRouter.getInterfaces()); VCPENetworkModel model = new VCPENetworkModel(); model.setElements(elements); model.setTemplateType(MultipleProviderTemplate.MP_VCPE_TEMPLATE); model.setCreated(false); return model; } /** * * @return a newly created VCPENetworkModel containing all logical elements required for MP-vCPE template. */ public static VCPENetworkModel generateLogicalElements() { // create networks IPNetworkDomain wan1 = new IPNetworkDomain(); wan1.setTemplateName(TemplateConstants.WAN1); IPNetworkDomain wan2 = new IPNetworkDomain(); wan2.setTemplateName(TemplateConstants.WAN2); IPNetworkDomain client = new IPNetworkDomain(); client.setTemplateName(TemplateConstants.LAN_CLIENT); Interface wan1down = createInterface(TemplateConstants.WAN1_IFACE_DOWN); Interface wan2down = createInterface(TemplateConstants.WAN2_IFACE_DOWN); Interface clientLanUp = createInterface(TemplateConstants.LAN_CLIENT_IFACE_UP); wan1.setInterfaces(Arrays.asList(wan1down)); wan2.setInterfaces(Arrays.asList(wan2down)); client.setInterfaces(Arrays.asList(clientLanUp)); // LogicalRouter 1 Router lr1 = new LogicalRouter(); lr1.setTemplateName(TemplateConstants.LR_1_ROUTER); lr1.setRoutingConfiguration(new RoutingConfiguration()); List<Interface> interfaces = new ArrayList<Interface>(); lr1.setInterfaces(interfaces); Interface lr1Up = createInterface(TemplateConstants.LR_1_IFACE_UP); Interface lr1Down = createInterface(TemplateConstants.LR_1_IFACE_DOWN); Interface lr1Lo = createInterface(TemplateConstants.LR_1_IFACE_LO); interfaces.add(lr1Up); interfaces.add(lr1Down); interfaces.add(lr1Lo); // LogicalRouter 2 Router lr2 = new LogicalRouter(); lr2.setTemplateName(TemplateConstants.LR_2_ROUTER); lr2.setRoutingConfiguration(new RoutingConfiguration()); interfaces = new ArrayList<Interface>(); lr2.setInterfaces(interfaces); Interface lr2Up = createInterface(TemplateConstants.LR_2_IFACE_UP); Interface lr2Down = createInterface(TemplateConstants.LR_2_IFACE_DOWN); Interface lr2Lo = createInterface(TemplateConstants.LR_2_IFACE_LO); interfaces.add(lr2Up); interfaces.add(lr2Down); interfaces.add(lr2Lo); // Client Logical Router Router lrclient = new LogicalRouter(); lrclient.setTemplateName(TemplateConstants.LR_CLIENT_ROUTER); lrclient.setRoutingConfiguration(new RoutingConfiguration()); interfaces = new ArrayList<Interface>(); lrclient.setInterfaces(interfaces); Interface lrclientUp1 = createInterface(TemplateConstants.LR_CLIENT_IFACE_UP1); Interface lrclientUp2 = createInterface(TemplateConstants.LR_CLIENT_IFACE_UP2); Interface lrclientDown = createInterface(TemplateConstants.LR_CLIENT_IFACE_DOWN); Interface lrclientLo = createInterface(TemplateConstants.LR_CLIENT_IFACE_LO); interfaces.add(lrclientUp1); interfaces.add(lrclientUp2); interfaces.add(lrclientDown); interfaces.add(lrclientLo); // Links Link wan1Link = VCPENetworkModelHelper.createLink(null, TemplateConstants.LINK_WAN1, "eth", lr1Up, wan1down); Link wan2Link = VCPENetworkModelHelper.createLink(null, TemplateConstants.LINK_WAN2, "eth", lr2Up, wan2down); Link clientLink = VCPENetworkModelHelper.createLink(null, TemplateConstants.LINK_LAN_CLIENT, "eth", lrclientDown, clientLanUp); Link intern1Link = VCPENetworkModelHelper.createLink(null, TemplateConstants.LINK_LR_1_LR_CLIENT, "lt", lr1Down, lrclientUp1); Link intern2Link = VCPENetworkModelHelper.createLink(null, TemplateConstants.LINK_LR_2_LR_CLIENT, "lt", lr2Down, lrclientUp2); List<VCPENetworkElement> elements = new ArrayList<VCPENetworkElement>(); elements.add(wan1); elements.addAll(wan1.getInterfaces()); elements.add(wan2); elements.addAll(wan2.getInterfaces()); elements.add(client); elements.addAll(client.getInterfaces()); elements.add(lr1); elements.addAll(lr1.getInterfaces()); elements.add(lr2); elements.addAll(lr2.getInterfaces()); elements.add(lrclient); elements.addAll(lrclient.getInterfaces()); elements.add(wan1Link); elements.add(wan2Link); elements.add(clientLink); elements.add(intern1Link); elements.add(intern2Link); VCPENetworkModel model = new VCPENetworkModel(); model.setElements(elements); model.setTemplateType(MultipleProviderTemplate.MP_VCPE_TEMPLATE); model.setCreated(false); return model; } /** * Joins given models into one, and adds required relationships between logical elements and physical ones. * * @param physicalInfrastructure * @param logicalInfrastructure * @return given logialInfrastructure updated with all elements in physicalInfrastructure and with new relationships added. */ public static VCPENetworkModel mapLogicalAndPhysical(VCPENetworkModel physicalInfrastructure, VCPENetworkModel logicalInfrastructure) { // Assign logical routers to physical ones Router phyRouter; LogicalRouter logRouter; phyRouter = (Router) VCPENetworkModelHelper.getElementByTemplateName(physicalInfrastructure, TemplateConstants.ROUTER_1_PHY); List<Router> routersInLogical = VCPENetworkModelHelper.getRouters(logicalInfrastructure.getElements()); logRouter = (LogicalRouter) VCPENetworkModelHelper.getElementByTemplateName(routersInLogical, TemplateConstants.LR_1_ROUTER); logRouter.setPhysicalRouter(phyRouter); logRouter = (LogicalRouter) VCPENetworkModelHelper.getElementByTemplateName(routersInLogical, TemplateConstants.LR_2_ROUTER); logRouter.setPhysicalRouter(phyRouter); logRouter = (LogicalRouter) VCPENetworkModelHelper.getElementByTemplateName(routersInLogical, TemplateConstants.LR_CLIENT_ROUTER); logRouter.setPhysicalRouter(phyRouter); return joinModels(physicalInfrastructure, logicalInfrastructure); } /** * Joins given models into one * * @param physicalInfrastructure * @param logicalInfrastructure * @return given logialInfrastructure updated with all elements in physicalInfrastructure */ public static VCPENetworkModel joinModels(VCPENetworkModel physicalInfrastructure, VCPENetworkModel logicalInfrastructure) { // put all physical elements in logicalInfrastructure logicalInfrastructure.getElements().addAll(physicalInfrastructure.getElements()); return logicalInfrastructure; } private static Interface createInterface(String nameInTemplate) { Interface iface = new Interface(); iface.setTemplateName(nameInTemplate); return iface; } }