--- /dev/null
+/*
+ * Copyright © 2019 Orange, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.topology;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1;
+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.topology.rev180226.TpId;
+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.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
+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.capacity.TotalSizeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
+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.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
+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.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
+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.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.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.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.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConvertORTopoObjectToTapiTopoObject {
+
+ private static final Logger LOG = LoggerFactory.getLogger(TapiTopologyImpl.class);
+ private String ietfNodeId;
+ private List<TerminationPoint> oorClientPortList;
+ private List<TerminationPoint> oorNetworkPortList;
+ private OduSwitchingPools oorOduSwitchingPool;
+ private Uuid tapiTopoUuid;
+ private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes;
+ private List<Link> tapiLinks;
+ private Map<String, Uuid> uuidMap;
+
+ public ConvertORTopoObjectToTapiTopoObject(Node ietfNode, Link1 otnLink, Uuid tapiTopoUuid) {
+ this.ietfNodeId = ietfNode.getNodeId().getValue();
+ this.oorClientPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+ .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
+ .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+ == OpenroadmTpType.XPONDERCLIENT.getIntValue())
+ .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+ .collect(Collectors.toList());
+ this.oorNetworkPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+ .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
+ .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+ == OpenroadmTpType.XPONDERNETWORK.getIntValue())
+ .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+ .collect(Collectors.toList());
+ this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools().get(0);
+ this.tapiTopoUuid = tapiTopoUuid;
+ this.tapiNodes = new ArrayList<>();
+ this.tapiLinks = new ArrayList<>();
+ this.uuidMap = new HashMap<>();
+ }
+
+
+ public void convertNode() {
+ //node creation [DSR/ODU]
+ LOG.info("creation of a DSR/ODU node");
+ Uuid nodeUuid = new Uuid(UUID.randomUUID().toString());
+ this.uuidMap.put(this.ietfNodeId + "+DSR", nodeUuid);
+ List<Name> dsrNodeNames = Arrays.asList(new NameBuilder().setValueName("dsr/odu node name")
+ .setValue(this.ietfNodeId).build());
+ List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
+ org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
+ .Node dsrNode = createTapiNode(dsrNodeNames, dsrLayerProtocols);
+ tapiNodes.add(dsrNode);
+
+ //node creation [otsi]
+ LOG.info("creation of an OTSi node");
+ nodeUuid = new Uuid(UUID.randomUUID().toString());
+ this.uuidMap.put(this.ietfNodeId + "+OTSi", nodeUuid);
+ List<Name> otsiNodeNames = Arrays.asList(new NameBuilder().setValueName("otsi node name")
+ .setValue(this.ietfNodeId).build());
+ List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
+ org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
+ .Node otsiNode = createTapiNode(otsiNodeNames, otsiLayerProtocols);
+ tapiNodes.add(otsiNode);
+
+ //transitional link cration between network nep of DSR/ODU node and iNep of otsi node
+ LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
+ createTapiTransitionalLinks();
+ }
+
+ private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
+ .Node createTapiNode(List<Name> nodeNames, List<LayerProtocolName> layerProtocols) {
+ Uuid nodeUuid = null;
+ List<OwnedNodeEdgePoint> onepl = new ArrayList<>();
+ List<NodeRuleGroup> nodeRuleGroupList = new ArrayList<>();
+ List<Rule> ruleList = new ArrayList<>();
+ Rule rule = new RuleBuilder()
+ .setLocalId("forward")
+ .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
+ .setRuleType(RuleType.FORWARDING)
+ .build();
+ ruleList.add(rule);
+ if (layerProtocols.contains(LayerProtocolName.DSR)) {
+ nodeUuid = this.uuidMap.get(this.ietfNodeId + "+DSR");
+ // client nep creation on DSR/ODU node
+ for (int i = 0; i < oorClientPortList.size(); i++) {
+ Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
+ this.uuidMap.put("DSR+" + oorClientPortList.get(i).getTpId().getValue(), nepUuid);
+ List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_C")
+ .append(i + 1).toString()).setValue(oorClientPortList.get(i).getTpId().getValue()).build());
+ OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), onedNames, LayerProtocolName.ETH,
+ LayerProtocolName.DSR, true, "DSR+");
+ onepl.add(onep);
+ }
+ // network nep creation on DSR/ODU node
+ for (int i = 0; i < oorNetworkPortList.size(); i++) {
+ Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
+ this.uuidMap.put("DSR+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid);
+ List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_N")
+ .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
+ OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames, LayerProtocolName.ODU,
+ LayerProtocolName.DSR, true, "DSR+");
+ onepl.add(onep);
+ }
+ // create NodeRuleGroup
+ for (NonBlockingList nbl : this.oorOduSwitchingPool.getNonBlockingList()) {
+ List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
+ .NodeEdgePoint> nepList = new ArrayList<>();
+ for (TpId tp : nbl.getTpList()) {
+ 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(tapiTopoUuid)
+ .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
+ .setNodeEdgePointUuid(this.uuidMap.get("DSR+" + tp.getValue()))
+ .build();
+ nepList.add(nep);
+ }
+ NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
+ .setUuid(new Uuid(UUID.randomUUID().toString()))
+ .setRule(ruleList)
+ .setNodeEdgePoint(nepList)
+ .build();
+ nodeRuleGroupList.add(nodeRuleGroup);
+ }
+ } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
+ nodeUuid = this.uuidMap.get(this.ietfNodeId + "+OTSi");
+ // iNep creation on otsi node
+ for (int i = 0; i < oorNetworkPortList.size(); i++) {
+ Uuid nepUuid1 = new Uuid(UUID.randomUUID().toString());
+ this.uuidMap.put("iOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid1);
+ List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("iNodeEdgePoint_")
+ .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
+ OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
+ LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "iOTSi+");
+ onepl.add(onep);
+ }
+ // eNep creation on otsi node
+ for (int i = 0; i < oorNetworkPortList.size(); i++) {
+ Uuid nepUuid2 = new Uuid(UUID.randomUUID().toString());
+ this.uuidMap.put("eOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid2);
+ List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("eNodeEdgePoint_")
+ .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
+ OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
+ LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "eOTSi+");
+ onepl.add(onep);
+ }
+ // create NodeRuleGroup
+ for (TerminationPoint tp : this.oorNetworkPortList) {
+ List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
+ .NodeEdgePoint> nepList = new ArrayList<>();
+ org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
+ .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+ .node.rule.group.NodeEdgePointBuilder()
+ .setTopologyUuid(tapiTopoUuid)
+ .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
+ .setNodeEdgePointUuid(this.uuidMap.get("iOTSi+" + tp.getTpId().getValue()))
+ .build();
+ org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
+ .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+ .node.rule.group.NodeEdgePointBuilder()
+ .setTopologyUuid(tapiTopoUuid)
+ .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
+ .setNodeEdgePointUuid(this.uuidMap.get("eOTSi+" + tp.getTpId().getValue()))
+ .build();
+ nepList.add(inep);
+ nepList.add(enep);
+ NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
+ .setUuid(new Uuid(UUID.randomUUID().toString()))
+ .setRule(ruleList)
+ .setNodeEdgePoint(nepList)
+ .build();
+ nodeRuleGroupList.add(nodeRuleGroup);
+ }
+ } else {
+ LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(0).getValueName(), nodeNames.get(0)
+ .getValue());
+ }
+
+ // create tapi node
+ org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node tapiNode =
+ new NodeBuilder()
+ .setUuid(nodeUuid)
+ .setName(nodeNames)
+ .setLayerProtocolName(layerProtocols)
+ .setAdministrativeState(AdministrativeState.UNLOCKED)
+ .setOperationalState(OperationalState.ENABLED)
+ .setLifecycleState(LifecycleState.INSTALLED)
+ .setOwnedNodeEdgePoint(onepl)
+ .setNodeRuleGroup(nodeRuleGroupList)
+ .build();
+ return tapiNode;
+ }
+
+ private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, List<Name> nepNames, LayerProtocolName nepProtocol,
+ LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
+ String key = keyword + oorTp.getTpId().getValue();
+ OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
+ .setUuid(this.uuidMap.get(key))
+ .setLayerProtocolName(nepProtocol)
+ .setName(nepNames);
+ if (withSip) {
+ onepBldr.setMappedServiceInterfacePoint(createSIP(1));
+ }
+ onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol));
+ onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
+ .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
+ .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
+ .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
+ return onepBldr.build();
+ }
+
+ private List<MappedServiceInterfacePoint> createSIP(int nb) {
+ List<MappedServiceInterfacePoint> msipl = new ArrayList<>();
+ for (int i = 0; i < nb; i++) {
+ MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
+ .setServiceInterfacePointUuid(new Uuid(UUID.randomUUID().toString())).build();
+ msipl.add(msip);
+ }
+ return msipl;
+ }
+
+ private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedCepLayerProtocolQualifier(TerminationPoint tp,
+ LayerProtocolName lpn) {
+ List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
+ List<SupportedInterfaceCapability> sicList = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm
+ .otn.network.topology.rev181130.TerminationPoint1.class).getTpSupportedInterfaces()
+ .getSupportedInterfaceCapability();
+ for (SupportedInterfaceCapability sic : sicList) {
+ switch (lpn.getName()) {
+ case "DSR" :
+ if (sic.getIfCapType().getSimpleName().equals("If10GEODU2e")) {
+ sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
+ sclpqList.add(ODUTYPEODU2E.class);
+ } else if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
+ sclpqList.add(ODUTYPEODU4.class);
+ } else if (sic.getIfCapType().getSimpleName().equals("If100GEODU4")) {
+ sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
+ sclpqList.add(ODUTYPEODU4.class);
+ }
+ break;
+ case "PHOTONIC_MEDIA" :
+ if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
+ sclpqList.add(PHOTONICLAYERQUALIFIEROTSi.class);
+ sclpqList.add(PHOTONICLAYERQUALIFIEROMS.class);
+ }
+ break;
+ default:
+ LOG.error("Layer Protocol Name is unknown");
+ break;
+ }
+ }
+ return sclpqList;
+ }
+
+ private void createTapiTransitionalLinks() {
+ for (TerminationPoint tp : this.oorNetworkPortList) {
+ List<NodeEdgePoint> nepList = new ArrayList<>();
+ String sourceKey = "DSR+" + tp.getTpId().getValue();
+ Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
+ String destKey = "iOTSi+" + tp.getTpId().getValue();
+ Uuid destUuidTp = this.uuidMap.get(destKey);
+ NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
+ .setTopologyUuid(this.tapiTopoUuid)
+ .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
+ .setNodeEdgePointUuid(sourceUuidTp)
+ .build();
+ nepList.add(sourceNep);
+ NodeEdgePoint destNep = new NodeEdgePointBuilder()
+ .setTopologyUuid(this.tapiTopoUuid)
+ .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
+ .setNodeEdgePointUuid(destUuidTp)
+ .build();
+ nepList.add(destNep);
+ LinkBuilder transiLinkBldr = new LinkBuilder()
+ .setUuid(new Uuid(UUID.randomUUID().toString()))
+ .setTransitionedLayerProtocolName(Arrays.asList(LayerProtocolName.ODU.getName(),
+ LayerProtocolName.PHOTONICMEDIA.getName()))
+ .setNodeEdgePoint(nepList)
+ .setDirection(ForwardingDirection.BIDIRECTIONAL)
+ .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
+ new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(new BigInteger("100")).build()).build());
+ this.tapiLinks.add(transiLinkBldr.build());
+ }
+ }
+
+ public List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> getTapiNodes() {
+ return tapiNodes;
+ }
+
+ public List<Link> getTapiLinks() {
+ return tapiLinks;
+ }
+}
import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.transportpce.common.InstanceIdentifiers;
+import org.opendaylight.transportpce.common.NetworkUtils;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev190702.network.Nodes;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev190702.network.NodesKey;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev190702.network.nodes.Mapping;
@Override
public ListenableFuture<RpcResult<GetTopologyDetailsOutput>> getTopologyDetails(GetTopologyDetailsInput input) {
- LOG.info("Building TAPI Topology {}", input.getTopologyIdOrName());
+ LOG.info("Building TAPI Topology absraction from {}", input.getTopologyIdOrName());
+ 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;
+ }
+ if (topology != null) {
+ return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build())
+ .buildFuture();
+ } else {
+ return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().build()).buildFuture();
+ }
+ }
+
+ private Topology createAbstractedOpenroadmTopology() {
// read openroadm-topology
@NonNull
FluentFuture<Optional<Network>> openroadmTopoOpt = dataBroker.newReadOnlyTransaction().read(
new ArrayList<>();
tapiNodeList.add(createTapiNode(goodTpList));
Topology topology = new TopologyBuilder().setName(names).setUuid(uuid).setNode(tapiNodeList).build();
- return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build())
- .buildFuture();
+ return topology;
} else {
- return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().build()).buildFuture();
+ return null;
+ }
+ }
+
+ private Topology createAbstractedOtnTopology() {
+ // read otn-topology
+ @NonNull
+ FluentFuture<Optional<Network>> otnTopoOpt = dataBroker.newReadOnlyTransaction().read(
+ LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.OTN_NETWORK_II);
+ if (otnTopoOpt.isDone()) {
+ Network otnTopo = null;
+ try {
+ otnTopo = otnTopoOpt.get().get();
+ } catch (InterruptedException | ExecutionException | NoSuchElementException e) {
+ LOG.error("Impossible to retreive otn-topology from mdsal");
+ return null;
+ }
+ List<Node> nodeList = otnTopo.getNode();
+ List<Node> otnNodeList = nodeList.stream().filter(nt -> nt.augmentation(
+ org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1.class)
+ .getNodeType().equals(OpenroadmNodeType.SWITCH) || nt.augmentation(
+ org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1.class)
+ .getNodeType().equals(OpenroadmNodeType.MUXPDR)).collect(Collectors.toList());
+ List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodeList =
+ new ArrayList<>();
+ List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> tapiLinkList =
+ new ArrayList<>();
+ Uuid topoUuid = new Uuid(UUID.randomUUID().toString());
+ for (Node node : otnNodeList) {
+ ConvertORTopoObjectToTapiTopoObject tapiFactory =
+ new ConvertORTopoObjectToTapiTopoObject(node, null, topoUuid);
+ tapiFactory.convertNode();
+ tapiNodeList.addAll(tapiFactory.getTapiNodes());
+ tapiLinkList.addAll(tapiFactory.getTapiLinks());
+ }
+ Topology topology = new TopologyBuilder()
+ .setName(Arrays.asList(new NameBuilder().setValue("T0 - Multi-layer topology")
+ .setValueName("TAPI Topology Name").build()))
+ .setUuid(topoUuid)
+ .setNode(tapiNodeList)
+ .setLink(tapiLinkList).build();
+ return topology;
+ } else {
+ return null;
}
}
private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node createTapiNode(List<
String> tpList) {
-
List<Name> names = new ArrayList<Name>();
Name name = new NameBuilder().setValueName("node name").setValue("TapiNode1").build();
names.add(name);
List<OwnedNodeEdgePoint> onepl = new ArrayList<OwnedNodeEdgePoint>();
for (int i = 0; i < tpList.size(); i++) {
List<Name> onedNames = new ArrayList<Name>();
- onedNames.add(new NameBuilder().setValueName("OwnedNodeEdgePoint" + i + " name").setValue(tpList.get(i))
- .build());
-
+ onedNames.add(new NameBuilder().setValueName("OwnedNodeEdgePoint " + i).setValue(tpList.get(i)).build());
OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder().setUuid(new Uuid(UUID.randomUUID().toString()))
.setLayerProtocolName(LayerProtocolName.ETH).setMappedServiceInterfacePoint(createSIP(1))
.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
private List<MappedServiceInterfacePoint> createSIP(int nb) {
List<MappedServiceInterfacePoint> msipl = new ArrayList<>();
for (int i = 0; i < nb; i++) {
- MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
- .setServiceInterfacePointUuid(new Uuid(UUID.randomUUID().toString())).build();
+ MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder().setServiceInterfacePointUuid(
+ new Uuid(UUID.randomUUID().toString())).build();
msipl.add(msip);
}
return msipl;
return false;
}
}
+
}