From 4b5caf037b5b61c5d53000d80e0273f833094fd5 Mon Sep 17 00:00:00 2001 From: Gilles Thouenon Date: Fri, 23 Oct 2020 12:24:33 +0200 Subject: [PATCH] TAPI topology consolidation - step3 - transform the TAPI multi-layer topology abstraction to expose the single 100G Transponder layer representing the connectivity between 100GE client ports of 100G Transponders connected to the ROADM infrastructure. That gives a higher level of abstraction where the whole otn-topology is abstracted into a single node with only its corresponding onep. - add UT to this specific topology abstraction JIRA: TRNSPRTPCE-344 Signed-off-by: Gilles Thouenon Co-authored-by: Christophe Betoule Change-Id: I048ff512a74cc5246eafda2cfb8444280b4c29f1 --- .../tapi/topology/TapiTopologyImpl.java | 200 +++++++----------- .../tapi/topology/TopologyUtils.java | 14 +- ...onvertORTopoObjectToTapiTooObjectTest.java | 24 +++ .../TapiTopologyImplExceptionTest.java | 3 +- .../tapi/topology/TapiTopologyImplTest.java | 50 +++-- 5 files changed, 143 insertions(+), 148 deletions(-) diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java index 0068e6c22..82cd51da3 100644 --- a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java +++ b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java @@ -11,6 +11,7 @@ import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.ListenableFuture; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -47,14 +48,11 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Admi import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsInput; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsOutput; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsInput; @@ -66,15 +64,18 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Ge import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutputBuilder; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyListInput; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyListOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.TapiTopologyService; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.Topology; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.TopologyBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey; @@ -88,8 +89,6 @@ import org.slf4j.LoggerFactory; public class TapiTopologyImpl implements TapiTopologyService { private static final Logger LOG = LoggerFactory.getLogger(TapiTopologyImpl.class); - private static final String ETH_TOPO = "Ethernet Topology"; - private static final String T0_MULTI_LAYER_TOPO = "T0 - Multi-layer topology"; private final DataBroker dataBroker; public TapiTopologyImpl(DataBroker dataBroker) { @@ -104,19 +103,16 @@ public class TapiTopologyImpl implements TapiTopologyService { @Override public ListenableFuture> getTopologyDetails(GetTopologyDetailsInput input) { + if (!TopologyUtils.T0_MULTILAYER.equals(input.getTopologyIdOrName()) + && !TopologyUtils.TPDR_100G.equals(input.getTopologyIdOrName())) { + LOG.error("Invalid TAPI topology name"); + return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().build()).buildFuture(); + } try { - LOG.info("Building TAPI Topology abstraction"); - Topology topology = null; - switch (input.getTopologyIdOrName()) { - case NetworkUtils.OVERLAY_NETWORK_ID: - topology = createAbstractedOpenroadmTopology(); - break; - case NetworkUtils.OTN_NETWORK_ID: - topology = createAbstractedOtnTopology(); - break; - default: - LOG.error("{} unknown - can not be abstracted", input.getTopologyIdOrName()); - break; + LOG.info("Building TAPI Topology abstraction for {}", input.getTopologyIdOrName()); + Topology topology = createAbstractedOtnTopology(); + if (TopologyUtils.TPDR_100G.equals(input.getTopologyIdOrName())) { + topology = createAbstracted100GTpdrTopology(topology); } return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build()) .buildFuture(); @@ -126,51 +122,27 @@ public class TapiTopologyImpl implements TapiTopologyService { } } - private Topology createAbstractedOpenroadmTopology() throws TapiTopologyException { - // read openroadm-topology - Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II); - List xpdrNodeList = pruneOpenroadmNodes(openroadmTopo); - List linkList = null; - if (openroadmTopo.augmentation(Network1.class) != null) { - linkList = new ArrayList<>(openroadmTopo.augmentation(Network1.class).getLink().values()); - } else { - linkList = new ArrayList<>(); - } - List xponderOutLinkList = linkList.stream() - .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT)) + private Topology createAbstracted100GTpdrTopology(Topology topology) { + List dsrNodes + = topology.nonnullNode().values().stream() + .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR)) .collect(Collectors.toList()); - List xponderInLinkList = linkList.stream() - .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDERINPUT)) - .collect(Collectors.toList()); - Map> clientPortMap = new HashMap<>(); - for (Node node : xpdrNodeList) { - String nodeId = node.getSupportingNode().values().stream() - .filter(sn -> sn.getNetworkRef().getValue().equals(NetworkUtils.UNDERLAY_NETWORK_ID)) - .findFirst() - .get().getNodeRef().getValue(); - List clientPortList = new ArrayList<>(); - for (TerminationPoint tp : node.augmentation(Node1.class).getTerminationPoint().values()) { - if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT) - && checkTp(node.getNodeId().getValue(), nodeId, tp, xponderOutLinkList, xponderInLinkList)) { - clientPortList.add(tp.getTpId().getValue()); - } - } - if (!clientPortList.isEmpty()) { - clientPortMap.put(nodeId, clientPortList); - } + List nep100GTpdrList = new ArrayList<>(); + for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node2 : dsrNodes) { + List nepList = node2.getOwnedNodeEdgePoint().values().stream() + .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr"))).collect(Collectors.toList()); + nep100GTpdrList.addAll(nepList); } - List goodTpList = extractGoodTpList(clientPortMap); - // tapi topology creation - Map names = new HashMap<>(); - Name name = new NameBuilder().setValue(ETH_TOPO).setValueName("Topo Name").build(); - names.put(name.key(), name); - Uuid uuid = new Uuid(UUID.nameUUIDFromBytes(ETH_TOPO.getBytes(Charset.forName("UTF-8"))).toString()); - Map - tapiNodeList = new HashMap<>(); + Name topoName = new NameBuilder().setValue(TopologyUtils.TPDR_100G).setValueName("TAPI Topology Name").build(); + Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TopologyUtils.TPDR_100G.getBytes(Charset.forName("UTF-8"))) + .toString()); org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node - = createTapiNode(goodTpList); - tapiNodeList.put(node.key(), node); - return new TopologyBuilder().setName(names).setUuid(uuid).setNode(tapiNodeList).build(); + = createTapiNode(nep100GTpdrList, topoUuid); + return new TopologyBuilder() + .setName(Map.of(topoName.key(), topoName)) + .setUuid(topoUuid) + .setNode(Map.of(node.key(), node)) + .build(); } private Network readTopology(InstanceIdentifier networkIID) @@ -191,24 +163,6 @@ public class TapiTopologyImpl implements TapiTopologyService { return topology; } - private List pruneOpenroadmNodes(Network openroadmTopo) { - return openroadmTopo.getNode().values().stream().filter(nt -> nt - .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1.class) - .getNodeType().equals(OpenroadmNodeType.XPONDER)).collect(Collectors.toList()); - } - - private List extractGoodTpList(Map> clientPortMap) { - List goodTpList = new ArrayList<>(); - for (Map.Entry> entry : clientPortMap.entrySet()) { - String key = entry.getKey(); - List value = entry.getValue(); - for (String tpid : value) { - goodTpList.add(key + "--" + tpid); - } - } - return goodTpList; - } - private Topology createAbstractedOtnTopology() throws TapiTopologyException { // read openroadm-topology Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II); @@ -251,7 +205,7 @@ public class TapiTopologyImpl implements TapiTopologyService { tapiNodeList = new HashMap<>(); Map tapiLinkList = new HashMap<>(); - Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(T0_MULTI_LAYER_TOPO.getBytes(Charset.forName("UTF-8"))) + Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TopologyUtils.T0_MULTILAYER.getBytes(Charset.forName("UTF-8"))) .toString()); ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topoUuid); Iterator>> it = networkPortMap.entrySet().iterator(); @@ -277,7 +231,7 @@ public class TapiTopologyImpl implements TapiTopologyService { tapiFactory.convertLinks(otnLinkList); tapiLinkList.putAll(tapiFactory.getTapiLinks()); } - Name name = new NameBuilder().setValue(T0_MULTI_LAYER_TOPO).setValueName("TAPI Topology Name").build(); + Name name = new NameBuilder().setValue(TopologyUtils.T0_MULTILAYER).setValueName("TAPI Topology Name").build(); return new TopologyBuilder() .setName(Map.of(name.key(), name)) .setUuid(topoUuid) @@ -304,48 +258,26 @@ public class TapiTopologyImpl implements TapiTopologyService { return null; } - private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node createTapiNode(List< - String> tpList) { - Name name = new NameBuilder().setValueName("node name").setValue("TAPI Ethernet Node").build(); - List layerProtocols = new ArrayList<>(); - layerProtocols.add(LayerProtocolName.ETH); - Map onepl = new HashMap<>(); - for (int i = 0; i < tpList.size(); i++) { - Name onedName = new NameBuilder().setValueName("OwnedNodeEdgePoint " + i).setValue(tpList.get(i)).build(); - OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder() - .setUuid(new Uuid(UUID.nameUUIDFromBytes(("OwnedNodeEdgePoint " + i).getBytes(Charset.forName("UTF-8"))) - .toString())) - .setLayerProtocolName(LayerProtocolName.ETH).setMappedServiceInterfacePoint(createSIP(1)) - .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC) - .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED) - .setLifecycleState(LifecycleState.INSTALLED).setName(Map.of(onedName.key(), onedName)) - .setTerminationDirection( - TerminationDirection.BIDIRECTIONAL).setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL) - .build(); - onepl.put(onep.key(), onep); + private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node + createTapiNode(List nepList, Uuid topoUuid) { + Name name = new NameBuilder().setValueName("Tpdr100g node name").setValue("Tpdr100g over WDM node").build(); + Map onepMap = new HashMap<>(); + for (OwnedNodeEdgePoint ownedNodeEdgePoint : nepList) { + onepMap.put(ownedNodeEdgePoint.key(), ownedNodeEdgePoint); } - + Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(name.getValue().getBytes(Charset.forName("UTF-8"))).toString()); return new NodeBuilder() - .setUuid(new Uuid(UUID.nameUUIDFromBytes(name.getValue().getBytes(Charset.forName("UTF-8"))) - .toString())) - .setName(Map.of(name.key(), name)).setLayerProtocolName(layerProtocols) + .setUuid(nodeUuid) + .setName(Map.of(name.key(), name)) + .setLayerProtocolName(List.of(LayerProtocolName.ETH)) .setAdministrativeState(AdministrativeState.UNLOCKED) .setOperationalState(OperationalState.ENABLED) .setLifecycleState(LifecycleState.INSTALLED) - .setOwnedNodeEdgePoint(onepl) + .setOwnedNodeEdgePoint(onepMap) + .setNodeRuleGroup(createNodeRuleGroupFor100gTpdrNode(topoUuid, nodeUuid, nepList)) .build(); } - private Map createSIP(int nb) { - Map msipl = new HashMap<>(); - for (int i = 0; i < nb; i++) { - MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder().setServiceInterfacePointUuid( - new Uuid(UUID.randomUUID().toString())).build(); - msipl.put(msip.key(), msip); - } - return msipl; - } - private boolean checkTp(String nodeIdTopo, String nodeIdPortMap, TerminationPoint tp, List xpdOut, List< Link> xpdIn) { String networkLcp; @@ -408,4 +340,36 @@ public class TapiTopologyImpl implements TapiTopologyService { } } + private Map createNodeRuleGroupFor100gTpdrNode(Uuid topoUuid, Uuid nodeUuid, + Collection onepl) { + Map + nepMap = new HashMap<>(); + for (OwnedNodeEdgePoint onep : onepl) { + org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint + nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group + .NodeEdgePointBuilder() + .setTopologyUuid(topoUuid) + .setNodeUuid(nodeUuid) + .setNodeEdgePointUuid(onep.key().getUuid()) + .build(); + nepMap.put(nep.key(), nep); + } + Map nodeRuleGroupMap = new HashMap<>(); + Map ruleList = new HashMap<>(); + Rule rule = new RuleBuilder() + .setLocalId("forward") + .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP) + .setRuleType(RuleType.FORWARDING) + .build(); + ruleList.put(rule.key(), rule); + NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder() + .setUuid(new Uuid(UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8"))) + .toString())) + .setRule(ruleList) + .setNodeEdgePoint(nepMap) + .build(); + nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup); + return nodeRuleGroupMap; + } } diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TopologyUtils.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TopologyUtils.java index 606d4455b..457f1b91d 100644 --- a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TopologyUtils.java +++ b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TopologyUtils.java @@ -7,22 +7,12 @@ */ package org.opendaylight.transportpce.tapi.topology; -import com.google.common.util.concurrent.ListenableFuture; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutput; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutputBuilder; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; - public final class TopologyUtils { private TopologyUtils() { } - public static ListenableFuture> createGetTopologyDetailsReply( - GetTopologyDetailsInput input) { - GetTopologyDetailsOutputBuilder output = new GetTopologyDetailsOutputBuilder().setTopology(null); - return RpcResultBuilder.success(output.build()).buildFuture(); - } + public static final String T0_MULTILAYER = "T0 - Multi-layer topology"; + public static final String TPDR_100G = "Transponder 100GE"; } diff --git a/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTooObjectTest.java b/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTooObjectTest.java index ed61dcac2..c79c1cca2 100644 --- a/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTooObjectTest.java +++ b/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTooObjectTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import com.google.common.util.concurrent.FluentFuture; @@ -525,6 +526,10 @@ public class ConvertORTopoObjectToTapiTooObjectTest extends AbstractTest { "NodeEdgePoint name"); count++; } + List nrgList4 = node.nonnullNodeRuleGroup().values().stream() + .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue())) + .collect(Collectors.toList()); + checkNodeRuleGroupForRdmInfra(nrgList4, count - 1); break; } } @@ -646,6 +651,25 @@ public class ConvertORTopoObjectToTapiTooObjectTest extends AbstractTest { RuleType.FORWARDING, ruleList.get(0).getRuleType()); } + private void checkNodeRuleGroupForRdmInfra(List nrgList, int nbNeps) { + assertEquals("RDM infra node - OTSi should contain a single node rule groups", 1, nrgList.size()); + if (nbNeps > 0) { + List nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values()); + assertEquals("RDM infra node -rule-group should contain " + nbNeps + " NEP", + nbNeps, nodeEdgePointList.size()); + } else { + assertNull("RDM infra node -rule-group should contain no NEP", nrgList.get(0).getNodeEdgePoint()); + } + List ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values()); + assertEquals("node-rule-group should contain a single rule", 1, ruleList.size()); + assertEquals("local-id of the rule should be 'forward'", + "forward", ruleList.get(0).getLocalId()); + assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'", + ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule()); + assertEquals("the rule type should be 'FORWARDING'", + RuleType.FORWARDING, ruleList.get(0).getRuleType()); + } + private void checkNodeRuleGroupForTpdrOTSi(List nrgList, Uuid enepUuid, Uuid inepUuid, Uuid nodeUuid) { assertEquals("Tpdr-OTSi should contain two node rule groups", 2, nrgList.size()); diff --git a/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplExceptionTest.java b/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplExceptionTest.java index 551e75c88..3d7ca13ae 100644 --- a/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplExceptionTest.java +++ b/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplExceptionTest.java @@ -21,7 +21,6 @@ import org.mockito.Mockito; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadTransaction; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.tapi.utils.TopologyDataUtils; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutput; @@ -38,7 +37,7 @@ public class TapiTopologyImplExceptionTest { when(dataBroker.newReadOnlyTransaction()) .thenReturn(new ReadTransactionMock()); - GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(NetworkUtils.OTN_NETWORK_ID); + GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(TopologyUtils.T0_MULTILAYER); TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(dataBroker); ListenableFuture> result = tapiTopoImpl.getTopologyDetails(input); RpcResult rpcResult = result.get(); diff --git a/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplTest.java b/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplTest.java index 2e9898cf8..30a5da121 100644 --- a/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplTest.java +++ b/tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplTest.java @@ -28,7 +28,6 @@ import org.eclipse.jdt.annotation.Nullable; import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.transportpce.common.InstanceIdentifiers; -import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.tapi.utils.TopologyDataUtils; import org.opendaylight.transportpce.test.AbstractTest; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState; @@ -39,11 +38,15 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Oper import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutput; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.Topology; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint; +import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule; import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link; -import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.Uint64; import org.slf4j.Logger; @@ -69,8 +72,9 @@ public class TapiTopologyImplTest extends AbstractTest { } @Test - public void getTopologyDetailsForOpenroadmTopologyWhenSuccessful() throws ExecutionException, InterruptedException { - GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(NetworkUtils.OVERLAY_NETWORK_ID); + public void getTopologyDetailsForTransponder100GTopologyWhenSuccessful() + throws ExecutionException, InterruptedException { + GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(TopologyUtils.TPDR_100G); TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker()); ListenableFuture> result = tapiTopoImpl.getTopologyDetails(input); result.addListener(new Runnable() { @@ -84,24 +88,38 @@ public class TapiTopologyImplTest extends AbstractTest { @Nullable Topology topology = rpcResult.getResult().getTopology(); assertNotNull("Topology should not be null", topology); - assertEquals("Nodes list size should be 1", 1, topology.getNode().size()); - List topologyNodeList = new ArrayList<>(topology.nonnullNode().values()); - List nodeList = new ArrayList<>(topologyNodeList); - List nameList = new ArrayList<>(nodeList.get(0).nonnullName().values()); - assertEquals("Node name should be TAPI Ethernet Node", - "TAPI Ethernet Node", nameList.get(0).getValue()); - Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes("Ethernet Topology".getBytes()).toString()); - Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes("TAPI Ethernet Node".getBytes()).toString()); + Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TopologyUtils.TPDR_100G.getBytes(Charset.forName("UTF-8"))) + .toString()); assertEquals("incorrect topology uuid", topoUuid, topology.getUuid()); - assertEquals("incorrect node uuid", nodeUuid, topologyNodeList.get(0).getUuid()); - assertEquals("TAPI Ethernet Node should have 2 neps", - 2, topologyNodeList.get(0).getOwnedNodeEdgePoint().size()); + assertEquals("Node list size should be 1", 1, topology.getNode().size()); + Name nodeName = topology.getNode().values().stream().findFirst().get().getName() + .get(new NameKey("Tpdr100g node name")); + assertEquals("Node name should be 'Tpdr100g over WDM node'", "Tpdr100g over WDM node", nodeName.getValue()); + Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeName.getValue().getBytes(Charset.forName("UTF-8"))) + .toString()); + assertEquals("incorrect node uuid", nodeUuid, topology.getNode().values().stream().findFirst().get().getUuid()); + long nb = topology.getNode().values().stream().findFirst().get().getOwnedNodeEdgePoint().size(); + assertEquals("'Transponder 100GE' node should have 2 neps", 2, nb); + List nrgList = topology.getNode().values().stream().findFirst().get().nonnullNodeRuleGroup() + .values().stream().sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue())) + .collect(Collectors.toList()); + assertEquals("'Transponder 100GE' node should contain a single node rule groups", 1, nrgList.size()); + List nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values()); + assertEquals("'Transponder 100GE' node -rule-group should contain 2 NEPs", nb, nodeEdgePointList.size()); + List ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values()); + assertEquals("node-rule-group should contain a single rule", 1, ruleList.size()); + assertEquals("local-id of the rule should be 'forward'", + "forward", ruleList.get(0).getLocalId()); + assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'", + ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule()); + assertEquals("the rule type should be 'FORWARDING'", + RuleType.FORWARDING, ruleList.get(0).getRuleType()); } @Test public void getTopologyDetailsForOtnTopologyWithOtnLinksWhenSuccessful() throws ExecutionException, InterruptedException { - GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(NetworkUtils.OTN_NETWORK_ID); + GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(TopologyUtils.T0_MULTILAYER); TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker()); ListenableFuture> result = tapiTopoImpl.getTopologyDetails(input); result.addListener(new Runnable() { -- 2.36.6