X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2Futil%2FOpenRoadmTopology.java;h=838cc11554f51af4fb46b8d7aac9f9d96595df72;hb=67763b4d82e44c68fdbc765cdeec5496ff65b01e;hp=621125fb9527439b38e52a432fee131d539a2573;hpb=e5480799d2f666999f2ae5cd7a874aa78d648a60;p=transportpce.git diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java index 621125fb9..838cc1155 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java @@ -17,30 +17,29 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; - import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; +import org.opendaylight.transportpce.common.fixedflex.GridUtils; 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.rev200113.network.Nodes; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200113.network.nodes.Mapping; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.mapping.Mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.network.Nodes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes; -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.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.networks.network.node.DegreeAttributes; -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.SrgAttributes; -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.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.http.org.openroadm.equipment.states.types.rev191129.AdminStates; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.TerminationPoint1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.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; @@ -65,6 +64,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top 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.opendaylight.yangtools.yang.common.Uint16; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,7 +87,7 @@ public final class OpenRoadmTopology { // transform flat mapping list to per degree and per srg mapping lists Map> mapDeg = new HashMap<>(); Map> mapSrg = new HashMap<>(); - List mappingList = mappingNode.getMapping(); + List mappingList = new ArrayList<>(mappingNode.nonnullMapping().values()); mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint)); List nodeShardList = new ArrayList<>(); @@ -98,8 +98,7 @@ public final class OpenRoadmTopology { } } for (String str : nodeShardList) { - List interList = new ArrayList<>(); - interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str)) + List interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str)) .collect(Collectors.toList()); if (str.contains("DEG")) { mapDeg.put(str, interList); @@ -110,14 +109,14 @@ public final class OpenRoadmTopology { } } // create degree nodes - for (String k : mapDeg.keySet()) { - NodeBuilder ietfNode = createDegree(k, mapDeg.get(k), mappingNode.getNodeId(), + for (Map.Entry> entry : mapDeg.entrySet()) { + NodeBuilder ietfNode = createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli()); nodes.add(ietfNode.build()); } // create srg nodes - for (String k : mapSrg.keySet()) { - NodeBuilder ietfNode = createSrg(k, mapSrg.get(k), mappingNode.getNodeId(), + for (Map.Entry> entry : mapSrg.entrySet()) { + NodeBuilder ietfNode = createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli()); nodes.add(ietfNode.build()); } @@ -131,7 +130,8 @@ public final class OpenRoadmTopology { return new TopologyShard(nodes, links); } else if (NodeTypes.Xpdr.getIntValue() == mappingNode.getNodeInfo().getNodeType().getIntValue()) { // Check if node is Xpdr is a Transponder - List networkMappings = mappingNode.getMapping().stream().filter(k -> k.getLogicalConnectionPoint() + List networkMappings = mappingNode.nonnullMapping().values() + .stream().filter(k -> k.getLogicalConnectionPoint() .contains("NETWORK")).collect(Collectors.toList()); List tpdrList = new ArrayList<>(); for (Mapping mapping : networkMappings) { @@ -139,7 +139,7 @@ public final class OpenRoadmTopology { Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]); if (!tpdrList.contains(xpdrNb)) { tpdrList.add(xpdrNb); - extractedMappings = mappingNode.getMapping().stream().filter(lcp -> lcp + extractedMappings = mappingNode.nonnullMapping().values().stream().filter(lcp -> lcp .getLogicalConnectionPoint().contains("XPDR" + xpdrNb)).collect(Collectors.toList()); NodeBuilder ietfNode; if (mapping.getXponderType() == null @@ -172,85 +172,91 @@ public final class OpenRoadmTopology { private static NodeBuilder createXpdr(String nodeId, String clli, Integer xpdrNb, List mappings, boolean isOtn) { // Create openroadm-network-topo augmentation to set node type to Xponder - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 ocnNode1 = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder() - .setNodeType(OpenroadmNodeType.XPONDER).build(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNode1 = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder() + .setNodeType(OpenroadmNodeType.XPONDER) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build(); // Create ietf node setting supporting-node data NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId, clli); // set node-id String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR").append(xpdrNb).toString(); ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo)) .withKey((new NodeKey(new NodeId(nodeIdtopo)))) - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .Node1.class, ocnNode1); + .addAugmentation(ocnNode1); - // Create tp-list - List tpList = new ArrayList<>(); + // Create tp-map + Map tpMap = new HashMap<>(); TerminationPointBuilder ietfTpBldr; for (Mapping m : mappings) { if (!isOtn) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-network-topology tp augmentations - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm - .common.network.rev181130.TerminationPoint1Builder(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder + ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1Builder() + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())); if (m.getPortQual().equals("xpdr-network")) { ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); - org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200123.TerminationPoint1 tpceTp1 = - new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200123 - .TerminationPoint1Builder().setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 = + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); ietfTpBldr - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network - .rev181130.TerminationPoint1.class, ocnTp1Bldr.build()) - .addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200123 - .TerminationPoint1.class, tpceTp1); - tpList.add(ietfTpBldr.build()); + .addAugmentation(ocnTp1Bldr.build()) + .addAugmentation(tpceTp1); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); } else if (m.getPortQual().equals("xpdr-client")) { ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT); - org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200123.TerminationPoint1 tpceTp1 = - new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200123 - .TerminationPoint1Builder().setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 = + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build(); ietfTpBldr - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1.class, ocnTp1Bldr.build()) - .addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200123 - .TerminationPoint1.class, tpceTp1); - tpList.add(ietfTpBldr.build()); + .addAugmentation(ocnTp1Bldr.build()) + .addAugmentation(tpceTp1); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); } } else { if (m.getPortQual().equals("xpdr-network") || m.getPortQual().equals("switch-network")) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm - .common.network.rev181130.TerminationPoint1Builder().setTpType(OpenroadmTpType.XPONDERNETWORK); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder + ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.XPONDERNETWORK) + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())); ietfTpBldr - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network - .rev181130.TerminationPoint1.class, ocnTp1Bldr.build()); - tpList.add(ietfTpBldr.build()); + .addAugmentation(ocnTp1Bldr.build()); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); } } } // 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() - .setTerminationPoint(tpList); - ietfNodeBldr.addAugmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, - ietfNode1.build()); + 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().setTerminationPoint(tpMap); + ietfNodeBldr.addAugmentation(ietfNode1.build()); return ietfNodeBldr; } private static NodeBuilder createDegree(String degNb, List degListMap, String nodeId, String clli) { // Create tp-list - List tpList = new ArrayList<>(); + Map tpMap = new HashMap<>(); TerminationPointBuilder ietfTpBldr; for (Mapping m : degListMap) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-common-network tp type augmentations - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common - .network.rev181130.TerminationPoint1Builder(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder + ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + .TerminationPoint1Builder() + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())); + + // Added states to degree port. TODO: add to mapping relation between abstracted and physical node states switch (m.getPortDirection()) { case "bidirectional": ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP); @@ -264,56 +270,62 @@ public final class OpenRoadmTopology { default: LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } - ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1.class, ocnTp1Bldr.build()); - tpList.add(ietfTpBldr.build()); + ietfTpBldr.addAugmentation(ocnTp1Bldr.build()); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); } - // Add CTP to tp-list + // Add CTP to tp-list + added states. TODO: same comment as before with the relation between states ietfTpBldr = createTpBldr(degNb + "-CTP-TXRX"); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1 ocnTp1 = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1Builder() - .setTpType(OpenroadmTpType.DEGREETXRXCTP).build(); - ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1.class, ocnTp1); - tpList.add(ietfTpBldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp1 = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.DEGREETXRXCTP) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build(); + ietfTpBldr.addAugmentation(ocnTp1); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); // set degree-attributes DegreeAttributes degAtt = new DegreeAttributesBuilder() - .setDegreeNumber(Integer.valueOf(degNb.split("DEG")[1])) - .setAvailableWavelengths(create96AvalWaveDegree()).build(); + .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1])) + .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()) + .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() - .setTerminationPoint(tpList); + 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().setTerminationPoint(tpMap); // set node-id String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString(); Node1 ontNode1 = new Node1Builder().setDegreeAttributes(degAtt).build(); // Create openroadm-common-network augmentation to set node type to DEGREE - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 ocnNode1 = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder() - .setNodeType(OpenroadmNodeType.DEGREE).build(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNode1 = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder() + .setNodeType(OpenroadmNodeType.DEGREE) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build(); // Create ietf node setting supporting-node data return createTopoLayerNode(nodeId, clli) .setNodeId(new NodeId(nodeIdtopo)) .withKey((new NodeKey(new NodeId(nodeIdtopo)))) - .addAugmentation(Node1.class, ontNode1) - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .Node1.class, ocnNode1) - .addAugmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology - .rev180226.Node1.class, - ietfNode1.build()); + .addAugmentation(ontNode1) + .addAugmentation(ocnNode1) + .addAugmentation(ietfNode1.build()); } private static NodeBuilder createSrg(String srgNb, List srgListMap, String nodeId, String clli) { // Create tp-list - List tpList = new ArrayList<>(); + Map tpMap = new HashMap<>(); TerminationPointBuilder ietfTpBldr; for (Mapping m : srgListMap) { ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); // Add openroadm-common-network tp type augmentations - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common - .network.rev181130.TerminationPoint1Builder(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1Builder() + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())); + // Added states to srg port. TODO: add to mapping relation between abstracted and physical node states switch (m.getPortDirection()) { case "bidirectional": ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP); @@ -327,40 +339,45 @@ public final class OpenRoadmTopology { default: LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } - ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1.class, ocnTp1Bldr.build()); - tpList.add(ietfTpBldr.build()); + ietfTpBldr.addAugmentation(ocnTp1Bldr.build()); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); } - // Add CP to tp-list + // Add CP to tp-list + added states. TODO: same comment as before with the relation between states ietfTpBldr = createTpBldr(srgNb + "-CP-TXRX"); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1 ocnTp1 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network - .rev181130.TerminationPoint1Builder().setTpType(OpenroadmTpType.SRGTXRXCP).build(); - ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .TerminationPoint1.class, ocnTp1); - tpList.add(ietfTpBldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + .TerminationPoint1 ocnTp1 = new org.opendaylight.yang.gen.v1 + .http.org.openroadm.common.network.rev200529.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.SRGTXRXCP) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build(); + ietfTpBldr.addAugmentation(ocnTp1); + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); // Create openroadm-common-network augmentation to set node type to SRG - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 ocnNode1 = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder() - .setNodeType(OpenroadmNodeType.SRG).build(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNode1 = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder() + .setNodeType(OpenroadmNodeType.SRG) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build(); // set srg-attributes - SrgAttributes srgAttr = new SrgAttributesBuilder().setAvailableWavelengths(create96AvalWaveSrg()).build(); + SrgAttributes srgAttr = new SrgAttributesBuilder() + .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()).build(); Node1 ontNode1 = new Node1Builder().setSrgAttributes(srgAttr).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() - .setTerminationPoint(tpList); + 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().setTerminationPoint(tpMap); // Create ietf node setting supporting-node data String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString(); return createTopoLayerNode(nodeId, clli) .setNodeId(new NodeId(nodeIdtopo)) .withKey((new NodeKey(new NodeId(nodeIdtopo)))) - .addAugmentation(Node1.class, ontNode1) - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 - .Node1.class, ocnNode1) - .addAugmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 - .Node1.class, ietfNode1.build()); + .addAugmentation(ontNode1) + .addAugmentation(ocnNode1) + .addAugmentation(ietfNode1.build()); } private static NodeBuilder createTopoLayerNode(String nodeId, String clli) { @@ -374,9 +391,11 @@ public final class OpenRoadmTopology { .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli))) .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)) .setNodeRef(new NodeId(clli)); - ArrayList supportlist = new ArrayList<>(); - supportlist.add(support1bldr.build()); - supportlist.add(support2bldr.build()); + Map supportlist = new HashMap<>(); + SupportingNode support1 = support1bldr.build(); + supportlist.put(support1.key(),support1); + SupportingNode support2 = support2bldr.build(); + supportlist.put(support2.key(),support2); return new NodeBuilder().setSupportingNode(supportlist); } @@ -412,19 +431,22 @@ public final class OpenRoadmTopology { 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() + srcTp = nodes.get(i) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang + .ietf.network.topology.rev180226.Node1.class).nonnullTerminationPoint().values().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() + destTp = nodes.get(j) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang + .ietf.network.topology.rev180226.Node1.class) + .nonnullTerminationPoint().values().stream() .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) .findFirst().get().getTpId().getValue(); Link1Builder ocnAzLinkBldr = new Link1Builder(); - int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common - .network.rev181130.Node1.class).getNodeType().getIntValue(); - int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common - .network.rev181130.Node1.class).getNodeType().getIntValue(); + int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.Node1.class).getNodeType().getIntValue(); + int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.Node1.class).getNodeType().getIntValue(); if (srcNodeType == 11 && destNodeType == 11) { ocnAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); } else if (srcNodeType == 11 && destNodeType == 12) { @@ -445,13 +467,36 @@ public final class OpenRoadmTopology { } else { continue; } + // Add state to link. Based on the operational state of the TPs at the edge of the link. + // Similar to getting srcTp and destTp + State srcTpState = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang + .ietf.network.topology.rev180226.Node1.class).getTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1.class).getOperationalState(); + State destTpState = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang + .ietf.network.topology.rev180226.Node1.class).getTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1.class).getOperationalState(); + if (State.InService.equals(srcTpState) && State.InService.equals(destTpState)) { + ocnAzLinkBldr.setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService); + ocnZaLinkBldr.setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService); + } else { + ocnAzLinkBldr.setAdministrativeState(AdminStates.OutOfService) + .setOperationalState(State.OutOfService); + ocnZaLinkBldr.setAdministrativeState(AdminStates.OutOfService) + .setOperationalState(State.OutOfService); + } // set opposite link augmentations LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp); LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp); ocnAzLinkBldr.setOppositeLink(ietfZaLinkBldr.getLinkId()); - ietfAzLinkBldr.addAugmentation(Link1.class, ocnAzLinkBldr.build()); + ietfAzLinkBldr.addAugmentation(ocnAzLinkBldr.build()); ocnZaLinkBldr.setOppositeLink(ietfAzLinkBldr.getLinkId()); - ietfZaLinkBldr.addAugmentation(Link1.class, ocnZaLinkBldr.build()); + ietfZaLinkBldr.addAugmentation(ocnZaLinkBldr.build()); links.add(ietfAzLinkBldr.build()); links.add(ietfZaLinkBldr.build()); } @@ -465,7 +510,7 @@ public final class OpenRoadmTopology { 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"); + LOG.debug("Link Id {} updated to have admin state down", linkId); return true; } else { LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode); @@ -475,7 +520,7 @@ public final class OpenRoadmTopology { // 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); + LOG.info("deleting link for LinkId: {}", linkId.getValue()); try { InstanceIdentifierBuilder linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class) @@ -484,14 +529,12 @@ public final class OpenRoadmTopology { networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get(); if (link.isPresent()) { LinkBuilder linkBuilder = new LinkBuilder(link.get()); - org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1Builder link1Builder = - new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1Builder( - linkBuilder.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130 - .Link1.class)) - .setAdministrativeState(State.OutOfService); + org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Link1Builder link1Builder = + new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Link1Builder( + linkBuilder.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529 + .Link1.class)); linkBuilder.removeAugmentation(Link1.class) - .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130 - .Link1.class,link1Builder.build()); + .addAugmentation(link1Builder.build()); networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(), linkBuilder.build()); networkTransactionService.commit().get(1, TimeUnit.SECONDS); @@ -503,39 +546,78 @@ public final class OpenRoadmTopology { } } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.error(e.getMessage(), e); + LOG.error("Error deleting link {}", linkId.getValue(), e); return false; } } - private static List create96AvalWaveDegree() { - List waveList = new ArrayList<>(); - - for (int i = 1; i < 97; i++) { - AvailableWavelengthsBuilder avalBldr = new AvailableWavelengthsBuilder() - .setIndex((long) i) - .withKey(new AvailableWavelengthsKey((long) i)); - waveList.add(avalBldr.build()); - } - - return waveList; + /** + * Get a builder for instance identifier related to common network termination point. + * @param nodeId String + * @param tpId String + * @return InstanceIdentifierBuilder + */ + public static InstanceIdentifierBuilder createCommonNetworkTerminationPointIIDBuilder(String nodeId, String tpId) { + return InstanceIdentifier + .builder(Networks.class).child(Network.class, new NetworkKey( + new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network + .Node.class, new NodeKey(new NodeId(nodeId))) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks + .network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId))) + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529 + .TerminationPoint1.class); } - private static List create96AvalWaveSrg() { + /** + * Get a builder for instance identifier related to network termination point. + * @param nodeId String + * @param tpId String + * @return InstanceIdentifierBuilder + */ + public static InstanceIdentifierBuilder createNetworkTerminationPointIIDBuilder(String nodeId, + String tpId) { + return InstanceIdentifier + .builder(Networks.class).child(Network.class, new NetworkKey( + new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network + .Node.class, new NodeKey(new NodeId(nodeId))) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks + .network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId))) + .augmentation(TerminationPoint1.class); + } - List waveList = new ArrayList<>(); + /** + * Get an instance identifier related to network node. + * @param nodeId String + * @return InstanceIdentifier + */ + public static InstanceIdentifier createNetworkNodeIID(String nodeId) { + return InstanceIdentifier + .builder(Networks.class).child(Network.class, new NetworkKey( + new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network + .Node.class, new NodeKey(new NodeId(nodeId))).augmentation(Node1.class).build(); + } - 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() - .setIndex((long) i) - .withKey(new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes - .AvailableWavelengthsKey((long) i)); - waveList.add(avalBldr.build()); - } - return waveList; + /** + * Get an instance identifier related to common network node. + * @param nodeId String + * @return InstanceIdentifier + */ + public static InstanceIdentifier createCommonNetworkNodeIID(String nodeId) { + return InstanceIdentifier + .builder(Networks.class).child(Network.class, new NetworkKey( + new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network + .Node.class, new NodeKey(new NodeId(nodeId))) + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class) + .build(); } }