/* * Copyright 2016-present 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.tetopology.management.impl; import java.util.List; import java.util.Map; import org.apache.commons.collections.MapUtils; import org.onlab.packet.Ip4Address; import org.onosproject.tetopology.management.api.DefaultNetwork; import org.onosproject.tetopology.management.api.KeyId; import org.onosproject.tetopology.management.api.Network; import org.onosproject.tetopology.management.api.TeTopology; import org.onosproject.tetopology.management.api.TeTopologyId; import org.onosproject.tetopology.management.api.TeTopologyKey; import org.onosproject.tetopology.management.api.link.DefaultNetworkLink; import org.onosproject.tetopology.management.api.link.NetworkLink; import org.onosproject.tetopology.management.api.link.NetworkLinkKey; 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.node.DefaultNetworkNode; import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint; import org.onosproject.tetopology.management.api.node.NetworkNode; import org.onosproject.tetopology.management.api.node.NetworkNodeKey; 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.TerminationPoint; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * TE Topology Manager utility functions. */ public final class TeMgrUtil { private static final String TENODE_ID = "teNodeId/"; private static final String TELINK_ID = "/teLinkId/"; private static final String PROVIDER_ID = "providerId/"; private static final String CLIENT_ID = "/clientId/"; private static final String TOPOLOGY_ID = "/topologyId/"; // no instantiation private TeMgrUtil() { } /** * Returns the network link id for a TE link local key. * * @param key TE link local key * @return value of network link id */ public static KeyId toNetworkLinkId(TeLinkTpKey key) { return KeyId.keyId(new StringBuilder() .append(TENODE_ID) .append(Ip4Address.valueOf((int) key.teNodeId()).toString()) .append(TELINK_ID) .append(key.teLinkTpId()).toString()); } /** * Returns the network id for a TE topology id. * * @param teTopologyId TE topology id * @return value of network id */ public static KeyId toNetworkId(TeTopologyId teTopologyId) { return KeyId.keyId(new StringBuilder() .append(PROVIDER_ID) .append(teTopologyId.providerId()) .append(CLIENT_ID) .append(teTopologyId.clientId()) .append(TOPOLOGY_ID) .append(teTopologyId.topologyId()).toString()); } /** * Returns the network id for a TE topology key. * * @param teTopologyKey TE topology key * @return value of network id */ public static KeyId toNetworkId(TeTopologyKey teTopologyKey) { return KeyId.keyId(new StringBuilder() .append(PROVIDER_ID) .append(teTopologyKey.providerId()) .append(CLIENT_ID) .append(teTopologyKey.clientId()) .append(TOPOLOGY_ID) .append(teTopologyKey.topologyId()).toString()); } /** * Returns the network node key for a TE node global key. * * @param teNodeKey TE node global key * @return value of network node key */ public static NetworkNodeKey networkNodeKey(TeNodeKey teNodeKey) { return new NetworkNodeKey(toNetworkId(teNodeKey.teTopologyKey()), KeyId.keyId(Ip4Address .valueOf((int) teNodeKey.teNodeId()) .toString())); } /** * Returns the network link key for a TE link global key. * * @param teLinkKey TE link global key * @return value of network link key */ public static NetworkLinkKey networkLinkKey(TeLinkTpGlobalKey teLinkKey) { return new NetworkLinkKey(toNetworkId(teLinkKey.teTopologyKey()), toNetworkLinkId(teLinkKey.teLinkTpKey())); } /** * Returns the TE topology id for a TE topology. * * @param teTopology an instance of TE topology * @return value of TE topology id */ public static TeTopologyId teTopologyId(TeTopology teTopology) { return new TeTopologyId(teTopology.teTopologyId().providerId(), teTopology.teTopologyId().clientId(), teTopology.teTopologyIdStringValue()); } /** * Returns a default instance of termination point for a TE termination point id. * * @param teTpId TE termination point id * @return an instance of termination point */ private static TerminationPoint tpBuilder(long teTpId) { return new DefaultTerminationPoint(KeyId.keyId(Long.toString(teTpId)), null, teTpId); } /** * Returns an instance of network node for a TE node. * * @param id value of the network node id * @param teNode value of TE node * @return an instance of network node */ public static NetworkNode nodeBuilder(KeyId id, TeNode teNode) { List<NetworkNodeKey> supportingNodeIds = null; if (teNode.supportingTeNodeId() != null) { supportingNodeIds = Lists.newArrayList(networkNodeKey(teNode.supportingTeNodeId())); } Map<KeyId, TerminationPoint> tps = Maps.newConcurrentMap(); for (Long teTpid : teNode.teTerminationPointIds()) { tps.put(KeyId.keyId(Long.toString(teTpid)), tpBuilder(teTpid)); } return new DefaultNetworkNode(id, supportingNodeIds, teNode, tps); } /** * Returns the network node termination point key for a TE link end point key. * * @param teLinkKey TE link end point key * @return value of network node termination point key */ public static NodeTpKey nodeTpKey(TeLinkTpKey teLinkKey) { return new NodeTpKey(KeyId.keyId(Ip4Address .valueOf((int) teLinkKey.teNodeId()).toString()), KeyId.keyId(Long.toString(teLinkKey.teLinkTpId()))); } /** * Returns an instance of network link for a TE link. * * @param id value of the network link id * @param teLink value of TE link * @return an instance of network link */ public static NetworkLink linkBuilder(KeyId id, TeLink teLink) { NodeTpKey source = nodeTpKey(teLink.teLinkKey()); NodeTpKey destination = null; if (teLink.peerTeLinkKey() != null) { destination = nodeTpKey(teLink.peerTeLinkKey()); } List<NetworkLinkKey> supportingLinkIds = null; if (teLink.supportingTeLinkId() != null) { supportingLinkIds = Lists.newArrayList(networkLinkKey(teLink.supportingTeLinkId())); } return new DefaultNetworkLink(id, source, destination, supportingLinkIds, teLink); } /** * Returns an instance of network for a TE topology. * * @param teTopology value of TE topology * @return an instance of network */ public static Network networkBuilder(TeTopology teTopology) { KeyId networkId = TeMgrUtil.toNetworkId(teTopology.teTopologyId()); TeTopologyId topologyId = teTopologyId(teTopology); Map<KeyId, NetworkNode> nodes = null; if (MapUtils.isNotEmpty(teTopology.teNodes())) { nodes = Maps.newHashMap(); for (TeNode tenode : teTopology.teNodes().values()) { KeyId key = KeyId.keyId(Ip4Address .valueOf((int) tenode.teNodeId()).toString()); nodes.put(key, nodeBuilder(key, tenode)); } } Map<KeyId, NetworkLink> links = null; if (MapUtils.isNotEmpty(teTopology.teLinks())) { links = Maps.newHashMap(); for (TeLink telink : teTopology.teLinks().values()) { KeyId key = toNetworkLinkId(telink.teLinkKey()); links.put(key, linkBuilder(key, telink)); } } return new DefaultNetwork(networkId, null, nodes, links, topologyId, false, teTopology.ownerId()); } }