Changing converter utility code to match the latest TE Subsystem APIs.
Change-Id: I82effa0431d5f7ccaa36e5f75a85324219de17ab
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
index b0daeee..c231060 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
@@ -15,13 +15,95 @@
*/
package org.onosproject.teyang.utils.topology;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.nio.ByteBuffer;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+
+import org.onlab.packet.Ip4Address;
+import org.onosproject.tetopology.management.api.EncodingType;
+import org.onosproject.tetopology.management.api.KeyId;
+import org.onosproject.tetopology.management.api.SwitchingType;
+import org.onosproject.tetopology.management.api.TeStatus;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.link.TeLinkId;
+import org.onosproject.tetopology.management.api.link.TePathAttributes;
+import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
+import org.onosproject.tetopology.management.api.node.CommonNodeData;
+import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
+import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
+import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
+import org.onosproject.tetopology.management.api.node.DefaultTeNode;
+import org.onosproject.tetopology.management.api.node.LocalLinkConnectivity;
import org.onosproject.tetopology.management.api.node.NetworkNode;
import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
+import org.onosproject.tetopology.management.api.node.TeNode;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.DomainName;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
- .Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+ .ietfnetwork.networks.network.DefaultNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+ .ietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+ .ietfnetwork.networks.network.node.DefaultSupportingNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+ .ietfnetwork.networks.network.node.SupportingNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.TpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.AugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.node.AugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.node.DefaultAugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.DefaultTeNodeEvent;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.DefaultInformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.InformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.DefaultInformationSourceState.InformationSourceStateBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.DefaultTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.Topology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.node.AugmentedNwNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.node.DefaultAugmentedNwNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultTunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.TunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.DefaultTeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes.TeNodeAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix.ConnectivityMatrixBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultFrom;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultTo;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.DefaultUnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.UnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.TerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeAdminStatus;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
/**
* Node conversion functions.
@@ -41,6 +123,217 @@
private NodeConverter() {
}
+ /**
+ * TE Node Config object conversion from TE Topology subsystem to YANG.
+ *
+ * @param teSubsystemTeNode TE node object
+ * @return TE Node Config YANG object
+ */
+ private static Config teNode2YangConfig(TeNode teSubsystemTeNode) {
+ checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
+
+ TeNodeAttributes.TeNodeAttributesBuilder teNodeAttributesConfigBuilder = DefaultTeNodeAttributes
+ .builder();
+ teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+ .isAbstract(teSubsystemTeNode.flags()
+ .get(TeNode.BIT_ABSTRACT));
+
+ if (teSubsystemTeNode.adminStatus() != null) {
+ teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+ .adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teSubsystemTeNode.adminStatus()));
+ }
+
+ if (teSubsystemTeNode.name() != null) {
+ teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+ .name(DomainName.fromString(teSubsystemTeNode.name()));
+ }
+
+ if (teSubsystemTeNode.underlayTeTopologyId() != null) {
+ teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+ .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
+ .underlayTeTopologyId()));
+ }
+
+ // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
+ if (teSubsystemTeNode.supportingTeNodeId() != null) {
+ }
+
+ if (teSubsystemTeNode.connectivityMatrices() != null) {
+ teNodeAttributesConfigBuilder = te2YangConnectivityMatrix(teNodeAttributesConfigBuilder,
+ teSubsystemTeNode.connectivityMatrices());
+ }
+
+
+ Config.ConfigBuilder yangConfigBuilder = DefaultConfig.builder();
+ yangConfigBuilder = yangConfigBuilder.teNodeAttributes(teNodeAttributesConfigBuilder.build());
+
+ return yangConfigBuilder.build();
+ }
+
+ private static TeNodeAttributesBuilder
+ te2YangConnectivityMatrix(TeNodeAttributesBuilder teNodeAttributesConfigBuilder,
+ Map<Long, ConnectivityMatrix> connectivityMatrices) {
+ ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = DefaultConnectivityMatrix.builder();
+ for (Map.Entry<Long, ConnectivityMatrix> teCmEntry :
+ connectivityMatrices.entrySet()) {
+ connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
+ .id(teCmEntry.getKey())
+ .isAllowed(!teCmEntry.getValue().flags()
+ .get(ConnectivityMatrix.BIT_DISALLOWED))
+ .from(new DefaultFrom.FromBuilder() // TODO: for now, assuming that there is
+ // only one 'from', and mergingList is empty
+ .tpRef(teCmEntry.getValue().from())
+ .build())
+ .to(new DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
+ // one item in constrainingElements list
+ .tpRef(teCmEntry.getValue().constrainingElements().get(0))
+ .build());
+ teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+ .addToConnectivityMatrix(connectivityMatrixConfigBuilder
+ .build());
+ }
+ return teNodeAttributesConfigBuilder;
+ }
+
+ private static UnderlayTopology teNode2YangUnderlay(TeTopologyKey underlayTopology) {
+ UnderlayTopology.UnderlayTopologyBuilder underlayBuilder = DefaultUnderlayTopology
+ .builder()
+ .teTopologyIdRef(TeTopologyId
+ .fromString(String.valueOf(underlayTopology.topologyId())))
+ .clientIdRef(underlayTopology.clientId())
+ .providerIdRef(underlayTopology.providerId());
+ // TODO: find networkId from the service
+// .networkIdRef(networkIdRef)
+ return underlayBuilder.build();
+ }
+
+ /**
+ * TE Node State object conversion from TE Topology subsystem to YANG.
+ *
+ * @param teSubsystemTeNode TE node object
+ * @return TE Node State YANG object
+ */
+ private static State teNode2YangState(TeNode teSubsystemTeNode) {
+ checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
+
+ TeNodeAttributes
+ .TeNodeAttributesBuilder teNodeAttributesStateBuilder =
+ DefaultTeNodeAttributes.builder()
+ .isAbstract(teSubsystemTeNode.flags()
+ .get(TeNode.BIT_ABSTRACT));
+
+ if (teSubsystemTeNode.adminStatus() != null) {
+ teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
+ .adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teSubsystemTeNode.adminStatus()));
+ }
+
+ if (teSubsystemTeNode.name() != null) {
+ teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
+ .name(DomainName.fromString(teSubsystemTeNode.name()));
+ }
+
+ if (teSubsystemTeNode.underlayTeTopologyId() != null) {
+ teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
+ .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
+ .underlayTeTopologyId()));
+ }
+
+ if (teSubsystemTeNode.connectivityMatrices() != null) {
+ teNodeAttributesStateBuilder = te2YangConnectivityMatrix(teNodeAttributesStateBuilder,
+ teSubsystemTeNode.connectivityMatrices());
+ }
+
+ // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
+ if (teSubsystemTeNode.supportingTeNodeId() != null) {
+ }
+
+ State.StateBuilder yangStateBuilder = DefaultState.builder();
+ yangStateBuilder = yangStateBuilder.teNodeAttributes(teNodeAttributesStateBuilder.build());
+
+ if (teSubsystemTeNode.opStatus() != null) {
+ yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
+ .teSubsystem2YangOperStatus(teSubsystemTeNode.opStatus()));
+ }
+
+ if (teSubsystemTeNode.sourceTeNodeId() != null) {
+ InformationSourceState.InformationSourceStateBuilder issBuilder = DefaultInformationSourceState.builder();
+
+ Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
+ topologyBuilder =
+ topologyBuilder.clientIdRef(teSubsystemTeNode.sourceTeNodeId().clientId())
+ .providerIdRef(teSubsystemTeNode.sourceTeNodeId().providerId())
+ // is this correct? Why not sourceTeNodeId().teTopologyKey()?
+ .teTopologyIdRef(teSubsystemTeNode
+ .sourceTeNodeId().topologyId());
+ issBuilder = issBuilder.topology(topologyBuilder.build());
+ yangStateBuilder.informationSourceState(issBuilder.build());
+ }
+
+ return yangStateBuilder.build();
+ }
+
+ private static class ByteUtils {
+ private static ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
+
+ public static byte[] longToBytes(long x) {
+ buffer.putLong(0, x);
+ return buffer.array();
+ }
+
+ public static long bytesToLong(byte[] bytes) {
+ buffer.put(bytes, 0, bytes.length);
+ buffer.flip(); // need flip
+ return buffer.getLong();
+ }
+ }
+
+ /**
+ * TE Node TunnelTerminationPoint object conversion from TE Topology subsystem to YANG.
+ *
+ * @param teTunnelTp TE TunnelTerminationPoint object
+ * @return TunnelTerminationPoint YANG object
+ */
+ private static TunnelTerminationPoint teSubsystem2YangTtp(
+ org.onosproject.tetopology.management.api.node
+ .TunnelTerminationPoint teTunnelTp, Long teTpId) {
+ checkNotNull(teTunnelTp, E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP);
+
+ TunnelTerminationPoint.TunnelTerminationPointBuilder tunnelTpBuilder =
+ DefaultTunnelTerminationPoint.builder().tunnelTpId(ByteUtils.longToBytes(teTpId.longValue()));
+
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeaugment.te.tunnelterminationpoint.Config.ConfigBuilder ttpConfigBuilder =
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultConfig.builder();
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeaugment.te.tunnelterminationpoint.State.StateBuilder ttpStateBuilder =
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultState.builder();
+
+ // Assuming teTunnelTp only has one interLayerLock
+ if (teTunnelTp.interLayerLockList() != null && !teTunnelTp.interLayerLockList().isEmpty()) {
+ ttpConfigBuilder = ttpConfigBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
+ ttpStateBuilder = ttpStateBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
+ }
+
+ TerminationCapability.TerminationCapabilityBuilder
+ tcapConfigBuilder = DefaultTerminationCapability.builder();
+ // TODO: retrieve more attributes from teTunnelTp and assign to tcapConfigBuilder.
+ // For which ones we can do the conversion?
+ // FIXME: once new yang model is used, we can make llc from teTunnelTp.localLinkConnectivityList()
+ ttpConfigBuilder = ttpConfigBuilder.addToTerminationCapability(tcapConfigBuilder.build());
+
+ TerminationCapability.TerminationCapabilityBuilder tcapStateBuilder =
+ DefaultTerminationCapability.builder();
+ // TODO: retrieve more attributes from teTunnelTp and assign to tcapStateBuilder
+ // For which ones we can do the conversion?
+ ttpStateBuilder = ttpStateBuilder.addToTerminationCapability(tcapStateBuilder.build());
+
+ tunnelTpBuilder = tunnelTpBuilder.config(ttpConfigBuilder.build())
+ .state(ttpStateBuilder.build());
+
+ return tunnelTpBuilder.build();
+ }
/**
* Node object conversion from TE Topology subsystem to YANG.
@@ -49,37 +342,546 @@
* @return YANG node
*/
public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem) {
- //TODO: implementation to be submitted as a separate review
- return null;
+ checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_NODE);
+
+ NodeId nodeId = NodeId.fromString(teSubsystem.nodeId().toString());
+ Node.NodeBuilder builder = DefaultNode.builder().nodeId(nodeId);
+
+ if (teSubsystem.supportingNodeIds() != null) {
+ List<SupportingNode> sNodes = Lists.newArrayList();
+ SupportingNode.SupportingNodeBuilder spNodeBuilder = DefaultSupportingNode
+ .builder();
+ for (NetworkNodeKey nodeKey : teSubsystem.supportingNodeIds()) {
+ sNodes.add(spNodeBuilder
+ .networkRef(NetworkId
+ .fromString(nodeKey.networkId().toString()))
+ .nodeRef(NodeId.fromString(nodeKey.nodeId().toString()))
+ .build());
+ }
+ builder = builder.supportingNode(sNodes);
+ }
+
+ if (teSubsystem.terminationPoints() != null) {
+ AugmentedNdNode.AugmentedNdNodeBuilder tpAugmentBuilder = DefaultAugmentedNdNode
+ .builder();
+ Map<KeyId, TerminationPoint> teSubsystemTeTp = teSubsystem
+ .terminationPoints();
+
+ for (TerminationPoint teTp : teSubsystemTeTp.values()) {
+ tpAugmentBuilder.addToTerminationPoint(TerminationPointConverter
+ .teSubsystem2YangTerminationPoint(teTp));
+ }
+ builder.addYangAugmentedInfo(tpAugmentBuilder.build(),
+ AugmentedNdNode.class);
+ }
+
+ if (teSubsystem.teNode() != null) {
+ AugmentedNwNode.AugmentedNwNodeBuilder nodeAugmentBuilder = DefaultAugmentedNwNode
+ .builder();
+
+ TeNode teSubsystemTeNode = teSubsystem.teNode();
+
+ TeBuilder yangTeBuilder = DefaultTe.builder();
+
+ yangTeBuilder = yangTeBuilder.teNodeId(TeNodeId
+ .fromString(String.valueOf(teSubsystemTeNode.teNodeId())));
+
+ // Set configuration data
+ // Set state data
+ yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode))
+ .state(teNode2YangState(teSubsystemTeNode));
+
+ if (teSubsystemTeNode.tunnelTerminationPoints() != null) {
+ for (Map.Entry<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> entry :
+ teSubsystemTeNode.tunnelTerminationPoints().entrySet()) {
+ yangTeBuilder = yangTeBuilder
+ .addToTunnelTerminationPoint(teSubsystem2YangTtp(entry
+ .getValue(), entry.getKey()));
+ }
+ }
+
+ nodeAugmentBuilder = nodeAugmentBuilder.te(yangTeBuilder.build());
+ builder.addYangAugmentedInfo(nodeAugmentBuilder.build(),
+ AugmentedNwNode.class);
+ }
+ return builder.build();
}
/**
* Node object conversion from YANG to TE Topology subsystem.
*
- * @param yangNode Network node in YANG model
- * @param yangNetworkId YANG network identifier in YANG model
+ * @param yangNode Node in YANG model
+ * @param yangNetwork YANG network
+ * @param yangNetwork Network node in YANG model
* @return TE subsystem node
*/
public static org.onosproject.tetopology.management.api.node.NetworkNode
- yang2TeSubsystemNode(Node yangNode, NetworkId yangNetworkId) {
+ yang2TeSubsystemNode(Node yangNode, Network yangNetwork) {
+ checkNotNull(yangNode, E_NULL_YANG_NODE);
- //TODO: implementation to be submitted as separate review
+ org.onosproject.tetopology.management.api.node.DefaultNetworkNode node;
+ List<NetworkNodeKey> spNodes = null;
+ TeNode teNode = null;
+ Map<KeyId, TerminationPoint> tps = null;
+ if (yangNode.supportingNode() != null) {
+ spNodes = Lists.newArrayList();
+ for (SupportingNode yangSpNode : yangNode.supportingNode()) {
+ NetworkNodeKey nodeKey = new NetworkNodeKey(KeyId.keyId(yangSpNode.nodeRef().uri().toString()),
+ KeyId.keyId(yangSpNode.networkRef().uri().toString()));
+ spNodes.add(nodeKey);
+ }
+ }
+
+ if (yangNode.yangAugmentedInfoMap() != null
+ && !yangNode.yangAugmentedInfoMap().isEmpty()) {
+
+ AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
+ .yangAugmentedInfo(AugmentedNdNode.class);
+ if (yang2TeSubsystemTpNodeAugment(yangTpNodeAugment) != null) {
+ tps = yang2TeSubsystemTpNodeAugment(yangTpNodeAugment);
+ }
+
+ AugmentedNwNode yangNodeAugment = (AugmentedNwNode) yangNode
+ .yangAugmentedInfo(AugmentedNwNode.class);
+ if (yangNodeAugment != null && yangNodeAugment.te() != null && yangNodeAugment.te().teNodeId() != null) {
+ Te yangNodeAugTe = yangNodeAugment.te();
+ teNode = yang2TeSubsystemNodeAugment(yangNodeAugTe,
+ yangNetwork,
+ yangNode,
+ tps);
+ }
+ }
+
+ node = new org.onosproject.tetopology.management.api.node
+ .DefaultNetworkNode(KeyId.keyId(yangNode.nodeId().uri().string()), spNodes, teNode, tps);
+ return node;
+ }
+
+ // TODO: convert connectivity matrix from yang to te
+ private static Map<Long, ConnectivityMatrix>
+ yang2TeSubsystemNodeConnectivityMatrix(String networkId,
+ String nodeId,
+ List<org.onosproject.yang.gen.v1.urn.ietf
+ .params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeconnectivitymatrix.
+ ConnectivityMatrix> yangMatrix) {
+
+ Map<Long, ConnectivityMatrix> teCmList = Maps.newHashMap();
+
+
+ for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te
+ .topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.
+ ConnectivityMatrix cmYang : yangMatrix) {
+
+ ElementType from = new TeLinkId((long) cmYang.from().tpRef()); // is this correct?
+
+ UnderlayAbstractPath underlayPath = null; // ignore
+
+ List<ElementType> mergingList = Lists.newArrayList(); // empty merging list for now
+
+ List<ElementType> constrainingElements = Lists.newArrayList();
+ ElementType to = new TeLinkId((long) cmYang.to().tpRef()); // is this correct?
+ constrainingElements.add(to);
+
+ BitSet flags = new BitSet(); // what are the flags in cmYang?
+
+ List<Long> srlgs = Lists.newArrayList();
+ if (cmYang.teSrlgs() != null) {
+ for (Srlg srlg : cmYang.teSrlgs().value()) {
+ srlgs.add(srlg.uint32());
+ }
+ }
+ TePathAttributes teAttributes = new
+ TePathAttributes(cmYang.teDefaultMetric(),
+ cmYang.performanceMetric().measurement().unidirectionalDelay(),
+ srlgs);
+ ConnectivityMatrix coreCm = new ConnectivityMatrix(cmYang.id(),
+ from,
+ mergingList ,
+ constrainingElements,
+ flags,
+ teAttributes ,
+ underlayPath);
+
+ teCmList.put(cmYang.id(), coreCm);
+ }
+
+ return teCmList;
+ }
+
+ private static TeTopologyKey yang2TeSubsystemNodeUnderlayTopology(UnderlayTopology ut) {
+ TeTopologyKey tetopokey = new TeTopologyKey((Long) ut.providerIdRef(),
+ (Long) ut.clientIdRef(),
+ (Long) ut.teTopologyIdRef());
+ return tetopokey;
+ }
+
+ // TODO: retrieve the details of tunnel termiantion points from yang to te
+ private static Map<Long, org.onosproject.tetopology.management.api.node.
+ TunnelTerminationPoint> yang2TeSubsystemTtp(List<TunnelTerminationPoint> ttps) {
+ Map<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttpsMap = Maps
+ .newHashMap();
+ for (TunnelTerminationPoint ttpYang : ttps) {
+
+ SwitchingType switchingLayer = null; // how to find switching type?
+ EncodingType encodingLayer = null; // TODO: find proper encoding type from ttpYang.config().encoding();
+ BitSet flags = new BitSet(); // how to set flags?
+ List<Long> interLayerLockList = Lists.newArrayList();
+ interLayerLockList.add(ttpYang.config().interLayerLockId()); // interLayerLock in yang is not a list
+
+ List<LocalLinkConnectivity> localLinkConnectivityList = Lists.newArrayList();
+ // FIXME: once new yang model is used, we can make llc
+// LocalLinkConnectivity llc = new LocalLinkConnectivity(constrainingElements,
+// flags,
+// teAttributes,
+// underlayPath)
+
+ float[] availAdaptBandwidth = null; // how to find availableBandwidth?
+
+ org.onosproject.tetopology.management.api.node.
+ TunnelTerminationPoint ttpTe = new
+ org.onosproject.tetopology.management.api.node.
+ DefaultTunnelTerminationPoint(ByteUtils.bytesToLong(ttpYang.tunnelTpId()),
+ switchingLayer ,
+ encodingLayer,
+ flags,
+ interLayerLockList,
+ localLinkConnectivityList,
+ availAdaptBandwidth);
+
+ ttpsMap.put(ByteUtils.bytesToLong(ttpYang.tunnelTpId()), ttpTe);
+ }
+
+ return ttpsMap;
+ }
+
+ private static TeNode yang2TeSubsystemNodeAugment(Te yangNodeAugTe,
+ Network yangNetwork,
+ Node yangNode,
+ Map<KeyId, TerminationPoint> yangTps) {
+
+
+ NodeId yangNodeId = yangNode.nodeId();
+ List<SupportingNode> yangSupportNodes = yangNode.supportingNode();
+
+ NetworkId yangNetworkId = yangNetwork.networkId();
+
+ long teNodeId = Ip4Address.valueOf(yangNodeAugTe.teNodeId().dottedQuad().string()).toInt();
+
+ TeTopologyKey underlayTopologyIdId = null;
+
+ // FIXME: yang has a list of supporting nodes, but TeNode only has one
+ // supportTeNodeId. How ro retrieve providerId, clientId, topologyId, teNodeId?
+ TeNodeKey supportTeNodeId = null;
+// supportTeNodeId = new TeNodeKey(providerId, clientId, topologyId, teNodeId)
+// yangSupportNodes.get(0).
+
+ TeNodeKey sourceTeNodeId = null; //ignore
+ CommonNodeData teData = null;
+ Map<Long, ConnectivityMatrix> connMatrices = null;
+ Map<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttps = null;
+ List<Long> teLinkIds = Lists.newArrayList();
+ List<Long> teTpIds = Lists.newArrayList();
+
+ // ********************************************** to find teLinkIds
+ if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
+ AugmentedNdNetwork augmentLink =
+ (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
+ for (Link link : augmentLink.link()) {
+ if (link.source().sourceNode().equals(yangNodeAugTe.teNodeId())) {
+ teLinkIds.add(Long.valueOf(link.linkId().uri().string()));
+ }
+ }
+ }
+ // ********************************************** to find teTpIds
+ if (yangNode.yangAugmentedInfoMap() != null
+ && !yangNode.yangAugmentedInfoMap().isEmpty()) {
+
+ AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
+ .yangAugmentedInfo(AugmentedNdNode.class);
+
+ if (yangTpNodeAugment.terminationPoint() != null) {
+ for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
+ .rev20151208.ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint
+ yangTpnode : yangTpNodeAugment.terminationPoint()) {
+ teTpIds.add(Long.valueOf(yangTpnode.tpId().uri().string()));
+ }
+ }
+ }
+ // **********************************************
+
+ Config ynodeAugCfg = yangNodeAugTe.config();
+
+ if (ynodeAugCfg != null) {
+ TeNodeAttributes teNodeAttr = ynodeAugCfg.teNodeAttributes();
+ if (teNodeAttr != null) {
+
+ if (teNodeAttr.underlayTopology() != null) {
+
+ underlayTopologyIdId = yang2TeSubsystemNodeUnderlayTopology(teNodeAttr
+ .underlayTopology());
+ }
+ BitSet flags = new BitSet();
+ if (teNodeAttr.isAbstract()) {
+ flags.set(TeNode.BIT_ABSTRACT);
+ }
+ teData = new CommonNodeData(
+ teNodeAttr.name().string(),
+ EnumConverter.yang2TeSubsystemAdminStatus(teNodeAttr.adminStatus()),
+ EnumConverter.yang2TeSubsystemOpStatus(yangNodeAugTe.state().operStatus()),
+ flags);
+
+ if (teNodeAttr.connectivityMatrix() != null) {
+ connMatrices = yang2TeSubsystemNodeConnectivityMatrix(yangNetworkId.uri().toString(),
+ yangNodeId.uri().toString(),
+ teNodeAttr.connectivityMatrix());
+ }
+
+ }
+ }
+
+ if (yangNodeAugTe.tunnelTerminationPoint() != null) {
+ ttps = yang2TeSubsystemTtp(yangNodeAugTe.tunnelTerminationPoint());
+ }
+
+ TeNode teNode = new DefaultTeNode(teNodeId,
+ underlayTopologyIdId,
+ supportTeNodeId,
+ sourceTeNodeId,
+ teData,
+ connMatrices,
+ teLinkIds,
+ ttps,
+ teTpIds);
+ return teNode;
+ }
+
+ private static Map<KeyId, TerminationPoint> yang2TeSubsystemTpNodeAugment(AugmentedNdNode yangTpNodeAugment) {
+ Map<KeyId, TerminationPoint> tps;
+ if (yangTpNodeAugment.terminationPoint() != null) {
+ tps = Maps.newHashMap();
+ for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
+ .rev20151208.ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint
+ yangTpnode : yangTpNodeAugment.terminationPoint()) {
+ tps.put(KeyId.keyId(yangTpnode.tpId().uri().toString()),
+ TerminationPointConverter.yang2teSubsystemTerminationPoint(yangTpnode));
+ }
+ return tps;
+ }
return null;
}
- public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
+ /**
+ * Converts a TE Topology node event from the data format used in
+ * the core to its corresponding YANG Object (YO) format.
+ *
+ * @param eventType Node event type
+ * @param nodeData TE Topology node event data
+ * @return YANG Object converted from nodeData
+ */
+ public static TeNodeEvent teNetworkNode2yangTeNodeEvent(TeTopologyEventTypeEnum eventType,
+ NetworkNode nodeData) {
+ TeNodeEvent.TeNodeEventBuilder builder = new DefaultTeNodeEvent.TeNodeEventBuilder();
+ TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
+ builder.eventType(yangEventType);
+
+ NodeId nodeId = NodeId.fromString(nodeData.nodeId().toString());
+ builder.nodeRef(nodeId);
+
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+ rev20160708.ietftetopology.tenodeconfigattributesnotification.
+ TeNodeAttributes teNodeAttributes = teNode2YangTeNodeAttributes(nodeData.teNode());
+ builder.teNodeAttributes(teNodeAttributes);
+
+ return builder.build();
+ }
+
+ private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.
+ ietf.te.topology.rev20160708.ietftetopology.
+ tenodeconfigattributesnotification.
+ TeNodeAttributes teNode2YangTeNodeAttributes(TeNode teNode) {
+
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+ rev20160708.ietftetopology.tenodeconfigattributesnotification.
+ TeNodeAttributes.TeNodeAttributesBuilder attrBuilder =
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+ rev20160708.ietftetopology.tenodeconfigattributesnotification.
+ DefaultTeNodeAttributes.builder();
+
+ if (teNode.connectivityMatrices() != null) {
+
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+ .tenodeconnectivitymatrixabs.DefaultConnectivityMatrix
+ .ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = org.onosproject.yang.gen.v1.urn.ietf.
+ params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrixabs.
+ DefaultConnectivityMatrix.builder();
+ for (Map.Entry<Long, ConnectivityMatrix> teCmEntry :
+ teNode.connectivityMatrices().entrySet()) {
+ connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
+ .id(teCmEntry.getKey())
+ .isAllowed(!teCmEntry.getValue().flags()
+ .get(ConnectivityMatrix.BIT_DISALLOWED))
+ .from(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix.DefaultFrom
+ .FromBuilder() // TODO: for now, assuming that there is
+ // only one 'from', and mergingList is empty
+ .tpRef(teCmEntry.getValue().from())
+ .build())
+ .to(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix
+ .DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
+ // one item in constrainingElements list
+ .tpRef(teCmEntry.getValue().constrainingElements().get(0))
+ .build());
+ attrBuilder = attrBuilder
+ .addToConnectivityMatrix(connectivityMatrixConfigBuilder
+ .build());
+ }
+ }
+
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+ rev20160708.ietftetopology.tenodeconfigattributesnotification.
+ TeNodeAttributes teNodeAttributes = attrBuilder.build();
+
+ return teNodeAttributes;
+ }
+
+ public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
//TODO: implementation to be submitted as separate review
- return null;
+ NetworkId networkRef = (NetworkId) (yangNodeEvent.networkRef());
+ NodeId nodeRef = (NodeId) (yangNodeEvent.nodeRef());
+ KeyId networkId = KeyId.keyId(networkRef.uri().toString());
+ KeyId nodeId = KeyId.keyId(nodeRef.uri().toString());
+
+ NetworkNodeKey networkNodeKey = new NetworkNodeKey(networkId, nodeId);
+
+ return networkNodeKey;
}
public static NetworkNode yangNodeEvent2NetworkNode(TeNodeEvent yangNodeEvent,
TeTopologyService teTopologyService) {
-
//TODO: implementation to be submitted as separate review
- return null;
+ KeyId networkNodeId = yangNodeEvent2NetworkNodeKey(yangNodeEvent).nodeId();
+
+ org.onosproject.tetopology.management.api.Network network = teTopologyService.network
+ (yangNodeEvent2NetworkNodeKey(yangNodeEvent).networkId());
+ if (network == null) {
+ return null;
+ }
+
+ NetworkNode networkNode = network.node(networkNodeId);
+ if (networkNode == null) {
+ return null;
+ }
+
+ List<NetworkNodeKey> supportingNodeIds = networkNode.supportingNodeIds();
+ Map<KeyId, TerminationPoint> tps = networkNode.terminationPoints();
+
+ TeNode teNode = networkNode.teNode();
+ if (teNode == null) {
+ return null;
+ }
+
+ TeNode updatedTeNode = yangNodeEvent2TeNode(yangNodeEvent, teNode);
+
+ NetworkNode updatedNetworkNode = new DefaultNetworkNode(networkNodeId, supportingNodeIds, updatedTeNode, tps);
+
+ return updatedNetworkNode;
+ }
+
+ private static TeNode yangNodeEvent2TeNode(TeNodeEvent yangNodeEvent, TeNode oldTeNode) {
+
+ long teNodeId = oldTeNode.teNodeId();
+ TeTopologyKey underlayTopoId = oldTeNode.underlayTeTopologyId();
+ TeNodeKey supportTeNodeId = oldTeNode.sourceTeNodeId();
+ TeNodeKey sourceTeNodeId = oldTeNode.sourceTeNodeId();
+ Map<Long, ConnectivityMatrix> connMatrices = oldTeNode.connectivityMatrices();
+ List<Long> teLinkIds = oldTeNode.teLinkIds();
+ Map<Long, org.onosproject.tetopology.management.
+ api.node.TunnelTerminationPoint> ttps = oldTeNode.tunnelTerminationPoints();
+ List<Long> teTpIds = oldTeNode.teLinkIds();
+ String name = oldTeNode.name();
+ TeStatus adminStatus = oldTeNode.adminStatus();
+ TeStatus opStatus = oldTeNode.opStatus();
+ BitSet flags = oldTeNode.flags();
+
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+ .tenodeconfigattributesnotification
+ .TeNodeAttributes yangTeNodeAttrs = yangNodeEvent.teNodeAttributes();
+
+ if (yangTeNodeAttrs != null) {
+ TeAdminStatus yangAdminStatus = yangTeNodeAttrs.adminStatus();
+ if (yangAdminStatus != null) {
+ adminStatus = EnumConverter.yang2TeSubsystemAdminStatus(yangAdminStatus);
+ }
+
+ BitSet yangFlags = yangTeNodeAttrs.selectLeafFlags();
+ if (yangFlags != null) {
+ flags = yangFlags;
+ }
+
+ List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.
+ ietf.te.topology.rev20160708.ietftetopology
+ .tenodeconnectivitymatrixabs.ConnectivityMatrix> yangConnMatrices = yangTeNodeAttrs
+ .connectivityMatrix();
+ if (yangConnMatrices != null) {
+ for (org.onosproject.yang.gen.v1.
+ urn.ietf.params.xml.ns.yang.
+ ietf.te.topology
+ .rev20160708.ietftetopology
+ .tenodeconnectivitymatrixabs
+ .ConnectivityMatrix yangConnMatrix : yangConnMatrices) {
+ Long cmId = new Long(yangConnMatrix.id());
+ ConnectivityMatrix oldConnMatrix = connMatrices.get(new Long(yangConnMatrix.id()));
+ if (oldConnMatrix != null) {
+ ConnectivityMatrix newConnMatrix = yangNodeEvent2TeConnectivityMatrix(yangConnMatrix,
+ oldConnMatrix);
+ connMatrices.remove(cmId);
+ connMatrices.put(cmId, newConnMatrix);
+ }
+ }
+ }
+ }
+
+ CommonNodeData teData = new CommonNodeData(name, adminStatus, opStatus, flags);
+ TeNode updatedTeNode = new DefaultTeNode(teNodeId, underlayTopoId, supportTeNodeId, sourceTeNodeId, teData,
+ connMatrices, teLinkIds, ttps, teTpIds);
+
+ return updatedTeNode;
+ }
+
+ private static ConnectivityMatrix yangNodeEvent2TeConnectivityMatrix(org.onosproject.yang.gen.v1.
+ urn.ietf.params.xml.ns.yang.
+ ietf.te.topology
+ .rev20160708.ietftetopology
+ .tenodeconnectivitymatrixabs
+ .ConnectivityMatrix yangConnMatrix,
+ ConnectivityMatrix oldTeConnMatrix) {
+
+ long id = yangConnMatrix.id();
+ ElementType from = new TeLinkId((long) (yangConnMatrix.from().tpRef()));
+ UnderlayAbstractPath underlayPath = null;
+ List<ElementType> mergingList = Lists.newArrayList();
+
+ List<ElementType> constrainingElements = Lists.newArrayList();
+ ElementType to = new TeLinkId((long) (yangConnMatrix.to().tpRef()));
+ constrainingElements.add(to);
+
+ BitSet flags = oldTeConnMatrix.flags();
+
+ TePathAttributes teAttributes = oldTeConnMatrix.teAttributes();
+
+ ConnectivityMatrix updatedConnMatrix = new ConnectivityMatrix(id,
+ from,
+ mergingList,
+ constrainingElements,
+ flags,
+ teAttributes,
+ underlayPath);
+ return updatedConnMatrix;
}
}