X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2FRdm2XpdrLink.java;h=c7aa9958d4684c7aee8de82bcd1952a08e48dfe7;hb=c2f1377c6fb6f0307d5b5956acdcd56581d9d834;hp=794ef8e575c7184a21b59e291090516fb4fc46fb;hpb=7600ff43d8769cc58fd46d908f29d39129133853;p=transportpce.git diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/Rdm2XpdrLink.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/Rdm2XpdrLink.java index 794ef8e57..c7aa9958d 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/Rdm2XpdrLink.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/Rdm2XpdrLink.java @@ -8,27 +8,45 @@ package org.opendaylight.transportpce.networkmodel; -import com.google.common.collect.ImmutableList; -import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.collect.ImmutableMap; +import com.google.common.util.concurrent.FluentFuture; +import java.util.Optional; import java.util.concurrent.ExecutionException; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.ReadTransaction; +import org.opendaylight.mdsal.binding.api.WriteTransaction; +import org.opendaylight.mdsal.common.api.CommitInfo; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.networkmodel.util.LinkIdUtil; -import org.opendaylight.transportpce.networkmodel.util.OpenRoadmFactory; +import org.opendaylight.transportpce.networkmodel.util.TopologyUtils; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.links.input.grouping.LinksInput; -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.types.rev181130.OpenroadmLinkType; +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.equipment.states.types.rev191129.AdminStates; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Link1; +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.TerminationPoint1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.termination.point.XpdrNetworkAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType; 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.topology.rev180226.Network1; +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.topology.rev180226.Network1Builder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder; +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.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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,8 +56,7 @@ final class Rdm2XpdrLink { private static final Logger LOG = LoggerFactory.getLogger(Rdm2XpdrLink.class); - public static boolean createXpdrRdmLinks(LinksInput linksInput, OpenRoadmFactory openRoadmFactory, - DataBroker dataBroker) { + public static boolean createXpdrRdmLinks(LinksInput linksInput, DataBroker dataBroker) { String srcNode = new StringBuilder(linksInput.getXpdrNode()).append("-XPDR").append(linksInput.getXpdrNum()).toString(); String srcTp = new StringBuilder("XPDR").append(linksInput.getXpdrNum()).append("-NETWORK") @@ -47,30 +64,30 @@ final class Rdm2XpdrLink { String destNode = new StringBuilder(linksInput.getRdmNode()).append("-SRG").append(linksInput.getSrgNum()).toString(); String destTp = linksInput.getTerminationPointNum(); + // update tail-equipment-id for tp of link + TerminationPoint xpdrTp = getTpofNode(srcNode, srcTp, dataBroker); + TerminationPoint rdmTp = getTpofNode(destNode, destTp, dataBroker); - Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, false, - openRoadmFactory).build(); + Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, false, xpdrTp, + rdmTp).build(); InstanceIdentifier.InstanceIdentifierBuilder nwIID = InstanceIdentifier.builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))); WriteTransaction wrtx = dataBroker.newWriteOnlyTransaction(); wrtx.merge(LogicalDatastoreType.CONFIGURATION, nwIID.build(), topoNetowkLayer); - ListenableFuture submit = wrtx.submit(); + FluentFuture commit = wrtx.commit(); try { - submit.get(); + commit.get(); LOG.info("Post successful"); return true; - } catch (InterruptedException | ExecutionException e) { LOG.warn("Failed to create Xponder to Roadm link in the Topo layer "); return false; - } } - public static boolean createRdmXpdrLinks(LinksInput linksInput, - OpenRoadmFactory openRoadmFactory, DataBroker dataBroker) { + public static boolean createRdmXpdrLinks(LinksInput linksInput, DataBroker dataBroker) { String srcNode = new StringBuilder(linksInput.getRdmNode()).append("-SRG").append(linksInput.getSrgNum()).toString(); String srcTp = linksInput.getTerminationPointNum(); @@ -78,17 +95,19 @@ final class Rdm2XpdrLink { new StringBuilder(linksInput.getXpdrNode()).append("-XPDR").append(linksInput.getXpdrNum()).toString(); String destTp = new StringBuilder("XPDR").append(linksInput.getXpdrNum()).append("-NETWORK") .append(linksInput.getNetworkNum()).toString(); + TerminationPoint xpdrTp = getTpofNode(destNode, destTp, dataBroker); + TerminationPoint rdmTp = getTpofNode(srcNode, srcTp, dataBroker); - Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, true, - openRoadmFactory).build(); + Network topoNetowkLayer = createNetworkBuilder(srcNode, srcTp, destNode, destTp, true, xpdrTp, + rdmTp).build(); InstanceIdentifier.InstanceIdentifierBuilder nwIID = InstanceIdentifier.builder(Networks.class).child(Network.class, - new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))); + new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))); WriteTransaction wrtx = dataBroker.newWriteOnlyTransaction(); wrtx.merge(LogicalDatastoreType.CONFIGURATION, nwIID.build(), topoNetowkLayer); - ListenableFuture submit = wrtx.submit(); + FluentFuture commit = wrtx.commit(); try { - submit.get(); + commit.get(); LOG.info("Post successful"); return true; @@ -99,23 +118,87 @@ final class Rdm2XpdrLink { } private static NetworkBuilder createNetworkBuilder(String srcNode, String srcTp, String destNode, String destTp, - boolean isXponderInput, OpenRoadmFactory openRoadmFactory) { - NetworkId nwId = new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID); - NetworkBuilder nwBuilder = new NetworkBuilder(); - nwBuilder.setNetworkId(nwId); - nwBuilder.withKey(new NetworkKey(nwId)); - Link1Builder lnk1bldr = new Link1Builder(); - LinkBuilder linkBuilder = openRoadmFactory.createLink(srcNode, destNode, srcTp, destTp); - lnk1bldr.setLinkType(isXponderInput ? OpenroadmLinkType.XPONDERINPUT : OpenroadmLinkType.XPONDEROUTPUT); - lnk1bldr.setOppositeLink(LinkIdUtil.getOppositeLinkId(srcNode, srcTp, destNode, destTp)); - linkBuilder.addAugmentation(Link1.class, lnk1bldr.build()); + boolean isXponderInput, TerminationPoint xpdrTp, TerminationPoint rdmTp) { + //update tp of nodes + TerminationPointBuilder xpdrTpBldr = new TerminationPointBuilder(xpdrTp); + if (xpdrTpBldr.augmentation(TerminationPoint1.class) != null) { + LOG.warn("Rewritting tail-equipment-id {} on tp {} of node {}", xpdrTpBldr + .augmentation(TerminationPoint1.class).getXpdrNetworkAttributes().getTailEquipmentId(), srcTp, srcNode); + } + TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(); + if (isXponderInput) { + tp1Bldr.setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder() + .setTailEquipmentId(srcNode + "--" + srcTp).build()); + } else { + tp1Bldr.setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder() + .setTailEquipmentId(destNode + "--" + destTp).build()); + } + xpdrTpBldr.addAugmentation(tp1Bldr.build()); + TerminationPoint newXpdrTp = xpdrTpBldr.build(); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1 = + new Node1Builder().setTerminationPoint(ImmutableMap.of(newXpdrTp.key(),newXpdrTp)).build(); + NodeBuilder nodeBldr = new NodeBuilder().addAugmentation(node1); + if (isXponderInput) { + nodeBldr.setNodeId(new NodeId(destNode)); + } else { + nodeBldr.setNodeId(new NodeId(srcNode)); + } + + Link1Builder lnk2bldr + = new Link1Builder() + .setLinkType(isXponderInput ? OpenroadmLinkType.XPONDERINPUT : OpenroadmLinkType.XPONDEROUTPUT) + .setOppositeLink(LinkIdUtil.getOppositeLinkId(srcNode, srcTp, destNode, destTp)); + // If both TPs of the Xpdr2Rdm link are inService --> link inService. Otherwise outOfService + if (State.InService.equals(xpdrTp.augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1.class).getOperationalState()) + && State.InService.equals(rdmTp.augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev200529.TerminationPoint1.class).getOperationalState())) { + lnk2bldr.setOperationalState(State.InService).setAdministrativeState(AdminStates.InService); + } else { + lnk2bldr.setOperationalState(State.OutOfService).setAdministrativeState(AdminStates.OutOfService); + } + LinkBuilder linkBuilder = TopologyUtils.createLink(srcNode, destNode, srcTp, destTp, null) + .addAugmentation(lnk2bldr.build()); LOG.info("Link id in the linkbldr {}", linkBuilder.getLinkId()); LOG.info("Link with oppo link {}", linkBuilder.augmentation(Link1.class)); - Network1Builder nwBldr1 = new Network1Builder(); - nwBldr1.setLink(ImmutableList.of(linkBuilder.build())); - nwBuilder.addAugmentation(Network1.class, nwBldr1.build()); - return nwBuilder; + Link link = linkBuilder.build(); + Network1Builder nwBldr1 = new Network1Builder().setLink(ImmutableMap.of(link.key(),link)); + + NetworkId nwId = new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID); + Node node = nodeBldr.build(); + return new NetworkBuilder() + .setNetworkId(nwId) + .withKey(new NetworkKey(nwId)) + .addAugmentation(nwBldr1.build()) + .setNode(ImmutableMap.of(node.key(),node)); + } + + private static TerminationPoint getTpofNode(String srcNode, String srcTp, DataBroker dataBroker) { + InstanceIdentifier iiTp = InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(Node.class, new NodeKey(new NodeId(srcNode))) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class) + .child(TerminationPoint.class, new TerminationPointKey(new TpId(srcTp))) + .build(); + @NonNull + ReadTransaction readTransaction = dataBroker.newReadOnlyTransaction(); + @NonNull + FluentFuture> tpFf = readTransaction.read(LogicalDatastoreType.CONFIGURATION, iiTp); + if (tpFf.isDone()) { + try { + Optional tpOpt; + tpOpt = tpFf.get(); + if (tpOpt.isPresent()) { + return tpOpt.get(); + } + } catch (InterruptedException | ExecutionException e) { + LOG.error("Impossible to get tp-id {} of node {} from {}", srcTp, srcNode, + NetworkUtils.OVERLAY_NETWORK_ID, e); + } + } + return null; } private Rdm2XpdrLink() {