/* * Copyright © 2016 AT&T 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.networkmodel.util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.transportpce.common.network.NetworkTransactionService; import org.opendaylight.transportpce.networkmodel.dto.TopologyShard; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.Nodes; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.networks.network.network.types.OpenroadmCommonNetworkBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes; import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengths; import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengthsBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengthsKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.DegreeAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.SrgAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrClientAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrNetworkAttributesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmLinkType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmNodeType; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NetworkTypesBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1Builder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class OpenRoadmTopology22 { private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology22.class); private NetworkTransactionService networkTransactionService; private final DeviceTransactionManager deviceTransactionManager; public OpenRoadmTopology22(NetworkTransactionService networkTransactionService, DeviceTransactionManager deviceTransactionManager) { this.networkTransactionService = networkTransactionService; this.deviceTransactionManager = deviceTransactionManager; } /** * This public method creates the OpenROADM Topology * Layer and posts it to the controller. */ public void createTopoLayer() { try { Network openRoadmTopology = createOpenRoadmTopology(); InstanceIdentifierBuilder nwIID = InstanceIdentifier.builder(Networks.class).child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))); this.networkTransactionService.put(LogicalDatastoreType.CONFIGURATION, nwIID.build(), openRoadmTopology); this.networkTransactionService.submit().get(1, TimeUnit.SECONDS); LOG.info("OpenRoadm-Topology created successfully."); } catch (ExecutionException | TimeoutException | InterruptedException e) { LOG.warn("Failed to create OpenRoadm-Topology", e); } } /** * Create empty OpenROADM topology. */ private Network createOpenRoadmTopology() { NetworkBuilder nwBuilder = new NetworkBuilder(); NetworkId nwId = new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID); nwBuilder.setNetworkId(nwId); nwBuilder.withKey(new NetworkKey(nwId)); NetworkTypes1Builder topoNetworkTypesBldr = new NetworkTypes1Builder(); topoNetworkTypesBldr.setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build()); NetworkTypesBuilder nwTypeBuilder = new NetworkTypesBuilder(); nwTypeBuilder.addAugmentation(NetworkTypes1.class, topoNetworkTypesBldr.build()); nwBuilder.setNetworkTypes(nwTypeBuilder.build()); // Array to store nodes in the topolayer of a roadm/Xponder Network1Builder nwBldr1 = new Network1Builder(); // adding expressLinks nwBldr1.setLink(Collections.emptyList()); nwBuilder.addAugmentation(Network1.class, nwBldr1.build()); nwBuilder.setNode(Collections.emptyList()); return nwBuilder.build(); } public TopologyShard createTopologyShard(Nodes mappingNode) { int numOfDegrees; int numOfSrgs; List nodes = new ArrayList<>(); List links = new ArrayList<>(); // Check if node is ROADM if (NodeTypes.Rdm.getIntValue() == mappingNode.getNodeType().getIntValue()) { LOG.info("creating rdm node in openroadmtopology for node {}", mappingNode.getNodeId()); // transform flat mapping list to per degree and per srg mapping lists Map> mapDeg = new HashMap(); Map> mapSrg = new HashMap(); List mappingList = mappingNode.getMapping(); mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint)); List nodeShardList = new ArrayList(); for (Mapping mapping : mappingList) { String str = mapping.getLogicalConnectionPoint().split("-")[0]; if (!nodeShardList.contains(str)) { nodeShardList.add(str); } } for (String str : nodeShardList) { List interList = new ArrayList(); interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str)) .collect(Collectors.toList()); if (str.contains("DEG")) { mapDeg.put(str, interList); } else if (str.contains("SRG")) { mapSrg.put(str, interList); } else { LOG.error("unknown element"); } } // create degree nodes for (String k : mapDeg.keySet()) { NodeBuilder ietfNode = createDegree(k, mapDeg.get(k), mappingNode.getNodeId()); nodes.add(ietfNode.build()); } // create srg nodes for (String k : mapSrg.keySet()) { NodeBuilder ietfNode = createSrg(k, mapSrg.get(k), mappingNode.getNodeId()); nodes.add(ietfNode.build()); } numOfDegrees = mapDeg.size(); numOfSrgs = mapSrg.size(); LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, numOfSrgs); links.addAll(createNewLinks(nodes)); LOG.info("created nodes/links: {}/{}", nodes.size(), links.size()); return new TopologyShard(nodes, links); } else if (NodeTypes.Xpdr.getIntValue() == mappingNode.getNodeType().getIntValue()) { // Check if node is XPONDER LOG.info("creating xpdr node in openroadmtopology for node {}", mappingNode.getNodeId()); NodeBuilder ietfNode = createXpdr(mappingNode); nodes.add(ietfNode.build()); return new TopologyShard(nodes, links); } LOG.error("Device node Type not managed yet"); return null; } private NodeBuilder createXpdr(Nodes mappingNode) { // Create ietf node setting supporting-node data NodeBuilder ietfNodeBldr = createTopoLayerNode(mappingNode.getNodeId()); // set node-id String nodeIdtopo = new StringBuilder().append(mappingNode.getNodeId()).append("-XPDR1").toString(); ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo)); ietfNodeBldr.withKey((new NodeKey(new NodeId(nodeIdtopo)))); // Create openroadm-network-topo augmentation to set node type to Xponder Node1Builder ontNode1Bldr = new Node1Builder(); ontNode1Bldr.setNodeType(OpenroadmNodeType.XPONDER); ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build()); // Create tp-list List tpList = new ArrayList<>(); TerminationPointBuilder ietfTpBldr; for (Mapping m : mappingNode.getMapping()) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-network-topology tp augmentations TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); if (m.getPortQual().equals("xpdr-network")) { ontTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); XpdrNetworkAttributesBuilder xpdrNwAttrBldr = new XpdrNetworkAttributesBuilder(); xpdrNwAttrBldr.setTailEquipmentId(m.getAssociatedLcp()); ontTp1Bldr.setXpdrNetworkAttributes(xpdrNwAttrBldr.build()); ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625 .TerminationPoint1Builder tpceTp1Bldr = new org.opendaylight.yang.gen.v1.http.transportpce .topology.rev190625.TerminationPoint1Builder(); tpceTp1Bldr.setAssociatedConnectionMapPort(m.getAssociatedLcp()); ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625 .TerminationPoint1.class, tpceTp1Bldr.build()); tpList.add(ietfTpBldr.build()); } else if (m.getPortQual().equals("xpdr-client")) { ontTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT); XpdrClientAttributesBuilder xpdrNwAttrBldr = new XpdrClientAttributesBuilder(); xpdrNwAttrBldr.setTailEquipmentId(m.getAssociatedLcp()); ontTp1Bldr.setXpdrClientAttributes(xpdrNwAttrBldr.build()); ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625 .TerminationPoint1Builder tpceTp1Bldr = new org.opendaylight.yang.gen.v1.http.transportpce .topology.rev190625.TerminationPoint1Builder(); tpceTp1Bldr.setAssociatedConnectionMapPort(m.getAssociatedLcp()); ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625 .TerminationPoint1.class, tpceTp1Bldr.build()); tpList.add(ietfTpBldr.build()); } } // Create ietf node augmentation to support ietf tp-list org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology .rev180226.Node1Builder(); ietfNode1.setTerminationPoint(tpList); ietfNodeBldr.addAugmentation( org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, ietfNode1.build()); return ietfNodeBldr; } private NodeBuilder createDegree(String degNb, List degListMap, String nodeId) { // Create ietf node setting supporting-node data NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId); // set node-id String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString(); ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo)); ietfNodeBldr.withKey((new NodeKey(new NodeId(nodeIdtopo)))); // Create openroadm-network-topo augmentation to set node type to DEGREE Node1Builder ontNode1Bldr = new Node1Builder(); ontNode1Bldr.setNodeType(OpenroadmNodeType.DEGREE); // set degree-attributes DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder(); degAttBldr.setDegreeNumber(new Integer(degNb.split("DEG")[1])); degAttBldr.setAvailableWavelengths(create96AvalWaveDegree()); ontNode1Bldr.setDegreeAttributes(degAttBldr.build()); ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build()); // Create tp-list List tpList = new ArrayList<>(); TerminationPointBuilder ietfTpBldr; for (Mapping m : degListMap) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-network-topology tp augmentations TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); switch (m.getPortDirection()) { case "bidirectional": ontTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP); break; case "tx": ontTp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP); break; case "rx": ontTp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP); break; default: LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); tpList.add(ietfTpBldr.build()); } // Add CTP to tp-list ietfTpBldr = createTpBldr(degNb + "-CTP-TXRX"); TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); ontTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXCTP); ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); tpList.add(ietfTpBldr.build()); // Create ietf node augmentation to support ietf tp-list org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology .rev180226.Node1Builder(); ietfNode1.setTerminationPoint(tpList); ietfNodeBldr.addAugmentation( org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, ietfNode1.build()); return ietfNodeBldr; } private NodeBuilder createSrg(String srgNb, List srgListMap, String nodeId) { // Create ietf node setting supporting-node data NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId); // set node-id String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString(); ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo)); ietfNodeBldr.withKey((new NodeKey(new NodeId(nodeIdtopo)))); // Create openroadm-network-topo augmentation to set node type to DEGREE Node1Builder ontNode1Bldr = new Node1Builder(); ontNode1Bldr.setNodeType(OpenroadmNodeType.SRG); // set srg-attributes SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder(); srgAttrBldr.setAvailableWavelengths(create96AvalWaveSrg()); ontNode1Bldr.setSrgAttributes(srgAttrBldr.build()); ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build()); // Create tp-list List tpList = new ArrayList<>(); TerminationPointBuilder ietfTpBldr; for (Mapping m : srgListMap) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-network-topology tp augmentations TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); switch (m.getPortDirection()) { case "bidirectional": ontTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP); break; case "tx": ontTp1Bldr.setTpType(OpenroadmTpType.SRGTXPP); break; case "rx": ontTp1Bldr.setTpType(OpenroadmTpType.SRGRXPP); break; default: LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); tpList.add(ietfTpBldr.build()); } // Add CP to tp-list ietfTpBldr = createTpBldr(srgNb + "-CP-TXRX"); TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); ontTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXCP); ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); tpList.add(ietfTpBldr.build()); // Create ietf node augmentation to support ietf tp-list org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology .rev180226.Node1Builder(); ietfNode1.setTerminationPoint(tpList); ietfNodeBldr.addAugmentation( org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, ietfNode1.build()); return ietfNodeBldr; } private NodeBuilder createTopoLayerNode(String nodeId) { // Sets the value of Network-ref and Node-ref as a part of the supporting node // attribute SupportingNodeBuilder supportbldr = new SupportingNodeBuilder(); supportbldr.withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId))); supportbldr.setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)); supportbldr.setNodeRef(new NodeId(nodeId)); ArrayList supportlist = new ArrayList<>(); supportlist.add(supportbldr.build()); NodeBuilder nodebldr = new NodeBuilder(); nodebldr.setSupportingNode(supportlist); return nodebldr; } // This method returns a generic termination point builder for a given tpid private TerminationPointBuilder createTpBldr(String tpId) { TerminationPointBuilder tpBldr = new TerminationPointBuilder(); TpId tp = new TpId(tpId); TerminationPointKey tpKey = new TerminationPointKey(tp); tpBldr.withKey(tpKey); tpBldr.setTpId(tp); return tpBldr; } private LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) { LinkBuilder ietfLinkBldr = new LinkBuilder(); //create source link SourceBuilder ietfSrcLinkBldr = new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(srcTp); //create destination link DestinationBuilder ietfDestLinkBldr = new DestinationBuilder().setDestNode(new NodeId(destNode)) .setDestTp(destTp); ietfLinkBldr.setSource(ietfSrcLinkBldr.build()) .setDestination(ietfDestLinkBldr.build()) .setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp)) .withKey(new LinkKey(ietfLinkBldr.getLinkId())); return ietfLinkBldr; } private List createNewLinks(List nodes) { List links = new ArrayList<>(); String srcNode; String destNode; String srcTp; String destTp; for (int i = 0; i < nodes.size() - 1; i++) { for (int j = i + 1; j < nodes.size(); j++) { srcNode = nodes.get(i).getNodeId().getValue(); destNode = nodes.get(j).getNodeId().getValue(); // A to Z direction srcTp = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf .network.topology.rev180226.Node1.class).getTerminationPoint().stream() .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) .findFirst().get().getTpId().getValue(); destTp = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf .network.topology.rev180226.Node1.class).getTerminationPoint().stream() .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) .findFirst().get().getTpId().getValue(); LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp); Link1Builder ontAzLinkBldr = new Link1Builder(); int srcNodeType = nodes.get(i).augmentation(Node1.class).getNodeType().getIntValue(); int destNodeType = nodes.get(j).augmentation(Node1.class).getNodeType().getIntValue(); if (srcNodeType == 11 && destNodeType == 11) { ontAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); } else if (srcNodeType == 11 && destNodeType == 12) { ontAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); } else if (srcNodeType == 12 && destNodeType == 11) { ontAzLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); } else { continue; } // Z to A direction LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp); Link1Builder ontZaLinkBldr = new Link1Builder(); if (srcNodeType == 11 && destNodeType == 11) { ontZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); } else if (destNodeType == 11 && srcNodeType == 12) { ontZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); } else if (destNodeType == 12 && srcNodeType == 11) { ontZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); } else { continue; } // set opposite link augmentations org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder ocnAzLinkBldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder() .setOppositeLink(ietfZaLinkBldr.getLinkId()); ietfAzLinkBldr.addAugmentation(Link1.class, ontAzLinkBldr.build()); ietfAzLinkBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 .Link1.class, ocnAzLinkBldr.build()); ietfZaLinkBldr.addAugmentation(Link1.class, ontZaLinkBldr.build()); org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder ocnZaLinkBldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder() .setOppositeLink(ietfAzLinkBldr.getLinkId()); ietfZaLinkBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 .Link1.class, ocnZaLinkBldr.build()); links.add(ietfAzLinkBldr.build()); links.add(ietfZaLinkBldr.build()); } } return links; } // This method returns the linkBuilder object for given source and destination public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp, NetworkTransactionService networkTransactionService) { LOG.info("deleting link for {}-{}", srcNode, dstNode); LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp); if (deleteLinkLinkId(linkId, networkTransactionService)) { LOG.debug("Link Id {} updated to have admin state down"); return true; } else { LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode); return false; } } // This method returns the linkBuilder object for given source and destination public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) { LOG.info("deleting link for LinkId: {}", linkId); try { InstanceIdentifierBuilder linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class) .child(Link.class, new LinkKey(linkId)); com.google.common.base.Optional link = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get(); if (link.isPresent()) { LinkBuilder linkBuilder = new LinkBuilder(link.get()); Link1Builder link1Builder = new Link1Builder(linkBuilder.augmentation(org.opendaylight .yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1.class)); link1Builder.setAdministrativeState(State.OutOfService); linkBuilder.removeAugmentation(Link1.class); linkBuilder.addAugmentation(Link1.class,link1Builder.build()); networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(), linkBuilder.build()); networkTransactionService.submit().get(1, TimeUnit.SECONDS); return true; } else { LOG.error("No link found for given LinkId: {}", linkId); return false; } } catch (InterruptedException | ExecutionException | TimeoutException e) { LOG.error(e.getMessage(), e); return false; } } private List create96AvalWaveDegree() { List waveList = new ArrayList<>(); for (int i = 1; i < 97; i++) { AvailableWavelengthsBuilder avalBldr = new AvailableWavelengthsBuilder(); avalBldr.setIndex((long) i); avalBldr.withKey(new AvailableWavelengthsKey((long) i)); waveList.add(avalBldr.build()); } return waveList; } private List create96AvalWaveSrg() { List waveList = new ArrayList<>(); for (int i = 1; i < 97; i++) { org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes .AvailableWavelengthsBuilder avalBldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node .attributes.AvailableWavelengthsBuilder(); avalBldr.setIndex((long) i); avalBldr.withKey( new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node .attributes.AvailableWavelengthsKey( (long) i)); waveList.add(avalBldr.build()); } return waveList; } }