| /* |
| * 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; |
| |
| import java.util.BitSet; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.onlab.packet.Ip4Address; |
| import org.onosproject.net.DeviceId; |
| import org.onosproject.tetopology.management.api.DefaultNetwork; |
| import org.onosproject.tetopology.management.api.EncodingType; |
| import org.onosproject.tetopology.management.api.KeyId; |
| import org.onosproject.tetopology.management.api.Network; |
| 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.TeTopologyId; |
| import org.onosproject.tetopology.management.api.TeTopologyKey; |
| import org.onosproject.tetopology.management.api.link.CommonLinkData; |
| import org.onosproject.tetopology.management.api.link.DefaultNetworkLink; |
| import org.onosproject.tetopology.management.api.link.DefaultTeLink; |
| import org.onosproject.tetopology.management.api.link.ExternalLink; |
| import org.onosproject.tetopology.management.api.link.LinkBandwidth; |
| import org.onosproject.tetopology.management.api.link.NetworkLink; |
| import org.onosproject.tetopology.management.api.link.NetworkLinkKey; |
| import org.onosproject.tetopology.management.api.link.OduResource; |
| import org.onosproject.tetopology.management.api.link.TeLink; |
| import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey; |
| import org.onosproject.tetopology.management.api.link.TeLinkTpKey; |
| import org.onosproject.tetopology.management.api.link.TePathAttributes; |
| import org.onosproject.tetopology.management.api.link.UnderlayPath; |
| 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.DefaultTerminationPoint; |
| import org.onosproject.tetopology.management.api.node.DefaultTunnelTerminationPoint; |
| 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 org.onosproject.tetopology.management.api.node.TunnelTerminationPoint; |
| import org.onosproject.tetopology.management.impl.TeMgrUtil; |
| |
| import com.google.common.collect.Lists; |
| import com.google.common.collect.Maps; |
| |
| /** |
| * Builds a sample abstract TE Topology, which consists of one node(represents |
| * an entire network), one inter-domain link and one TTP. |
| */ |
| public final class DefaultBuilder { |
| private static final String NODEIP = "100.10.10.10"; |
| // Bandwidth in GigaBits/second |
| private static final float[] ODU0BW = {1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f}; |
| private static final float[] ODU2BW = {10, 10, 10, 10, 10, 10, 10, 10}; |
| private static final float[] ODU3BW = {40, 40, 40, 40, 40, 40, 40, 40}; |
| private static final float[] ODU4BW = {100, 100, 100, 100, 100, 100, 100, 100}; |
| |
| private static final String ODU2 = "ODU2"; |
| private static final String ODU3 = "ODU3"; |
| private static final String ODU4 = "ODU4"; |
| |
| private static final long PROVIDER_ID = 0x100; |
| private static final long CLIENT_ID = 0x0a0a0a0a; |
| private static final long CLIENT_NIL = 0; |
| private static final long ABSTRACT_TOPOLOGY_ID = 100; |
| private static final long NATIVE_TOPOLOGY_ID = 1; |
| private static final long NUM_TPS = 1; |
| private static final long NUM_TTPS = 1; |
| private static final boolean ABSTRACT = true; |
| private static final boolean UNABSTRACT = false; |
| private static final int FIRST_INDEX = 0; |
| private static final long INTER_DOMAIN_LINK_PLUGID = 100; |
| private static final long LINK_COST = 500; |
| private static final long LINK_DELAY = 2000; |
| private static final long LINK_SRLG = 150; |
| private static final String DOMAIN_ID = "DomainX"; |
| |
| private static NetworkNode networkNode; |
| private static TeNode teNode; |
| private static NetworkLink networkLink; |
| private static TeLink teLink; |
| private static Network network; |
| private static TunnelTerminationPoint ttp; |
| |
| private static TeTopologyKey teTopologyKey = new TeTopologyKey(PROVIDER_ID, |
| CLIENT_ID, |
| ABSTRACT_TOPOLOGY_ID); |
| |
| // no instantiation |
| private DefaultBuilder() { |
| } |
| |
| private static TunnelTerminationPoint ttpBuilder(long ttpId) { |
| return new DefaultTunnelTerminationPoint(ttpId, SwitchingType.OTN_TDM_CAPABLE, |
| EncodingType.LSP_ENCODING_ODUK, |
| new BitSet(TeConstants.FLAG_MAX_BITS), |
| null, null, |
| ODU2BW, null); //10G for ODU2 |
| } |
| |
| private static TerminationPoint tpBuilder(long teTpId) { |
| return new DefaultTerminationPoint(KeyId.keyId(Long.toString(teTpId)), null, teTpId); |
| } |
| |
| private static NetworkNode nodeBuilder(String nodeIp, long numTps, long numTtps, |
| TeTopologyKey underlayTopologyId, TeNodeKey supportTeNodeId, |
| TeNodeKey sourceTeNodeId, boolean isAbstract) { |
| long teNodeId = Ip4Address.valueOf(nodeIp).toInt(); |
| BitSet flags = new BitSet(TeConstants.FLAG_MAX_BITS); |
| |
| if (isAbstract) { |
| flags.set(TeNode.BIT_ABSTRACT); |
| } |
| CommonNodeData common = new CommonNodeData(nodeIp, TeStatus.UP, TeStatus.UP, flags); |
| Map<Long, ConnectivityMatrix> connMatrices = null; |
| List<Long> teTpIds = Lists.newArrayList(); |
| Map<KeyId, TerminationPoint> tps = Maps.newHashMap(); |
| for (long i = 0; i < numTps; i++) { |
| teTpIds.add(i); |
| tps.put(KeyId.keyId(Long.toString(i)), tpBuilder(i)); |
| } |
| //TTP |
| Map<Long, TunnelTerminationPoint> ttps = Maps.newHashMap(); |
| for (long i = 0; i < numTtps; i++) { |
| ttps.put(i, ttpBuilder(i)); |
| } |
| ttp = ttps.get(FIRST_INDEX); |
| //TeNode |
| teNode = new DefaultTeNode(teNodeId, underlayTopologyId, |
| supportTeNodeId, sourceTeNodeId, |
| common, connMatrices, teTpIds, ttps, teTpIds); |
| List<NetworkNodeKey> supportingNodeIds = null; |
| if (supportTeNodeId != null) { |
| supportingNodeIds = Lists |
| .newArrayList(TeMgrUtil.networkNodeKey(supportTeNodeId)); |
| } |
| |
| return new DefaultNetworkNode(KeyId.keyId(nodeIp), supportingNodeIds, teNode, tps); |
| } |
| |
| private static LinkBandwidth linkBwBuilder(String odu) { |
| |
| float[] maxBandwidth; //Maximum bandwidth, Size is MAX_PRIORITY + 1 |
| float[] avaiBandwidth; //Unreserved bandwidth, Size is MAX_PRIORITY + 1 |
| float[] maxAvialLspBandwidth; //Maximum available bandwidth for a LSP |
| float[] minAvialLspBandwidth; //Minimum available bandwidth for a LSP |
| short odu0s; |
| short odu1s; |
| short odu2s; |
| short odu2es = 0; |
| short odu3s; |
| short odu4s; |
| short oduFlexes = 0; |
| |
| switch (odu) { |
| case ODU3: |
| maxBandwidth = ODU3BW; |
| avaiBandwidth = ODU3BW; |
| maxAvialLspBandwidth = ODU3BW; |
| minAvialLspBandwidth = ODU0BW; |
| odu0s = 32; |
| odu1s = 16; |
| odu2s = 4; |
| odu3s = 1; |
| odu4s = 0; |
| break; |
| case ODU4: |
| maxBandwidth = ODU4BW; |
| avaiBandwidth = ODU4BW; |
| maxAvialLspBandwidth = ODU4BW; |
| minAvialLspBandwidth = ODU0BW; |
| odu0s = 80; |
| odu1s = 40; |
| odu2s = 10; |
| odu3s = 2; |
| odu4s = 1; |
| break; |
| default: |
| maxBandwidth = ODU2BW; |
| avaiBandwidth = ODU2BW; |
| maxAvialLspBandwidth = ODU2BW; |
| minAvialLspBandwidth = ODU0BW; |
| odu0s = 8; |
| odu1s = 4; |
| odu2s = 1; |
| odu3s = 0; |
| odu4s = 0; |
| } |
| |
| OduResource oduRrc = new OduResource(odu0s, odu1s, odu2s, odu2es, odu3s, |
| odu4s, oduFlexes); |
| return new LinkBandwidth(maxBandwidth, avaiBandwidth, maxAvialLspBandwidth, |
| minAvialLspBandwidth, oduRrc); |
| } |
| |
| private static NetworkLink linkBuilder(TeLinkTpKey teLinkKey, TeLinkTpKey peerTeLinkKey, |
| TeTopologyKey underlayTopologyId, TeLinkTpGlobalKey supportTeLinkId, |
| TeLinkTpGlobalKey sourceTeLinkId, boolean isAbstract, Long plugid, |
| Long cost, Long delay, List<Long> srlgs, String odu) { |
| //NetworkLink |
| KeyId linkId = TeMgrUtil.toNetworkLinkId(teLinkKey); |
| NodeTpKey source = TeMgrUtil.nodeTpKey(teLinkKey); |
| NodeTpKey destination = null; |
| if (peerTeLinkKey != null) { |
| destination = TeMgrUtil.nodeTpKey(peerTeLinkKey); |
| } |
| List<NetworkLinkKey> supportingLinkIds = null; |
| if (supportTeLinkId != null) { |
| supportingLinkIds = Lists |
| .newArrayList(TeMgrUtil.networkLinkKey(supportTeLinkId)); |
| } |
| BitSet flags = new BitSet(TeConstants.FLAG_MAX_BITS); |
| if (isAbstract) { |
| flags.set(TeLink.BIT_ABSTRACT); |
| } |
| ExternalLink externalLink = null; |
| |
| if (plugid != null) { |
| // Inter-Domain Link |
| flags.set(TeLink.BIT_ACCESS_INTERDOMAIN); |
| externalLink = new ExternalLink(null, plugid); |
| } |
| UnderlayPath underlayPath = null; |
| Long adminGroup = null; |
| List<Long> interLayerLocks = null; |
| teLink = new DefaultTeLink(teLinkKey, peerTeLinkKey, underlayTopologyId, |
| supportTeLinkId, sourceTeLinkId, |
| new CommonLinkData(TeStatus.UP, TeStatus.UP, flags, |
| SwitchingType.OTN_TDM_CAPABLE, |
| EncodingType.LSP_ENCODING_ODUK, |
| externalLink, underlayPath, |
| new TePathAttributes(cost, delay, srlgs), |
| adminGroup, interLayerLocks, linkBwBuilder(odu))); |
| return new DefaultNetworkLink(linkId, source, destination, supportingLinkIds, teLink); |
| } |
| |
| private static Network networkBuilder(TeTopologyId teTopologyId, KeyId supportingNetworkId, |
| Map<KeyId, NetworkNode> nodes, Map<KeyId, NetworkLink> links, |
| boolean serverProvided, DeviceId ownerId) { |
| KeyId networkId = TeMgrUtil.toNetworkId(teTopologyId); |
| List<KeyId> supportingNetworkIds = null; |
| if (supportingNetworkId != null) { |
| supportingNetworkIds = Lists.newArrayList(supportingNetworkId); |
| } |
| return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links, teTopologyId, |
| serverProvided, ownerId); |
| } |
| |
| /** |
| * Returns the key for the sample TE Topology. |
| * |
| * @return value of TE Topology key |
| */ |
| public static TeTopologyKey teTopologyKey() { |
| return teTopologyKey; |
| } |
| |
| /** |
| * Returns the abstract TE Node in the sample TE Topology. |
| * |
| * @return value of TE node |
| */ |
| public static TeNode teNode() { |
| return teNode; |
| } |
| |
| /** |
| * Returns the TE link in the sample TE Topology. |
| * |
| * @return value of TE link |
| */ |
| public static TeLink teLink() { |
| return teLink; |
| } |
| |
| /** |
| * Builds a sample abstract TE Topology, which consists of one abstract node |
| * representing an entire physical network, one inter-domain link and one |
| * TTP. |
| * |
| * @return value of network with an abstract TE Topology |
| */ |
| public static Network buildSampleAbstractNetwork() { |
| TeTopologyKey underlayTopologyId = new TeTopologyKey(PROVIDER_ID, |
| CLIENT_NIL, |
| NATIVE_TOPOLOGY_ID); |
| Map<KeyId, NetworkNode> nodes = Maps.newHashMap(); |
| networkNode = nodeBuilder(NODEIP, NUM_TPS, NUM_TTPS, underlayTopologyId, |
| null, null, ABSTRACT); |
| nodes.put(networkNode.nodeId(), networkNode); |
| |
| Map<KeyId, NetworkLink> links = Maps.newHashMap(); |
| TeLinkTpKey node1tp1 = new TeLinkTpKey(networkNode.teNode().teNodeId(), |
| networkNode.teNode() |
| .teTerminationPointIds() |
| .get(FIRST_INDEX)); |
| networkLink = linkBuilder(node1tp1, null, null, null, null, UNABSTRACT, |
| INTER_DOMAIN_LINK_PLUGID, LINK_COST, |
| LINK_DELAY, Lists.newArrayList(LINK_SRLG), |
| ODU4); |
| links.put(networkLink.linkId(), networkLink); |
| DeviceId ownerId = DeviceId.deviceId(DOMAIN_ID); |
| TeTopologyId topologyId = new TeTopologyId(PROVIDER_ID, CLIENT_ID, Long |
| .toString(ABSTRACT_TOPOLOGY_ID)); |
| network = networkBuilder(topologyId, null, nodes, links, false, |
| ownerId); |
| return network; |
| } |
| |
| } |