/* * Copyright © 2017 Orange, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.transportpce.stubpce.topology; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.opendaylight.transportpce.stubpce.TpNodeTp; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.Link; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.LinkBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.Node; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.NodeBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.TerminationPoint; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.TerminationPointBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.link.LinkIdentifierBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.node.NodeIdentifierBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426.pce.resource.resource.resource.termination.point.TerminationPointIdentifierBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * build all path with one resource * from Supernode. * * @author Martial Coulibaly on * behalf of Orange */ public class NodePath { /** Logging. */ private static final Logger LOG = LoggerFactory.getLogger(NodePath.class); /** element of Supernode. */ private org.opendaylight.transportpce.stubpce.topology.Resource resource; /** TpNodeTp list. */ private List tpNodeTps; /** Link list. */ private List links; /** SuperNode element nodeId. */ private String nodeId; /** Supernode Id. */ private String superNodeId; /** boolean to determine if Supernode contains an XPDR. */ private boolean isXpdrSrgAbsent; /** Path List. */ private List path; /** *NodePath constructor. * * @param res element of Supernode * @param superNodeId supernode Id * @param isXpdrSrgAbsent boolean to determine if Supernode contains an XPDR */ public NodePath(org.opendaylight.transportpce.stubpce.topology.Resource res, String superNodeId, boolean isXpdrSrgAbsent) { setResource(res); setNodeId(res.getNodeId()); setSuperNodeId(superNodeId); setXpdrSrgAbsent(isXpdrSrgAbsent); setLinks(new ArrayList()); setTpNodeTps(new ArrayList()); setPath(new ArrayList()); } @Override public String toString() { java.lang.String name = "NodePath ["; java.lang.StringBuilder builder = new java.lang.StringBuilder(name); if (nodeId != null) { builder.append("nodeId= "); builder.append(nodeId); builder.append(", "); } if (path.size() > 0) { builder.append("Paths ["); builder.append(path.toString()); builder.append(" ]"); } return builder.append(']').toString(); } /** *get all resources (links, *logicalConnectionpoints, nodeId) *from Supernode element. */ public void fill() { Boolean xpdr = false; if (resource != null) { String nodeid = resource.getNodeId(); List resLinks = resource.getLinks(); List resLcps = resource.getLcps(); for (String tmp : resLinks) { Link link = new LinkBuilder() .setLinkIdentifier(new LinkIdentifierBuilder() .setLinkId(tmp) .build()) .build(); links.add(link); } if (nodeid.contains("XPDR")) { LOG.info("building xpdr resource ..."); xpdr = true; buildXpdrTopo(nodeid,resLinks,resLcps,xpdr); links.add(new LinkBuilder() .setLinkIdentifier(new LinkIdentifierBuilder() .setLinkId("TAIL-LINKS") .build()) .build()); } if (nodeid.contains("SRG")) { LOG.info("building SRG resource ..."); buildSRGTopo(nodeid, resLinks, resLcps); } if (nodeid.contains("DEG")) { LOG.info("building DEG resource ..."); xpdr = false; buildXpdrTopo(nodeid,resLinks,resLcps,xpdr); links.add(new LinkBuilder() .setLinkIdentifier(new LinkIdentifierBuilder() .setLinkId("EXTERNAL-LINKS") .build()) .build()); } } createDirection(); } /** * reverse a TpNodeTp * List. * * @return TpNodeTp list */ private List reverseTpNodetpList() { List result = new ArrayList(); for (TpNodeTp tpNodetp : tpNodeTps) { TpNodeTp tmp = tpNodetp.reverse(); result.add(tmp); } return result; } /** *create list of Path *(TpNodeTp/Link). */ private void createDirection() { /** create direction */ LOG.info("creating direction ..."); Path resourcePath = null; List direction = new ArrayList(); for (Link link : links) { String linkId = link.getLinkIdentifier().getLinkId(); LOG.info("LinkId : {}", linkId); if (!isXpdrSrgAbsent) { if (StringUtils.countMatches(link.getLinkIdentifier().getLinkId(), "ROADM") < 2) { if ((linkId.contains("XPDR") && linkId.startsWith("ROADM")) || ((linkId.startsWith("DEG") && linkId.contains("SRG"))) || (nodeId.contains("XPDR") && linkId.contains("TAIL-LINKS"))) { LOG.info("reversing TpNodetp list for link '{}'", linkId); direction = reverseTpNodetpList(); } else { direction = tpNodeTps; } } else { LOG.info("link is deg to deg link !"); } } else { if (StringUtils.countMatches(link.getLinkIdentifier().getLinkId(), "ROADM") == 2) { direction = reverseTpNodetpList(); } else { direction = tpNodeTps; } } if (tpNodeTps.size() > 0) { for (TpNodeTp tpNodeTp : direction) { resourcePath = new Path(tpNodeTp, link); LOG.info(resourcePath.toString()); path.add(resourcePath); } } else { LOG.info("tpNodeTps is empty !"); } } } /** * build a list of * Termination Point in * XPDR or DEG * ordered in AToZdirection * on a Supernode (XPDR to SRG) * (ROADMA-DEG to ROADMZ-DEG). * * @param xpdr determine if it is an XPDR or not * @param resLcps list of LogicalConnectionPoint * @return String list of TerminationPoints */ private List getOrderedTps(boolean xpdr, List resLcps) { List result = new ArrayList(); if (xpdr) { for (LogicalConnectionPoint lcp : resLcps) { String tmp = lcp.getTpId(); if (tmp.contains("CLIENT")) { result.add(0, tmp); } else if (tmp.contains("NETWORK")) { result.add(1, tmp); } } } else { for (LogicalConnectionPoint lcp : resLcps) { String tmp = lcp.getTpId(); if (tmp.contains("CTP")) { result.add(0, tmp); } else if (tmp.contains("TTP")) { result.add(1, tmp); } } } return result; } /** * build TpNodeTp * structure in an * XPDR. * * @param nodeid XPDR Id * @param resLinks list of links * @param resLcps list of LogicalConnectionPoints * @param xpdr determine if it is an XPDR or not */ private void buildXpdrTopo(String nodeid, List resLinks, List resLcps, boolean xpdr) { /** build TpNodetp .*/ TerminationPointBuilder in = null; TerminationPointBuilder out = null; List lcps = getOrderedTps(xpdr,resLcps); if (lcps.size() == 2) { in = new TerminationPointBuilder() .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder() .setNodeId(nodeid) .setTpId(lcps.get(0)) .build()); out = new TerminationPointBuilder() .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder() .setNodeId(nodeid) .setTpId(lcps.get(1)) .build()); } else { LOG.info("lcps size not equal to 2"); } Node node = new NodeBuilder() .setNodeIdentifier(new NodeIdentifierBuilder() .setNodeId(nodeid) .build()) .build(); TpNodeTp tmp = new TpNodeTp(in.build(), out.build(), node); tpNodeTps.add(tmp); } /** * build TpNodeTp * structure in an * SGR. * * @param nodeid SRG nodeId * @param resLinks list of links * @param resLcps list of LogicalConnectionPoints */ private void buildSRGTopo(String nodeid, List resLinks,List resLcps) { /** build TpNodetp .*/ Node node = new NodeBuilder() .setNodeIdentifier(new NodeIdentifierBuilder() .setNodeId(nodeid) .build()) .build(); TerminationPoint out = new TerminationPointBuilder() .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder() .setNodeId(nodeid) .setTpId("SRG1-CP-TXRX") .build()) .build(); for (LogicalConnectionPoint lcp : resLcps) { if (lcp.getTpId().compareTo("SRG1-CP-TXRX") != 0) { TerminationPoint in = new TerminationPointBuilder() .setTerminationPointIdentifier(new TerminationPointIdentifierBuilder() .setNodeId(nodeid) .setTpId(lcp.getTpId()) .build()) .build(); tpNodeTps.add(new TpNodeTp(in, out, node)); } } } public static void main(String[] args) { Topology topo = new Topology(); topo.start(); Network net = topo.getNetwork(); if (net != null) { SuperNode superNode = net.getSuperNodes().get(0); LOG.info("SuperNode : {}", superNode.getSuperNodeId()); for (org.opendaylight.transportpce.stubpce.topology.Resource res : superNode.getResources()) { LOG.info(res.toString()); NodePath path = new NodePath(res, superNode.getSuperNodeId(), superNode.isXpdrSrgAbsent()); path.fill(); } } } public org.opendaylight.transportpce.stubpce.topology.Resource getResource() { return resource; } public void setResource(org.opendaylight.transportpce.stubpce.topology.Resource resource) { this.resource = resource; } public List getTpNodeTps() { return tpNodeTps; } public void setTpNodeTps(List tpNodeTps) { this.tpNodeTps = tpNodeTps; } public List getLinks() { return links; } public void setLinks(List links) { this.links = links; } public List getPath() { return path; } public void setPath(List path) { this.path = path; } public String getNodeId() { return nodeId; } public void setNodeId(String nodeId) { this.nodeId = nodeId; } public String getSuperNodeId() { return superNodeId; } public void setSuperNodeId(String superNodeId) { this.superNodeId = superNodeId; } public boolean isXpdrSrgAbsent() { return isXpdrSrgAbsent; } public void setXpdrSrgAbsent(boolean xpdrSrgAbsent) { this.isXpdrSrgAbsent = xpdrSrgAbsent; } }