blob: e1e2e0140059fc1d7f5f6be9c8d7c077abf0a4b3 [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;
Hesam Rahimi41208102016-12-09 17:54:03 -050023import org.onosproject.tetopology.management.api.TeTopologyKey;
24import org.onosproject.tetopology.management.api.TeTopologyService;
Yixiao Chen39828a62016-09-14 14:37:06 -040025import org.onosproject.tetopology.management.api.link.NetworkLink;
Hesam Rahimi41208102016-12-09 17:54:03 -050026import org.onosproject.tetopology.management.api.link.NetworkLinkEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040027import org.onosproject.tetopology.management.api.node.NetworkNode;
Hesam Rahimi41208102016-12-09 17:54:03 -050028import org.onosproject.tetopology.management.api.node.NetworkNodeEventSubject;
Yixiao Chen39828a62016-09-14 14:37:06 -040029import org.onosproject.teyang.api.OperationType;
Hesam Rahimie96d0be2016-10-19 15:51:11 -040030import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050031import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.DefaultNetworks;
32import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
33 .DefaultNetworksState;
34import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
35import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
36import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
37import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks
38 .DefaultNetwork;
39import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
40import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network
41 .NetworkBuilder;
42import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
43 .DefaultNetworkTypes;
44import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
45 .DefaultSupportingNetwork;
46import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
47 .DefaultSupportingNetwork.SupportingNetworkBuilder;
48import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
49 .NetworkTypes;
50import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
51 .Node;
52import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
53 .SupportingNetwork;
54import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
55 .networks.network.AugmentedNdNetwork;
56import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
57 .networks.network.DefaultAugmentedNdNetwork;
58import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
59 .networks.network.DefaultAugmentedNdNetwork.AugmentedNdNetworkBuilder;
60import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
61 .networks.network.augmentedndnetwork.Link;
62import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
63 .IetfTeTopologyEvent;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050064import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.IetfTeTopologyEventSubject;
65import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
66import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050067import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
68 .network.AugmentedNwNetwork;
69import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
70 .network.DefaultAugmentedNwNetwork;
71import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
72 .network.networktypes.AugmentedNwNetworkTypes;
73import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
74 .network.networktypes.DefaultAugmentedNwNetworkTypes;
75import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
76 .tetopologyaugment.DefaultTe;
77import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
78 .tetopologyaugment.Te;
79import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
80 .tetopologytype.DefaultTeTopology;
81import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
82 .tetopologytype.TeTopology;
83import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
84import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
Hesam Rahimi39bdc002016-11-10 15:01:26 -050085import 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 -040086import org.slf4j.Logger;
87import org.slf4j.LoggerFactory;
88
Henry Yu4b4a7eb2016-11-09 20:07:53 -050089import java.util.List;
90import java.util.Map;
91
92import static com.google.common.base.Preconditions.checkNotNull;
93import static com.google.common.base.Preconditions.checkState;
Yixiao Chen39828a62016-09-14 14:37:06 -040094
95
96/**
97 * Networks, Networks State conversion functions.
98 */
99public final class NetworkConverter {
100 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500101 E_NULL_TE_NETWORKS = "TeSubsystem 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_TE_NETWORK_LIST = "TeSubsystem 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_TE_NETWORK = "TeSubsystem 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_TE_NETWORKID = "TeSubsystem 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_NETWORKS = "YANG 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_YANG_NETWORK_LIST = "YANG 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_YANG_NETWORK = "YANG 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_NETWORKID = "YANG 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_NETWORKSSTATE = "YANG networksState cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400118 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500119 E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
Yixiao Chen39828a62016-09-14 14:37:06 -0400120 private static final String
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500121 E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState 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_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
Yixiao Chen39828a62016-09-14 14:37:06 -0400124
125 private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
126
127 // no instantiation
128 private NetworkConverter() {
129 }
130
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400131 private static OnosYangOpType toNetworksOperationType(OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400132 switch (operation) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500133 case CREATE:
134 return OnosYangOpType.CREATE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400135
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500136 case DELETE:
137 return OnosYangOpType.DELETE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400138
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500139 case REMOVE:
140 return OnosYangOpType.REMOVE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400141
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500142 case MERGE:
143 return OnosYangOpType.MERGE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400144
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500145 case REPLACE:
146 return OnosYangOpType.REPLACE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400147
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500148 default:
149 return OnosYangOpType.NONE;
Yixiao Chen39828a62016-09-14 14:37:06 -0400150 }
151 }
152
153 /**
154 * Networks object conversion from TE Topology subsystem to YANG.
155 *
156 * @param teSubsystem TE Topology subsystem networks object
Hesam Rahimi41208102016-12-09 17:54:03 -0500157 * @param operation operation type
158 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400159 * @return Networks YANG object
160 */
161 public static Networks teSubsystem2YangNetworks(
162 org.onosproject.tetopology.management.api.Networks teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500163 OperationType operation,
164 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400165 checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
166 checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
167 Networks.NetworksBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400168 DefaultNetworks.builder()
169 .yangNetworksOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400170 List<Network> networks = Lists.newArrayList();
171 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500172 networks.add(teSubsystem2YangNetwork(teNetwork, operation,
173 teTopologyService));
Yixiao Chen39828a62016-09-14 14:37:06 -0400174 }
175 builder.network(networks);
176 return builder.build();
177 }
178
Yixiao Chen39828a62016-09-14 14:37:06 -0400179 /**
180 * Network States object conversion from TE Topology subsystem to YANG.
181 *
182 * @param teSubsystem TE Topology subsystem networks object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500183 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400184 * @return NetworkStates YANG object
185 */
186 public static NetworksState teSubsystem2YangNetworkStates(
187 org.onosproject.tetopology.management.api.Networks teSubsystem,
188 OperationType operation) {
189 checkNotNull(teSubsystem, "teSubsystem object cannot be null");
190 checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
191 NetworksState.NetworksStateBuilder builder =
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400192 DefaultNetworksState.builder()
193 .yangNetworksStateOpType(toNetworksOperationType(operation));
Yixiao Chen39828a62016-09-14 14:37:06 -0400194 List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
195 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
196 for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
197 networks.add(teSubsystem2YangNetworkState(teNetwork, operation));
198 }
199 builder.network(networks);
200 return builder.build();
201 }
202
203 private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
204 .ietfnetwork.networksstate.Network networkStateNetwork(Network network,
205 NetworksState yangNetworkStates) {
206 checkNotNull(network, "YANG Network object cannot be null");
207 checkNotNull(yangNetworkStates, "YANG NetworksState object cannot be null");
208 if (yangNetworkStates.network() == null) {
209 return null;
210 }
211
212 for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
213 .ietfnetwork.networksstate.Network stateNetwork : yangNetworkStates.network()) {
214 if (stateNetwork.networkRef().equals(network.networkId())) {
215 return stateNetwork;
216 }
217 }
218 return null;
219 }
220
221 /**
222 * Networks object conversion from YANG to TE Topology subsystem.
223 *
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500224 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400225 * @param yangNetworkStates NetworkStates YANG object
226 * @return teSubsystem TE Topology subsystem networks object
227 */
228 public static org.onosproject.tetopology.management.api.Networks yang2TeSubsystemNetworks(
229 Networks yangNetworks, NetworksState yangNetworkStates) {
230 checkNotNull(yangNetworks, E_NULL_YANG_NETWORKS);
231 checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
232 checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
233
Yixiao Chen39828a62016-09-14 14:37:06 -0400234 List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
235 for (Network network : yangNetworks.network()) {
236 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
237 .ietfnetwork.networksstate.Network stateNetwork =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500238 networkStateNetwork(network, yangNetworkStates);
Yixiao Chen39828a62016-09-14 14:37:06 -0400239 org.onosproject.tetopology.management.api.Network teNetwork;
240 if (stateNetwork == null) {
241 log.info("networkId {} can't be found in yangNetworkStates",
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500242 network.networkId());
243 teNetwork = yang2TeSubsystemNetwork(network, yangNetworks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400244 } else {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500245 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400246 }
247 networks.add(teNetwork);
248 }
249
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500250 org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
251 new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400252 return defaultNetworks;
253 }
254
Yixiao Chen39828a62016-09-14 14:37:06 -0400255 private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
256 List<KeyId> teSpptNetworkIds) {
257 List<SupportingNetwork> snws = Lists.newArrayList();
258 SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
259 for (KeyId teSpNwKey : teSpptNetworkIds) {
260 snws.add(spNetworkBuilder
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500261 .networkRef(NetworkId.fromString(teSpNwKey.toString()))
262 .build());
Yixiao Chen39828a62016-09-14 14:37:06 -0400263 }
264 return builder.supportingNetwork(snws);
265 }
266
267 private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
Hesam Rahimi41208102016-12-09 17:54:03 -0500268 Map<KeyId, NetworkNode> teNodes,
269 TeTopologyService teTopologyService,
270 TeTopologyKey teTopologyKey) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400271 List<Node> nodeList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500272
273 for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500274 nodeList.add(NodeConverter.teSubsystem2YangNode(node,
275 teTopologyService,
276 teTopologyKey));
Yixiao Chen39828a62016-09-14 14:37:06 -0400277 }
278 return builder.node(nodeList);
279 }
280
281 private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500282 Map<KeyId, NetworkLink> teLinks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400283 List<Link> linkList = Lists.newArrayList();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500284
285 for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400286 linkList.add(LinkConverter.teSubsystem2YangLink(link));
287 }
288 AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
289 ndAugment.link(linkList);
290 builder.addYangAugmentedInfo(ndAugment.build(), AugmentedNdNetwork.class);
291 return builder;
292 }
293
294 private static NetworkBuilder te2YangNetworkType(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 NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
298 if (teTopologyId != null) {
299 // Set "te-topology" network type.
300 TeTopology.TeTopologyBuilder teTopology = DefaultTeTopology.builder();
301 AugmentedNwNetworkTypes.AugmentedNwNetworkTypesBuilder teNwType =
302 DefaultAugmentedNwNetworkTypes.builder();
303 teNwType.teTopology(teTopology.build());
304 nwType.addYangAugmentedInfo(teNwType.build(), AugmentedNwNetworkTypes.class);
305 }
306 return builder.networkTypes(nwType.build());
307 }
308
309 private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500310 org.onosproject.tetopology.management.api.TeTopologyId
311 teTopologyId) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400312 Te.TeBuilder teBuilder = DefaultTe.builder();
313 teBuilder.clientId(new TeGlobalId(teTopologyId.clientId()));
314 teBuilder.providerId(new TeGlobalId(teTopologyId.providerId()));
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500315 if (teTopologyId.topologyId() != null) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400316 teBuilder.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
317 }
318
319 AugmentedNwNetwork.AugmentedNwNetworkBuilder nwAugment = DefaultAugmentedNwNetwork
320 .builder();
321 nwAugment.te(teBuilder.build());
322 builder.addYangAugmentedInfo(nwAugment.build(),
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500323 AugmentedNwNetwork.class);
Yixiao Chen39828a62016-09-14 14:37:06 -0400324 return builder;
325 }
326
327 /**
328 * Network object conversion from TE Topology subsystem to YANG.
329 *
330 * @param teSubsystem TE Topology subsystem network object
Hesam Rahimi41208102016-12-09 17:54:03 -0500331 * @param operation operation type
332 * @param teTopologyService teTopology core service
Yixiao Chen39828a62016-09-14 14:37:06 -0400333 * @return Network YANG object
334 */
335 public static Network teSubsystem2YangNetwork(
336 org.onosproject.tetopology.management.api.Network teSubsystem,
Hesam Rahimi41208102016-12-09 17:54:03 -0500337 OperationType operation,
338 TeTopologyService teTopologyService) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400339 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
340 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
341
342 // Generate a network builder with the specific networkId.
343 NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
344 NetworkBuilder builder = DefaultNetwork.builder()
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500345 .yangNetworkOpType(
346 toNetworksOperationType(operation))
347 .networkId(networkId);
Yixiao Chen39828a62016-09-14 14:37:06 -0400348
349 // Supporting networks
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500350 if (teSubsystem.supportingNetworkIds() != null) {
351 builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
Yixiao Chen39828a62016-09-14 14:37:06 -0400352 }
353
354 // Nodes
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500355 if (teSubsystem.nodes() != null) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500356 org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(teSubsystem.networkId());
357 TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
358 nt.teTopologyId().clientId(),
359 Long.valueOf(nt.teTopologyId().topologyId()));
360 builder = te2YangNodes(builder, teSubsystem.nodes(),
361 teTopologyService,
362 teTopoKey);
Yixiao Chen39828a62016-09-14 14:37:06 -0400363 }
364
365 // Network types
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500366 builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400367
368 // Add links - link is the augmentation
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500369 if (teSubsystem.links() != null) {
370 builder = te2YangLinks(builder, teSubsystem.links());
Yixiao Chen39828a62016-09-14 14:37:06 -0400371 }
372
373 // TE Topology IDs
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500374 if (teSubsystem.teTopologyId() != null) {
375 builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId());
Yixiao Chen39828a62016-09-14 14:37:06 -0400376 }
377
378 return builder.build();
379 }
380
381 /**
382 * Network State object conversion from TE Topology subsystem to YANG.
383 *
384 * @param teSubsystem TE Topology subsystem network object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500385 * @param operation operation type
Yixiao Chen39828a62016-09-14 14:37:06 -0400386 * @return Network YANG object
387 */
388 public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500389 .rev20151208.ietfnetwork.networksstate.Network
390 teSubsystem2YangNetworkState(
391 org.onosproject.tetopology.management.api.Network teSubsystem,
392 OperationType operation) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400393 checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
394 checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
395
396 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
397 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500398 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
399 .ietfnetwork.networksstate.DefaultNetwork.builder();
Yixiao Chen39828a62016-09-14 14:37:06 -0400400
401 if (teSubsystem.networkId() != null) {
402 stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
403 }
404 stateBuilder.serverProvided(teSubsystem.isServerProvided());
405
406 // Operation type may be required.
407 return stateBuilder.build();
408 }
409
410
411 /**
412 * Network conversion from YANG to TE Topology subsystem.
413 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500414 * @param yangNetwork Network YANG object
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500415 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500416 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400417 * @return TE Topology subsystem defaultNetwork object
418 */
419 private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500420 Network yangNetwork,
421 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
422 yang.ietf.network.rev20151208.ietfnetwork.networksstate.
423 Network yangNetworkState,
424 Networks yangNetworks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400425 checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
426 checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
427 String networkId = yangNetwork.networkId().uri().string();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500428
429 KeyId networkKeyId = KeyId.keyId(networkId);
430 List<KeyId> supportingNetworkIds = null;
431 Map<KeyId, NetworkNode> teNodes = null;
432 Map<KeyId, NetworkLink> teLinks = null;
433 org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
434 boolean serverProvided = false;
435 DeviceId ownerId = null;
Yixiao Chen39828a62016-09-14 14:37:06 -0400436
437 // Supporting networks
438 if (yangNetwork.supportingNetwork() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500439 supportingNetworkIds = Lists.newArrayList();
Yixiao Chen39828a62016-09-14 14:37:06 -0400440 for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
441 supportingNetworkIds.add(
442 KeyId.keyId(supportNw.networkRef().uri().string()));
443 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400444 }
445
446 // Nodes
447 if (yangNetwork.node() != null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500448 teNodes = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400449 for (Node node : yangNetwork.node()) {
450 // Convert the Yang Node to a TE node.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500451 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500452 NodeConverter.yang2TeSubsystemNode(node, yangNetwork));
Yixiao Chen39828a62016-09-14 14:37:06 -0400453 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400454 }
455
456 // Links
457 if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
458 AugmentedNdNetwork augmentLink =
459 (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500460 teLinks = Maps.newHashMap();
Yixiao Chen39828a62016-09-14 14:37:06 -0400461 for (Link link : augmentLink.link()) {
462 // Convert the Yang Link to a TE link.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500463 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500464 LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
Yixiao Chen39828a62016-09-14 14:37:06 -0400465 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400466 }
467
468 // TE Topology Ids
469 if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
470 AugmentedNwNetwork augmentTeIds =
471 (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500472 teTopologyId =
Yixiao Chen39828a62016-09-14 14:37:06 -0400473 new org.onosproject.tetopology.management.api.TeTopologyId(
Yixiao Chen39828a62016-09-14 14:37:06 -0400474 augmentTeIds.te().providerId().uint32(),
Hesam Rahimi41208102016-12-09 17:54:03 -0500475 augmentTeIds.te().clientId().uint32(),
Yixiao Chen39828a62016-09-14 14:37:06 -0400476 augmentTeIds.te().teTopologyId().string());
Yixiao Chen39828a62016-09-14 14:37:06 -0400477 }
478
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500479 if (yangNetworkState != null) {
480 serverProvided = yangNetworkState.serverProvided();
481 }
482
483 org.onosproject.tetopology.management.api.DefaultNetwork network =
484 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
485 teNodes, teLinks, teTopologyId,
486 serverProvided, ownerId);
487 return network;
Yixiao Chen39828a62016-09-14 14:37:06 -0400488 }
489
490 /**
491 * Network object conversion from YANG to TE Topology subsystem.
492 *
493 * @param yangNetwork Network YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500494 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400495 * @return network TE Topology subsystem networks object
496 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500497 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
498 Networks yangNetworks) {
499 return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks);
Yixiao Chen39828a62016-09-14 14:37:06 -0400500 }
501
502 /**
503 * Network and State object conversion from YANG to TE Topology subsystem.
504 *
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500505 * @param yangNetwork Network YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400506 * @param yangNetworkState NetworkState YANG object
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500507 * @param yangNetworks Networks YANG object
Yixiao Chen39828a62016-09-14 14:37:06 -0400508 * @return teSubsystem TE Topology subsystem networks object
509 */
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500510 public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
511 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
512 .networksstate.Network yangNetworkState, Networks yangNetworks) {
Yixiao Chen39828a62016-09-14 14:37:06 -0400513 checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
514 checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500515
516 org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500517 yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500518
Hesam Rahimie96d0be2016-10-19 15:51:11 -0400519 String networkref = yangNetworkState.networkRef().toString();
Yixiao Chen39828a62016-09-14 14:37:06 -0400520 checkState(teNetwork.networkId().toString().equals(networkref),
521 E_DIFF_YANG_NETWORKID);
522
Yixiao Chen39828a62016-09-14 14:37:06 -0400523 return teNetwork;
524 }
Henry Yua4e34f82016-11-06 18:30:59 -0500525
526 /**
527 * Converts a TE Topology event from the data format used in core to its
528 * corresponding YANG Object (YO) format.
529 *
530 * @param event TE Topology event from the core
531 * @return YANG Object converted from event
532 */
533 public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500534 IetfTeTopologyEvent yangEvent = null;
535 IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
536
537 IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
538 if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500539 NetworkLinkEventSubject eventData = (NetworkLinkEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500540 TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
541 TeLinkEvent yangLinkEvent = LinkConverter.teNetworkLink2yangTeLinkEvent(linkEventType, eventData);
542 eventSubject.teLinkEvent(yangLinkEvent);
543 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
544 } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
Hesam Rahimi41208102016-12-09 17:54:03 -0500545 NetworkNodeEventSubject eventData = (NetworkNodeEventSubject) event.subject();
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500546 TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
547 TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
548 eventSubject.teNodeEvent(yangNodeEvent);
549 yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
550 }
551
552 return yangEvent;
553 }
554
555 private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
556 IetfTeTopologyEvent.Type returnType = null;
557
558 switch (type) {
559 case LINK_ADDED:
560 case LINK_REMOVED:
561 case LINK_UPDATED:
562 returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
563 break;
564 case NODE_ADDED:
565 case NODE_REMOVED:
566 case NODE_UPDATED:
567 returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
568 break;
569 default:
570 log.error("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
571 }
572
573 return returnType;
574 }
575
576 private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
577 TeTopologyEventTypeEnum returnType = null;
578
579 switch (type) {
580 case LINK_ADDED:
581 case NODE_ADDED:
582 returnType = TeTopologyEventTypeEnum.ADD;
583 break;
584 case LINK_REMOVED:
585 case NODE_REMOVED:
586 returnType = TeTopologyEventTypeEnum.REMOVE;
587 break;
588 case LINK_UPDATED:
589 case NODE_UPDATED:
590 returnType = TeTopologyEventTypeEnum.UPDATE;
591 break;
592 default:
Hesam Rahimi41208102016-12-09 17:54:03 -0500593 // log.warn("teTopoEventType2YangIetfTopoEventType: unsupported
594 // type: {}",
595 // type);
596 break;
Hesam Rahimi39bdc002016-11-10 15:01:26 -0500597 }
598
599 return returnType;
Henry Yua4e34f82016-11-06 18:30:59 -0500600 }
Yixiao Chen39828a62016-09-14 14:37:06 -0400601}
602
603