- .put(GetNodeDetails.class, this::getNodeDetails)
- .put(GetTopologyDetails.class, this::getTopologyDetails)
- .put(GetNodeEdgePointDetails.class, this::getNodeEdgePointDetails)
- .put(GetLinkDetails.class, this::getLinkDetails)
- .put(GetTopologyList.class, this::getTopologyList)
- .put(GetServiceInterfacePointDetails.class, this::getServiceInterfacePointDetails)
- .put(GetServiceInterfacePointList.class, this::getServiceInterfacePointList)
- .put(UpdateServiceInterfacePoint.class, this::updateServiceInterfacePoint)
- .build();
- }
-
- @Override
- public ListenableFuture<RpcResult<GetNodeDetailsOutput>> getNodeDetails(GetNodeDetailsInput input) {
- // TODO Auto-generated method stub
- // TODO -> maybe we get errors when having CEPs?
- Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
- // Node id: if roadm -> ROADM+PHOTONIC_MEDIA. if xpdr -> XPDR-XPDR+DSR/OTSi
- Uuid nodeUuid = getUuidFromIput(input.getNodeIdOrName());
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node = this.tapiContext
- .getTapiNode(topoUuid, nodeUuid);
- if (node == null) {
- LOG.error("Invalid TAPI node name");
- return RpcResultBuilder.<GetNodeDetailsOutput>failed()
- .withError(ErrorType.RPC, "Invalid Tapi Node name")
- .buildFuture();
- }
- return RpcResultBuilder
- .success(new GetNodeDetailsOutputBuilder()
- .setNode(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
- .get.node.details.output.NodeBuilder(node)
- .build())
- .build())
- .buildFuture();
- }
-
- @Override
- public ListenableFuture<RpcResult<GetTopologyDetailsOutput>> getTopologyDetails(GetTopologyDetailsInput input) {
- // TODO -> Add check for Full T0 Multilayer
- if (!TapiStringConstants.T0_MULTILAYER.equals(input.getTopologyIdOrName())
- && !TapiStringConstants.TPDR_100G.equals(input.getTopologyIdOrName())) {
- if (TapiStringConstants.T0_FULL_MULTILAYER.equals(input.getTopologyIdOrName())) {
- Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(input.getTopologyIdOrName()
- .getBytes(Charset.forName("UTF-8"))).toString());
- Context context = this.tapiContext.getTapiContext();
- Map<TopologyKey,
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology>
- topologyMap = context.augmentation(Context1.class).getTopologyContext().getTopology();
- if (!(topologyMap != null && topologyMap.containsKey(new TopologyKey(topoUuid)))) {
- LOG.error("Topology {} not found in datastore", input.getTopologyIdOrName());
- return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
- .withError(ErrorType.RPC, "Invalid Topology name")
- .buildFuture();
- }
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology
- topology = topologyMap.get(new TopologyKey(topoUuid));
- return RpcResultBuilder
- .success(new GetTopologyDetailsOutputBuilder()
- .setTopology(this.topologyUtils.transformTopology(topology))
- .build())
- .buildFuture();
- }
- LOG.error("Invalid TAPI topology name");
- return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
- .withError(ErrorType.RPC, "Invalid Topology name")
- .buildFuture();
- }
- try {
- LOG.info("Building TAPI Topology abstraction for {}", input.getTopologyIdOrName());
- Topology topology = createAbstractedOtnTopology();
- if (TapiStringConstants.TPDR_100G.equals(input.getTopologyIdOrName())) {
- topology = createAbstracted100GTpdrTopology(topology);
- }
- return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build())
- .buildFuture();
- } catch (TapiTopologyException e) {
- LOG.error("error building TAPI topology");
- return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
- .withError(ErrorType.RPC, "Error building topology")
- .buildFuture();
- }
- }
-
- @Override
- public ListenableFuture<RpcResult<GetNodeEdgePointDetailsOutput>> getNodeEdgePointDetails(
- GetNodeEdgePointDetailsInput input) {
- // TODO Auto-generated method stub
- // TODO -> maybe we get errors when having CEPs?
- Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
- // Node id: if roadm -> ROADMid+PHOTONIC_MEDIA. if xpdr -> XPDRid-XPDRnbr+DSR/OTSi
- Uuid nodeUuid = getUuidFromIput(input.getNodeIdOrName());
- // NEP id: if roadm -> ROADMid+PHOTONIC_MEDIA/MC/OTSiMC+TPid.
- // if xpdr -> XPDRid-XPDRnbr+DSR/eODU/iODU/iOTSi/eOTSi/PHOTONIC_MEDIA+TPid
- Uuid nepUuid = getUuidFromIput(input.getEpIdOrName());
- OwnedNodeEdgePoint nep = this.tapiContext.getTapiNEP(topoUuid, nodeUuid, nepUuid);
- if (nep == null) {
- LOG.error("Invalid TAPI nep name");
- return RpcResultBuilder.<GetNodeEdgePointDetailsOutput>failed()
- .withError(ErrorType.RPC, "Invalid NEP name")
- .buildFuture();
- }
- return RpcResultBuilder
- .success(new GetNodeEdgePointDetailsOutputBuilder()
- .setNodeEdgePoint(new NodeEdgePointBuilder(nep).build())
- .build())
- .buildFuture();
- }
-
- @Override
- public ListenableFuture<RpcResult<GetLinkDetailsOutput>> getLinkDetails(GetLinkDetailsInput input) {
- // TODO Auto-generated method stub
- Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
- // Link id: same as OR link id
- Uuid linkUuid = getUuidFromIput(input.getLinkIdOrName());
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link link =
- this.tapiContext.getTapiLink(topoUuid, linkUuid);
- if (link == null) {
- LOG.error("Invalid TAPI link name");
- return RpcResultBuilder.<GetLinkDetailsOutput>failed()
- .withError(ErrorType.RPC, "Invalid Link name")
- .buildFuture();
- }
- return RpcResultBuilder
- .success(new GetLinkDetailsOutputBuilder().setLink(new LinkBuilder(link).build()).build())
- .buildFuture();
- }
-
- @Override
- public ListenableFuture<RpcResult<GetTopologyListOutput>> getTopologyList(GetTopologyListInput input) {
- // TODO Auto-generated method stub
- // TODO -> maybe we get errors when having CEPs?
- Map<TopologyKey,
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology>
- topologyMap = this.tapiContext.getTopologyContext();
- if (topologyMap.isEmpty()) {
- LOG.error("No topologies exist in tapi context");
- return RpcResultBuilder.<GetTopologyListOutput>failed()
- .withError(ErrorType.APPLICATION, "No topologies exist in tapi context")
- .buildFuture();
- }
- Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.TopologyKey,
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.Topology>
- newTopoMap = new HashMap<>();
- for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology
- topo:topologyMap.values()) {
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.Topology
- newTopo = new org.opendaylight.yang.gen.v1.urn
- .onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.TopologyBuilder(topo).build();
- newTopoMap.put(newTopo.key(), newTopo);
- }
- return RpcResultBuilder
- .success(new GetTopologyListOutputBuilder().setTopology(newTopoMap).build())
- .buildFuture();
- }
-
- @Override
- public ListenableFuture<RpcResult<GetServiceInterfacePointDetailsOutput>>
- getServiceInterfacePointDetails(GetServiceInterfacePointDetailsInput input) {
- Uuid sipUuid = getUuidFromIput(input.getSipIdOrName());
- Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips =
- this.tapiContext.getTapiContext().getServiceInterfacePoint();
- if (sips == null || sips.isEmpty()) {
- return RpcResultBuilder.<GetServiceInterfacePointDetailsOutput>failed()
- .withError(ErrorType.RPC, "No sips in datastore")
- .buildFuture();
- }
- if (!sips.containsKey(new ServiceInterfacePointKey(sipUuid))) {
- return RpcResultBuilder.<GetServiceInterfacePointDetailsOutput>failed()
- .withError(ErrorType.RPC, "Sip doesnt exist in datastore")
- .buildFuture();
- }
- var outSip = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210
- .get.service._interface.point.details.output.SipBuilder(sips.get(new ServiceInterfacePointKey(sipUuid)))
- .build();
- return RpcResultBuilder
- .success(new GetServiceInterfacePointDetailsOutputBuilder().setSip(outSip).build())
- .buildFuture();
- }
-
- @Override
- public ListenableFuture<RpcResult<GetServiceInterfacePointListOutput>>
- getServiceInterfacePointList(GetServiceInterfacePointListInput input) {
- Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips =
- this.tapiContext.getTapiContext().getServiceInterfacePoint();
- if (sips == null || sips.isEmpty()) {
- return RpcResultBuilder.<GetServiceInterfacePointListOutput>failed()
- .withError(ErrorType.RPC, "No sips in datastore")
- .buildFuture();
- }
- Map<SipKey, Sip> outSipMap = new HashMap<>();
- for (ServiceInterfacePoint sip : sips.values()) {
- Sip si = new SipBuilder(sip).build();
- outSipMap.put(si.key(), si);
- }
- return RpcResultBuilder
- .success(new GetServiceInterfacePointListOutputBuilder().setSip(outSipMap).build())
- .buildFuture();
- }
-
- @Override
- public ListenableFuture<RpcResult<UpdateServiceInterfacePointOutput>>
- updateServiceInterfacePoint(UpdateServiceInterfacePointInput input) {
- // TODO --> not yet implemented
- return null;
- }
-
- private Topology createAbstracted100GTpdrTopology(Topology topology) {
- List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> dsrNodes =
- topology.nonnullNode().values().stream()
- .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
- .collect(Collectors.toList());
- List<OwnedNodeEdgePoint> nep100GTpdrList = new ArrayList<>();
- for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node2: dsrNodes) {
- List<OwnedNodeEdgePoint> nepList = node2.getOwnedNodeEdgePoint().values().stream()
- .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr"))).collect(Collectors.toList());
- nep100GTpdrList.addAll(nepList);
- }
- Name topoName = new NameBuilder().setValue(TapiStringConstants.TPDR_100G)
- .setValueName("TAPI Topology Name").build();
- Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(
- TapiStringConstants.TPDR_100G.getBytes(Charset.forName("UTF-8"))).toString());
- org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node =
- 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<Network> networkIID) throws TapiTopologyException {
- Network topology = null;
- FluentFuture<Optional<Network>> topologyFuture = dataBroker.newReadOnlyTransaction()
- .read(LogicalDatastoreType.CONFIGURATION, networkIID);
- try {
- topology = topologyFuture.get().orElseThrow();
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- throw new TapiTopologyException("Unable to get from mdsal topology: " + networkIID
- .firstKeyOf(Network.class).getNetworkId().getValue(), e);
- } catch (ExecutionException e) {
- throw new TapiTopologyException("Unable to get from mdsal topology: " + networkIID
- .firstKeyOf(Network.class).getNetworkId().getValue(), e);
- }
- return topology;
- }
-
- private Topology createAbstractedOtnTopology() throws TapiTopologyException {
- // read openroadm-topology
- Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II);
- List<Link> linkList = new ArrayList<>();
- if (openroadmTopo.augmentation(Network1.class) != null) {
- linkList.addAll(openroadmTopo.augmentation(Network1.class).getLink().values());
- }
- List<Link> xponderOutLinkList = linkList.stream()
- .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))
- .collect(Collectors.toList());
- List<Link> xponderInLinkList = linkList.stream()
- .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDERINPUT))
- .collect(Collectors.toList());
- // read otn-topology
- Network otnTopo = readTopology(InstanceIdentifiers.OTN_NETWORK_II);
- Map<NodeId, Node> otnNodeMap = otnTopo.nonnullNode().values().stream()
- .collect(Collectors.toMap(Node::getNodeId, node -> node));
-
- Map<String, List<String>> networkPortMap = new HashMap<>();
- Iterator<Entry<NodeId, Node>> itOtnNodeMap = otnNodeMap.entrySet().iterator();
- while (itOtnNodeMap.hasNext()) {
- Entry<NodeId, Node> entry = itOtnNodeMap.next();
- String portMappingNodeId = entry.getValue().getSupportingNode().values().stream()
- .filter(sn -> sn.getNetworkRef().getValue().equals(NetworkUtils.UNDERLAY_NETWORK_ID))
- .findFirst()
- .orElseThrow().getNodeRef().getValue();
- List<String> networkPortList = new ArrayList<>();
- for (TerminationPoint tp: entry.getValue().augmentation(Node1.class).getTerminationPoint().values()) {
- if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)
- && checkTp(entry.getKey().getValue(), portMappingNodeId, tp, xponderOutLinkList,
- xponderInLinkList)) {
- networkPortList.add(tp.getTpId().getValue());
- }
- }
- if (!networkPortList.isEmpty()) {
- networkPortMap.put(entry.getKey().getValue(), networkPortList);
- }
- }
- Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
- tapiNodeList = new HashMap<>();
- Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link>
- tapiLinkList = new HashMap<>();
- Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER
- .getBytes(Charset.forName("UTF-8"))).toString());
- ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topoUuid, this.tapiLink);
- Iterator<Entry<String, List<String>>> it = networkPortMap.entrySet().iterator();
- while (it.hasNext()) {
- String nodeId = it.next().getKey();
- tapiFactory.convertNode(otnNodeMap.get(new NodeId(nodeId)), networkPortMap.get(nodeId));
- tapiNodeList.putAll(tapiFactory.getTapiNodes());
- tapiLinkList.putAll(tapiFactory.getTapiLinks());
- }
- if (openroadmTopo.nonnullNode().values().stream()
- .filter(nt -> nt
- .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
- .getNodeType()
- .equals(OpenroadmNodeType.SRG))
- .count() > 0) {
- tapiFactory.convertRoadmInfrastructure();
- tapiNodeList.putAll(tapiFactory.getTapiNodes());
- tapiLinkList.putAll(tapiFactory.getTapiLinks());
- } else {
- LOG.warn("Unable to abstract an ROADM infrasctructure from openroadm-topology");
- }
- if (otnTopo.augmentation(Network1.class) != null) {
- Map<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.network.topology.rev180226.networks.network.LinkKey, Link> otnLinkMap =
- otnTopo.augmentation(Network1.class).getLink();
- tapiFactory.convertLinks(otnLinkMap);
- tapiLinkList.putAll(tapiFactory.getTapiLinks());
- }
- Name name = new NameBuilder()
- .setValue(TapiStringConstants.T0_MULTILAYER)
- .setValueName("TAPI Topology Name")