blob: 6e0c57483557ee9db909fee1a6a4b4ef589ad0b6 [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.BitSet;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
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.TeConstants;
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.NetworkLinkKey;
import org.onosproject.tetopology.management.api.link.TeIpv4;
import org.onosproject.tetopology.management.api.link.TeLinkId;
import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
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.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.NetworkNodeEventSubject;
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.tetopology.management.api.node.TtpKey;
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.inet.types.rev20130715.ietfinettypes.IpAddress;
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;
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.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.rev20170110.ietftetopology.DefaultTeNodeEvent;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeNodeEvent;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.connectivitymatrixentryattributes.DefaultUnderlay;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.connectivitymatrixentryattributes.Underlay;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourcepernodeattributes.DefaultInformationSourceState;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourcepernodeattributes.InformationSourceState;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourcepernodeattributes.informationsourcestate.DefaultTopology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.informationsourcepernodeattributes.informationsourcestate.Topology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
.ietftetopology.networks.network.node.AugmentedNwNode;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
.ietftetopology.networks.network.node.DefaultAugmentedNwNode;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks.network.node.terminationpoint.AugmentedNtTerminationPoint;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkconnectivityattributes.TeSrlgs;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.DefaultPrimaryPath;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.PrimaryPath;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.primarypath.DefaultPathElement;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.telinkunderlayattributes.primarypath.PathElement;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.DefaultTe;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.DefaultTe.TeBuilder;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.Te;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.Config;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.DefaultConfig;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.DefaultState;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.DefaultTunnelTerminationPoint;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.State;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.TunnelTerminationPoint;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultSupportingTunnelTerminationPoint;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeaugment.te.tunnelterminationpoint.SupportingTunnelTerminationPoint;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconfigattributes.DefaultTeNodeAttributes;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconfigattributes.TeNodeAttributes;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconfigattributes.TeNodeAttributes.TeNodeAttributesBuilder;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.ConnectivityMatrices;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrices;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrices.ConnectivityMatricesBuilder;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.connectivitymatrices.DefaultConnectivityMatrix;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.connectivitymatrices.DefaultConnectivityMatrix.ConnectivityMatrixBuilder;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.connectivitymatrices.connectivitymatrix.DefaultFrom;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.connectivitymatrices.connectivitymatrix.DefaultTo;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeinfoattributes.DefaultUnderlayTopology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodeinfoattributes.UnderlayTopology;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodetunnelterminationattributes.DefaultLocalLinkConnectivities;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodetunnelterminationattributes.LocalLinkConnectivities;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodetunnelterminationattributes.locallinkconnectivities.DefaultLocalLinkConnectivity;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tenodetunnelterminationattributes.locallinkconnectivities.DefaultLocalLinkConnectivity.LocalLinkConnectivityBuilder;
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.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.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.tetopologyeventtype.TeTopologyEventTypeEnum;
import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.ietfyangtypes.DottedQuad;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
* Node conversion functions.
*/
public final class NodeConverter {
private static final String E_NULL_TE_SUBSYSTEM_TE_NODE =
"TeSubsystem teNode object cannot be null";
private static final String E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP =
"TeSubsystem teTunnelTp object cannot be null";
private static final String E_NULL_TE_SUBSYSTEM_NODE =
"TeSubsystem ndoe object cannot be null";
private static final String E_NULL_YANG_NODE =
"Yang node object cannot be null";
// no instantiation
private NodeConverter() {
}
/**
* TE Node Config object conversion from TE Topology subsystem to YANG.
*
* @param teSubsystemTeNode TE node object
* @param teTopologyService teTopolog core service
* @return TE Node Config YANG object
*/
private static Config teNode2YangConfig(TeNode teSubsystemTeNode, TeTopologyService teTopologyService) {
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(), teTopologyService));
}
// 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();
ConnectivityMatricesBuilder yangConnectivityMatricesBuilder = DefaultConnectivityMatrices.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(((TeLinkId) teCmEntry.getValue().from()).value())
.build())
.to(new DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
// one item in constrainingElements list
.tpRef(((TeLinkId) teCmEntry.getValue().constrainingElements().get(0)).value())
.build());
if (teCmEntry.getValue().teAttributes() != null) {
connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
.teDefaultMetric(teCmEntry.getValue().teAttributes().cost())
.teDelayMetric(teCmEntry.getValue().teAttributes().delay());
}
TeSrlgs.TeSrlgsBuilder teSrlgsBuilder = DefaultTeSrlgs.builder();
if (teCmEntry.getValue().teAttributes().srlgs() != null) {
for (Long val : teCmEntry.getValue().teAttributes().srlgs()) {
Srlg srlg = new Srlg(val);
teSrlgsBuilder = teSrlgsBuilder.addToValue(srlg);
}
connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
.teSrlgs(teSrlgsBuilder.build());
}
Underlay.UnderlayBuilder underlayBuilder = DefaultUnderlay.builder();
PrimaryPath.PrimaryPathBuilder primaryPathBuilder = DefaultPrimaryPath.builder();
PathElement.PathElementBuilder pathElementBuilder = DefaultPathElement.builder();
if (teCmEntry.getValue().underlayPath() != null &&
teCmEntry.getValue().underlayPath().pathElements() != null &&
!teCmEntry.getValue().underlayPath().pathElements().isEmpty()) {
for (org.onosproject.tetopology.management.api.link.PathElement patel : teCmEntry.getValue()
.underlayPath().pathElements()) {
pathElementBuilder = pathElementBuilder.pathElementId(patel.pathElementId());
if (patel.type() instanceof AsNumber) {
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
.explicitroutesubobject.type.AsNumber
.AsNumberBuilder asNumberBuilder = new DefaultAsNumber.AsNumberBuilder();
asNumberBuilder = asNumberBuilder.asNumber(((AsNumber) patel.type()).asNumber());
pathElementBuilder = pathElementBuilder.type(asNumberBuilder.build());
} else if (patel.type() instanceof UnnumberedLink) {
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
.explicitroutesubobject.type.UnnumberedLink
.UnnumberedLinkBuilder unNumberBuilder = DefaultUnnumberedLink.builder();
unNumberBuilder = unNumberBuilder.interfaceId(((UnnumberedLink) patel.type()).interfaceId());
unNumberBuilder = unNumberBuilder.routerId(IpAddress.fromString(((UnnumberedLink) patel.type())
.routerId().toString()));
pathElementBuilder = pathElementBuilder.type(unNumberBuilder.build());
}
primaryPathBuilder = primaryPathBuilder
.addToPathElement(pathElementBuilder.build());
}
}
underlayBuilder = underlayBuilder.primaryPath(primaryPathBuilder.build());
connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
.underlay(underlayBuilder.build());
yangConnectivityMatricesBuilder = yangConnectivityMatricesBuilder
.addToConnectivityMatrix(connectivityMatrixConfigBuilder.build());
}
teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
.connectivityMatrices(yangConnectivityMatricesBuilder.build());
return teNodeAttributesConfigBuilder;
}
private static UnderlayTopology teNode2YangUnderlay(TeTopologyKey underlayTopology,
TeTopologyService teTopologyService) {
UnderlayTopology.UnderlayTopologyBuilder underlayBuilder = DefaultUnderlayTopology.builder();
underlayBuilder = underlayBuilder.networkRef(teTopologyService.networkId(underlayTopology));
return underlayBuilder.build();
}
/**
* TE Node State object conversion from TE Topology subsystem to YANG.
*
* @param teSubsystemTeNode TE node object
* @param teTopologyService teTopology core service
* @return TE Node State YANG object
*/
private static State teNode2YangState(TeNode teSubsystemTeNode, TeTopologyService teTopologyService) {
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(), teTopologyService));
}
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.nodeRef(teTopologyService
.nodeKey(teSubsystemTeNode.sourceTeNodeId()).nodeId())
.networkRef(teTopologyService
.nodeKey(teSubsystemTeNode.sourceTeNodeId())
.networkId());
issBuilder = issBuilder.topology(topologyBuilder.build());
yangStateBuilder.informationSourceState(issBuilder.build());
}
return yangStateBuilder.build();
}
private static class ByteUtils {
public static byte[] longToBytes(long x) {
long temp = x;
byte[] b = new byte[8];
for (int i = 0; i < b.length; i++) {
b[i] = new Long(temp & 0xff).byteValue();
temp = temp >> 8;
}
return b;
}
public static long bytesToLong(byte[] bytes) {
return (bytes[7] & 255L) << 56
| (bytes[6] & 255L) << 48
| (bytes[5] & 255L) << 40
| (bytes[4] & 255L) << 32
| (bytes[3] & 255L) << 24
| (bytes[2] & 255L) << 16
| (bytes[1] & 255L) << 8 | bytes[0] & 255L;
}
}
/**
* TE Node TunnelTerminationPoint object conversion from TE Topology subsystem to YANG.
*
* @param teTunnelTp TE TunnelTerminationPoint object
* @param teTpId
* @param teTopologyService
* @param teNodeKey
* @return TunnelTerminationPoint YANG object
*/
private static TunnelTerminationPoint teSubsystem2YangTtp(
org.onosproject.tetopology.management.api.node
.TunnelTerminationPoint teTunnelTp, Long teTpId,
TeTopologyService teTopologyService,
TeNodeKey teNodeKey) {
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.rev20170110
.ietftetopology.tenodeaugment.te.tunnelterminationpoint.Config.ConfigBuilder ttpConfigBuilder =
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
.ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultConfig.builder();
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
.ietftetopology.tenodeaugment.te.tunnelterminationpoint.State.StateBuilder ttpStateBuilder =
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
.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));
}
// TODO: retrieve teTunnelTp.switchingLayer() and set it to ttpConfigBuilder and ttpStateBuilder
// TODO: retrieve more attributes from teTunnelTp and assign to ttpConfigBuilder and ttpStateBuilder
// For which ones we can do the conversion?
LocalLinkConnectivities.LocalLinkConnectivitiesBuilder
localLinkConnectivitiesBuilder = DefaultLocalLinkConnectivities.builder();
if (teTunnelTp.localLinkConnectivityList() != null && !teTunnelTp.localLinkConnectivityList().isEmpty()) {
for (LocalLinkConnectivity llcn : teTunnelTp.localLinkConnectivityList()) {
// convert teLinkId to networkLinkKey
if (llcn != null && llcn.constrainingElements() != null
&& !llcn.constrainingElements().isEmpty()) {
TeLinkId telinkId = (TeLinkId) llcn.constrainingElements().get(0);
TeLinkTpGlobalKey globalKey = new TeLinkTpGlobalKey(teNodeKey, telinkId.value());
NetworkLinkKey netLinkKey = teTopologyService.linkKey(globalKey);
NetworkLink networkLink = teTopologyService
.network(netLinkKey.networkId()).links().get(netLinkKey.linkId());
LocalLinkConnectivityBuilder llcBuilder = DefaultLocalLinkConnectivity.builder();
llcBuilder = llcBuilder.linkTpRef(networkLink.source().tpId());
localLinkConnectivitiesBuilder.addToLocalLinkConnectivity(llcBuilder.build());
}
}
ttpConfigBuilder = ttpConfigBuilder.localLinkConnectivities(localLinkConnectivitiesBuilder.build());
ttpStateBuilder = ttpStateBuilder.localLinkConnectivities(localLinkConnectivitiesBuilder.build());
}
tunnelTpBuilder = tunnelTpBuilder.config(ttpConfigBuilder.build())
.state(ttpStateBuilder.build());
SupportingTunnelTerminationPoint.SupportingTunnelTerminationPointBuilder
supportTtpBuilder = DefaultSupportingTunnelTerminationPoint.builder();
if (teTunnelTp.supportingTtpId() != null) {
TeTopologyKey teTopologyKey = new TeTopologyKey(teTunnelTp.supportingTtpId().providerId(),
teTunnelTp.supportingTtpId().clientId(),
teTunnelTp.supportingTtpId().topologyId());
TeNodeKey teNodeKeySup = new TeNodeKey(teTopologyKey, teTunnelTp.supportingTtpId().teNodeId());
NetworkNodeKey networkNodeKey = teTopologyService.nodeKey(teNodeKeySup);
NetworkId netId = NetworkId.fromString(networkNodeKey.networkId().toString());
supportTtpBuilder = supportTtpBuilder
.nodeRef(NodeId.fromString(networkNodeKey.nodeId().toString()))
.networkRef(netId)
.tunnelTpRef(ByteUtils.longToBytes(teTunnelTp.supportingTtpId().ttpId()));
tunnelTpBuilder = tunnelTpBuilder.addToSupportingTunnelTerminationPoint(supportTtpBuilder.build());
}
return tunnelTpBuilder.build();
}
/**
* Node object conversion from TE Topology subsystem to YANG.
*
* @param teSubsystem TE subsystem node
* @param teTopologyService teTopology core service
* @param teTopologyKey teTopologyKey
* @return YANG node
*/
public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem,
TeTopologyService teTopologyService,
TeTopologyKey teTopologyKey) {
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();
nodeAugmentBuilder = nodeAugmentBuilder
.teNodeId(TeNodeId.of(DottedQuad.of(Ip4Address
.valueOf((int) teSubsystemTeNode.teNodeId())
.toString())));
// Set configuration data
// Set state data
yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode, teTopologyService))
.state(teNode2YangState(teSubsystemTeNode, teTopologyService));
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(), teTopologyService,
new TeNodeKey(teTopologyKey, teSubsystemTeNode.teNodeId())));
}
}
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 Node in YANG model
* @param yangNetwork YANG network
* @param yangNetworks YANG networks
* @return TE subsystem node
*/
public static org.onosproject.tetopology.management.api.node.NetworkNode
yang2TeSubsystemNode(Node yangNode, Network yangNetwork,
Networks yangNetworks) {
checkNotNull(yangNode, E_NULL_YANG_NODE);
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.teNodeId() != null) {
TeNodeId teNodeId = yangNodeAugment.teNodeId();
Te yangNodeAugTe = yangNodeAugment.te();
teNode = yang2TeSubsystemNodeAugment(yangNodeAugTe, teNodeId,
yangNetwork,
yangNetworks,
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,
ConnectivityMatrices yangMatrices) {
Map<Long, ConnectivityMatrix> teCmList = Maps.newHashMap();
List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
.tenodeconnectivitymatrix.connectivitymatrices.ConnectivityMatrix>
yangMatrix = yangMatrices.connectivityMatrix();
for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te
.topology.rev20170110.ietftetopology.tenodeconnectivitymatrix.connectivitymatrices.
ConnectivityMatrix cmYang : yangMatrix) {
ElementType from = new TeLinkId(Long.valueOf(((String) cmYang.from().tpRef()))); // is this correct?
UnderlayAbstractPath underlayPath = null; // ignore
List<org.onosproject.tetopology.management.api.link.PathElement> pathElements = Lists.newArrayList();
Boolean loose = false;
long longTeNodeId = TeConstants.NIL_LONG_VALUE;
if (cmYang != null && cmYang.underlay() != null && cmYang.underlay().primaryPath() != null
&& cmYang.underlay().primaryPath().pathElement() != null
&& !cmYang.underlay().primaryPath().pathElement().isEmpty()) {
for (PathElement yangPathEl : cmYang.underlay().primaryPath().pathElement()) {
ElementType type = null;
if (yangPathEl.type() instanceof UnnumberedLink) {
String rS = ((UnnumberedLink) (yangPathEl.type())).routerId().toString();
org.onlab.packet.IpAddress routerId = org.onlab.packet.IpAddress.valueOf(rS);
long interfaceId = ((UnnumberedLink) yangPathEl.type()).interfaceId();
type = new org.onosproject.tetopology.management.api.link.UnnumberedLink(routerId, interfaceId);
longTeNodeId = Long.valueOf(((UnnumberedLink) yangPathEl.type()).routerId().toString());
} else if (yangPathEl.type() instanceof Ipv4Address) {
short v4PrefixLength = ((Ipv4Address) yangPathEl.type())
.v4PrefixLength();
Ip4Address v4Address = Ip4Address
.valueOf(((Ipv4Address) yangPathEl.type())
.v4Address().string());
loose = ((Ipv4Address) yangPathEl.type()).v4Loose();
type = new TeIpv4(v4Address, v4PrefixLength);
}
org.onosproject.tetopology.management.api.link.PathElement
patel = new org.onosproject.tetopology.management.api.link
.PathElement(yangPathEl.pathElementId(),
longTeNodeId,
type,
loose);
pathElements.add(patel);
}
}
underlayPath = new UnderlayAbstractPath(pathElements, loose);
List<ElementType> mergingList = Lists.newArrayList(); // empty merging list for now
List<ElementType> constrainingElements = Lists.newArrayList();
ElementType to = new TeLinkId(Long.valueOf(((String) 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.teDelayMetric(),
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, Networks yangNetworks) {
TeTopologyKey tetopokey = LinkConverter.findTopologyId(yangNetworks,
ut.networkRef());
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, Node yangNode,
Networks yangNetworks) {
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();
if (ttpYang.config() != null) {
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
ElementType elt = null;
List<ElementType> eltList = Lists.newArrayList();
if (ttpYang.config() != null &&
ttpYang.config().localLinkConnectivities() != null &&
CollectionUtils.isNotEmpty(ttpYang.config().localLinkConnectivities().localLinkConnectivity())) {
for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110
.ietftetopology.tenodetunnelterminationattributes.locallinkconnectivities
.LocalLinkConnectivity yangLlc : ttpYang.config()
.localLinkConnectivities().localLinkConnectivity()) {
if (MapUtils.isNotEmpty(yangNode.yangAugmentedInfoMap())) {
AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
.yangAugmentedInfo(AugmentedNdNode.class);
for (org.onosproject.yang.gen.v1.urn.ietf.params.xml
.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
.networks.network.node.augmentedndnode
.TerminationPoint tpItem : yangTpNodeAugment.terminationPoint()) {
if (tpItem.tpId().uri().string().equals(yangLlc.linkTpRef().toString())) {
if (tpItem.yangAugmentedInfoMap() != null
&& !tpItem.yangAugmentedInfoMap().isEmpty()) {
AugmentedNtTerminationPoint yangTpAugment =
(AugmentedNtTerminationPoint) tpItem
.yangAugmentedInfo(AugmentedNtTerminationPoint.class);
if (yangTpAugment.teTpId() != null) {
elt = new TeLinkId(Long.valueOf(yangTpAugment.teTpId().toString()));
break;
}
}
}
}
}
eltList.add(elt);
// tercap.linkTp().toString() //tpId -> tp -> te-tp-id (long)
}
}
TePathAttributes teAttributes = null; // how to find these
// attributes from ttpYang?
UnderlayAbstractPath underlayPath = null; // how to find underlayAbstractPath from ttpYang?
LocalLinkConnectivity llc = new LocalLinkConnectivity(eltList,
flags,
teAttributes,
underlayPath);
localLinkConnectivityList.add(llc);
float[] availAdaptBandwidth = null; // how to find availableBandwidth?
TeTopologyKey teTopologyKey = null;
Object networkRefObj = null;
NetworkId networkId = null;
if (ttpYang != null && ttpYang.supportingTunnelTerminationPoint() != null
&& !ttpYang.supportingTunnelTerminationPoint().isEmpty()
&& ttpYang.supportingTunnelTerminationPoint().get(0) != null) {
networkRefObj = ttpYang.supportingTunnelTerminationPoint()
.get(0).networkRef();
}
if (networkRefObj != null) {
teTopologyKey = LinkConverter.findTopologyId(yangNetworks,
networkRefObj);
networkId = NetworkId.fromString((String) networkRefObj);
}
Network teNetworkFound = null;
if (yangNetworks.network() != null
&& !yangNetworks.network().isEmpty()
&& networkId != null) {
for (Network ynetItem : yangNetworks.network()) {
if (ynetItem.networkId() != null) {
if (ynetItem.networkId().equals(networkId)) {
teNetworkFound = ynetItem;
break;
}
}
}
}
TeNodeId teNodeIdSupport = null;
if (teNetworkFound != null
&& ttpYang != null
&& ttpYang.supportingTunnelTerminationPoint() != null
&& ttpYang.supportingTunnelTerminationPoint().get(0) != null) {
String s = ((String) ttpYang.supportingTunnelTerminationPoint().get(0).nodeRef());
int integ = Integer.valueOf(s);
NodeId nodeId = NodeId.fromString(DottedQuad.of(Ip4Address.valueOf(integ).toString()).toString());
teNodeIdSupport = LinkConverter
.findTeNodeId(teNetworkFound,
nodeId);
}
long tenIdLong = -1;
if (teNodeIdSupport != null) {
tenIdLong = Ip4Address
.valueOf(teNodeIdSupport.dottedQuad().string()).toInt();
}
TeNodeKey teNodeKey = null;
if (teTopologyKey != null && tenIdLong != -1) {
teNodeKey = new TeNodeKey(teTopologyKey, tenIdLong);
}
TtpKey supportTtpKey = null;
if (teNodeKey != null && ttpYang != null
&& ttpYang.supportingTunnelTerminationPoint() != null
&& !ttpYang.supportingTunnelTerminationPoint().isEmpty()
&& ttpYang.supportingTunnelTerminationPoint().get(0) != null) {
supportTtpKey = new TtpKey(teNodeKey,
ByteUtils.bytesToLong((byte[]) ttpYang
.supportingTunnelTerminationPoint().get(0)
.tunnelTpRef()));
}
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,
supportTtpKey);
ttpsMap.put(ByteUtils.bytesToLong(ttpYang.tunnelTpId()), ttpTe);
}
return ttpsMap;
}
private static TeNode yang2TeSubsystemNodeAugment(Te yangNodeAugTe,
TeNodeId teNodeId,
Network yangNetwork,
Networks yangNetworks,
Node yangNode,
Map<KeyId, TerminationPoint> teTps) {
NodeId yangNodeId = yangNode.nodeId();
NetworkId yangNetworkId = yangNetwork.networkId();
long teNodeIdLong = Ip4Address.valueOf(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
// teLinkIds should be supposed to get from YANG Link and TP data.
// For now, assuming each teTp is sourcing a TE link .
if (MapUtils.isNotEmpty(teTps)) {
for (Map.Entry<KeyId, TerminationPoint> entry : teTps.entrySet()) {
if (entry.getValue().teTpId() != null) {
teTpIds.add(entry.getValue().teTpId());
teLinkIds.add(entry.getValue().teTpId());
}
}
}
// ********************************************** 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(), yangNetworks);
}
BitSet flags = new BitSet();
if (teNodeAttr.isAbstract()) {
flags.set(TeNode.BIT_ABSTRACT);
}
teData = new CommonNodeData(
null, // teNodeAttr.name().string(),
EnumConverter.yang2TeSubsystemAdminStatus(teNodeAttr.adminStatus()),
EnumConverter.yang2TeSubsystemOpStatus(yangNodeAugTe.state().operStatus()),
flags);
// if (teNodeAttr.connectivityMatrix() != null) {
if (teNodeAttr.connectivityMatrices() != null) {
connMatrices = yang2TeSubsystemNodeConnectivityMatrix(yangNetworkId.uri().toString(),
yangNodeId.uri().toString(),
teNodeAttr.connectivityMatrices());
}
}
}
if (yangNodeAugTe.tunnelTerminationPoint() != null) {
ttps = yang2TeSubsystemTtp(yangNodeAugTe.tunnelTerminationPoint(),
yangNode,
yangNetworks);
}
TeNode teNode = new DefaultTeNode(teNodeIdLong,
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;
}
/**
* 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 eventData TE Topology node event data
* @return YANG Object converted from nodeData
*/
public static TeNodeEvent teNetworkNode2yangTeNodeEvent(TeTopologyEventTypeEnum eventType,
NetworkNodeEventSubject eventData) {
TeNodeEvent.TeNodeEventBuilder builder = new DefaultTeNodeEvent.TeNodeEventBuilder();
TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
builder.eventType(yangEventType);
NetworkId newtorkId = NetworkId.fromString(eventData.key().networkId().toString());
builder.networkRef(newtorkId);
NodeId nodeId = NodeId.fromString(eventData.key().nodeId().toString());
builder.nodeRef(nodeId);
NetworkNode node = eventData.neworkNode();
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
rev20170110.ietftetopology.tenodeconfigattributesnotification.
TeNodeAttributes teNodeAttributes = node == null ? null
: teNode2YangTeNodeAttributes(node.teNode());
builder.teNodeAttributes(teNodeAttributes);
return builder.build();
}
private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.
ietf.te.topology.rev20170110.ietftetopology.
tenodeconfigattributesnotification.
TeNodeAttributes teNode2YangTeNodeAttributes(TeNode teNode) {
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
rev20170110.ietftetopology.tenodeconfigattributesnotification.
TeNodeAttributes.TeNodeAttributesBuilder attrBuilder =
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
rev20170110.ietftetopology.tenodeconfigattributesnotification.
DefaultTeNodeAttributes.builder();
if (teNode.connectivityMatrices() != null) {
org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
.tenodeconnectivitymatrixabs.DefaultConnectivityMatrix
.ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = org.onosproject.yang.gen.v1.urn.ietf.
params.xml.ns.yang.ietf.te.topology.rev20170110.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.rev20170110
.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.rev20170110
.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.
rev20170110.ietftetopology.tenodeconfigattributesnotification.
TeNodeAttributes teNodeAttributes = attrBuilder.build();
return teNodeAttributes;
}
public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
NetworkId networkRef = NetworkId.fromString(yangNodeEvent.networkRef().toString());
NodeId nodeRef = NodeId.fromString(yangNodeEvent.nodeRef().toString());
KeyId networkId = KeyId.keyId(networkRef.uri().toString());
KeyId nodeId = KeyId.keyId(nodeRef.uri().toString());
NetworkNodeKey networkNodeKey = new NetworkNodeKey(networkId, nodeId);
return networkNodeKey;
}
/**
* Converts YangNode event to NetworkNode.
*
* @param yangNodeEvent yangNodeEvent
* @param teTopologyService teTopologyService
* @return NetworkNode
*/
public static NetworkNode yangNodeEvent2NetworkNode(TeNodeEvent yangNodeEvent,
TeTopologyService teTopologyService) {
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.rev20170110.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.rev20170110.ietftetopology
.tenodeconnectivitymatrixabs.ConnectivityMatrix> yangConnMatrices = yangTeNodeAttrs
.connectivityMatrix();
if (yangConnMatrices != null) {
for (org.onosproject.yang.gen.v1.
urn.ietf.params.xml.ns.yang.
ietf.te.topology
.rev20170110.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
.rev20170110.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;
}
}