*/
package org.opendaylight.transportpce.tapi.topology;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
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.Context1;
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.NodeEdgePointRef;
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.context.TopologyContext;
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.risk.parameter.pac.RiskCharacteristic;
import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristicBuilder;
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.LinkKey;
import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node;
import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkModelServiceImpl.class);
private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
- .getBytes(Charset.forName("UTF-8"))).toString());
+ .getBytes(StandardCharsets.UTF_8)).toString());
private final NetworkTransactionService networkTransactionService;
private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap;
private final R2RTapiLinkDiscovery linkDiscovery;
// Device not managed yet
}
+ @Override
+ public void updateTapiTopology(String nodeId, Mapping mapping) {
+ List<Uuid> uuids = getChangedNodeUuids(nodeId, mapping);
+
+ List<Uuid> changedOneps = updateNeps(mapping, uuids);
+ updateLinks(changedOneps, mapping);
+
+ LOG.info("Updated TAPI topology successfully.");
+ }
+
+ private void updateLinks(List<Uuid> changedOneps, Mapping mapping) {
+ try {
+ InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
+ .augmentation(Context1.class).child(TopologyContext.class)
+ .child(Topology.class, new TopologyKey(tapiTopoUuid))
+ .build();
+ Optional<Topology> optTopology = this.networkTransactionService
+ .read(LogicalDatastoreType.OPERATIONAL, topoIID).get();
+ if (optTopology.isEmpty()) {
+ LOG.error("Could not update TAPI links");
+ return;
+ }
+ Map<LinkKey, Link> links = optTopology.get().getLink();
+ if (links != null) {
+ for (Link link : links.values()) {
+ List<Uuid> linkNeps = Objects.requireNonNull(link.getNodeEdgePoint()).values().stream()
+ .map(NodeEdgePointRef::getNodeEdgePointUuid).collect(Collectors.toList());
+ if (!Collections.disjoint(changedOneps, linkNeps)) {
+ InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
+ .augmentation(Context1.class).child(TopologyContext.class)
+ .child(Topology.class, new TopologyKey(tapiTopoUuid))
+ .child(Link.class, new LinkKey(link.getUuid())).build();
+ Link linkblr = new LinkBuilder().setUuid(link.getUuid())
+ .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
+ .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+ this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, linkIID, linkblr);
+ }
+ }
+ }
+ this.networkTransactionService.commit().get();
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.error("Could not update TAPI links");
+ }
+ }
+
+ private List<Uuid> updateNeps(Mapping mapping, List<Uuid> uuids) {
+ List<Uuid> changedOneps = new ArrayList<>();
+ for (Uuid nodeUuid : uuids) {
+ try {
+ InstanceIdentifier<Node> nodeIID = InstanceIdentifier.builder(Context.class)
+ .augmentation(Context1.class).child(TopologyContext.class)
+ .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
+ .build();
+ Optional<Node> optionalNode = this.networkTransactionService.read(
+ LogicalDatastoreType.OPERATIONAL, nodeIID).get();
+ if (optionalNode.isPresent()) {
+ Node node = optionalNode.get();
+ List<OwnedNodeEdgePoint> oneps = node.getOwnedNodeEdgePoint().values().stream()
+ .filter(onep -> ((Name) onep.getName().values().toArray()[0]).getValue()
+ .contains(mapping.getLogicalConnectionPoint())).collect(Collectors.toList());
+ for (OwnedNodeEdgePoint onep : oneps) {
+ changedOneps.add(onep.getUuid());
+ updateSips(mapping, onep);
+ InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+ .augmentation(Context1.class).child(TopologyContext.class)
+ .child(Topology.class, new TopologyKey(tapiTopoUuid))
+ .child(Node.class, new NodeKey(nodeUuid))
+ .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(onep.getUuid()))
+ .build();
+ OwnedNodeEdgePoint onepblr = new OwnedNodeEdgePointBuilder().setUuid(onep.getUuid())
+ .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
+ .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+ this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID, onepblr);
+ }
+ this.networkTransactionService.commit().get();
+ }
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.error("Could not update TAPI NEP");
+ }
+ }
+ return changedOneps;
+ }
+
+ private List<Uuid> getChangedNodeUuids(String nodeId, Mapping mapping) {
+ List<Uuid> uuids = new ArrayList<>();
+ if (nodeId.contains("ROADM")) {
+ uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA))
+ .getBytes(StandardCharsets.UTF_8)).toString()));
+ } else if (nodeId.contains("PDR") && mapping.getLogicalConnectionPoint().contains("CLIENT")) {
+ int xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
+ String xpdrNodeId = nodeId + TapiStringConstants.XPDR + xpdrNb;
+ uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", xpdrNodeId, TapiStringConstants.DSR))
+ .getBytes(StandardCharsets.UTF_8)).toString()));
+ } else if (nodeId.contains("PDR") && mapping.getLogicalConnectionPoint().contains("NETWORK")) {
+ int xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
+ String xpdrNodeId = nodeId + TapiStringConstants.XPDR + xpdrNb;
+ uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", xpdrNodeId, TapiStringConstants.DSR))
+ .getBytes(StandardCharsets.UTF_8)).toString()));
+ uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", xpdrNodeId, TapiStringConstants.OTSI))
+ .getBytes(StandardCharsets.UTF_8)).toString()));
+ } else {
+ LOG.error("Updating this device is currently not supported");
+ return uuids;
+ }
+ return uuids;
+ }
+
+ private void updateSips(Mapping mapping, OwnedNodeEdgePoint onep) {
+ if (onep.getMappedServiceInterfacePoint() == null
+ || onep.getMappedServiceInterfacePoint().size() == 0) {
+ return;
+ }
+ for (MappedServiceInterfacePoint msip : onep.getMappedServiceInterfacePoint().values()) {
+ InstanceIdentifier<ServiceInterfacePoint> sipIID = InstanceIdentifier
+ .builder(Context.class)
+ .child(ServiceInterfacePoint.class,
+ new ServiceInterfacePointKey(msip.getServiceInterfacePointUuid()))
+ .build();
+ ServiceInterfacePoint sipblr = new ServiceInterfacePointBuilder()
+ .setUuid(msip.getServiceInterfacePointUuid())
+ .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
+ .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+ this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, sipIID, sipblr);
+ }
+
+ }
+
private Map<NodeKey, Node> transformXpdrToTapiNode(String nodeId, List<Mapping> xpdrClMaps,
List<Mapping> xpdrNetMaps, XpdrNodeTypes xponderType,
OduSwitchingPools oorOduSwitchingPool) {
Map<NodeKey, Node> nodeMap = new HashMap<>();
LOG.info("creation of a DSR/ODU node for {}", nodeId);
Uuid nodeUuidDsr = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.DSR))
- .getBytes(Charset.forName("UTF-8"))).toString());
+ .getBytes(StandardCharsets.UTF_8)).toString());
Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(
String.join("+", nodeId, TapiStringConstants.DSR)).build();
Name nameNodeType = new NameBuilder().setValueName("Node Type")
// node creation [otsi]
LOG.info("creation of an OTSi node for {}", nodeId);
Uuid nodeUuidOtsi = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.OTSI))
- .getBytes(Charset.forName("UTF-8"))).toString());
+ .getBytes(StandardCharsets.UTF_8)).toString());
Name nameOtsi = new NameBuilder().setValueName("otsi node name").setValue(
String.join("+", nodeId, TapiStringConstants.OTSI)).build();
Set<LayerProtocolName> otsiLayerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
// 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");
- Map<LinkKey, Link> linkMap = createTapiTransitionalLinks(nodeId, xpdrNetMaps, nodeUuidDsr,
- nodeUuidOtsi);
+ Map<LinkKey, Link> linkMap = createTapiTransitionalLinks(nodeId, xpdrNetMaps);
mergeLinkinTopology(linkMap);
return nodeMap;
if (nodeId.contains("ROADM")) {
// Node is in photonic media layer and UUID can be built from nodeId + PHTN_MEDIA
Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
- TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
+ TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8)).toString());
deleteNodeFromTopo(nodeUuid);
}
if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) {
CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
.setCostAlgorithm("Restricted Shortest Path - RSP")
.setCostName("HOP_COUNT")
- .setCostValue("12345678")
+ .setCostValue(TapiStringConstants.COST_HOP_VALUE)
.build();
LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
- .setFixedLatencyCharacteristic("12345678")
- .setQueingLatencyCharacteristic("12345678")
- .setJitterCharacteristic("12345678")
- .setWanderCharacteristic("12345678")
+ .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+ .setQueingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+ .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+ .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
.setTrafficPropertyName("FIXED_LATENCY")
.build();
return new NodeBuilder()
for (int i = 0; i < xpdrNetMaps.size(); i++) {
Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.I_OTSI,
- xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+ xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
Name onedName = new NameBuilder()
.setValueName("iNodeEdgePoint")
.setValue(String.join("+", nodeId, TapiStringConstants.I_OTSI,
for (int i = 0; i < xpdrNetMaps.size(); i++) {
Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.E_OTSI,
- xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+ xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
Name onedName = new NameBuilder()
.setValueName("eNodeEdgePoint")
.setValue(String.join("+", nodeId, TapiStringConstants.E_OTSI,
for (int i = 0; i < xpdrNetMaps.size(); i++) {
Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA,
- xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+ xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
Name onedName = new NameBuilder()
.setValueName("PhotMedNodeEdgePoint")
.setValue(String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA,
xpdrClMaps.get(i).getLogicalConnectionPoint()));
Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.DSR,
- xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+ xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
NameBuilder nameBldr = new NameBuilder().setValue(String.join("+", nodeId,
TapiStringConstants.DSR, xpdrClMaps.get(i).getLogicalConnectionPoint()));
Name name;
xpdrNetMaps.get(i).getLogicalConnectionPoint()));
Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.I_ODU,
- xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+ xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
Name onedName = new NameBuilder()
.setValueName("iNodeEdgePoint_N")
.setValue(String.join("+", nodeId, TapiStringConstants.I_ODU,
xpdrClMaps.get(i).getLogicalConnectionPoint()));
Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.E_ODU,
- xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+ xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
Name onedName = new NameBuilder()
.setValueName("eNodeEdgePoint_N")
.setValue(String.join("+", nodeId, TapiStringConstants.E_ODU,
Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
// PHOTONIC MEDIA nep
Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
- TapiStringConstants.PHTNC_MEDIA, tpId)).getBytes(Charset.forName("UTF-8"))).toString());
+ TapiStringConstants.PHTNC_MEDIA, tpId)).getBytes(StandardCharsets.UTF_8)).toString());
Name nepName = new NameBuilder()
.setValueName(TapiStringConstants.PHTNC_MEDIA + "NodeEdgePoint")
.setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA, tpId))
// MC nep
Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
- TapiStringConstants.MC, tpId)).getBytes(Charset.forName("UTF-8"))).toString());
+ TapiStringConstants.MC, tpId)).getBytes(StandardCharsets.UTF_8)).toString());
Name nepName1 = new NameBuilder()
.setValueName(TapiStringConstants.MC + "NodeEdgePoint")
.setValue(String.join("+", orNodeId, TapiStringConstants.MC, tpId))
// OTSiMC nep
Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId, TapiStringConstants.OTSI_MC,
- tpId)).getBytes(Charset.forName("UTF-8"))).toString());
+ tpId)).getBytes(StandardCharsets.UTF_8)).toString());
Name nepName2 = new NameBuilder()
.setValueName(TapiStringConstants.OTSI_MC + "NodeEdgePoint")
.setValue(String.join("+", orNodeId, TapiStringConstants.OTSI_MC, tpId))
Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
for (int i = 0; i < nb; i++) {
Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeid,
- tpid)).getBytes(Charset.forName("UTF-8"))).toString());
+ tpid)).getBytes(StandardCharsets.UTF_8)).toString());
MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
.setServiceInterfacePointUuid(sipUuid).build();
ServiceInterfacePoint sip = createSIP(sipUuid, layerProtocol, tpid, nodeid, supportedInterfaceCapability,
private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist) {
// UUID
Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
- TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
+ TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8)).toString());
// Names
Name nodeNames = new NameBuilder().setValueName("roadm node name")
.setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA)).build();
CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
.setCostAlgorithm("Restricted Shortest Path - RSP")
.setCostName("HOP_COUNT")
- .setCostValue("12345678")
+ .setCostValue(TapiStringConstants.COST_HOP_VALUE)
.build();
LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
- .setFixedLatencyCharacteristic("12345678")
- .setQueingLatencyCharacteristic("12345678")
- .setJitterCharacteristic("12345678")
- .setWanderCharacteristic("12345678")
+ .setFixedLatencyCharacteristic(TapiStringConstants.COST_HOP_VALUE)
+ .setQueingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+ .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+ .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
.setTrafficPropertyName("FIXED_LATENCY")
.build();
return new NodeBuilder()
ruleList.put(rule.key(), rule);
NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
.setUuid(new Uuid(UUID.nameUUIDFromBytes((orNodeId + " node rule group")
- .getBytes(Charset.forName("UTF-8"))).toString()))
+ .getBytes(StandardCharsets.UTF_8)).toString()))
.setRule(ruleList)
.setNodeEdgePoint(nepMap)
.build();
return nodeRuleGroupMap;
}
- private Map<LinkKey, Link> createTapiTransitionalLinks(String nodeId, List<Mapping> xpdrNetMaps, Uuid nodeUuidDsr,
- Uuid nodeUuidOtsi) {
+ private Map<LinkKey, Link> createTapiTransitionalLinks(String nodeId, List<Mapping> xpdrNetMaps) {
Map<LinkKey, Link> linkMap = new HashMap<>();
for (Mapping mapping : xpdrNetMaps) {
Link transiLink = tapiLink.createTapiLink(nodeId, mapping.getLogicalConnectionPoint(), nodeId,
NodeEdgePoint inep = new NodeEdgePointBuilder()
.setTopologyUuid(this.tapiTopoUuid)
.setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
- TapiStringConstants.OTSI)).getBytes(Charset.forName("UTF-8"))).toString()))
+ TapiStringConstants.OTSI)).getBytes(StandardCharsets.UTF_8)).toString()))
.setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
TapiStringConstants.I_OTSI, tpMapping.getLogicalConnectionPoint()))
- .getBytes(Charset.forName("UTF-8"))).toString()))
+ .getBytes(StandardCharsets.UTF_8)).toString()))
.build();
NodeEdgePoint enep = new NodeEdgePointBuilder()
.setTopologyUuid(this.tapiTopoUuid)
.setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
- TapiStringConstants.OTSI)).getBytes(Charset.forName("UTF-8"))).toString()))
+ TapiStringConstants.OTSI)).getBytes(StandardCharsets.UTF_8)).toString()))
.setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId, TapiStringConstants.E_OTSI,
- tpMapping.getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString()))
+ tpMapping.getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString()))
.build();
nepList.put(inep.key(), inep);
nepList.put(enep.key(), enep);
CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
.setCostAlgorithm("Restricted Shortest Path - RSP")
.setCostName("HOP_COUNT")
- .setCostValue("12345678")
+ .setCostValue(TapiStringConstants.COST_HOP_VALUE)
.build();
LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
- .setFixedLatencyCharacteristic("12345678")
- .setQueingLatencyCharacteristic("12345678")
- .setJitterCharacteristic("12345678")
- .setWanderCharacteristic("12345678")
+ .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+ .setQueingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+ .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+ .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
.setTrafficPropertyName("FIXED_LATENCY")
.build();
RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
.build();
NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
.setUuid(new Uuid(
- UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
+ UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(StandardCharsets.UTF_8))
.toString()))
.setRule(ruleList)
.setNodeEdgePoint(nepList)
LOG.info("EDOU TP = {}", String.join("+", nodeId, TapiStringConstants.E_ODU, tp.getValue()));
LOG.info("DSR TP = {}", String.join("+", nodeId, TapiStringConstants.DSR, tp.getValue()));
Uuid tpUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
- TapiStringConstants.E_ODU, tp.getValue())).getBytes(Charset.forName("UTF-8"))).toString());
+ TapiStringConstants.E_ODU, tp.getValue())).getBytes(StandardCharsets.UTF_8)).toString());
Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
- TapiStringConstants.DSR, tp.getValue())).getBytes(Charset.forName("UTF-8"))).toString());
+ TapiStringConstants.DSR, tp.getValue())).getBytes(StandardCharsets.UTF_8)).toString());
if (onepl.containsKey(new OwnedNodeEdgePointKey(tpUuid))
&& onepl.containsKey(new OwnedNodeEdgePointKey(tp1Uuid))) {
NodeEdgePoint nep1 = new NodeEdgePointBuilder()
.setTopologyUuid(this.tapiTopoUuid)
.setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId,TapiStringConstants. DSR))
- .getBytes(Charset.forName("UTF-8"))).toString()))
+ .getBytes(StandardCharsets.UTF_8)).toString()))
.setNodeEdgePointUuid(tp1Uuid)
.build();
NodeEdgePoint nep2 = new NodeEdgePointBuilder()
.setTopologyUuid(this.tapiTopoUuid)
.setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
(String.join("+", nodeId,TapiStringConstants. DSR))
- .getBytes(Charset.forName("UTF-8"))).toString()))
+ .getBytes(StandardCharsets.UTF_8)).toString()))
.setNodeEdgePointUuid(tpUuid)
.build();
nepList.put(nep1.key(), nep1);
CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
.setCostAlgorithm("Restricted Shortest Path - RSP")
.setCostName("HOP_COUNT")
- .setCostValue("12345678")
+ .setCostValue(TapiStringConstants.COST_HOP_VALUE)
.build();
LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
- .setFixedLatencyCharacteristic("12345678")
- .setQueingLatencyCharacteristic("12345678")
- .setJitterCharacteristic("12345678")
- .setWanderCharacteristic("12345678")
+ .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+ .setQueingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+ .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+ .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
.setTrafficPropertyName("FIXED_LATENCY")
.build();
RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
.build();
NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
.setUuid(new Uuid(
- UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
+ UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(StandardCharsets.UTF_8))
.toString()))
.setRule(ruleList)
.setNodeEdgePoint(nepList)
--- /dev/null
+module tapi-notification {
+ namespace "urn:onf:otcc:yang:tapi-notification";
+ prefix tapi-notification;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact "
+ Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
+ Project List: <mailto:transport-api@opennetworking.org>
+ Editor: Karthik Sethuraman
+ <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI Notification Model definitions.
+ Source: TapiNotification.uml
+ - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
+ - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
+ <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
+ and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
+ <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
+ - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
+ As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
+ - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
+ The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
+ YANG models included in this release may not be backward compatible with previous TAPI releases.
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-12-10 {
+ description "ONF Transport API version 2.1.1.
+ Changes included in this TAPI release (v2.1.1) are listed in
+ <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+ <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-10-16 {
+ description "ONF Transport API version 2.1.0.
+ Changes included in this TAPI release (v2.1.0) are listed in
+ <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
+ <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2
+ This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+ Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+ <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1
+ This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+ Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+ <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0
+ This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
+ Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
+ <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context" {
+ container notification-context {
+ uses notification-context;
+ description "Augments the base TAPI Context with NotificationService information";
+ }
+ description "Augments the base TAPI Context with NotificationService information";
+ }
+
+ /**************************
+ * package object-classes
+ **************************/
+ grouping notification-subscription-service {
+ list notification {
+ key 'uuid';
+ config false;
+ uses notification;
+ description "none";
+ }
+ container notification-channel {
+ uses notification-channel;
+ description "none";
+ }
+ container subscription-filter {
+ uses subscription-filter;
+ description "none";
+ }
+ leaf subscription-state {
+ type subscription-state;
+ description "none";
+ }
+ leaf-list supported-notification-types {
+ type notification-type;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ leaf-list supported-object-types {
+ type object-type;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ uses tapi-common:service-spec;
+ description "none";
+ }
+ grouping subscription-filter {
+ leaf-list requested-notification-types {
+ type notification-type;
+ config false;
+ description "none";
+ }
+ leaf-list requested-object-types {
+ type object-type;
+ config false;
+ description "none";
+ }
+ leaf-list requested-layer-protocols {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ leaf-list requested-object-identifier {
+ type tapi-common:uuid;
+ config false;
+ description "none";
+ }
+ leaf include-content {
+ type boolean;
+ config false;
+ description "Indicates whether the published Notification includes content or just the Notification Id (which enables retrieval of the notification at the later stage)";
+ }
+ uses tapi-common:local-class;
+ description "none";
+ }
+ notification notification {
+ uses notification;
+ description "none";
+ }
+ grouping notification {
+ leaf notification-type {
+ type notification-type;
+ description "none";
+ }
+ leaf target-object-type {
+ type object-type;
+ description "none";
+ }
+ leaf target-object-identifier {
+ type tapi-common:uuid;
+ description "none";
+ }
+ list target-object-name {
+ key 'value-name';
+ min-elements 1;
+ uses tapi-common:name-and-value;
+ description "none";
+ }
+ leaf event-time-stamp {
+ type tapi-common:date-and-time;
+ description "none";
+ }
+ leaf sequence-number {
+ type uint64;
+ config false;
+ description "A monotonous increasing sequence number associated with the notification.
+ The exact semantics of how this sequence number is assigned (per channel or subscription or source or system) is left undefined.";
+ }
+ leaf source-indicator {
+ type source-indicator;
+ description "none";
+ }
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ description "none";
+ }
+ list changed-attributes {
+ key 'value-name';
+ uses name-and-value-change;
+ description "none";
+ }
+ list additional-info {
+ key 'value-name';
+ uses tapi-common:name-and-value;
+ description "none";
+ }
+ leaf additional-text {
+ type string;
+ description "none";
+ }
+ container tca-info {
+ uses tca-info;
+ description "none";
+ }
+ container alarm-info {
+ uses alarm-info;
+ description "none";
+ }
+ uses tapi-common:resource-spec;
+ description "none";
+ }
+ grouping notification-channel {
+ leaf stream-address {
+ type string;
+ config false;
+ description "The address/location/URI of the channel/stream to which the subscribed notifications are published.
+ This specifics of this is typically dependent on the implementation protocol & mechanism and hence is typed as a string.";
+ }
+ leaf next-sequence-no {
+ type uint64;
+ config false;
+ description "The sequence number of the next notification that will be published on the channel";
+ }
+ uses tapi-common:local-class;
+ description "none";
+ }
+ grouping notification-context {
+ list notif-subscription {
+ key 'uuid';
+ uses notification-subscription-service;
+ description "none";
+ }
+ list notification {
+ key 'uuid';
+ config false;
+ uses notification;
+ description "none";
+ }
+ description "none";
+ }
+ grouping alarm-info {
+ leaf is-transient {
+ type boolean;
+ config false;
+ description "none";
+ }
+ leaf perceived-severity {
+ type perceived-severity-type;
+ config false;
+ description "none";
+ }
+ leaf probable-cause {
+ type string;
+ config false;
+ description "none";
+ }
+ leaf service-affecting {
+ type service-affecting;
+ description "none";
+ }
+ description "none";
+ }
+ grouping tca-info {
+ leaf is-transient {
+ type boolean;
+ config false;
+ description "none";
+ }
+ leaf threshold-crossing {
+ type threshold-crossing-type;
+ description "none";
+ }
+ leaf threshold-parameter {
+ type string;
+ config false;
+ description "none";
+ }
+ leaf threshold-value {
+ type uint64;
+ config false;
+ description "none";
+ }
+ leaf perceived-severity {
+ type perceived-tca-severity;
+ description "none";
+ }
+ leaf measurement-interval {
+ type tapi-common:date-and-time;
+ description "none";
+ }
+ leaf suspect-interval-flag {
+ type boolean;
+ description "none";
+ }
+ description "none";
+ }
+
+ /**************************
+ * package type-definitions
+ **************************/
+ grouping name-and-value-change {
+ leaf value-name {
+ type string;
+ description "The name of the value. The value need not have a name.";
+ }
+ leaf old-value {
+ type string;
+ description "The value";
+ }
+ leaf new-value {
+ type string;
+ description "The value";
+ }
+ description "A scoped name-value triple, including old value and new value";
+ }
+ typedef notification-type {
+ type enumeration {
+ enum OBJECT_CREATION {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ enum OBJECT_DELETION {
+ description "none";
+ }
+ enum ATTRIBUTE_VALUE_CHANGE {
+ description "none";
+ }
+ enum ALARM_EVENT {
+ description "none";
+ }
+ enum THRESHOLD_CROSSING_ALERT {
+ description "none";
+ }
+ }
+ description "List of supported Notifications types.";
+ }
+ typedef object-type {
+ type enumeration {
+ enum TOPOLOGY {
+ description "none";
+ }
+ enum NODE {
+ description "none";
+ }
+ enum LINK {
+ description "none";
+ }
+ enum CONNECTION {
+ description "none";
+ }
+ enum PATH {
+ description "none";
+ }
+ enum CONNECTIVITY_SERVICE {
+ description "none";
+ }
+ enum VIRTUAL_NETWORK_SERVICE {
+ description "none";
+ }
+ enum PATH_COMPUTATION_SERVICE {
+ description "none";
+ }
+ enum NODE_EDGE_POINT {
+ description "none";
+ }
+ enum SERVICE_INTERFACE_POINT {
+ description "none";
+ }
+ enum CONNECTION_END_POINT {
+ description "none";
+ }
+ enum MAINTENANCE_ENTITY_GROUP {
+ description "none";
+ }
+ enum MAINTENANCE_ENTITY {
+ description "none";
+ }
+ enum MEG_END_POINT {
+ description "none";
+ }
+ enum MEG_INTERMEDIATE_POINT {
+ description "none";
+ }
+ enum SWITCH_CONTROL {
+ description "none";
+ }
+ enum SWITCH {
+ description "none";
+ }
+ enum ROUTE {
+ description "none";
+ }
+ enum NODE_RULE_GROUP {
+ description "none";
+ }
+ enum INTER_RULE_GROUP {
+ description "none";
+ }
+ enum RULE {
+ description "none";
+ }
+ enum OAM_JOB {
+ description "none";
+ }
+ }
+ description "The list of TAPI Global Object Class types on which Notifications can be raised.";
+ }
+ typedef source-indicator {
+ type enumeration {
+ enum RESOURCE_OPERATION {
+ description "none";
+ }
+ enum MANAGEMENT_OPERATION {
+ description "none";
+ }
+ enum UNKNOWN {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef subscription-state {
+ type enumeration {
+ enum SUSPENDED {
+ description "none";
+ }
+ enum ACTIVE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef perceived-severity-type {
+ type enumeration {
+ enum CRITICAL {
+ description "none";
+ }
+ enum MAJOR {
+ description "none";
+ }
+ enum MINOR {
+ description "none";
+ }
+ enum WARNING {
+ description "none";
+ }
+ enum CLEARED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef threshold-crossing-type {
+ type enumeration {
+ enum THRESHOLD_ABOVE {
+ description "none";
+ }
+ enum THRESHOLD_BELOW {
+ description "none";
+ }
+ enum CLEARED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef service-affecting {
+ type enumeration {
+ enum SERVICE_AFFECTING {
+ description "none";
+ }
+ enum NOT_SERVICE_AFFECTING {
+ description "none";
+ }
+ enum UNKNOWN {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef perceived-tca-severity {
+ type enumeration {
+ enum WARNING {
+ description "none";
+ }
+ enum CLEAR {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ /**************************
+ * package interfaces
+ **************************/
+ rpc get-supported-notification-types {
+ description "none";
+ output {
+ leaf-list supported-notification-types {
+ type notification-type;
+ min-elements 1;
+ description "none";
+ }
+ leaf-list supported-object-types {
+ type object-type;
+ min-elements 1;
+ description "none";
+ }
+ }
+ }
+ rpc create-notification-subscription-service {
+ description "none";
+ input {
+ container subscription-filter {
+ uses subscription-filter;
+ description "none";
+ }
+ leaf subscription-state {
+ type subscription-state;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service;
+ description "none";
+ }
+ }
+ }
+ rpc update-notification-subscription-service {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ container subscription-filter {
+ uses subscription-filter;
+ description "none";
+ }
+ leaf subscription-state {
+ type subscription-state;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service;
+ description "none";
+ }
+ }
+ }
+ rpc delete-notification-subscription-service {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service;
+ description "none";
+ }
+ }
+ }
+ rpc get-notification-subscription-service-details {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service;
+ description "none";
+ }
+ }
+ }
+ rpc get-notification-subscription-service-list {
+ description "none";
+ output {
+ list subscription-service {
+ key 'uuid';
+ uses notification-subscription-service;
+ description "none";
+ }
+ }
+ }
+ rpc get-notification-list {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf time-period {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ list notification {
+ key 'uuid';
+ uses notification;
+ description "none";
+ }
+ }
+ }
+}
\ No newline at end of file