blob: 220577826d4046ad2e5e90d591e18eb542823436 [file] [log] [blame]
Yixiao Chen39828a62016-09-14 14:37:06 -04001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
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
Henry Yu4b4a7eb2016-11-09 20:07:53 -050018import com.google.common.collect.Lists;
19import com.google.common.collect.Maps;
20import org.onosproject.net.DeviceId;
Yixiao Chen39828a62016-09-14 14:37:06 -040021import org.onosproject.tetopology.management.api.KeyId;
Henry Yua4e34f82016-11-06 18:30:59 -050022import org.onosproject.tetopology.management.api.TeTopologyEvent;
Yixiao Chen39828a62016-09-14 14:37:06 -040023import org.onosproject.tetopology.management.api.link.NetworkLink;
24import org.onosproject.tetopology.management.api.node.NetworkNode;
25import org.onosproject.teyang.api.OperationType;
Hesam Rahimie96d0be2016-10-19 15:51:11 -040026import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050027import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.DefaultNetworks;
28import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
29 .DefaultNetworksState;
30import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
31import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
32import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
33import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks
34 .DefaultNetwork;
35import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
36import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network
37 .NetworkBuilder;
38import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
39 .DefaultNetworkTypes;
40import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
41 .DefaultSupportingNetwork;
42import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
43 .DefaultSupportingNetwork.SupportingNetworkBuilder;
44import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
45 .NetworkTypes;
46import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
47 .Node;
48import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
49 .SupportingNetwork;
50import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
51 .networks.network.AugmentedNdNetwork;
52import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
53 .networks.network.DefaultAugmentedNdNetwork;
54import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
55 .networks.network.DefaultAugmentedNdNetwork.AugmentedNdNetworkBuilder;
56import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
57 .networks.network.augmentedndnetwork.Link;
58import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
59 .IetfTeTopologyEvent;
60import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
61 .network.AugmentedNwNetwork;
62import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
63 .network.DefaultAugmentedNwNetwork;
64import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
65 .network.networktypes.AugmentedNwNetworkTypes;
66import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
67 .network.networktypes.DefaultAugmentedNwNetworkTypes;
68import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
69 .tetopologyaugment.DefaultTe;
70import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
71 .tetopologyaugment.Te;
72import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
73 .tetopologytype.DefaultTeTopology;
74import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
75 .tetopologytype.TeTopology;
76import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
77import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
Yixiao Chen39828a62016-09-14 14:37:06 -040078import org.slf4j.Logger;
79import org.slf4j.LoggerFactory;
80
Henry Yu4b4a7eb2016-11-09 20:07:53 -050081import java.util.List;
82import java.util.Map;
83
84import static com.google.common.base.Preconditions.checkNotNull;
85import static com.google.common.base.Preconditions.checkState;
Yixiao Chen39828a62016-09-14 14:37:06 -040086
87
88/**
89 * Networks, Networks State conversion functions.
90 */
91public final class NetworkConverter {
92 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -050093 E_NULL_TE_NETWORKS = "TeSubsystem networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -040094 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -050095 E_NULL_TE_NETWORK_LIST = "TeSubsystem network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -040096 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -050097 E_NULL_TE_NETWORK = "TeSubsystem network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -040098 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -050099 E_NULL_TE_NETWORKID = "TeSubsystem networkId cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400100 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500101 E_NULL_YANG_NETWORKS = "YANG networks cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400102 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500103 E_NULL_YANG_NETWORK_LIST = "YANG network list cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400104 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500105 E_NULL_YANG_NETWORK = "YANG network cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400106 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500107 E_NULL_YANG_NETWORKID = "YANG networkId cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400108 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500109 E_NULL_YANG_NETWORKSSTATE = "YANG networksState cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400110 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500111 E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
Yixiao Chen39828a62016-09-14 14:37:06 -0400112 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500113 E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState 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_YANG_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400116
117 private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
118
119 // no instantiation
120 private NetworkConverter() {
121 }
122
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400123 private static OnosYangOpType toNetworksOperationType(OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400124 switch (operation) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500125 case CREATE:
126 return OnosYangOpType.CREATE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400127
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500128 case DELETE:
129 return OnosYangOpType.DELETE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400130
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500131 case REMOVE:
132 return OnosYangOpType.REMOVE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400133
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500134 case MERGE:
135 return OnosYangOpType.MERGE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400136
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500137 case REPLACE:
138 return OnosYangOpType.REPLACE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400139
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500140 default:
141 return OnosYangOpType.NONE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400142 }
143 }
144
145 /**
146 * Networks object conversion from TE Topology subsystem to YANG.
147 *
148 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500149 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400150 * @return Networks YANG object
151 */
152 public static Networks teSubsystem2YangNetworks(
153 org.onosproject.tetopology.management.api.Networks teSubsystem,
154 OperationType operation) {
155 checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
156 checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
157 Networks.NetworksBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400158 DefaultNetworks.builder()
159 .yangNetworksOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400160 List<Network> networks = Lists.newArrayList();
161 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
162 networks.add(teSubsystem2YangNetwork(teNetwork, operation));
163 }
164 builder.network(networks);
165 return builder.build();
166 }
167
Yixiao Chen39828a62016-09-14 14:37:06 -0400168 /**
169 * Network States object conversion from TE Topology subsystem to YANG.
170 *
171 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500172 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400173 * @return NetworkStates YANG object
174 */
175 public static NetworksState teSubsystem2YangNetworkStates(
176 org.onosproject.tetopology.management.api.Networks teSubsystem,
177 OperationType operation) {
178 checkNotNull(teSubsystem, "teSubsystem object cannot be null");
179 checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
180 NetworksState.NetworksStateBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400181 DefaultNetworksState.builder()
182 .yangNetworksStateOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400183 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
184 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
185 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
186 networks.add(teSubsystem2YangNetworkState(teNetwork, operation));
187 }
188 builder.network(networks);
189 return builder.build();
190 }
191
192 private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
193 .ietfnetwork.networksstate.Network networkStateNetwork(Network network,
194 NetworksState yangNetworkStates) {
195 checkNotNull(network, "YANG Network object cannot be null");
196 checkNotNull(yangNetworkStates, "YANG NetworksState object cannot be null");
197 if (yangNetworkStates.network() == null) {
198 return null;
199 }
200
201 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
202 .ietfnetwork.networksstate.Network stateNetwork : yangNetworkStates.network()) {
203 if (stateNetwork.networkRef().equals(network.networkId())) {
204 return stateNetwork;
205 }
206 }
207 return null;
208 }
209
210 /**
211 * Networks object conversion from YANG to TE Topology subsystem.
212 *
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500213 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400214 * @param yangNetworkStates NetworkStates YANG object
215 * @return teSubsystem TE Topology subsystem networks object
216 */
217 public static org.onosproject.tetopology.management.api.Networks yang2TeSubsystemNetworks(
218 Networks yangNetworks, NetworksState yangNetworkStates) {
219 checkNotNull(yangNetworks, E_NULL_YANG_NETWORKS);
220 checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
221 checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
222
Yixiao Chen39828a62016-09-14 14:37:06 -0400223 List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
224 for (Network network : yangNetworks.network()) {
225 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
226 .ietfnetwork.networksstate.Network stateNetwork =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500227 networkStateNetwork(network, yangNetworkStates);
Yixiao Chen39828a62016-09-14 14:37:06 -0400228 org.onosproject.tetopology.management.api.Network teNetwork;
229 if (stateNetwork == null) {
230 log.info("networkId {} can't be found in yangNetworkStates",
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500231 network.networkId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400232 teNetwork = yang2TeSubsystemNetwork(network);
233 } else {
234 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork);
235 }
236 networks.add(teNetwork);
237 }
238
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500239 org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
240 new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400241 return defaultNetworks;
242 }
243
Yixiao Chen39828a62016-09-14 14:37:06 -0400244 private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
245 List<KeyId> teSpptNetworkIds) {
246 List<SupportingNetwork> snws = Lists.newArrayList();
247 SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
248 for (KeyId teSpNwKey : teSpptNetworkIds) {
249 snws.add(spNetworkBuilder
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500250 .networkRef(NetworkId.fromString(teSpNwKey.toString()))
251 .build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400252 }
253 return builder.supportingNetwork(snws);
254 }
255
256 private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500257 Map<KeyId, NetworkNode> teNodes) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400258 List<Node> nodeList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500259
260 for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400261 nodeList.add(NodeConverter.teSubsystem2YangNode(node));
262 }
263 return builder.node(nodeList);
264 }
265
266 private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500267 Map<KeyId, NetworkLink> teLinks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400268 List<Link> linkList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500269
270 for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400271 linkList.add(LinkConverter.teSubsystem2YangLink(link));
272 }
273 AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
274 ndAugment.link(linkList);
275 builder.addYangAugmentedInfo(ndAugment.build(), AugmentedNdNetwork.class);
276 return builder;
277 }
278
279 private static NetworkBuilder te2YangNetworkType(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500280 org.onosproject.tetopology.management.api.TeTopologyId
281 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400282 NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
283 if (teTopologyId != null) {
284 // Set "te-topology" network type.
285 TeTopology.TeTopologyBuilder teTopology = DefaultTeTopology.builder();
286 AugmentedNwNetworkTypes.AugmentedNwNetworkTypesBuilder teNwType =
287 DefaultAugmentedNwNetworkTypes.builder();
288 teNwType.teTopology(teTopology.build());
289 nwType.addYangAugmentedInfo(teNwType.build(), AugmentedNwNetworkTypes.class);
290 }
291 return builder.networkTypes(nwType.build());
292 }
293
294 private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500295 org.onosproject.tetopology.management.api.TeTopologyId
296 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400297 Te.TeBuilder teBuilder = DefaultTe.builder();
298 teBuilder.clientId(new TeGlobalId(teTopologyId.clientId()));
299 teBuilder.providerId(new TeGlobalId(teTopologyId.providerId()));
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500300 if (teTopologyId.topologyId() != null) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400301 teBuilder.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
302 }
303
304 AugmentedNwNetwork.AugmentedNwNetworkBuilder nwAugment = DefaultAugmentedNwNetwork
305 .builder();
306 nwAugment.te(teBuilder.build());
307 builder.addYangAugmentedInfo(nwAugment.build(),
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500308 AugmentedNwNetwork.class);
Yixiao Chen39828a62016-09-14 14:37:06 -0400309 return builder;
310 }
311
312 /**
313 * Network object conversion from TE Topology subsystem to YANG.
314 *
315 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500316 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400317 * @return Network YANG object
318 */
319 public static Network teSubsystem2YangNetwork(
320 org.onosproject.tetopology.management.api.Network teSubsystem,
321 OperationType operation) {
322 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
323 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
324
325 // Generate a network builder with the specific networkId.
326 NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
327 NetworkBuilder builder = DefaultNetwork.builder()
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500328 .yangNetworkOpType(
329 toNetworksOperationType(operation))
330 .networkId(networkId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400331
332 // Supporting networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500333 if (teSubsystem.supportingNetworkIds() != null) {
334 builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
Yixiao Chen39828a62016-09-14 14:37:06 -0400335 }
336
337 // Nodes
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500338 if (teSubsystem.nodes() != null) {
339 builder = te2YangNodes(builder, teSubsystem.nodes());
Yixiao Chen39828a62016-09-14 14:37:06 -0400340 }
341
342 // Network types
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500343 builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400344
345 // Add links - link is the augmentation
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500346 if (teSubsystem.links() != null) {
347 builder = te2YangLinks(builder, teSubsystem.links());
Yixiao Chen39828a62016-09-14 14:37:06 -0400348 }
349
350 // TE Topology IDs
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500351 if (teSubsystem.teTopologyId() != null) {
352 builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400353 }
354
355 return builder.build();
356 }
357
358 /**
359 * Network State object conversion from TE Topology subsystem to YANG.
360 *
361 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500362 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400363 * @return Network YANG object
364 */
365 public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500366 .rev20151208.ietfnetwork.networksstate.Network
367 teSubsystem2YangNetworkState(
368 org.onosproject.tetopology.management.api.Network teSubsystem,
369 OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400370 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
371 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
372
373 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
374 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500375 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
376 .ietfnetwork.networksstate.DefaultNetwork.builder();
Yixiao Chen39828a62016-09-14 14:37:06 -0400377
378 if (teSubsystem.networkId() != null) {
379 stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
380 }
381 stateBuilder.serverProvided(teSubsystem.isServerProvided());
382
383 // Operation type may be required.
384 return stateBuilder.build();
385 }
386
387
388 /**
389 * Network conversion from YANG to TE Topology subsystem.
390 *
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500391 * @param yangNetwork Network YANG object
392 * @param yangNetworkState NetworkState YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400393 * @return TE Topology subsystem defaultNetwork object
394 */
395 private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500396 Network yangNetwork,
397 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
398 yang.ietf.network.rev20151208.ietfnetwork.networksstate.
399 Network yangNetworkState) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400400 checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
401 checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
402 String networkId = yangNetwork.networkId().uri().string();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500403
404 KeyId networkKeyId = KeyId.keyId(networkId);
405 List<KeyId> supportingNetworkIds = null;
406 Map<KeyId, NetworkNode> teNodes = null;
407 Map<KeyId, NetworkLink> teLinks = null;
408 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
409 boolean serverProvided = false;
410 DeviceId ownerId = null;
Yixiao Chen39828a62016-09-14 14:37:06 -0400411
412 // Supporting networks
413 if (yangNetwork.supportingNetwork() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500414 supportingNetworkIds = Lists.newArrayList();
Yixiao Chen39828a62016-09-14 14:37:06 -0400415 for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
416 supportingNetworkIds.add(
417 KeyId.keyId(supportNw.networkRef().uri().string()));
418 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400419 }
420
421 // Nodes
422 if (yangNetwork.node() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500423 teNodes = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400424 for (Node node : yangNetwork.node()) {
425 // Convert the Yang Node to a TE node.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500426 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
427 NodeConverter.yang2TeSubsystemNode(node, yangNetwork.networkId()));
Yixiao Chen39828a62016-09-14 14:37:06 -0400428 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400429 }
430
431 // Links
432 if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
433 AugmentedNdNetwork augmentLink =
434 (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500435 teLinks = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400436 for (Link link : augmentLink.link()) {
437 // Convert the Yang Link to a TE link.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500438 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
439 LinkConverter.yang2TeSubsystemLink(link, yangNetwork.networkId()));
Yixiao Chen39828a62016-09-14 14:37:06 -0400440 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400441 }
442
443 // TE Topology Ids
444 if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
445 AugmentedNwNetwork augmentTeIds =
446 (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500447 teTopologyId =
Yixiao Chen39828a62016-09-14 14:37:06 -0400448 new org.onosproject.tetopology.management.api.TeTopologyId(
449 augmentTeIds.te().clientId().uint32(),
450 augmentTeIds.te().providerId().uint32(),
451 augmentTeIds.te().teTopologyId().string());
Yixiao Chen39828a62016-09-14 14:37:06 -0400452 }
453
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500454 if (yangNetworkState != null) {
455 serverProvided = yangNetworkState.serverProvided();
456 }
457
458 org.onosproject.tetopology.management.api.DefaultNetwork network =
459 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
460 teNodes, teLinks, teTopologyId,
461 serverProvided, ownerId);
462 return network;
Yixiao Chen39828a62016-09-14 14:37:06 -0400463 }
464
465 /**
466 * Network object conversion from YANG to TE Topology subsystem.
467 *
468 * @param yangNetwork Network YANG object
469 * @return network TE Topology subsystem networks object
470 */
471 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500472 return yang2TeDefaultNetwork(yangNetwork, null);
Yixiao Chen39828a62016-09-14 14:37:06 -0400473 }
474
475 /**
476 * Network and State object conversion from YANG to TE Topology subsystem.
477 *
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500478 * @param yangNetwork Network YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400479 * @param yangNetworkState NetworkState YANG object
480 * @return teSubsystem TE Topology subsystem networks object
481 */
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500482 public static org.onosproject.tetopology.management.api.Network
483 yang2TeSubsystemNetwork(Network yangNetwork,
484 org.onosproject.yang.gen
485 .v1.urn.ietf
486 .params.xml.ns
487 .yang.ietf
488 .network
489 .rev20151208.ietfnetwork
490 .networksstate
491 .Network
492 yangNetworkState) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400493 checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
494 checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500495
496 org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
497 yang2TeDefaultNetwork(yangNetwork, yangNetworkState);
498
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400499 String networkref = yangNetworkState.networkRef().toString();
Yixiao Chen39828a62016-09-14 14:37:06 -0400500 checkState(teNetwork.networkId().toString().equals(networkref),
501 E_DIFF_YANG_NETWORKID);
502
Yixiao Chen39828a62016-09-14 14:37:06 -0400503 return teNetwork;
504 }
Henry Yua4e34f82016-11-06 18:30:59 -0500505
506 /**
507 * Converts a TE Topology event from the data format used in core to its
508 * corresponding YANG Object (YO) format.
509 *
510 * @param event TE Topology event from the core
511 * @return YANG Object converted from event
512 */
513 public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500514 // TODO: implementation will be submitted as a seperate review.
515 return null;
Henry Yua4e34f82016-11-06 18:30:59 -0500516 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400517}
518
519