blob: 86df3ce2f5ba63a9d1ac397fc64ebc07d4ebef3a [file] [log] [blame]
Yixiao Chen39828a62016-09-14 14:37:06 -04001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016 Open Networking Foundation
Yixiao Chen39828a62016-09-14 14:37:06 -04003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.teyang.utils.topology;
17
Yixiao Chen265b3bb2017-01-13 10:17:03 -050018import static com.google.common.base.Preconditions.checkNotNull;
19import static com.google.common.base.Preconditions.checkState;
Aihua Guo0bc12092017-02-10 09:53:55 -050020import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
Yixiao Chen265b3bb2017-01-13 10:17:03 -050021
22import java.util.List;
23import java.util.Map;
24
Henry Yu4b4a7eb2016-11-09 20:07:53 -050025import org.onosproject.net.DeviceId;
Yixiao Chen39828a62016-09-14 14:37:06 -040026import org.onosproject.tetopology.management.api.KeyId;
Henry Yua4e34f82016-11-06 18:30:59 -050027import org.onosproject.tetopology.management.api.TeTopologyEvent;
Hesam Rahimi41208102016-12-09 17:54:03 -050028import org.onosproject.tetopology.management.api.TeTopologyKey;
29import org.onosproject.tetopology.management.api.TeTopologyService;
Yixiao Chen39828a62016-09-14 14:37:06 -040030import org.onosproject.tetopology.management.api.link.NetworkLink;
Hesam Rahimi41208102016-12-09 17:54:03 -050031import org.onosproject.tetopology.management.api.link.NetworkLinkEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040032import org.onosproject.tetopology.management.api.node.NetworkNode;
Hesam Rahimi41208102016-12-09 17:54:03 -050033import org.onosproject.tetopology.management.api.node.NetworkNodeEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040034import org.onosproject.teyang.api.OperationType;
Hesam Rahimie96d0be2016-10-19 15:51:11 -040035import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050036import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.DefaultNetworks;
37import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
38 .DefaultNetworksState;
39import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
40import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
41import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
42import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks
43 .DefaultNetwork;
44import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
45import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network
46 .NetworkBuilder;
47import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
48 .DefaultNetworkTypes;
49import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
50 .DefaultSupportingNetwork;
51import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
52 .DefaultSupportingNetwork.SupportingNetworkBuilder;
53import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
54 .NetworkTypes;
55import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
56 .Node;
57import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
58 .SupportingNetwork;
59import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
60 .networks.network.AugmentedNdNetwork;
61import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
62 .networks.network.DefaultAugmentedNdNetwork;
63import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
64 .networks.network.DefaultAugmentedNdNetwork.AugmentedNdNetworkBuilder;
65import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
66 .networks.network.augmentedndnetwork.Link;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050067import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050068 .IetfTeTopologyEvent;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050069import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.IetfTeTopologyEventSubject;
70import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeLinkEvent;
71import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.TeNodeEvent;
72import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050073 .network.AugmentedNwNetwork;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050074import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050075 .network.DefaultAugmentedNwNetwork;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050076import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050077 .network.networktypes.AugmentedNwNetworkTypes;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050078import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -050079 .network.networktypes.DefaultAugmentedNwNetworkTypes;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050080import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050081 .tetopologyaugment.DefaultTe;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050082import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050083 .tetopologyaugment.Te;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050084import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tetopologyaugment.te.Config;
85import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology.tetopologyaugment.te.DefaultConfig;
86import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050087 .tetopologytype.DefaultTeTopology;
Hesam Rahimi01f6ae02017-02-01 13:57:00 -050088import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20170110.ietftetopology
Henry Yu4b4a7eb2016-11-09 20:07:53 -050089 .tetopologytype.TeTopology;
Aihua Guo0a6998c2017-02-08 18:14:18 -050090import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Cost;
91import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Delay;
92import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.NotOptimized;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050093import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
Aihua Guo0a6998c2017-02-08 18:14:18 -050094import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOptimizationCriterion;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050095import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050096import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
Yixiao Chen39828a62016-09-14 14:37:06 -040097import org.slf4j.Logger;
98import org.slf4j.LoggerFactory;
99
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500100import com.google.common.collect.Lists;
101import com.google.common.collect.Maps;
Yixiao Chen39828a62016-09-14 14:37:06 -0400102
103
104/**
105 * Networks, Networks State conversion functions.
106 */
107public final class NetworkConverter {
108 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500109 E_NULL_TE_NETWORKS = "TeSubsystem networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400110 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500111 E_NULL_TE_NETWORK_LIST = "TeSubsystem network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400112 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500113 E_NULL_TE_NETWORK = "TeSubsystem network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400114 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500115 E_NULL_TE_NETWORKID = "TeSubsystem networkId cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400116 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500117 E_NULL_YANG_NETWORKS = "YANG networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400118 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500119 E_NULL_YANG_NETWORK_LIST = "YANG network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400120 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500121 E_NULL_YANG_NETWORK = "YANG network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400122 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500123 E_NULL_YANG_NETWORKID = "YANG networkId cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400124 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500125 E_NULL_YANG_NETWORKSSTATE = "YANG networksState cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400126 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500127 E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
Yixiao Chen39828a62016-09-14 14:37:06 -0400128 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500129 E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400130 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500131 E_NULL_YANG_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400132
133 private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
134
135 // no instantiation
136 private NetworkConverter() {
137 }
138
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400139 private static OnosYangOpType toNetworksOperationType(OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400140 switch (operation) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500141 case CREATE:
142 return OnosYangOpType.CREATE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400143
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500144 case DELETE:
145 return OnosYangOpType.DELETE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400146
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500147 case REMOVE:
148 return OnosYangOpType.REMOVE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400149
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500150 case MERGE:
151 return OnosYangOpType.MERGE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400152
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500153 case REPLACE:
154 return OnosYangOpType.REPLACE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400155
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500156 default:
157 return OnosYangOpType.NONE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400158 }
159 }
160
161 /**
162 * Networks object conversion from TE Topology subsystem to YANG.
163 *
164 * @param teSubsystem TE Topology subsystem networks object
Hesam Rahimi41208102016-12-09 17:54:03 -0500165 * @param operation operation type
166 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400167 * @return Networks YANG object
168 */
169 public static Networks teSubsystem2YangNetworks(
170 org.onosproject.tetopology.management.api.Networks teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500171 OperationType operation,
172 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400173 checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
174 checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
175 Networks.NetworksBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400176 DefaultNetworks.builder()
177 .yangNetworksOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400178 List<Network> networks = Lists.newArrayList();
179 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500180 networks.add(teSubsystem2YangNetwork(teNetwork, operation,
181 teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400182 }
183 builder.network(networks);
184 return builder.build();
185 }
186
Yixiao Chen39828a62016-09-14 14:37:06 -0400187 /**
188 * Network States object conversion from TE Topology subsystem to YANG.
189 *
190 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500191 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400192 * @return NetworkStates YANG object
193 */
194 public static NetworksState teSubsystem2YangNetworkStates(
195 org.onosproject.tetopology.management.api.Networks teSubsystem,
196 OperationType operation) {
197 checkNotNull(teSubsystem, "teSubsystem object cannot be null");
198 checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
199 NetworksState.NetworksStateBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400200 DefaultNetworksState.builder()
201 .yangNetworksStateOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400202 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
203 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
204 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
205 networks.add(teSubsystem2YangNetworkState(teNetwork, operation));
206 }
207 builder.network(networks);
208 return builder.build();
209 }
210
211 private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
212 .ietfnetwork.networksstate.Network networkStateNetwork(Network network,
213 NetworksState yangNetworkStates) {
214 checkNotNull(network, "YANG Network object cannot be null");
215 checkNotNull(yangNetworkStates, "YANG NetworksState object cannot be null");
216 if (yangNetworkStates.network() == null) {
217 return null;
218 }
219
220 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
221 .ietfnetwork.networksstate.Network stateNetwork : yangNetworkStates.network()) {
222 if (stateNetwork.networkRef().equals(network.networkId())) {
223 return stateNetwork;
224 }
225 }
226 return null;
227 }
228
229 /**
230 * Networks object conversion from YANG to TE Topology subsystem.
231 *
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500232 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400233 * @param yangNetworkStates NetworkStates YANG object
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500234 * @param deviceId the device Id
Yixiao Chen39828a62016-09-14 14:37:06 -0400235 * @return teSubsystem TE Topology subsystem networks object
236 */
237 public static org.onosproject.tetopology.management.api.Networks yang2TeSubsystemNetworks(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500238 Networks yangNetworks, NetworksState yangNetworkStates, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400239 checkNotNull(yangNetworks, E_NULL_YANG_NETWORKS);
240 checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
241 checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
242
Yixiao Chen39828a62016-09-14 14:37:06 -0400243 List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
244 for (Network network : yangNetworks.network()) {
245 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
246 .ietfnetwork.networksstate.Network stateNetwork =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500247 networkStateNetwork(network, yangNetworkStates);
Yixiao Chen39828a62016-09-14 14:37:06 -0400248 org.onosproject.tetopology.management.api.Network teNetwork;
249 if (stateNetwork == null) {
250 log.info("networkId {} can't be found in yangNetworkStates",
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500251 network.networkId());
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500252 teNetwork = yang2TeSubsystemNetwork(network, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400253 } else {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500254 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400255 }
256 networks.add(teNetwork);
257 }
258
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500259 org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
260 new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400261 return defaultNetworks;
262 }
263
Yixiao Chen39828a62016-09-14 14:37:06 -0400264 private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
265 List<KeyId> teSpptNetworkIds) {
266 List<SupportingNetwork> snws = Lists.newArrayList();
267 SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
268 for (KeyId teSpNwKey : teSpptNetworkIds) {
269 snws.add(spNetworkBuilder
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500270 .networkRef(NetworkId.fromString(teSpNwKey.toString()))
271 .build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400272 }
273 return builder.supportingNetwork(snws);
274 }
275
276 private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
Hesam Rahimi41208102016-12-09 17:54:03 -0500277 Map<KeyId, NetworkNode> teNodes,
278 TeTopologyService teTopologyService,
279 TeTopologyKey teTopologyKey) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400280 List<Node> nodeList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500281
282 for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500283 nodeList.add(NodeConverter.teSubsystem2YangNode(node,
284 teTopologyService,
285 teTopologyKey));
Yixiao Chen39828a62016-09-14 14:37:06 -0400286 }
287 return builder.node(nodeList);
288 }
289
290 private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500291 Map<KeyId, NetworkLink> teLinks,
292 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400293 List<Link> linkList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500294
295 for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500296 linkList.add(LinkConverter.teSubsystem2YangLink(link, teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400297 }
298 AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
299 ndAugment.link(linkList);
300 builder.addYangAugmentedInfo(ndAugment.build(), AugmentedNdNetwork.class);
301 return builder;
302 }
303
304 private static NetworkBuilder te2YangNetworkType(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500305 org.onosproject.tetopology.management.api.TeTopologyId
306 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400307 NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
308 if (teTopologyId != null) {
309 // Set "te-topology" network type.
310 TeTopology.TeTopologyBuilder teTopology = DefaultTeTopology.builder();
311 AugmentedNwNetworkTypes.AugmentedNwNetworkTypesBuilder teNwType =
312 DefaultAugmentedNwNetworkTypes.builder();
313 teNwType.teTopology(teTopology.build());
314 nwType.addYangAugmentedInfo(teNwType.build(), AugmentedNwNetworkTypes.class);
315 }
316 return builder.networkTypes(nwType.build());
317 }
318
319 private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500320 org.onosproject.tetopology.management.api
321 .TeTopologyId teTopologyId,
322 TeTopologyService teTopologyService,
323 KeyId networkKeyId) {
324
325 //teBuilder. //OPTIMIZATIONCRITERION for Config/State
Yixiao Chen39828a62016-09-14 14:37:06 -0400326 Te.TeBuilder teBuilder = DefaultTe.builder();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500327 Config.ConfigBuilder configBuilder = DefaultConfig.builder();
328 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(networkKeyId);
329 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
330 nt.teTopologyId().clientId(),
331 Long.valueOf(nt.teTopologyId().topologyId()));
Aihua Guo0a6998c2017-02-08 18:14:18 -0500332 switch (teTopologyService.teTopology(teTopoKey).optimization()) {
333 case LEAST_COST:
334 configBuilder = configBuilder.optimizationCriterion(Cost.class);
335 break;
336 case SHORTEST_DELAY:
337 configBuilder = configBuilder.optimizationCriterion(Delay.class);
338 break;
339 case NOT_OPTIMIZED:
340 configBuilder = configBuilder.optimizationCriterion(NotOptimized.class);
341 break;
342 default:
343 configBuilder = configBuilder.optimizationCriterion(TeOptimizationCriterion.class);
344 break;
345 }
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500346
347 teBuilder = teBuilder.config(configBuilder.build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400348
349 AugmentedNwNetwork.AugmentedNwNetworkBuilder nwAugment = DefaultAugmentedNwNetwork
350 .builder();
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500351 nwAugment.clientId(new TeGlobalId(teTopologyId.clientId()));
352 nwAugment.providerId(new TeGlobalId(teTopologyId.providerId()));
353 if (teTopologyId.topologyId() != null) {
354 nwAugment.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
355 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400356 nwAugment.te(teBuilder.build());
357 builder.addYangAugmentedInfo(nwAugment.build(),
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500358 AugmentedNwNetwork.class);
Yixiao Chen39828a62016-09-14 14:37:06 -0400359 return builder;
360 }
361
362 /**
363 * Network object conversion from TE Topology subsystem to YANG.
364 *
365 * @param teSubsystem TE Topology subsystem network object
Hesam Rahimi41208102016-12-09 17:54:03 -0500366 * @param operation operation type
367 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400368 * @return Network YANG object
369 */
370 public static Network teSubsystem2YangNetwork(
371 org.onosproject.tetopology.management.api.Network teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500372 OperationType operation,
373 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400374 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
375 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
376
377 // Generate a network builder with the specific networkId.
378 NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
379 NetworkBuilder builder = DefaultNetwork.builder()
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500380 .yangNetworkOpType(
381 toNetworksOperationType(operation))
382 .networkId(networkId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400383
384 // Supporting networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500385 if (teSubsystem.supportingNetworkIds() != null) {
386 builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
Yixiao Chen39828a62016-09-14 14:37:06 -0400387 }
388
389 // Nodes
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500390 if (teSubsystem.nodes() != null) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500391 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(teSubsystem.networkId());
392 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
393 nt.teTopologyId().clientId(),
394 Long.valueOf(nt.teTopologyId().topologyId()));
395 builder = te2YangNodes(builder, teSubsystem.nodes(),
396 teTopologyService,
397 teTopoKey);
Yixiao Chen39828a62016-09-14 14:37:06 -0400398 }
399
400 // Network types
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500401 builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400402
403 // Add links - link is the augmentation
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500404 if (teSubsystem.links() != null) {
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500405 builder = te2YangLinks(builder, teSubsystem.links(), teTopologyService);
Yixiao Chen39828a62016-09-14 14:37:06 -0400406 }
407
408 // TE Topology IDs
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500409 if (teSubsystem.teTopologyId() != null) {
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500410 builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId(),
411 teTopologyService,
412 teSubsystem.networkId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400413 }
414
415 return builder.build();
416 }
417
418 /**
419 * Network State object conversion from TE Topology subsystem to YANG.
420 *
421 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500422 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400423 * @return Network YANG object
424 */
425 public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500426 .rev20151208.ietfnetwork.networksstate.Network
427 teSubsystem2YangNetworkState(
428 org.onosproject.tetopology.management.api.Network teSubsystem,
429 OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400430 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
431 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
432
433 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
434 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500435 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
436 .ietfnetwork.networksstate.DefaultNetwork.builder();
Yixiao Chen39828a62016-09-14 14:37:06 -0400437
438 if (teSubsystem.networkId() != null) {
439 stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
440 }
441 stateBuilder.serverProvided(teSubsystem.isServerProvided());
442
443 // Operation type may be required.
444 return stateBuilder.build();
445 }
446
447
448 /**
449 * Network conversion from YANG to TE Topology subsystem.
450 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500451 * @param yangNetwork Network YANG object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500452 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500453 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400454 * @return TE Topology subsystem defaultNetwork object
455 */
456 private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500457 Network yangNetwork,
458 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
459 yang.ietf.network.rev20151208.ietfnetwork.networksstate.
460 Network yangNetworkState,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500461 Networks yangNetworks, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400462 checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
463 checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
464 String networkId = yangNetwork.networkId().uri().string();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500465
466 KeyId networkKeyId = KeyId.keyId(networkId);
467 List<KeyId> supportingNetworkIds = null;
468 Map<KeyId, NetworkNode> teNodes = null;
469 Map<KeyId, NetworkLink> teLinks = null;
470 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
471 boolean serverProvided = false;
Yixiao Chen39828a62016-09-14 14:37:06 -0400472
473 // Supporting networks
474 if (yangNetwork.supportingNetwork() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500475 supportingNetworkIds = Lists.newArrayList();
Yixiao Chen39828a62016-09-14 14:37:06 -0400476 for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
477 supportingNetworkIds.add(
478 KeyId.keyId(supportNw.networkRef().uri().string()));
479 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400480 }
481
482 // Nodes
483 if (yangNetwork.node() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500484 teNodes = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400485 for (Node node : yangNetwork.node()) {
486 // Convert the Yang Node to a TE node.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500487 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500488 NodeConverter.yang2TeSubsystemNode(node, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400489 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400490 }
491
492 // Links
493 if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
494 AugmentedNdNetwork augmentLink =
495 (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500496 teLinks = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400497 for (Link link : augmentLink.link()) {
498 // Convert the Yang Link to a TE link.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500499 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500500 LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400501 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400502 }
503
504 // TE Topology Ids
505 if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
506 AugmentedNwNetwork augmentTeIds =
507 (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500508 teTopologyId =
Yixiao Chen39828a62016-09-14 14:37:06 -0400509 new org.onosproject.tetopology.management.api.TeTopologyId(
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500510 augmentTeIds.providerId().uint32(),
511 augmentTeIds.clientId().uint32(),
512 augmentTeIds.teTopologyId().string());
Yixiao Chen39828a62016-09-14 14:37:06 -0400513 }
514
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500515 if (yangNetworkState != null) {
516 serverProvided = yangNetworkState.serverProvided();
517 }
518
519 org.onosproject.tetopology.management.api.DefaultNetwork network =
520 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
521 teNodes, teLinks, teTopologyId,
Aihua Guo0bc12092017-02-10 09:53:55 -0500522 serverProvided,
523 deviceId,
524 NOT_OPTIMIZED);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500525 return network;
Yixiao Chen39828a62016-09-14 14:37:06 -0400526 }
527
528 /**
529 * Network object conversion from YANG to TE Topology subsystem.
530 *
531 * @param yangNetwork Network YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500532 * @param yangNetworks Networks YANG object
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500533 * @param deviceId The identifier of RESTCONF server device
Yixiao Chen39828a62016-09-14 14:37:06 -0400534 * @return network TE Topology subsystem networks object
535 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500536 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500537 Networks yangNetworks,
538 DeviceId deviceId) {
539 return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks, deviceId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400540 }
541
542 /**
543 * Network and State object conversion from YANG to TE Topology subsystem.
544 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500545 * @param yangNetwork Network YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400546 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500547 * @param yangNetworks Networks YANG object
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500548 * @param deviceId The identifier of RESTCONF server device
Yixiao Chen39828a62016-09-14 14:37:06 -0400549 * @return teSubsystem TE Topology subsystem networks object
550 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500551 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
552 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500553 .networksstate.Network yangNetworkState, Networks yangNetworks, DeviceId deviceId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400554 checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
555 checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500556
557 org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500558 yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks, deviceId);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500559
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400560 String networkref = yangNetworkState.networkRef().toString();
Yixiao Chen39828a62016-09-14 14:37:06 -0400561 checkState(teNetwork.networkId().toString().equals(networkref),
562 E_DIFF_YANG_NETWORKID);
563
Yixiao Chen39828a62016-09-14 14:37:06 -0400564 return teNetwork;
565 }
Henry Yua4e34f82016-11-06 18:30:59 -0500566
567 /**
568 * Converts a TE Topology event from the data format used in core to its
569 * corresponding YANG Object (YO) format.
570 *
571 * @param event TE Topology event from the core
Aihua Guo0a6998c2017-02-08 18:14:18 -0500572 * @param teTopologyService TE Topology Service object
Henry Yua4e34f82016-11-06 18:30:59 -0500573 * @return YANG Object converted from event
574 */
Aihua Guo0a6998c2017-02-08 18:14:18 -0500575 public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event,
576 TeTopologyService teTopologyService) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500577 IetfTeTopologyEvent yangEvent = null;
578 IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
579
580 IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
581 if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500582 NetworkLinkEventSubject eventData = (NetworkLinkEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500583 TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
Hesam Rahimi01f6ae02017-02-01 13:57:00 -0500584 TeLinkEvent yangLinkEvent = LinkConverter
Aihua Guo0a6998c2017-02-08 18:14:18 -0500585 .teNetworkLink2yangTeLinkEvent(linkEventType, eventData, teTopologyService);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500586 eventSubject.teLinkEvent(yangLinkEvent);
587 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
588 } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500589 NetworkNodeEventSubject eventData = (NetworkNodeEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500590 TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
591 TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
592 eventSubject.teNodeEvent(yangNodeEvent);
593 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
594 }
595
596 return yangEvent;
597 }
598
599 private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
600 IetfTeTopologyEvent.Type returnType = null;
601
602 switch (type) {
603 case LINK_ADDED:
604 case LINK_REMOVED:
605 case LINK_UPDATED:
606 returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
607 break;
608 case NODE_ADDED:
609 case NODE_REMOVED:
610 case NODE_UPDATED:
611 returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
612 break;
613 default:
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500614 log.warn("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500615 }
616
617 return returnType;
618 }
619
620 private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
621 TeTopologyEventTypeEnum returnType = null;
622
623 switch (type) {
624 case LINK_ADDED:
625 case NODE_ADDED:
626 returnType = TeTopologyEventTypeEnum.ADD;
627 break;
628 case LINK_REMOVED:
629 case NODE_REMOVED:
630 returnType = TeTopologyEventTypeEnum.REMOVE;
631 break;
632 case LINK_UPDATED:
633 case NODE_UPDATED:
634 returnType = TeTopologyEventTypeEnum.UPDATE;
635 break;
636 default:
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500637 log.warn("teTopoEventType2YangteTopoEventType: unsupported type: {}", type);
Hesam Rahimi41208102016-12-09 17:54:03 -0500638 break;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500639 }
640
641 return returnType;
Henry Yua4e34f82016-11-06 18:30:59 -0500642 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400643}
644
645