blob: f87b0b1022ada82be7feda72cc402f797ae8a9a9 [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;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050060import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.IetfTeTopologyEventSubject;
61import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
62import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050063import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
64 .network.AugmentedNwNetwork;
65import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
66 .network.DefaultAugmentedNwNetwork;
67import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
68 .network.networktypes.AugmentedNwNetworkTypes;
69import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
70 .network.networktypes.DefaultAugmentedNwNetworkTypes;
71import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
72 .tetopologyaugment.DefaultTe;
73import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
74 .tetopologyaugment.Te;
75import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
76 .tetopologytype.DefaultTeTopology;
77import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
78 .tetopologytype.TeTopology;
79import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
80import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050081import 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 -040082import org.slf4j.Logger;
83import org.slf4j.LoggerFactory;
84
Henry Yu4b4a7eb2016-11-09 20:07:53 -050085import java.util.List;
86import java.util.Map;
87
88import static com.google.common.base.Preconditions.checkNotNull;
89import static com.google.common.base.Preconditions.checkState;
Yixiao Chen39828a62016-09-14 14:37:06 -040090
91
92/**
93 * Networks, Networks State conversion functions.
94 */
95public final class NetworkConverter {
96 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -050097 E_NULL_TE_NETWORKS = "TeSubsystem networks 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_NETWORK_LIST = "TeSubsystem network list 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_TE_NETWORK = "TeSubsystem network 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_TE_NETWORKID = "TeSubsystem networkId 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_NETWORKS = "YANG networks 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_NETWORK_LIST = "YANG network list 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_NETWORK = "YANG network 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_YANG_NETWORKID = "YANG networkId 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_YANG_NETWORKSSTATE = "YANG networksState cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400114 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500115 E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
Yixiao Chen39828a62016-09-14 14:37:06 -0400116 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500117 E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState network 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_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400120
121 private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
122
123 // no instantiation
124 private NetworkConverter() {
125 }
126
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400127 private static OnosYangOpType toNetworksOperationType(OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400128 switch (operation) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500129 case CREATE:
130 return OnosYangOpType.CREATE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400131
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500132 case DELETE:
133 return OnosYangOpType.DELETE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400134
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500135 case REMOVE:
136 return OnosYangOpType.REMOVE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400137
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500138 case MERGE:
139 return OnosYangOpType.MERGE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400140
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500141 case REPLACE:
142 return OnosYangOpType.REPLACE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400143
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500144 default:
145 return OnosYangOpType.NONE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400146 }
147 }
148
149 /**
150 * Networks object conversion from TE Topology subsystem to YANG.
151 *
152 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500153 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400154 * @return Networks YANG object
155 */
156 public static Networks teSubsystem2YangNetworks(
157 org.onosproject.tetopology.management.api.Networks teSubsystem,
158 OperationType operation) {
159 checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
160 checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
161 Networks.NetworksBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400162 DefaultNetworks.builder()
163 .yangNetworksOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400164 List<Network> networks = Lists.newArrayList();
165 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
166 networks.add(teSubsystem2YangNetwork(teNetwork, operation));
167 }
168 builder.network(networks);
169 return builder.build();
170 }
171
Yixiao Chen39828a62016-09-14 14:37:06 -0400172 /**
173 * Network States object conversion from TE Topology subsystem to YANG.
174 *
175 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500176 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400177 * @return NetworkStates YANG object
178 */
179 public static NetworksState teSubsystem2YangNetworkStates(
180 org.onosproject.tetopology.management.api.Networks teSubsystem,
181 OperationType operation) {
182 checkNotNull(teSubsystem, "teSubsystem object cannot be null");
183 checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
184 NetworksState.NetworksStateBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400185 DefaultNetworksState.builder()
186 .yangNetworksStateOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400187 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
188 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
189 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
190 networks.add(teSubsystem2YangNetworkState(teNetwork, operation));
191 }
192 builder.network(networks);
193 return builder.build();
194 }
195
196 private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
197 .ietfnetwork.networksstate.Network networkStateNetwork(Network network,
198 NetworksState yangNetworkStates) {
199 checkNotNull(network, "YANG Network object cannot be null");
200 checkNotNull(yangNetworkStates, "YANG NetworksState object cannot be null");
201 if (yangNetworkStates.network() == null) {
202 return null;
203 }
204
205 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
206 .ietfnetwork.networksstate.Network stateNetwork : yangNetworkStates.network()) {
207 if (stateNetwork.networkRef().equals(network.networkId())) {
208 return stateNetwork;
209 }
210 }
211 return null;
212 }
213
214 /**
215 * Networks object conversion from YANG to TE Topology subsystem.
216 *
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500217 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400218 * @param yangNetworkStates NetworkStates YANG object
219 * @return teSubsystem TE Topology subsystem networks object
220 */
221 public static org.onosproject.tetopology.management.api.Networks yang2TeSubsystemNetworks(
222 Networks yangNetworks, NetworksState yangNetworkStates) {
223 checkNotNull(yangNetworks, E_NULL_YANG_NETWORKS);
224 checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
225 checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
226
Yixiao Chen39828a62016-09-14 14:37:06 -0400227 List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
228 for (Network network : yangNetworks.network()) {
229 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
230 .ietfnetwork.networksstate.Network stateNetwork =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500231 networkStateNetwork(network, yangNetworkStates);
Yixiao Chen39828a62016-09-14 14:37:06 -0400232 org.onosproject.tetopology.management.api.Network teNetwork;
233 if (stateNetwork == null) {
234 log.info("networkId {} can't be found in yangNetworkStates",
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500235 network.networkId());
236 teNetwork = yang2TeSubsystemNetwork(network, yangNetworks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400237 } else {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500238 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400239 }
240 networks.add(teNetwork);
241 }
242
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500243 org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
244 new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400245 return defaultNetworks;
246 }
247
Yixiao Chen39828a62016-09-14 14:37:06 -0400248 private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
249 List<KeyId> teSpptNetworkIds) {
250 List<SupportingNetwork> snws = Lists.newArrayList();
251 SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
252 for (KeyId teSpNwKey : teSpptNetworkIds) {
253 snws.add(spNetworkBuilder
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500254 .networkRef(NetworkId.fromString(teSpNwKey.toString()))
255 .build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400256 }
257 return builder.supportingNetwork(snws);
258 }
259
260 private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500261 Map<KeyId, NetworkNode> teNodes) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400262 List<Node> nodeList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500263
264 for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400265 nodeList.add(NodeConverter.teSubsystem2YangNode(node));
266 }
267 return builder.node(nodeList);
268 }
269
270 private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500271 Map<KeyId, NetworkLink> teLinks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400272 List<Link> linkList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500273
274 for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400275 linkList.add(LinkConverter.teSubsystem2YangLink(link));
276 }
277 AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
278 ndAugment.link(linkList);
279 builder.addYangAugmentedInfo(ndAugment.build(), AugmentedNdNetwork.class);
280 return builder;
281 }
282
283 private static NetworkBuilder te2YangNetworkType(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500284 org.onosproject.tetopology.management.api.TeTopologyId
285 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400286 NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
287 if (teTopologyId != null) {
288 // Set "te-topology" network type.
289 TeTopology.TeTopologyBuilder teTopology = DefaultTeTopology.builder();
290 AugmentedNwNetworkTypes.AugmentedNwNetworkTypesBuilder teNwType =
291 DefaultAugmentedNwNetworkTypes.builder();
292 teNwType.teTopology(teTopology.build());
293 nwType.addYangAugmentedInfo(teNwType.build(), AugmentedNwNetworkTypes.class);
294 }
295 return builder.networkTypes(nwType.build());
296 }
297
298 private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500299 org.onosproject.tetopology.management.api.TeTopologyId
300 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400301 Te.TeBuilder teBuilder = DefaultTe.builder();
302 teBuilder.clientId(new TeGlobalId(teTopologyId.clientId()));
303 teBuilder.providerId(new TeGlobalId(teTopologyId.providerId()));
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500304 if (teTopologyId.topologyId() != null) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400305 teBuilder.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
306 }
307
308 AugmentedNwNetwork.AugmentedNwNetworkBuilder nwAugment = DefaultAugmentedNwNetwork
309 .builder();
310 nwAugment.te(teBuilder.build());
311 builder.addYangAugmentedInfo(nwAugment.build(),
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500312 AugmentedNwNetwork.class);
Yixiao Chen39828a62016-09-14 14:37:06 -0400313 return builder;
314 }
315
316 /**
317 * Network object conversion from TE Topology subsystem to YANG.
318 *
319 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500320 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400321 * @return Network YANG object
322 */
323 public static Network teSubsystem2YangNetwork(
324 org.onosproject.tetopology.management.api.Network teSubsystem,
325 OperationType operation) {
326 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
327 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
328
329 // Generate a network builder with the specific networkId.
330 NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
331 NetworkBuilder builder = DefaultNetwork.builder()
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500332 .yangNetworkOpType(
333 toNetworksOperationType(operation))
334 .networkId(networkId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400335
336 // Supporting networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500337 if (teSubsystem.supportingNetworkIds() != null) {
338 builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
Yixiao Chen39828a62016-09-14 14:37:06 -0400339 }
340
341 // Nodes
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500342 if (teSubsystem.nodes() != null) {
343 builder = te2YangNodes(builder, teSubsystem.nodes());
Yixiao Chen39828a62016-09-14 14:37:06 -0400344 }
345
346 // Network types
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500347 builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400348
349 // Add links - link is the augmentation
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500350 if (teSubsystem.links() != null) {
351 builder = te2YangLinks(builder, teSubsystem.links());
Yixiao Chen39828a62016-09-14 14:37:06 -0400352 }
353
354 // TE Topology IDs
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500355 if (teSubsystem.teTopologyId() != null) {
356 builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400357 }
358
359 return builder.build();
360 }
361
362 /**
363 * Network State object conversion from TE Topology subsystem to YANG.
364 *
365 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500366 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400367 * @return Network YANG object
368 */
369 public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500370 .rev20151208.ietfnetwork.networksstate.Network
371 teSubsystem2YangNetworkState(
372 org.onosproject.tetopology.management.api.Network teSubsystem,
373 OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400374 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
375 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
376
377 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
378 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500379 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
380 .ietfnetwork.networksstate.DefaultNetwork.builder();
Yixiao Chen39828a62016-09-14 14:37:06 -0400381
382 if (teSubsystem.networkId() != null) {
383 stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
384 }
385 stateBuilder.serverProvided(teSubsystem.isServerProvided());
386
387 // Operation type may be required.
388 return stateBuilder.build();
389 }
390
391
392 /**
393 * Network conversion from YANG to TE Topology subsystem.
394 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500395 * @param yangNetwork Network YANG object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500396 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500397 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400398 * @return TE Topology subsystem defaultNetwork object
399 */
400 private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500401 Network yangNetwork,
402 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
403 yang.ietf.network.rev20151208.ietfnetwork.networksstate.
404 Network yangNetworkState,
405 Networks yangNetworks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400406 checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
407 checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
408 String networkId = yangNetwork.networkId().uri().string();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500409
410 KeyId networkKeyId = KeyId.keyId(networkId);
411 List<KeyId> supportingNetworkIds = null;
412 Map<KeyId, NetworkNode> teNodes = null;
413 Map<KeyId, NetworkLink> teLinks = null;
414 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
415 boolean serverProvided = false;
416 DeviceId ownerId = null;
Yixiao Chen39828a62016-09-14 14:37:06 -0400417
418 // Supporting networks
419 if (yangNetwork.supportingNetwork() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500420 supportingNetworkIds = Lists.newArrayList();
Yixiao Chen39828a62016-09-14 14:37:06 -0400421 for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
422 supportingNetworkIds.add(
423 KeyId.keyId(supportNw.networkRef().uri().string()));
424 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400425 }
426
427 // Nodes
428 if (yangNetwork.node() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500429 teNodes = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400430 for (Node node : yangNetwork.node()) {
431 // Convert the Yang Node to a TE node.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500432 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500433 NodeConverter.yang2TeSubsystemNode(node, yangNetwork));
Yixiao Chen39828a62016-09-14 14:37:06 -0400434 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400435 }
436
437 // Links
438 if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
439 AugmentedNdNetwork augmentLink =
440 (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500441 teLinks = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400442 for (Link link : augmentLink.link()) {
443 // Convert the Yang Link to a TE link.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500444 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500445 LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400446 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400447 }
448
449 // TE Topology Ids
450 if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
451 AugmentedNwNetwork augmentTeIds =
452 (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500453 teTopologyId =
Yixiao Chen39828a62016-09-14 14:37:06 -0400454 new org.onosproject.tetopology.management.api.TeTopologyId(
455 augmentTeIds.te().clientId().uint32(),
456 augmentTeIds.te().providerId().uint32(),
457 augmentTeIds.te().teTopologyId().string());
Yixiao Chen39828a62016-09-14 14:37:06 -0400458 }
459
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500460 if (yangNetworkState != null) {
461 serverProvided = yangNetworkState.serverProvided();
462 }
463
464 org.onosproject.tetopology.management.api.DefaultNetwork network =
465 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
466 teNodes, teLinks, teTopologyId,
467 serverProvided, ownerId);
468 return network;
Yixiao Chen39828a62016-09-14 14:37:06 -0400469 }
470
471 /**
472 * Network object conversion from YANG to TE Topology subsystem.
473 *
474 * @param yangNetwork Network YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500475 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400476 * @return network TE Topology subsystem networks object
477 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500478 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
479 Networks yangNetworks) {
480 return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400481 }
482
483 /**
484 * Network and State object conversion from YANG to TE Topology subsystem.
485 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500486 * @param yangNetwork Network YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400487 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500488 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400489 * @return teSubsystem TE Topology subsystem networks object
490 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500491 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
492 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
493 .networksstate.Network yangNetworkState, Networks yangNetworks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400494 checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
495 checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500496
497 org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500498 yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500499
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400500 String networkref = yangNetworkState.networkRef().toString();
Yixiao Chen39828a62016-09-14 14:37:06 -0400501 checkState(teNetwork.networkId().toString().equals(networkref),
502 E_DIFF_YANG_NETWORKID);
503
Yixiao Chen39828a62016-09-14 14:37:06 -0400504 return teNetwork;
505 }
Henry Yua4e34f82016-11-06 18:30:59 -0500506
507 /**
508 * Converts a TE Topology event from the data format used in core to its
509 * corresponding YANG Object (YO) format.
510 *
511 * @param event TE Topology event from the core
512 * @return YANG Object converted from event
513 */
514 public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500515 IetfTeTopologyEvent yangEvent = null;
516 IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
517
518 IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
519 if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
520 NetworkLink eventData = (NetworkLink) event.subject();
521 TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
522 TeLinkEvent yangLinkEvent = LinkConverter.teNetworkLink2yangTeLinkEvent(linkEventType, eventData);
523 eventSubject.teLinkEvent(yangLinkEvent);
524 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
525 } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
526 NetworkNode eventData = (NetworkNode) event.subject();
527 TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
528 TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
529 eventSubject.teNodeEvent(yangNodeEvent);
530 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
531 }
532
533 return yangEvent;
534 }
535
536 private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
537 IetfTeTopologyEvent.Type returnType = null;
538
539 switch (type) {
540 case LINK_ADDED:
541 case LINK_REMOVED:
542 case LINK_UPDATED:
543 returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
544 break;
545 case NODE_ADDED:
546 case NODE_REMOVED:
547 case NODE_UPDATED:
548 returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
549 break;
550 default:
551 log.error("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
552 }
553
554 return returnType;
555 }
556
557 private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
558 TeTopologyEventTypeEnum returnType = null;
559
560 switch (type) {
561 case LINK_ADDED:
562 case NODE_ADDED:
563 returnType = TeTopologyEventTypeEnum.ADD;
564 break;
565 case LINK_REMOVED:
566 case NODE_REMOVED:
567 returnType = TeTopologyEventTypeEnum.REMOVE;
568 break;
569 case LINK_UPDATED:
570 case NODE_UPDATED:
571 returnType = TeTopologyEventTypeEnum.UPDATE;
572 break;
573 default:
574 log.error("teTopoEventType2YangTeTopoEventType: unknown type: {}", type);
575 }
576
577 return returnType;
Henry Yua4e34f82016-11-06 18:30:59 -0500578 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400579}
580
581