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/EnumConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
index f784fa7..1c07f9b 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
@@ -15,6 +15,12 @@
*/
package org.onosproject.teyang.utils.topology;
+import org.onosproject.tetopology.management.api.TeStatus;
+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.TeOperStatus;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.teadminstatus.TeAdminStatusEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.teoperstatus.TeOperStatusEnum;
+
/**
* The Enum conversion functions.
*/
@@ -24,5 +30,104 @@
private EnumConverter() {
}
-// TODO: implementation of this class will be submitted as a separate review.
-}
+ /**
+ * Converts YANG Operation Status Enum to TE Topology TeStatus Enum.
+ *
+ * @param opStatus YANG Operation Status
+ * @return the equivalent Enum from TE Topology TeStatus or null if not
+ * found
+ */
+ public static TeStatus yang2TeSubsystemOpStatus(TeOperStatus opStatus) {
+ switch (opStatus.enumeration()) {
+ case DOWN:
+ return TeStatus.DOWN;
+ case UP:
+ return TeStatus.UP;
+ case MAINTENANCE:
+ return TeStatus.MAINTENANCE;
+ case PREPARING_MAINTENANCE:
+ return TeStatus.PREPARING_MAINTENANCE;
+ case TESTING:
+ return TeStatus.TESTING;
+ case UNKNOWN:
+ return TeStatus.UNKNOWN;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Converts YANG TeAdminStatus Enum to TE Topology TeStatus Enum.
+ *
+ * @param adminStatus YANG Admin Status
+ * @return the equivalent Enum from TE Topology TeStatus or null if not
+ * found
+ */
+ public static TeStatus yang2TeSubsystemAdminStatus(TeAdminStatus adminStatus) {
+ switch (adminStatus.enumeration()) {
+ case DOWN:
+ return TeStatus.DOWN;
+ case UP:
+ return TeStatus.UP;
+ case TESTING:
+ return TeStatus.TESTING;
+ case MAINTENANCE:
+ return TeStatus.MAINTENANCE;
+ case PREPARING_MAINTENANCE:
+ return TeStatus.PREPARING_MAINTENANCE;
+ default:
+ return TeStatus.UNKNOWN;
+ }
+ }
+
+ /**
+ * Converts TE Topology TeStatus Enum to YANG TeAdminStatus Enum.
+ *
+ * @param adminStatus TE Topology admin status
+ * @return the equivalent Enum from YANG TeAdminStatus or null if not found
+ */
+ public static TeAdminStatus teSubsystem2YangAdminStatus(TeStatus adminStatus) {
+ switch (adminStatus) {
+ case DOWN:
+ return TeAdminStatus.of(TeAdminStatusEnum.DOWN);
+ case UP:
+ return TeAdminStatus.of(TeAdminStatusEnum.UP);
+ case TESTING:
+ return TeAdminStatus.of(TeAdminStatusEnum.TESTING);
+ case MAINTENANCE:
+ return TeAdminStatus.of(TeAdminStatusEnum.MAINTENANCE);
+ case PREPARING_MAINTENANCE:
+ return TeAdminStatus.of(TeAdminStatusEnum.PREPARING_MAINTENANCE);
+ case UNKNOWN:
+ return null;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Converts TE Topology TeStatus Enum to YANG TeOperStatus Enum.
+ *
+ * @param opStatus TE Topology operation status
+ * @return the equivalent Enum from YANG TeOperStatus or null if not found
+ */
+ public static TeOperStatus teSubsystem2YangOperStatus(TeStatus opStatus) {
+ switch (opStatus) {
+ case DOWN:
+ return TeOperStatus.of(TeOperStatusEnum.DOWN);
+ case UP:
+ return TeOperStatus.of(TeOperStatusEnum.UP);
+ case TESTING:
+ return TeOperStatus.of(TeOperStatusEnum.TESTING);
+ case MAINTENANCE:
+ return TeOperStatus.of(TeOperStatusEnum.MAINTENANCE);
+ case PREPARING_MAINTENANCE:
+ return TeOperStatus.of(TeOperStatusEnum.PREPARING_MAINTENANCE);
+ case UNKNOWN:
+ return TeOperStatus.of(TeOperStatusEnum.UNKNOWN);
+ default:
+ return null;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
index 6b10176..401d1f9 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
@@ -15,13 +15,130 @@
*/
package org.onosproject.teyang.utils.topology;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+
+import org.onlab.packet.Ip4Address;
+import org.onosproject.tetopology.management.api.KeyId;
+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.CommonLinkData;
+import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
+import org.onosproject.tetopology.management.api.link.DefaultTeLink;
+import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.ExternalLink;
+import org.onosproject.tetopology.management.api.link.LinkBandwidth;
import org.onosproject.tetopology.management.api.link.NetworkLink;
import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
+import org.onosproject.tetopology.management.api.link.OduResource;
+import org.onosproject.tetopology.management.api.link.PathElement;
+import org.onosproject.tetopology.management.api.link.TeLink;
+import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
+import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
+import org.onosproject.tetopology.management.api.link.TePathAttributes;
+import org.onosproject.tetopology.management.api.link.TeTunnelId;
+import org.onosproject.tetopology.management.api.link.TunnelProtectionType;
+import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
+import org.onosproject.tetopology.management.api.link.UnderlayPath;
+import org.onosproject.tetopology.management.api.node.NodeTpKey;
+import org.onosproject.tetopology.management.api.node.TeNode;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TerminationPointKey;
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.topology.rev20151208.ietfnetworktopology
- .networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
+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.Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.LinkId;
+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.DefaultLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
+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.augmentedndnetwork.link.DefaultDestination;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.link.Destination
+ .DestinationBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.link.Source.SourceBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink
+ .SupportingLinkBuilder;
+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.te.topology.rev20160708.ietftetopology.DefaultTeLinkEvent;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
+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.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.AugmentedNwNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.link.AugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.link.DefaultAugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
+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.terminationpoint.AugmentedNtTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig.ConfigBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState.StateBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.TeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay.UnderlayBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.ExternalDomain;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
+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.telinkconnectivityattributes.TeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
+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.TeNodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOperStatus;
+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.TeTpId;
+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;
+
/**
* The conversion functions.
@@ -42,41 +159,828 @@
private LinkConverter() {
}
+ private static LinkProtectionTypeEnum teSubsystem2YangLinkProtectionType(TunnelProtectionType linkProtectionType) {
+ switch (linkProtectionType) {
+ case ENHANCED:
+ return LinkProtectionTypeEnum.ENHANCED;
+ case EXTRA_TRAFFIC:
+ return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
+ case SHARED:
+ return LinkProtectionTypeEnum.SHARED;
+ case UNPROTECTED:
+ return LinkProtectionTypeEnum.UNPROTECTED;
+ case ONE_FOR_ONE:
+ return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
+ case ONE_PLUS_ONE:
+ return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
+ default:
+ return null;
+ }
+ }
+ /**
+ * TE Link Config object conversion from TE Topology subsystem to YANG.
+ *
+ * @param teLink TE link object
+ * @return TE Link Config YANG object
+ */
+ private static Config teLink2YangConfig(TeLink teLink) {
+ checkNotNull(teLink, E_NULL_TELINK_DATA);
+ TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
+
+ if (teLink.teLinkKey() != null) {
+ // what is link index? for now I used teLinkTpId
+ attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
+ }
+
+ if (teLink.adminStatus() != null) {
+ attrBuilder = attrBuilder.adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teLink.adminStatus()));
+ }
+
+ if (teLink.tunnelProtectionType() != null) {
+ attrBuilder = attrBuilder
+ .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
+ .tunnelProtectionType()));
+ }
+
+ attrBuilder = attrBuilder.teDefaultMetric(teLink.cost());
+
+ if (teLink.srlgs() != null) {
+ TeSrlgsBuilder teSrlgsBuilder = DefaultTeSrlgs.builder();
+ for (Long srlgLongVal : teLink.srlgs()) {
+ teSrlgsBuilder = teSrlgsBuilder.addToValue(new Srlg(srlgLongVal));
+ }
+ attrBuilder = attrBuilder.teSrlgs(teSrlgsBuilder.build());
+ }
+ attrBuilder = attrBuilder.isAbstract(teLink.flags().get(TeNode.BIT_ABSTRACT));
+
+ if (teLink.externalLink() != null) {
+ ExternalDomainBuilder edBuilder =
+ DefaultExternalDomain.builder();
+ if (teLink.externalLink().plugId() != null) {
+ edBuilder.plugId(teLink.externalLink().plugId());
+ }
+ if (teLink.externalLink().externalLinkKey() != null) {
+ edBuilder = edBuilder
+ .remoteTeLinkTpId(TeTpId.fromString(
+ String.valueOf(teLink
+ .externalLink()
+ .externalLinkKey()
+ .teLinkTpId())))
+ .remoteTeNodeId(TeNodeId.fromString(
+ String.valueOf(teLink
+ .externalLink()
+ .externalLinkKey()
+ .teNodeId())));
+ }
+ attrBuilder = attrBuilder.externalDomain(edBuilder.build());
+ }
+
+ if (teLink.availBandwidth() != null) {
+ short i = 0;
+ for (float f : teLink.availBandwidth()) {
+ UnreservedBandwidthBuilder urBuilder =
+ DefaultUnreservedBandwidth.builder()
+ .bandwidth(BigDecimal.valueOf(f))
+ .priority(i);
+ i++;
+ attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
+ }
+ }
+
+ if (teLink.maxBandwidth() != null) {
+ // maxBandwidth is an array of float[], but in yang is just a big decimal
+ attrBuilder = attrBuilder.maxLinkBandwidth(BigDecimal.valueOf(teLink.maxBandwidth()[0]));
+ }
+ // FIXME: how to retrieve maxResvLinkBandwidth from teLink
+// if (teLink.maxResvLinkBandwidth() != null) {
+// attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
+// }
+
+ UnderlayBuilder builder = DefaultUnderlay.builder();
+ if (teLink.primaryPath() != null) {
+
+ // TODO: what is underlayProtectionType in tePath?
+ // builder = builder.underlayProtectionType(tePath.protectionType());
+
+ builder = te2YangConfigUnderlayPrimaryPath(builder, teLink);
+ }
+
+ if (teLink.backupPaths() != null) {
+ builder = te2YangConfigUnderlayBackupPaths(builder, teLink);
+ }
+
+ attrBuilder = attrBuilder.underlay(builder.build());
+
+ ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
+ .teLinkAttributes(attrBuilder.build());
+ return yangConfigBuilder.build();
+ }
+
+ /**
+ * TE Link State object conversion from TE Topology subsystem to YANG.
+ *
+ * @param teLink TE link object
+ * @return TE Link State YANG object
+ */
+ private static State teLink2YangState(TeLink teLink) {
+ TeLinkAttributes
+ .TeLinkAttributesBuilder attrBuilder =
+ DefaultTeLinkAttributes
+ .builder()
+ .teDefaultMetric(teLink.cost())
+ .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
+ if (teLink.teLinkKey() != null) {
+ // what is link index? for now I used teLinkTpId
+ attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
+ }
+
+ if (teLink.adminStatus() != null) {
+ attrBuilder = attrBuilder.adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teLink.adminStatus()));
+ }
+ if (teLink.tunnelProtectionType() != null) {
+ attrBuilder = attrBuilder
+ .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
+ .tunnelProtectionType()));
+ }
+ // FIXME: maxBandwidth stuff are array[] in TE but not in yang...
+// if (teLink.maxLinkBandwidth() != null) {
+// attrBuilder = attrBuilder.maxLinkBandwidth(teLink.maxLinkBandwidth());
+// }
+// if (teLink.maxResvLinkBandwidth() != null) {
+// attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
+// }
+ if (teLink.srlgs() != null) {
+ TeSrlgs.TeSrlgsBuilder srlgsBuilder = DefaultTeSrlgs.builder();
+ for (Long srlgLongVal : teLink.srlgs()) {
+ srlgsBuilder = srlgsBuilder.addToValue(new Srlg(srlgLongVal));
+ }
+ attrBuilder = attrBuilder.teSrlgs(srlgsBuilder.build());
+ }
+
+ if (teLink.externalLink() != null) {
+ ExternalDomain.ExternalDomainBuilder edBuilder = DefaultExternalDomain
+ .builder();
+ if (teLink.externalLink().plugId() != null) {
+ edBuilder = edBuilder.plugId(teLink.externalLink().plugId());
+ }
+ if (teLink.externalLink().externalLinkKey() != null) {
+ edBuilder = edBuilder
+ .remoteTeLinkTpId(TeTpId.fromString(String.valueOf(teLink
+ .externalLink()
+ .externalLinkKey()
+ .teLinkTpId())))
+ .remoteTeNodeId(TeNodeId.fromString(String.valueOf(teLink
+ .externalLink()
+ .externalLinkKey()
+ .teNodeId())));
+ }
+ attrBuilder = attrBuilder.externalDomain(edBuilder.build());
+
+ }
+
+ if (teLink.availBandwidth() != null) {
+ short i = 0;
+ for (float f : teLink.availBandwidth()) {
+ UnreservedBandwidth.UnreservedBandwidthBuilder urBuilder = DefaultUnreservedBandwidth
+ .builder()
+ .bandwidth(BigDecimal.valueOf(f))
+ .priority(i);
+ i++;
+ attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
+ }
+ }
+
+ StateBuilder yangStateBuilder = DefaultState.builder()
+ .teLinkAttributes(attrBuilder.build());
+ if (teLink.opStatus() != null) {
+ yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
+ .teSubsystem2YangOperStatus(teLink.opStatus()));
+ }
+
+ if (teLink.sourceTeLinkId() != null) {
+ InformationSourceState.InformationSourceStateBuilder issBuilder = DefaultInformationSourceState.builder();
+
+ Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
+ topologyBuilder = topologyBuilder.clientIdRef(teLink.sourceTeLinkId().clientId())
+ .providerIdRef(teLink.sourceTeLinkId().providerId())
+ .teTopologyIdRef(teLink.sourceTeLinkId().topologyId());
+ issBuilder = issBuilder.topology(topologyBuilder.build());
+ yangStateBuilder.informationSourceState(issBuilder.build());
+ }
+
+ // Once stateDerived underlay is available in yang and core TE Topology
+ // object model, set the value properly
+ // stateDerivedUnderlay = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
+ // .rev20160708.ietftetopology.telinkstatederived.Underlay
+ // yangStateBuilder = yangStateBuilder.underlay(stateDerivedUnderlay);
+
+ return yangStateBuilder.build();
+ }
+
+ /**
+ * Link object conversion from TE Topology subsystem to YANG.
+ *
+ * @param teSubsNetworkLink TE subsystem link object
+ * @return YANG link object
+ */
+ public static Link teSubsystem2YangLink(
+ org.onosproject.tetopology.management.api.link.NetworkLink teSubsNetworkLink) {
+ checkNotNull(teSubsNetworkLink, E_NULL_TELINK);
+
+ LinkId linkId = LinkId.fromString(teSubsNetworkLink.linkId().toString());
+ LinkBuilder builder = DefaultLink.builder().linkId(linkId);
+ if (teSubsNetworkLink.supportingLinkIds() != null) {
+ List<SupportingLink> slinks = Lists.newArrayList();
+ SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
+ for (NetworkLinkKey linkKey : teSubsNetworkLink.supportingLinkIds()) {
+ slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
+ linkKey.networkId().toString()))
+ .linkRef(LinkId.fromString(
+ linkKey.linkId().toString()))
+ .build());
+ }
+ builder = builder.supportingLink(slinks);
+ }
+ if (teSubsNetworkLink.source() != null) {
+ SourceBuilder sourceBuilder = DefaultSource
+ .builder()
+ .sourceNode(NodeId.fromString(
+ teSubsNetworkLink.source().nodeId().toString()))
+ .sourceTp(TpId.fromString(
+ teSubsNetworkLink.source().tpId().toString()));
+ builder = builder.source(sourceBuilder.build());
+ }
+ if (teSubsNetworkLink.destination() != null) {
+ DestinationBuilder destBuilder = DefaultDestination
+ .builder()
+ .destNode(NodeId.fromString(
+ teSubsNetworkLink.destination().nodeId().toString()))
+ .destTp(TpId.fromString(
+ teSubsNetworkLink.destination().tpId().toString()));
+ builder = builder.destination(destBuilder.build());
+ }
+
+ if (teSubsNetworkLink.teLink() != null) {
+ TeLink teData = teSubsNetworkLink.teLink();
+ TeBuilder yangTeBuilder = DefaultTe.builder()
+ .config(teLink2YangConfig(teData))
+ .state(teLink2YangState(teData));
+ // ignoring supportingTeLinkId when converting from core to yang?
+ // if (teData.supportingTeLinkId() != null) {
+ // }
+ AugmentedNtLinkBuilder linkAugmentBuilder =
+ DefaultAugmentedNtLink.builder()
+ .te(yangTeBuilder.build());
+ builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
+ }
+
+ return builder.build();
+ }
+
+ private static UnderlayBuilder te2YangConfigUnderlayPrimaryPath(
+ UnderlayBuilder yangBuilder,
+ TeLink teLink) {
+
+ org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath = teLink.primaryPath();
+
+ UnderlayPrimaryPathBuilder pathBuilder =
+ DefaultUnderlayPrimaryPath.builder();
+ if (tePath.pathElements() != null) {
+ for (PathElement pathElementTe : tePath.pathElements()) {
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.telinkunderlayattributes.underlayprimarypath.PathElement
+ .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
+
+ pathElementYangBuilder = pathElementYangBuilder.pathElementId(pathElementTe.pathElementId());
+ //TODO: add some Type cross converter
+// pathElementYangBuilder = pathElementYangBuilder.type(Type pathElementTe.type())
+
+ pathBuilder = pathBuilder.addToPathElement(pathElementYangBuilder.build());
+ }
+ }
+
+ pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
+ .providerIdRef(teLink.underlayTeTopologyId().providerId())
+ .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+
+ // TODO: get networkRefId from service
+// pathBuilder = pathBuilder.networkIdRef(networkIdRef);
+
+ return yangBuilder.underlayPrimaryPath(pathBuilder.build());
+ }
+
+ private static UnderlayBuilder te2YangConfigUnderlayBackupPaths(UnderlayBuilder yangBuilder,
+ TeLink teLink) {
+ List<UnderlayBackupPath> tePaths = teLink.backupPaths();
+
+ for (UnderlayBackupPath tePath : tePaths) {
+ UnderlayBackupPathBuilder pathBuilder = DefaultUnderlayBackupPath
+ .builder();
+ pathBuilder = pathBuilder.index(tePath.index());
+ pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
+ .providerIdRef(teLink.underlayTeTopologyId().providerId())
+ .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+ // TODO: find networkIdRef from the service
+// pathBuilder = pathBuilder.networkIdRef(networkIdRef);
+
+ for (PathElement backupPathElementTe : tePath.pathElements()) {
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
+ .PathElementBuilder elementBuilder =
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement
+ .builder();
+
+ elementBuilder = elementBuilder.pathElementId(backupPathElementTe.pathElementId());
+ // TODO: add some Type cross conversion
+// elementBuilder.type(type);
+
+ pathBuilder = pathBuilder
+ .addToPathElement(elementBuilder.build());
+ }
+ yangBuilder = yangBuilder
+ .addToUnderlayBackupPath(pathBuilder.build());
+ }
+
+ return yangBuilder;
+ }
+
+ private static TeLink yang2TeLinkAttributes(TeLinkAttributes yangLinkAttr,
+ State opState, Link yangLink,
+ Network yangNetwork,
+ Networks yangNetworks) {
+ TeNodeId teNodeId = findTeNodeId(yangNetwork,
+ yangLink.source().sourceNode(),
+ yangLink.source().sourceTp());
+ long teNodeIdLong = Ip4Address.valueOf(teNodeId.dottedQuad().string()).toInt();
+
+ TeLinkTpKey teLinkKey = new TeLinkTpKey(teNodeIdLong,
+ findTeTpId(yangNetwork,
+ yangLink.source().sourceNode(),
+ yangLink.source().sourceTp()));
+
+ TeNodeId teNodeIdDest = findTeNodeId(yangNetwork,
+ yangLink.destination().destNode(),
+ yangLink.destination().destTp());
+ long teNodeIdDestLong = Ip4Address.valueOf(teNodeIdDest.dottedQuad().string()).toInt();
+
+ TeLinkTpKey peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
+ findTeTpId(yangNetwork,
+ yangLink.destination().destNode(),
+ yangLink.destination().destTp()));
+
+ TeLinkTpGlobalKey supportTeLinkId = findSupportTeLinkId(yangNetworks, yangLink);
+
+ org.onosproject.tetopology.management.api.TeStatus opStatus = null;
+ if (opState != null && opState.operStatus() != null) {
+ opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState.operStatus());
+ }
+
+
+ TeLink teLink = yangLinkAttr2TeLinkAttributes(yangLinkAttr, opStatus, teNodeIdLong, teNodeIdDestLong, teLinkKey,
+ peerTeLinkKey, supportTeLinkId);
+
+ return teLink;
+ }
+
+ private static TeLink yangLinkAttr2TeLinkAttributes(TeLinkAttributes yangLinkAtrr,
+ org.onosproject.tetopology.management.api.TeStatus opStatus,
+ long teNodeIdLong,
+ long teNodeIdDestLong,
+ TeLinkTpKey teLinkKey,
+ TeLinkTpKey peerTeLinkKey,
+ TeLinkTpGlobalKey supportTeLinkId) {
+ org.onosproject.tetopology.management.api.TeStatus adminStatus = null;
+
+ TeLinkTpGlobalKey sourceTeLinkId = null; // from yang to core, we can ignore sourceTeLinkId
+ TeTopologyKey underlayTopologyId = null;
+ CommonLinkData teData = null;
+
+ underlayTopologyId = new TeTopologyKey((long) yangLinkAtrr.underlay().underlayPrimaryPath().providerIdRef(),
+ (long) yangLinkAtrr.underlay().underlayPrimaryPath().clientIdRef(),
+ (long) yangLinkAtrr.underlay().underlayPrimaryPath().teTopologyIdRef());
+
+ if (yangLinkAtrr.adminStatus() != null) {
+ adminStatus = EnumConverter.yang2TeSubsystemAdminStatus(yangLinkAtrr.adminStatus());
+ }
+
+ BitSet flags = new BitSet();
+ if (yangLinkAtrr.isAbstract()) {
+ flags.set(TeLink.BIT_ABSTRACT);
+ }
+
+ ExternalLink externalLink = new ExternalLink(null, yangLinkAtrr.externalDomain().plugId());
+
+ UnderlayPath underlayPath = null;
+ underlayPath = yang2TeSubsystemUnderlayPath(yangLinkAtrr, teNodeIdLong,
+ teNodeIdDestLong);
+ Long adminGroup = Long.valueOf(yangLinkAtrr.administrativeGroup().toString());
+ List<Long> interLayerLocks = null; // FIXME: how to find interLayerLocks?
+
+ List<UnreservedBandwidth> listOfUnreservedBandwidth = yangLinkAtrr.unreservedBandwidth();
+ float[] availBandwidth = new float[listOfUnreservedBandwidth.size()];
+ int i = 0;
+ for (UnreservedBandwidth urbw : listOfUnreservedBandwidth) {
+ availBandwidth[i] = urbw.bandwidth().floatValue();
+ i++;
+ }
+
+ float[] maxBandwidth = new float[1];
+ maxBandwidth[0] = yangLinkAtrr.maxLinkBandwidth().floatValue();
+
+ float[] maxAvailLspBandwidth = null; // FIXME: how to find this?
+ float[] minAvailLspBandwidth = null; // FIXME: how to find this?
+ LinkBandwidth bandwidth = new LinkBandwidth(
+ maxBandwidth,
+ availBandwidth,
+ maxAvailLspBandwidth,
+ minAvailLspBandwidth,
+ null); // FIXME: how to find odu resource?
+ List<Long> srlgs = Lists.newArrayList();
+ for (Srlg srlg : yangLinkAtrr.teSrlgs().value()) {
+ srlgs.add(srlg.uint32());
+ }
+ TePathAttributes teAttributes =
+ new TePathAttributes(yangLinkAtrr.teDefaultMetric(),
+ yangLinkAtrr.performanceMetric().measurement().unidirectionalDelay(),
+ srlgs);
+ teData = new CommonLinkData(adminStatus,
+ opStatus,
+ flags,
+ null, // switchingLayer
+ null, // encodingLayer
+ externalLink,
+ underlayPath,
+ teAttributes,
+ adminGroup,
+ interLayerLocks,
+ bandwidth);
+
+ TeLink te = new DefaultTeLink(teLinkKey, peerTeLinkKey,
+ underlayTopologyId, supportTeLinkId,
+ sourceTeLinkId, teData);
+ return te;
+ }
+
+ private static TeLinkTpGlobalKey findSupportTeLinkId(Networks yangNetworks,
+ Link yangLink) {
+ Network teNetworkFound = null;
+ LinkId teLinkIdFound = null;
+ for (Network ynetItem : yangNetworks.network()) {
+ if (ynetItem.networkId().equals(yangLink.supportingLink().get(0).networkRef())) {
+ teNetworkFound = ynetItem;
+ teLinkIdFound = yangLink.supportingLink().get(0).linkRef();
+ break;
+ }
+ }
+ Link teLinkFound = null;
+ if (teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
+ AugmentedNdNetwork augmentLink =
+ (AugmentedNdNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class);
+ for (Link link : augmentLink.link()) {
+ if (link.linkId().equals(teLinkIdFound)) {
+ teLinkFound = link;
+ break;
+ }
+ }
+ }
+
+ TeNodeId teSupportNodeId = findTeNodeId(teNetworkFound,
+ teLinkFound.source().sourceNode(),
+ teLinkFound.source().sourceTp());
+ long tenIdLong = Ip4Address.valueOf(teSupportNodeId.dottedQuad().string()).toInt();
+ long teSupportLinkTpId = findTeTpId(teNetworkFound,
+ teLinkFound.source().sourceNode(),
+ teLinkFound.source().sourceTp());
+
+ org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
+ if (teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
+ AugmentedNwNetwork augmentTeIds =
+ (AugmentedNwNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class);
+ teTopologyId =
+ new org.onosproject.tetopology.management.api.TeTopologyId(
+ augmentTeIds.te().clientId().uint32(),
+ augmentTeIds.te().providerId().uint32(),
+ augmentTeIds.te().teTopologyId().string());
+ }
+
+ TeLinkTpGlobalKey supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
+ teTopologyId.clientId(),
+ Long.valueOf(teTopologyId
+ .topologyId()),
+ tenIdLong, teSupportLinkTpId);
+
+ return supportTeLinkId;
+ }
+
+ private static TeNodeId findTeNodeId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
+ TeNodeId teNodeId = null;
+ for (Node node : yangNetwork.node()) {
+ if (node.nodeId().equals(yangNodeId)) {
+ if (node.yangAugmentedInfoMap() != null
+ && !node.yangAugmentedInfoMap().isEmpty()) {
+ AugmentedNwNode yangNodeAugment = (AugmentedNwNode) node
+ .yangAugmentedInfo(AugmentedNwNode.class);
+ if (yangNodeAugment != null && yangNodeAugment.te() != null
+ && yangNodeAugment.te().teNodeId() != null) {
+ Te yangNodeAugTe = yangNodeAugment.te();
+ teNodeId = yangNodeAugTe.teNodeId();
+ }
+ }
+ }
+ }
+ return teNodeId;
+ }
+
+ private static long findTeTpId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
+ long teTpId = 0;
+ for (Node node : yangNetwork.node()) {
+ if (node.nodeId().equals(yangNodeId)) {
+ if (node.yangAugmentedInfoMap() != null
+ && !node.yangAugmentedInfoMap().isEmpty()) {
+
+ AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) node
+ .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()) {
+ if (yangTpnode.tpId().equals(yangTpId)) {
+ if (yangTpnode.yangAugmentedInfoMap() != null
+ && !yangTpnode.yangAugmentedInfoMap()
+ .isEmpty()) {
+ AugmentedNtTerminationPoint yangTpAugment =
+ (AugmentedNtTerminationPoint) yangTpnode
+ .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
+ if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
+ teTpId = Long.valueOf(yangTpAugment.te().teTpId().toString());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return teTpId;
+ }
/**
* Link object conversion from YANG to TE Topology subsystem.
*
* @param yangLink YANG link
- * @param networkId YANG networkId
+ * @param yangNetwork YANG network
+ * @param yangNetworks YANG networks
* @return TE subsystem link
*/
public static org.onosproject.tetopology.management.api.link.NetworkLink
- yang2TeSubsystemLink(Link yangLink, NetworkId networkId) {
+ yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
+ Networks yangNetworks) {
+ NetworkId networkId = yangNetwork.networkId();
+ checkNotNull(yangLink, E_NULL_YANG_TELINK);
- //TODO: Implementation will be submitted as a separate review
+ KeyId linkId = KeyId.keyId(yangLink.linkId().uri().toString());
+ NodeTpKey sourceNodeTpKey = null;
+ NodeTpKey destinationNodeTpKey = null;
+ List<NetworkLinkKey> spLinkIds = null;
+ TeLink te = null;
- return null;
+ if (yangLink.supportingLink() != null) {
+ spLinkIds = Lists.newArrayList();
+ for (SupportingLink yangSpLink : yangLink.supportingLink()) {
+ NetworkLinkKey linkKey = new NetworkLinkKey(KeyId.keyId(yangSpLink.networkRef().uri().toString()),
+ KeyId.keyId(yangSpLink.linkRef().uri().toString()));
+ spLinkIds.add(linkKey);
+ }
+ }
+
+ if (yangLink.source() != null) {
+ TerminationPointKey source = new TerminationPointKey(
+ KeyId.keyId(networkId.uri().toString()),
+ KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
+ KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
+ sourceNodeTpKey = new NodeTpKey(source.nodeId(), source.tpId());
+ }
+
+ if (yangLink.destination() != null) {
+ TerminationPointKey destination = new TerminationPointKey(
+ KeyId.keyId(networkId.uri().toString()),
+ KeyId.keyId(yangLink.destination().destNode().uri().toString()),
+ KeyId.keyId(yangLink.destination().destTp().uri().toString()));
+ destinationNodeTpKey = new NodeTpKey(destination.nodeId(), destination.tpId());
+ }
+
+ if (yangLink.yangAugmentedInfoMap() != null && !yangLink.yangAugmentedInfoMap().isEmpty()) {
+
+ AugmentedNtLink yangLinkAugment =
+ (AugmentedNtLink) yangLink.yangAugmentedInfo(AugmentedNtLink.class);
+ if (yangLinkAugment != null &&
+ yangLinkAugment.te() != null &&
+ yangLinkAugment.te().config() != null) {
+ TeLinkAttributes yangLinkAtrr =
+ yangLinkAugment.te().config().teLinkAttributes();
+ if (yangLinkAtrr != null && yangLinkAtrr.linkIndex() != null) {
+ te = yang2TeLinkAttributes(yangLinkAtrr,
+ yangLinkAugment.te().state(),
+ yangLink, yangNetwork,
+ yangNetworks);
+ }
+ }
+ }
+
+ org.onosproject.tetopology.management.api.link.DefaultNetworkLink link =
+ new DefaultNetworkLink(linkId,
+ sourceNodeTpKey,
+ destinationNodeTpKey,
+ spLinkIds,
+ te);
+ return link;
}
- public static Link teSubsystem2YangLink(NetworkLink link) {
+ private static org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath
+ yang2TeSubsystemUnderlayPrimaryPath(UnderlayPrimaryPath yangpath,
+ long teNodeId) {
+ org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath = null;
- //TODO: Implementation will be submitted as a separate review
+ List<PathElement> pathElementList = Lists.newArrayList();
+ for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+ .telinkunderlayattributes.underlayprimarypath.
+ PathElement pathElementConfigYang : yangpath.pathElement()) {
- return null;
+ // TODO: find the proper type (ElementType) from pathElementConfigYang.type()
+ PathElement tePathElement = new PathElement(pathElementConfigYang.pathElementId(),
+ teNodeId,
+ null,
+ false); // FIXME: how to find the proper value for loose?
+ pathElementList.add(tePathElement);
+ }
+
+ teUnderlayPrimaryPath = new org.onosproject.tetopology.management.api.link.
+ UnderlayPrimaryPath(pathElementList, false); // FIXME: how to find the proper value for loose?
+
+ return teUnderlayPrimaryPath;
+ }
+
+ private static List<UnderlayBackupPath>
+ yang2TeSubsystemUnderlayBackupPaths(
+ List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+ rev20160708.ietftetopology.telinkunderlayattributes.
+ UnderlayBackupPath> yangpaths,
+ long teNodeId) {
+
+ List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
+ for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.telinkunderlayattributes.
+ UnderlayBackupPath yangConfig : yangpaths) {
+ UnderlayBackupPath ubp = null;
+ List<PathElement> backupPathElementList = Lists.newArrayList();
+ for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+ .telinkunderlayattributes.underlaybackuppath.
+ PathElement pathElementBackupYang : yangConfig.pathElement()) {
+
+ PathElement tePathElementBackup = new PathElement(pathElementBackupYang.pathElementId(),
+ teNodeId,
+ null, // FIXME: find the proper ElementType
+ // from pathElementBackupYang.type()
+ false); // FIXME: find the proper value for loose
+ backupPathElementList.add(tePathElementBackup);
+ }
+ ubp = new UnderlayBackupPath(yangConfig.index(),
+ backupPathElementList,
+ null); // FIXME: find the proper value for loose
+ underlayBackupPathsList.add(ubp);
+ }
+
+ return underlayBackupPathsList;
+ }
+
+ /**
+ * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
+ *
+ * @param yangLinkAtrr YANG link Config YANG object
+ * @return teSubsystem TE underlay path object
+ */
+ private static org.onosproject.tetopology.management.api.link.UnderlayPath
+ yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
+
+ checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
+
+ org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath underlayPrimaryPath = null;
+ List<UnderlayBackupPath> underlayBackupPathsList = null;
+ TeTunnelId teTunnelId = new TeTunnelId(srcTeNodeId, dstTeNodeId, 0); // FIXME: how to find teTunnelId?
+
+ if (yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
+ underlayPrimaryPath =
+ yang2TeSubsystemUnderlayPrimaryPath(yangLinkAtrr.underlay().underlayPrimaryPath(), srcTeNodeId);
+ }
+
+ if (yangLinkAtrr.underlay().underlayBackupPath() != null) {
+ underlayBackupPathsList =
+ yang2TeSubsystemUnderlayBackupPaths(yangLinkAtrr.underlay().underlayBackupPath(), srcTeNodeId);
+ }
+
+ org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay =
+ new org.onosproject.tetopology.management.api.link.
+ UnderlayPath(underlayPrimaryPath,
+ underlayBackupPathsList,
+ TunnelProtectionType.of(yangLinkAtrr.underlay().underlayProtectionType()),
+ (long) yangLinkAtrr.underlay().underlayTrailSrc().tpRef(), // Is this correct?
+ (long) yangLinkAtrr.underlay().underlayTrailDes().tpRef(), // Is this correct?
+ teTunnelId);
+
+ return teUnderlay;
+ }
+
+ /**
+ * Converts a TE Topology link event from the data format used in
+ * the core to its corresponding YANG Object (YO) format.
+ *
+ * @param eventType Link event type
+ * @param linkData TE Topology link event data
+ * @return YANG Object converted from linkData
+ */
+ public static TeLinkEvent teNetworkLink2yangTeLinkEvent(TeTopologyEventTypeEnum eventType,
+ NetworkLink linkData) {
+ TeLinkEvent.TeLinkEventBuilder builder = new DefaultTeLinkEvent.TeLinkEventBuilder();
+
+ TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
+ builder.eventType(yangEventType);
+ LinkId linkId = LinkId.fromString(linkData.linkId().toString());
+ builder.linkRef(linkId);
+
+ TeLinkAttributes teLinkAttributes = teLink2YangConfig(linkData.teLink()).teLinkAttributes();
+ builder.teLinkAttributes(teLinkAttributes);
+
+ return builder.build();
}
public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
-
//TODO: Implementation will be submitted as a separate review
+ NetworkId networkRef = (NetworkId) (yangLinkEvent.networkRef());
+ LinkId linkRef = (LinkId) (yangLinkEvent.linkRef());
+ KeyId networkId = KeyId.keyId(networkRef.uri().toString());
+ KeyId linkId = KeyId.keyId(linkRef.uri().toString());
- return null;
+ NetworkLinkKey networkLinkKey = new NetworkLinkKey(networkId, linkId);
+
+ return networkLinkKey;
}
public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
TeTopologyService teTopologyService) {
- //TODO: Implementation will be submitted as a separate review
+ KeyId linkId = yangLinkEvent2NetworkLinkKey(yangLinkEvent).linkId();
- return null;
+ org.onosproject.tetopology.management.api.
+ Network network = teTopologyService.network(
+ yangLinkEvent2NetworkLinkKey(yangLinkEvent).networkId());
+ if (network == null) {
+ return null;
+ }
+
+ NetworkLink networkLink = network.link(linkId);
+ if (networkLink == null) {
+ return null;
+ }
+
+ NodeTpKey sourceTp = networkLink.source();
+ NodeTpKey destTp = networkLink.destination();
+
+ List<NetworkLinkKey> supportingLinkIds = networkLink.supportingLinkIds();
+ TeLink teLink = networkLink.teLink();
+ if (teLink == null) {
+ return null;
+ }
+
+ TeOperStatus opState = yangLinkEvent.operStatus();
+ org.onosproject.tetopology.management.api.
+ TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
+
+ TeLink updatedTeLink = yangLinkEvent2TeLinkAttributes(yangLinkEvent, teLink, opStatus);
+
+
+ NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId, sourceTp, destTp, supportingLinkIds,
+ updatedTeLink);
+
+ return updatedNetworkLink;
+ }
+
+ private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent, TeLink oldTeLink, TeStatus
+ opStatus) {
+
+ TeLinkAttributes yangTeLinkAttrs = yangLinkEvent.teLinkAttributes();
+
+ TeLinkTpKey teLinkKey = oldTeLink.teLinkKey();
+
+
+ long teNodeIdDest = oldTeLink.peerTeLinkKey().teNodeId();
+ long teNodeId = oldTeLink.teLinkKey().teNodeId();
+ TeLinkTpGlobalKey supportTeLinkId = oldTeLink.supportingTeLinkId();
+ TeLinkTpKey peerTeLinkKey = oldTeLink.peerTeLinkKey();
+
+ TeLink updatedTeLink = yangLinkAttr2TeLinkAttributes(yangTeLinkAttrs, opStatus, teNodeId, teNodeIdDest,
+ teLinkKey, peerTeLinkKey, supportTeLinkId);
+
+ return updatedTeLink;
}
}
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
index 2205778..f87b0b1 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
@@ -57,6 +57,9 @@
.networks.network.augmentedndnetwork.Link;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
.IetfTeTopologyEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.IetfTeTopologyEventSubject;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
+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.networks
.network.AugmentedNwNetwork;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
@@ -75,6 +78,7 @@
.tetopologytype.TeTopology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -228,10 +232,10 @@
org.onosproject.tetopology.management.api.Network teNetwork;
if (stateNetwork == null) {
log.info("networkId {} can't be found in yangNetworkStates",
- network.networkId());
- teNetwork = yang2TeSubsystemNetwork(network);
+ network.networkId());
+ teNetwork = yang2TeSubsystemNetwork(network, yangNetworks);
} else {
- teNetwork = yang2TeSubsystemNetwork(network, stateNetwork);
+ teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks);
}
networks.add(teNetwork);
}
@@ -388,15 +392,17 @@
/**
* Network conversion from YANG to TE Topology subsystem.
*
- * @param yangNetwork Network YANG object
+ * @param yangNetwork Network YANG object
* @param yangNetworkState NetworkState YANG object
+ * @param yangNetworks Networks YANG object
* @return TE Topology subsystem defaultNetwork object
*/
private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
- Network yangNetwork,
- org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
- yang.ietf.network.rev20151208.ietfnetwork.networksstate.
- Network yangNetworkState) {
+ Network yangNetwork,
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
+ yang.ietf.network.rev20151208.ietfnetwork.networksstate.
+ Network yangNetworkState,
+ Networks yangNetworks) {
checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
String networkId = yangNetwork.networkId().uri().string();
@@ -424,7 +430,7 @@
for (Node node : yangNetwork.node()) {
// Convert the Yang Node to a TE node.
teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
- NodeConverter.yang2TeSubsystemNode(node, yangNetwork.networkId()));
+ NodeConverter.yang2TeSubsystemNode(node, yangNetwork));
}
}
@@ -436,7 +442,7 @@
for (Link link : augmentLink.link()) {
// Convert the Yang Link to a TE link.
teLinks.put(KeyId.keyId(link.linkId().uri().string()),
- LinkConverter.yang2TeSubsystemLink(link, yangNetwork.networkId()));
+ LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
}
}
@@ -466,35 +472,30 @@
* Network object conversion from YANG to TE Topology subsystem.
*
* @param yangNetwork Network YANG object
+ * @param yangNetworks Networks YANG object
* @return network TE Topology subsystem networks object
*/
- public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork) {
- return yang2TeDefaultNetwork(yangNetwork, null);
+ public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
+ Networks yangNetworks) {
+ return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks);
}
/**
* Network and State object conversion from YANG to TE Topology subsystem.
*
- * @param yangNetwork Network YANG object
+ * @param yangNetwork Network YANG object
* @param yangNetworkState NetworkState YANG object
+ * @param yangNetworks Networks YANG object
* @return teSubsystem TE Topology subsystem networks object
*/
- public static org.onosproject.tetopology.management.api.Network
- yang2TeSubsystemNetwork(Network yangNetwork,
- org.onosproject.yang.gen
- .v1.urn.ietf
- .params.xml.ns
- .yang.ietf
- .network
- .rev20151208.ietfnetwork
- .networksstate
- .Network
- yangNetworkState) {
+ public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
+ org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
+ .networksstate.Network yangNetworkState, Networks yangNetworks) {
checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
- yang2TeDefaultNetwork(yangNetwork, yangNetworkState);
+ yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks);
String networkref = yangNetworkState.networkRef().toString();
checkState(teNetwork.networkId().toString().equals(networkref),
@@ -511,8 +512,69 @@
* @return YANG Object converted from event
*/
public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
- // TODO: implementation will be submitted as a seperate review.
- return null;
+ IetfTeTopologyEvent yangEvent = null;
+ IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
+
+ IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
+ if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
+ NetworkLink eventData = (NetworkLink) event.subject();
+ TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
+ TeLinkEvent yangLinkEvent = LinkConverter.teNetworkLink2yangTeLinkEvent(linkEventType, eventData);
+ eventSubject.teLinkEvent(yangLinkEvent);
+ yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
+ } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
+ NetworkNode eventData = (NetworkNode) event.subject();
+ TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
+ TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
+ eventSubject.teNodeEvent(yangNodeEvent);
+ yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
+ }
+
+ return yangEvent;
+ }
+
+ private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
+ IetfTeTopologyEvent.Type returnType = null;
+
+ switch (type) {
+ case LINK_ADDED:
+ case LINK_REMOVED:
+ case LINK_UPDATED:
+ returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
+ break;
+ case NODE_ADDED:
+ case NODE_REMOVED:
+ case NODE_UPDATED:
+ returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
+ break;
+ default:
+ log.error("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
+ }
+
+ return returnType;
+ }
+
+ private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
+ TeTopologyEventTypeEnum returnType = null;
+
+ switch (type) {
+ case LINK_ADDED:
+ case NODE_ADDED:
+ returnType = TeTopologyEventTypeEnum.ADD;
+ break;
+ case LINK_REMOVED:
+ case NODE_REMOVED:
+ returnType = TeTopologyEventTypeEnum.REMOVE;
+ break;
+ case LINK_UPDATED:
+ case NODE_UPDATED:
+ returnType = TeTopologyEventTypeEnum.UPDATE;
+ break;
+ default:
+ log.error("teTopoEventType2YangTeTopoEventType: unknown type: {}", type);
+ }
+
+ return returnType;
}
}
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;
}
}
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
index 2084f3e..18ac803 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
@@ -15,8 +15,43 @@
*/
package org.onosproject.teyang.utils.topology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
- .networks.network.node.augmentedndnode.TerminationPoint;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.onosproject.tetopology.management.api.KeyId;
+import org.onosproject.tetopology.management.api.node.TerminationPointKey;
+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.NodeId;
+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.node.augmentedndnode.DefaultTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.node.augmentedndnode.terminationpoint
+ .DefaultSupportingTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+ .ietfnetworktopology.networks.network.node.augmentedndnode.terminationpoint
+ .SupportingTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.DefaultInterfaceSwitchingCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.InterfaceSwitchingCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.interfaceswitchingcapability.DefaultMaxLspBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.interfaceswitchingcapability.MaxLspBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.node.terminationpoint.AugmentedNtTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+ .ietftetopology.networks.network.node.terminationpoint.DefaultAugmentedNtTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
+
+import com.google.common.collect.Lists;
/**
* The termination point translations.
@@ -38,13 +73,79 @@
* @param teSubsystem TE Topology subsystem termination point
* @return Termination point in YANG Java data structure
*/
- public static TerminationPoint teSubsystem2YangTerminationPoint(
- org.onosproject.tetopology.management.api.node.TerminationPoint teSubsystem) {
+ public static TerminationPoint teSubsystem2YangTerminationPoint(org.onosproject.tetopology.management.api.node.
+ TerminationPoint teSubsystem) {
+ checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_TP);
- //TODO: implementation to be submitted as a separate review
- return null;
+ TpId tpId = TpId.fromString(teSubsystem.tpId().toString());
+ TerminationPoint.TerminationPointBuilder builder =
+ new DefaultTerminationPoint.TerminationPointBuilder().tpId(tpId);
+
+ if (teSubsystem.supportingTpIds() != null) {
+ List<SupportingTerminationPoint> tps = Lists.newArrayList();
+ SupportingTerminationPoint.SupportingTerminationPointBuilder
+ spTpBuilder = DefaultSupportingTerminationPoint.builder();
+ for (TerminationPointKey tpKey : teSubsystem.supportingTpIds()) {
+ tps.add(spTpBuilder.networkRef(NetworkId.fromString(tpKey.networkId().toString()))
+ .nodeRef(NodeId.fromString(tpKey.nodeId().toString()))
+ .tpRef(TpId.fromString(tpKey.tpId().toString()))
+ .build());
+ }
+ builder = builder.supportingTerminationPoint(tps);
+ }
+
+ if (teSubsystem.teTpId() != null) {
+ AugmentedNtTerminationPoint.AugmentedNtTerminationPointBuilder
+ tpAugmentBuilder = DefaultAugmentedNtTerminationPoint.builder();
+
+ TeBuilder yangTeBuilder = DefaultTe.builder();
+
+ yangTeBuilder = yangTeBuilder.teTpId(TeTpId.fromString((String.valueOf(teSubsystem.teTpId()))));
+
+ Config yConfig = teSubsystem2YangTeAugConfig(teSubsystem);
+ yangTeBuilder = yangTeBuilder.config(yConfig);
+
+ State yState = teSubsystem2YangTeAugState(teSubsystem);
+ yangTeBuilder = yangTeBuilder.state(yState);
+
+ tpAugmentBuilder = tpAugmentBuilder.te(yangTeBuilder.build());
+ builder.addYangAugmentedInfo(tpAugmentBuilder.build(), AugmentedNtTerminationPoint.class);
+ }
+
+ return builder.build();
}
+ private static State teSubsystem2YangTeAugState(org.onosproject.tetopology.management.api.node.
+ TerminationPoint teSubsystemTe) {
+ State.StateBuilder yangStateBuilder = DefaultState.builder();
+ // FIXME: interLayerLocks is a list in core but not in yang
+// yangStateBuilder = yangStateBuilder.interLayerLockId(teLink.interLayerLocks().get(0));
+
+ return yangStateBuilder.build();
+ }
+
+ private static Config teSubsystem2YangTeAugConfig(org.onosproject.tetopology.management.api.node.
+ TerminationPoint teSubsystemTe) {
+ Config.ConfigBuilder yangConfigBuilder = DefaultConfig.builder();
+ //FIXME: interLayerLocks is a list in core but not in yang
+ // yangConfigBuilder =
+ // yangConfigBuilder.interLayerLockId(teLink.interLayerLocks().get(0));
+
+ InterfaceSwitchingCapability.InterfaceSwitchingCapabilityBuilder isc =
+ DefaultInterfaceSwitchingCapability.builder();
+
+ MaxLspBandwidth.MaxLspBandwidthBuilder maxlspBW = DefaultMaxLspBandwidth
+ .builder();
+// for (float f : teLink.maxAvialLspBandwidth()) {
+// // is converting from float to long ok?
+// maxlspBW = maxlspBW.bandwidth(BigDecimal.valueOf((long) f));
+// isc = isc.addToMaxLspBandwidth(maxlspBW.build());
+// }
+
+ yangConfigBuilder = yangConfigBuilder.addToInterfaceSwitchingCapability(isc.build());
+
+ return yangConfigBuilder.build();
+ }
/**
* TerminationPoint object translation from YANG to TE Topology subsystem.
@@ -53,10 +154,38 @@
* @return TerminationPoint TE Topology subsystem termination point
*/
public static org.onosproject.tetopology.management.api.node.TerminationPoint
- yang2teSubsystemTerminationPoint(TerminationPoint yangTp) {
+ yang2teSubsystemTerminationPoint(TerminationPoint yangTp) {
+ checkNotNull(yangTp, E_NULL_YANG_TP);
- // TODO: implementation to be submitted as separate review
- return null;
+ org.onosproject.tetopology.management.api.node.DefaultTerminationPoint tp = null;
+ List<org.onosproject.tetopology.management.api.node.TerminationPointKey> spTps = null;
+ KeyId teTpId = null;
+
+ if (yangTp.supportingTerminationPoint() != null) {
+ spTps = Lists.newArrayList();
+ for (SupportingTerminationPoint yangSptp : yangTp.supportingTerminationPoint()) {
+ org.onosproject.tetopology.management.api.node.TerminationPointKey tpKey =
+ new org.onosproject.tetopology.management.api.node.TerminationPointKey(
+ KeyId.keyId(yangSptp.networkRef().uri().string()),
+ KeyId.keyId(yangSptp.nodeRef().uri().string()),
+ KeyId.keyId(yangSptp.tpRef().uri().string()));
+ spTps.add(tpKey);
+ }
+ }
+
+ if (yangTp.yangAugmentedInfoMap() != null && !yangTp.yangAugmentedInfoMap().isEmpty()) {
+ AugmentedNtTerminationPoint yangTpAugment =
+ (AugmentedNtTerminationPoint) yangTp.yangAugmentedInfo(AugmentedNtTerminationPoint.class);
+ if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
+ teTpId = KeyId.keyId(yangTpAugment.te().teTpId().toString());
+ }
+ }
+
+ tp = new org.onosproject.tetopology.management.api.node
+ .DefaultTerminationPoint(KeyId.keyId(yangTp.tpId().uri().string()),
+ spTps,
+ Long.valueOf(teTpId.toString()));
+ return tp;
}
}
diff --git a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
index 442b65f..2fd6aec 100644
--- a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
+++ b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
@@ -270,7 +270,7 @@
//Convert the YO to TE Core data and update TE Core.
for (Network nw : ietfNetwork.networks().network()) {
topologyProviderService.networkUpdated(
- NetworkConverter.yang2TeSubsystemNetwork(nw));
+ NetworkConverter.yang2TeSubsystemNetwork(nw, ietfNetwork.networks()));
}
}