blob: f8aeca2b1544abc3166ceb9012a8f67c54561cf5 [file] [log] [blame]
/*
* Copyright 2016 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.teyang.utils.topology;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.List;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpAddress.Version;
import org.onosproject.tetopology.management.api.KeyId;
import org.onosproject.tetopology.management.api.link.ElementType;
import org.onosproject.tetopology.management.api.link.ExternalDomain;
import org.onosproject.tetopology.management.api.link.LinkProtectionType;
import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
import org.onosproject.tetopology.management.api.link.PathElement;
import org.onosproject.tetopology.management.api.link.TeIpv4;
import org.onosproject.tetopology.management.api.link.TeLink;
import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
import org.onosproject.tetopology.management.api.link.UnderlayPath;
import org.onosproject.tetopology.management.api.node.TeNetworkTopologyId;
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.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.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.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.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.Underlay;
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.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.DefaultUnderlayTrailDes.UnderlayTrailDesBuilder;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayTrailSrc.UnderlayTrailSrcBuilder;
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.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement.PathElementBuilder;
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.TeLinkAccessType;
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.TeTopologyId;
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.explicitroutesubobject.Type;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.AsNumber;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultAsNumber;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultIpv4Address;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.Ipv4Address;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.UnnumberedLink;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
.ietftetypes.telinkaccesstype.TeLinkAccessTypeEnum;
import com.google.common.collect.Lists;
/**
* The conversion functions.
*/
public final class LinkConverter {
private static final String
E_NULL_TELINK_UNDERLAY_PATH = "TeSubsystem link underlayPath object cannot be null";
private static final String
E_NULL_TELINK_DATA = "TeSubsystem teLinkAttrBuilder data cannot be null";
private static final String
E_NULL_TELINK = "TeSubsystem teLink object cannot be null";
private static final String
E_NULL_YANG_TELINK_CONFIG = "YANG telink config object cannot be null";
private static final String
E_NULL_YANG_TELINK = "YANG Link object cannot be null";
// no instantiation
private LinkConverter() {
}
private static UnderlayBuilder te2YangConfigUnderlayPrimaryPath(
UnderlayBuilder yangBuilder,
org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath) {
UnderlayPrimaryPathBuilder pathBuilder =
DefaultUnderlayPrimaryPath.builder();
if (tePath.pathElements() != null) {
for (PathElement pathElementTe : tePath.pathElements()) {
PathElementBuilder pathElementYangBuilder = DefaultPathElement
.builder();
pathElementYangBuilder = pathElementYangBuilder
.pathElementId(pathElementTe.pathElementId())
.type(findYangTypeConfigPrimaryPath(pathElementTe.type()));
pathBuilder = pathBuilder
.addToPathElement(pathElementYangBuilder.build());
}
}
pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
tePath.ref().getNetworkId().toString()))
.teTopologyIdRef(TeTopologyId.fromString(
tePath.ref().getTopologyId().topologyId()));
return yangBuilder.underlayPrimaryPath(pathBuilder.build());
}
private static UnderlayBuilder te2YangConfigUnderlayBackupPaths(
UnderlayBuilder yangBuilder,
List<org.onosproject.tetopology.management.api.link.UnderlayBackupPath> tePaths) {
for (UnderlayBackupPath tePath : tePaths) {
UnderlayBackupPathBuilder pathBuilder = DefaultUnderlayBackupPath.builder();
pathBuilder = pathBuilder.index(tePath.index());
pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
tePath.ref().getNetworkId().toString()))
.teTopologyIdRef(TeTopologyId.fromString(
tePath.ref().getTopologyId().topologyId()));
for (PathElement backupPathElementTe : tePath.pathElements()) {
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
.ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement.
PathElementBuilder backupPathElementYangBuilder =
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
.ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement.builder();
backupPathElementYangBuilder = backupPathElementYangBuilder
.pathElementId(backupPathElementTe.pathElementId());
backupPathElementYangBuilder = backupPathElementYangBuilder
.type(findYangTypeConfigPrimaryPath(backupPathElementTe
.type()));
pathBuilder = pathBuilder.addToPathElement(backupPathElementYangBuilder.build());
}
yangBuilder = yangBuilder.addToUnderlayBackupPath(pathBuilder.build());
}
return yangBuilder;
}
private static Type findYangTypeConfigPrimaryPath(ElementType type) {
if (type instanceof org.onosproject.tetopology.management.api.link.AsNumber) {
AsNumber.AsNumberBuilder yangAsNumberBuilder = DefaultAsNumber
.builder();
yangAsNumberBuilder.asNumber(((AsNumber) type).asNumber());
return yangAsNumberBuilder.build();
} else if (type instanceof TeIpv4) {
Ipv4Address.Ipv4AddressBuilder yangIpv4AddrBuilder = DefaultIpv4Address
.builder();
yangIpv4AddrBuilder = yangIpv4AddrBuilder
.v4Address(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types
.rev20130715.ietfinettypes.Ipv4Address(((TeIpv4) type)
.v4Address().toString()));
yangIpv4AddrBuilder = yangIpv4AddrBuilder
.v4Loose(((TeIpv4) type).v4Loose());
yangIpv4AddrBuilder = yangIpv4AddrBuilder
.v4PrefixLength((((TeIpv4) type).v4PrefixLength()));
return yangIpv4AddrBuilder.build();
} else if (type instanceof org.onosproject.tetopology.management.api.link.UnnumberedLink) {
UnnumberedLink.UnnumberedLinkBuilder unnumberedLinkBuilder = DefaultUnnumberedLink.builder();
unnumberedLinkBuilder.routerId(org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
.inet.types.rev20130715.ietfinettypes.IpAddress
.fromString(((org.onosproject.tetopology.management.api.link.UnnumberedLink) type)
.routerId().toString()))
.interfaceId(((org.onosproject.tetopology.management.api.link.UnnumberedLink) type)
.interfaceId());
return unnumberedLinkBuilder.build();
}
return null;
}
/**
* TE Link underlay path Config object conversion from TE Topology subsystem to YANG.
*
* @param tePath TE underlay path object
* @return Link underlay path Config YANG object
*/
private static Underlay teSubsystem2YangConfigUnderlayPath(UnderlayPath tePath) {
checkNotNull(tePath, E_NULL_TELINK_UNDERLAY_PATH);
UnderlayBuilder builder =
DefaultUnderlay.builder().underlayProtectionType(tePath.protectionType());
if (tePath.primaryPath() != null) {
builder = te2YangConfigUnderlayPrimaryPath(builder, tePath.primaryPath());
}
if (tePath.trailSrc() != null) {
builder = builder.underlayTrailSrc(
new UnderlayTrailSrcBuilder()
.networkRef(NetworkId.fromString(
tePath.trailSrc().networkId().toString()))
.nodeRef(NodeId.fromString(
tePath.trailSrc().nodeId().toString()))
.tpRef(TpId.fromString(
tePath.trailSrc().tpId().toString()))
.build());
}
if (tePath.trailDes() != null) {
builder = builder.underlayTrailDes(
new UnderlayTrailDesBuilder()
.networkRef(NetworkId.fromString(
tePath.trailDes().networkId().toString()))
.nodeRef(NodeId.fromString(
tePath.trailDes().nodeId().toString()))
.tpRef(TpId.fromString(
tePath.trailDes().tpId().toString()))
.build());
}
if (tePath.backupPaths() != null) {
builder = te2YangConfigUnderlayBackupPaths(builder, tePath.backupPaths());
}
return builder.build();
}
private static Config teLink2YangConfig(TeLinkAttributesBuilder teLinkAttrBuilder) {
checkNotNull(teLinkAttrBuilder, E_NULL_TELINK_DATA);
ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
.teLinkAttributes(teLinkAttrBuilder.build());
return yangConfigBuilder.build();
}
private static TeLinkAttributesBuilder teLink2YangAttrBuilder(TeLink teLink) {
checkNotNull(teLink, E_NULL_TELINK_DATA);
TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
if (teLink.linkIndex() != null) {
attrBuilder = attrBuilder.linkIndex(teLink.linkIndex());
}
if (teLink.name() != null) {
attrBuilder = attrBuilder.name(teLink.name());
}
if (teLink.adminStatus() != null) {
attrBuilder = attrBuilder
.adminStatus(EnumConverter
.teSubsystem2YangAdminStatus(teLink
.adminStatus()));
}
if (teLink.accessType() != null) {
attrBuilder = attrBuilder
.accessType(teSubsystem2YangTeLinkAccess(teLink
.accessType()));
}
if (teLink.linkProtectionType() != null) {
attrBuilder = attrBuilder
.linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
.linkProtectionType()));
}
if (teLink.maxLinkBandwidth() != null) {
attrBuilder = attrBuilder.maxLinkBandwidth(teLink.maxLinkBandwidth());
}
if (teLink.maxResvLinkBandwidth() != null) {
attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
}
attrBuilder = attrBuilder.teDefaultMetric(teLink.teDefaultMetric());
if (teLink.teSrlgs() != null) {
TeSrlgsBuilder teSrlgsBuilder = DefaultTeSrlgs.builder();
for (Long srlgLongVal : teLink.teSrlgs()) {
teSrlgsBuilder = teSrlgsBuilder.addToValue(new Srlg(srlgLongVal));
}
attrBuilder = attrBuilder.teSrlgs(teSrlgsBuilder.build());
}
attrBuilder = attrBuilder.isAbstract(teLink.isAbstract());
if (teLink.underlayPath() != null) {
attrBuilder = attrBuilder.underlay(
teSubsystem2YangConfigUnderlayPath(teLink.underlayPath()));
}
if (teLink.externalDomain() != null) {
ExternalDomainBuilder edBuilder =
DefaultExternalDomain.builder()
.plugId(teLink.externalDomain().plugId())
.remoteTeLinkTpId(TeTpId.fromString(
teLink.externalDomain().remoteTeLinkTpId().toString()))
.remoteTeNodeId(TeNodeId.fromString(
teLink.externalDomain().remoteTeNodeId().toString()));
attrBuilder = attrBuilder.externalDomain(edBuilder.build());
}
if (teLink.unreservedBandwidths() != null) {
for (org.onosproject.tetopology.management.api.link.UnreservedBandwidth unResBwTe :
teLink.unreservedBandwidths()) {
UnreservedBandwidthBuilder urBuilder =
DefaultUnreservedBandwidth.builder()
.bandwidth(unResBwTe.bandwidth())
.priority(unResBwTe.priority());
attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
}
}
return attrBuilder;
}
private static LinkProtectionTypeEnum
teSubsystem2YangLinkProtectionType(LinkProtectionType 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 YANGAUTOPREFIX1_FOR_1:
return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
case YANGAUTOPREFIX1_PLUS_1:
return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
default:
return null;
}
}
private static TeLinkAccessType teSubsystem2YangTeLinkAccess(
org.onosproject.tetopology.management.api.link.TeLinkAccessType accessType) {
switch (accessType) {
case MULTI_ACCESS:
return TeLinkAccessType.of(TeLinkAccessTypeEnum.MULTI_ACCESS);
case POINT_TO_POINT:
return TeLinkAccessType.of(TeLinkAccessTypeEnum.POINT_TO_POINT);
default:
return null;
}
}
private static State teLink2YangState(TeLinkAttributesBuilder teLinkAttrBuilder, TeLink teLink) {
StateBuilder yangStateBuilder = DefaultState.builder()
.teLinkAttributes(teLinkAttrBuilder.build());
if (teLink.opStatus() != null) {
yangStateBuilder = yangStateBuilder
.operStatus(EnumConverter
.teSubsystem2YangOperStatus(teLink
.opStatus()));
}
// TODO: once stateDerived Underlay is available in 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 teLink TE subsystem link object
* @return YANG link object
*/
public static Link teSubsystem2YangLink(
org.onosproject.tetopology.management.api.link.NetworkLink teLink) {
checkNotNull(teLink, E_NULL_TELINK);
LinkId linkId = LinkId.fromString(teLink.linkId().toString());
LinkBuilder builder = DefaultLink.builder().linkId(linkId);
if (teLink.getSupportingLinkIds() != null) {
List<SupportingLink> slinks = Lists.newArrayList();
SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
for (NetworkLinkKey linkKey : teLink.getSupportingLinkIds()) {
slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
linkKey.networkId().toString()))
.linkRef(LinkId.fromString(
linkKey.linkId().toString()))
.build());
}
builder = builder.supportingLink(slinks);
}
if (teLink.getSource() != null) {
SourceBuilder sourceBuilder = DefaultSource
.builder()
.sourceNode(NodeId.fromString(
teLink.getSource().nodeId().toString()))
.sourceTp(TpId.fromString(
teLink.getSource().tpId().toString()));
builder = builder.source(sourceBuilder.build());
}
if (teLink.getDestination() != null) {
DestinationBuilder destBuilder = DefaultDestination
.builder()
.destNode(NodeId.fromString(
teLink.getDestination().nodeId().toString()))
.destTp(TpId.fromString(
teLink.getDestination().tpId().toString()));
builder = builder.destination(destBuilder.build());
}
if (teLink.getTe() != null) {
TeLink teData = teLink.getTe();
TeLinkAttributesBuilder attrBuilder = teLink2YangAttrBuilder(teData);
TeBuilder yangTeBuilder = DefaultTe.builder()
.config(teLink2YangConfig(attrBuilder))
.state(teLink2YangState(attrBuilder, teData));
AugmentedNtLinkBuilder linkAugmentBuilder =
DefaultAugmentedNtLink.builder()
.te(yangTeBuilder.build());
builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
}
return builder.build();
}
private static org.onosproject.tetopology.management.api.link.UnderlayPath
yang2TeSubsystemUnderlayPrimaryPath(
org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay,
UnderlayPrimaryPath yangpath) {
org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath =
new org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath();
teUnderlayPrimaryPath.setRef(new TeNetworkTopologyId(KeyId.keyId(
yangpath.networkIdRef().toString()),
new org.onosproject.tetopology.management.api.TeTopologyId(
((long) yangpath.providerIdRef()),
((long) yangpath.clientIdRef()),
yangpath.teTopologyIdRef().toString())));
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()) {
PathElement tePathElement = new PathElement(pathElementConfigYang.pathElementId(),
findElementType(pathElementConfigYang.type()));
pathElementList.add(tePathElement);
}
teUnderlayPrimaryPath.setPathElement(pathElementList);
teUnderlay.setPrimaryPath(teUnderlayPrimaryPath);
return teUnderlay;
}
private static org.onosproject.tetopology.management.api.link.UnderlayPath
yang2TeSubsystemUnderlayBackupPaths(
org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay,
List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayBackupPath> yangpaths) {
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 = new UnderlayBackupPath();
ubp.setIndex(yangConfig.index());
ubp.setRef(new TeNetworkTopologyId(KeyId.keyId(yangConfig.networkIdRef().toString()),
new org.onosproject.tetopology.management.api.TeTopologyId(
((long) yangConfig.providerIdRef()),
((long) yangConfig.clientIdRef()),
yangConfig.teTopologyIdRef().toString()
)));
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(),
findElementType(pathElementBackupYang.type()));
backupPathElementList.add(tePathElementBackup);
}
ubp.setPathElement(backupPathElementList);
underlayBackupPathsList.add(ubp);
}
teUnderlay.setBackupPath(underlayBackupPathsList);
return teUnderlay;
}
private static ElementType findElementType(Type type) {
ElementType el = null;
if (type instanceof AsNumber) {
org.onosproject.tetopology.management.api.link.AsNumber elementTypeAsNumber = new org.onosproject
.tetopology.management.api.link.AsNumber(((AsNumber) type).asNumber());
return elementTypeAsNumber;
} else if (type instanceof Ipv4Address) {
TeIpv4 elementTypeIpv4 = new TeIpv4();
String ipVal = ((Ipv4Address) type).v4Address().toString();
elementTypeIpv4.setV4Address(Ip4Address.valueOf(Version.INET, ipVal.getBytes()).getIp4Address());
boolean v4Loose = ((Ipv4Address) type).v4Loose();
elementTypeIpv4.setV4Loose(v4Loose);
short v4PrefixLength = ((Ipv4Address) type).v4PrefixLength();
elementTypeIpv4.setV4PrefixLength(v4PrefixLength);
return elementTypeIpv4;
} else if (type instanceof UnnumberedLink) {
org.onosproject.tetopology.management.api.link.UnnumberedLink elementTypeUnnumberedLink = new org
.onosproject.tetopology.management.api.link.UnnumberedLink();
long interfaceId = ((UnnumberedLink) type).interfaceId();
elementTypeUnnumberedLink.setInterfaceId(interfaceId);
IpAddress routerId = IpAddress.valueOf(((UnnumberedLink) type).routerId().toString());
elementTypeUnnumberedLink.setRouterId(routerId);
return elementTypeUnnumberedLink;
}
// TODO: as an improvement in future, construct the tePathElement object
// properly using pathElementConfigYang
// More types need to be added to the above if/else statements.
// Now, I only have AsNumber, Ipv4Address, and UnnumberedLink
return el;
}
/**
* 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) {
checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay =
new org.onosproject.tetopology.management.api.link.UnderlayPath();
teUnderlay.setProtectionType(yangLinkAtrr.underlay().underlayProtectionType());
if (yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
teUnderlay = yang2TeSubsystemUnderlayPrimaryPath(teUnderlay,
yangLinkAtrr.underlay().underlayPrimaryPath());
}
if (yangLinkAtrr.underlay().underlayBackupPath() != null) {
teUnderlay = yang2TeSubsystemUnderlayBackupPaths(teUnderlay,
yangLinkAtrr.underlay().underlayBackupPath());
}
if (yangLinkAtrr.underlay().underlayTrailSrc() != null) {
teUnderlay.setTrailSrc(new TerminationPointKey(
KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
.networkRef().toString()),
KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
.nodeRef().toString()),
KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
.tpRef().toString())));
}
if (yangLinkAtrr.underlay().underlayTrailDes() != null) {
teUnderlay.setTrailDes(new TerminationPointKey(
KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
.networkRef().toString()),
KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
.nodeRef().toString()),
KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
.tpRef().toString())));
}
return teUnderlay;
}
private static TeLink yang2TeLinkAttributes(TeLinkAttributes yangLinkAtrr,
State opState) {
TeLink te = new TeLink(yangLinkAtrr.linkIndex());
if (yangLinkAtrr.name() != null) {
te.setName(yangLinkAtrr.name());
}
if (yangLinkAtrr.adminStatus() != null) {
te.setAdminStatus(EnumConverter.yang2TeSubsystemAdminStatus(
yangLinkAtrr.adminStatus()));
}
if (opState != null && opState.operStatus() != null) {
te.setOpStatus(EnumConverter.yang2TeSubsystemOpStatus(
opState.operStatus()));
}
if (yangLinkAtrr.accessType() != null) {
te.setAccessType(yang2TeSubsystemAccessType(
yangLinkAtrr.accessType()));
}
if (yangLinkAtrr.linkProtectionType() != null) {
te.setLinkProtectionType(yang2TeSubsystemLinkProtectionType(
yangLinkAtrr.linkProtectionType()));
}
if (yangLinkAtrr.maxLinkBandwidth() != null) {
te.setMaxLinkBandwidth(yangLinkAtrr.maxLinkBandwidth());
}
if (yangLinkAtrr.maxResvLinkBandwidth() != null) {
te.setMaxResvLinkBandwidth(yangLinkAtrr.maxResvLinkBandwidth());
}
te.setTeDefaultMetric(yangLinkAtrr.teDefaultMetric());
te.setIsAbstract(yangLinkAtrr.isAbstract());
if (yangLinkAtrr.teSrlgs() != null) {
List<Long> srlgs = Lists.newArrayList();
for (Srlg srlgConfigYang : yangLinkAtrr.teSrlgs().value()) {
srlgs.add(srlgConfigYang.uint32());
}
te.setTeSrlgs(srlgs);
}
if (yangLinkAtrr.externalDomain() != null) {
te.setExternalDomain(new ExternalDomain(
KeyId.keyId(yangLinkAtrr.externalDomain()
.remoteTeNodeId().toString()),
KeyId.keyId(yangLinkAtrr.externalDomain()
.remoteTeLinkTpId().toString()),
yangLinkAtrr.externalDomain().plugId()));
}
if (yangLinkAtrr.underlay() != null) {
te.setUnderlayPath(yang2TeSubsystemUnderlayPath(yangLinkAtrr));
}
if (yangLinkAtrr.unreservedBandwidth() != null) {
List<org.onosproject.tetopology.management.api.link.UnreservedBandwidth>
unreservedBandwidths = Lists.newArrayList();
for (UnreservedBandwidth urBwYang : yangLinkAtrr.unreservedBandwidth()) {
org.onosproject.tetopology.management.api.link.UnreservedBandwidth unResBw =
new org.onosproject.tetopology.management.api.link.UnreservedBandwidth(
urBwYang.priority(),
urBwYang.bandwidth());
unreservedBandwidths.add(unResBw);
}
te.setUnreservedBandwidths(unreservedBandwidths);
}
return te;
}
private static LinkProtectionType
yang2TeSubsystemLinkProtectionType(LinkProtectionTypeEnum linkProtectionType) {
switch (linkProtectionType) {
case ENHANCED:
return LinkProtectionType.ENHANCED;
case EXTRA_TRAFFIC:
return LinkProtectionType.EXTRA_TRAFFIC;
case SHARED:
return LinkProtectionType.SHARED;
case UNPROTECTED:
return LinkProtectionType.UNPROTECTED;
case YANGAUTOPREFIX1_FOR_1:
return LinkProtectionType.YANGAUTOPREFIX1_FOR_1;
case YANGAUTOPREFIX1_PLUS_1:
return LinkProtectionType.YANGAUTOPREFIX1_PLUS_1;
default:
return null;
}
}
private static org.onosproject.tetopology.management.api.link.TeLinkAccessType
yang2TeSubsystemAccessType(TeLinkAccessType accessType) {
switch (accessType.enumeration()) {
case MULTI_ACCESS:
return org.onosproject.tetopology.management.api.link.TeLinkAccessType.MULTI_ACCESS;
case POINT_TO_POINT:
return org.onosproject.tetopology.management.api.link.TeLinkAccessType.POINT_TO_POINT;
default:
return null;
}
}
/**
* Link object conversion from YANG to TE Topology subsystem.
*
* @param yangLink YANG link object
* @param networkId YANG networkId object
* @return TE subsystem link object
*/
public static org.onosproject.tetopology.management.api.link.NetworkLink
yang2TeSubsystemLink(Link yangLink, NetworkId networkId) {
checkNotNull(yangLink, E_NULL_YANG_TELINK);
org.onosproject.tetopology.management.api.link.DefaultNetworkLink link =
new org.onosproject.tetopology.management.api.link.DefaultNetworkLink(
KeyId.keyId(yangLink.linkId().uri().toString()));
if (yangLink.supportingLink() != null) {
List<NetworkLinkKey> 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);
}
link.setSupportingLinkIds(spLinkIds);
}
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()));
link.setSource(source);
}
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()));
link.setDestination(destination);
}
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) {
TeLink te = yang2TeLinkAttributes(yangLinkAtrr, yangLinkAugment.te().state());
link.setTe(te);
}
}
}
return link;
}
}