blob: 54d797d362367df356fa98d9f73ecb24e489895f [file] [log] [blame]
Yixiao Chen5ece00f2016-09-14 16:23:24 -04001/*
2 * Copyright 2016-present 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.provider.te.topology;
17
Henry Yu4b4a7eb2016-11-09 20:07:53 -050018import com.google.common.base.Preconditions;
Yixiao Chen5ece00f2016-09-14 16:23:24 -040019import org.apache.commons.io.IOUtils;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
25import org.onosproject.core.ApplicationId;
26import org.onosproject.core.CoreService;
27import org.onosproject.incubator.net.config.basics.ConfigException;
28import org.onosproject.net.DeviceId;
29import org.onosproject.net.config.ConfigFactory;
30import org.onosproject.net.config.NetworkConfigEvent;
31import org.onosproject.net.config.NetworkConfigListener;
32import org.onosproject.net.config.NetworkConfigRegistry;
33import org.onosproject.net.device.DeviceProviderRegistry;
34import org.onosproject.net.provider.AbstractProvider;
35import org.onosproject.net.provider.ProviderId;
36import org.onosproject.protocol.rest.RestSBDevice;
37import org.onosproject.protocol.restconf.RestConfSBController;
chengfan9d60b6e2016-12-01 11:06:39 +080038import org.onosproject.provider.te.utils.DefaultJsonCodec;
Henry Yu05dcc212017-01-05 16:05:26 -050039import org.onosproject.provider.te.utils.RestconfNotificationEventProcessor;
40import org.onosproject.provider.te.utils.TeTopologyRestconfEventListener;
chengfan9d60b6e2016-12-01 11:06:39 +080041import org.onosproject.provider.te.utils.YangCompositeEncodingImpl;
Yixiao Chen5ece00f2016-09-14 16:23:24 -040042import org.onosproject.tetopology.management.api.TeTopologyProvider;
43import org.onosproject.tetopology.management.api.TeTopologyProviderRegistry;
44import org.onosproject.tetopology.management.api.TeTopologyProviderService;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050045import org.onosproject.tetopology.management.api.TeTopologyService;
46import org.onosproject.tetopology.management.api.link.NetworkLink;
47import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
48import org.onosproject.tetopology.management.api.node.NetworkNode;
49import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
50import org.onosproject.teyang.utils.topology.LinkConverter;
Yixiao Chen5ece00f2016-09-14 16:23:24 -040051import org.onosproject.teyang.utils.topology.NetworkConverter;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050052import org.onosproject.teyang.utils.topology.NodeConverter;
Yixiao Chen5ece00f2016-09-14 16:23:24 -040053import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork;
54import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
55import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.IetfNetworkTopology;
56import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.IetfTeTopology;
Henry Yu8ac364b2016-12-15 18:24:20 -050057import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
58 .IetfTeTopologyEvent;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050059import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
60import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
Yuren You8be581b2017-02-01 16:35:51 -050061import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
62 .tetopologyeventtype.TeTopologyEventTypeEnum;
Yixiao Chen5ece00f2016-09-14 16:23:24 -040063import org.onosproject.yms.ych.YangCodecHandler;
64import org.onosproject.yms.ych.YangProtocolEncodingFormat;
65import org.onosproject.yms.ych.YangResourceIdentifierType;
66import org.onosproject.yms.ydt.YmsOperationType;
67import org.onosproject.yms.ymsm.YmsService;
68import org.slf4j.Logger;
69
Henry Yu4b4a7eb2016-11-09 20:07:53 -050070import java.io.IOException;
71import java.io.InputStream;
72import java.io.StringWriter;
73import java.nio.charset.StandardCharsets;
74import java.util.HashSet;
75import java.util.List;
76import java.util.Set;
77import java.util.concurrent.ExecutorService;
78import java.util.concurrent.Executors;
79
80import static org.onlab.util.Tools.groupedThreads;
81import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
82import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
83import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
Henry Yu05dcc212017-01-05 16:05:26 -050084import static org.onosproject.provider.te.utils.TeTopologyRestconfEventType.TE_TOPOLOGY_LINK_NOTIFICATION;
85import static org.onosproject.provider.te.utils.TeTopologyRestconfEventType.TE_TOPOLOGY_NODE_NOTIFICATION;
Henry Yu4b4a7eb2016-11-09 20:07:53 -050086import static org.slf4j.LoggerFactory.getLogger;
Yixiao Chen5ece00f2016-09-14 16:23:24 -040087
88/**
89 * Provider for IETF TE Topology that use RESTCONF as means of communication.
90 */
91@Component(immediate = true)
92public class TeTopologyRestconfProvider extends AbstractProvider
93 implements TeTopologyProvider {
Henry Yu8ac364b2016-12-15 18:24:20 -050094 private static final String APP_NAME = "org.onosproject.teprovider";
Yixiao Chen5ece00f2016-09-14 16:23:24 -040095 private static final String RESTCONF = "restconf";
Henry Yu4b4a7eb2016-11-09 20:07:53 -050096 private static final String PROVIDER =
97 "org.onosproject.teprovider.restconf.domain";
Yixiao Chen5ece00f2016-09-14 16:23:24 -040098 private static final String IETF_NETWORK_URI = "ietf-network:networks";
Henry Yu4b4a7eb2016-11-09 20:07:53 -050099 private static final String IETF_NETWORKS_PREFIX =
100 "{\"ietf-network:networks\":";
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500101 private static final String TE_LINK_EVENT_PREFIX =
102 "{\"ietf-te-topology:te-link-event\":";
103 private static final String TE_NODE_EVENT_PREFIX =
104 "{\"ietf-te-topology:te-node-event\":";
105 private static final String IETF_NOTIFICATION_URI = "netconf";
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400106 private static final String JSON = "json";
107 private static final String E_DEVICE_NULL = "Restconf device is null";
108
109 private final Logger log = getLogger(getClass());
110
111 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
112 protected DeviceProviderRegistry deviceProviderRegistry;
113
114 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
115 protected TeTopologyProviderRegistry topologyProviderRegistry;
116
117 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
118 protected RestConfSBController restconfClient;
119
120 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
121 protected NetworkConfigRegistry cfgService;
122
123 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
124 protected CoreService coreService;
125
126 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
127 protected YmsService ymsService;
128
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500129 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
130 protected TeTopologyService teTopologyService;
131
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400132 private YangCodecHandler codecHandler;
133
134 private TeTopologyProviderService topologyProviderService;
135
136 private final ExecutorService executor =
137 Executors.newFixedThreadPool(5, groupedThreads("onos/restconfsbprovider",
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500138 "device-installer-%d", log));
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400139
140 private final ConfigFactory<ApplicationId, RestconfServerConfig> factory =
141 new ConfigFactory<ApplicationId, RestconfServerConfig>(APP_SUBJECT_FACTORY,
142 RestconfServerConfig.class,
143 "restconfDevices",
144 true) {
145 @Override
146 public RestconfServerConfig createConfig() {
147 return new RestconfServerConfig();
148 }
149 };
150
151 private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
152 private ApplicationId appId;
153
154 private Set<DeviceId> addedDevices = new HashSet<>();
155
156 @Activate
157 public void activate() {
158 // Get the codec handler.
159 codecHandler = ymsService.getYangCodecHandler();
160 // Register all three IETF Topology YANG model schema with YMS.
161 codecHandler.addDeviceSchema(IetfNetwork.class);
162 codecHandler.addDeviceSchema(IetfNetworkTopology.class);
163 codecHandler.addDeviceSchema(IetfTeTopology.class);
164 // Register JSON CODEC functions
chengfan9d60b6e2016-12-01 11:06:39 +0800165 codecHandler.registerOverriddenCodec(new DefaultJsonCodec(ymsService),
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530166 YangProtocolEncodingFormat.JSON);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400167
168 appId = coreService.registerApplication(APP_NAME);
169 topologyProviderService = topologyProviderRegistry.register(this);
170 cfgService.registerConfigFactory(factory);
171 cfgService.addListener(cfgLister);
172 executor.execute(TeTopologyRestconfProvider.this::connectDevices);
173 log.info("Started");
174 }
175
176 @Deactivate
177 public void deactivate() {
178 cfgService.removeListener(cfgLister);
179 restconfClient.getDevices().keySet().forEach(this::deviceRemoved);
180 topologyProviderRegistry.unregister(this);
181 cfgService.unregisterConfigFactory(factory);
182 log.info("Stopped");
183 }
184
185 /**
186 * Creates an instance of TeTopologyRestconf provider.
187 */
188 public TeTopologyRestconfProvider() {
189 super(new ProviderId(RESTCONF, PROVIDER));
190 }
191
192 private void deviceAdded(RestSBDevice nodeId) {
193 Preconditions.checkNotNull(nodeId, E_DEVICE_NULL);
194 nodeId.setActive(true);
195 addedDevices.add(nodeId.deviceId());
196 }
197
198 private void deviceRemoved(DeviceId deviceId) {
199 Preconditions.checkNotNull(deviceId, E_DEVICE_NULL);
200 restconfClient.removeDevice(deviceId);
201 }
202
203 private void connectDevices() {
204
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500205 RestconfServerConfig cfg = cfgService.getConfig(appId,
206 RestconfServerConfig.class);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400207 try {
208 if (cfg != null && cfg.getDevicesAddresses() != null) {
209 //Precomputing the devices to be removed
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500210 Set<RestSBDevice> toBeRemoved = new HashSet<>(restconfClient.
211 getDevices().values());
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400212 toBeRemoved.removeAll(cfg.getDevicesAddresses());
213 //Adding new devices
214 for (RestSBDevice device : cfg.getDevicesAddresses()) {
215 device.setActive(false);
216 restconfClient.addDevice(device);
217 deviceAdded(device);
218 }
219
220 //Removing devices not wanted anymore
221 toBeRemoved.forEach(device -> deviceRemoved(device.deviceId()));
222 }
223 } catch (ConfigException e) {
224 log.error("Configuration error {}", e);
225 }
226
227 // Discover the topology from RESTCONF server
228 addedDevices.forEach(this::retrieveTopology);
229 addedDevices.clear();
230 }
231
232 private void retrieveTopology(DeviceId deviceId) {
233 // Retrieve IETF Network at top level.
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500234 InputStream jsonStream = restconfClient.get(deviceId,
235 IETF_NETWORK_URI,
236 JSON);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400237 if (jsonStream == null) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500238 log.warn("Unable to retrieve network Topology from restconf " +
239 "server {}", deviceId);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400240 return;
241 }
242
243 // Need to convert Input stream to String.
244 StringWriter writer = new StringWriter();
245 try {
246 IOUtils.copy(jsonStream, writer, StandardCharsets.UTF_8);
247 } catch (IOException e) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500248 log.warn("There is an exception {} for copy jsonStream to " +
249 "stringWriter for restconf {}",
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400250 e.getMessage(), deviceId);
251 return;
252 }
253 String jsonString = writer.toString();
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500254 String networkLevelJsonString = removePrefixTagFromJson(jsonString,
255 IETF_NETWORKS_PREFIX);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400256
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500257 YangCompositeEncodingImpl yce =
258 new YangCompositeEncodingImpl(YangResourceIdentifierType.URI,
259 IETF_NETWORK_URI,
260 networkLevelJsonString);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400261
262 Object yo = codecHandler.decode(yce,
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530263 YangProtocolEncodingFormat.JSON,
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400264 YmsOperationType.QUERY_REPLY);
265
266 if ((yo == null)) {
267 log.error("YMS decoder returns {} for restconf {}", yo, deviceId);
268 return;
269 }
270
271 // YMS returns an ArrayList in a single Object (i.e. yo in this case)
272 // this means yo is actually an ArrayList of size 1
273 IetfNetwork ietfNetwork = ((List<IetfNetwork>) yo).get(0);
274
275 if (ietfNetwork.networks() != null &&
276 ietfNetwork.networks().network() != null) {
277 //Convert the YO to TE Core data and update TE Core.
278 for (Network nw : ietfNetwork.networks().network()) {
279 topologyProviderService.networkUpdated(
Yixiao Chen265b3bb2017-01-13 10:17:03 -0500280 NetworkConverter.yang2TeSubsystemNetwork(nw, ietfNetwork.networks(), deviceId));
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400281 }
282 }
283
284 //TODO: Uncomment when YMS fixes the issue in NetworkState translation (network-ref)
285// org.onosproject.tetopology.management.api.Networks networks =
286// NetworkConverter.yang2TeSubsystemNetworks(ietfNetwork.networks(),
287// ietfNetwork.networksState());
288// if (networks == null || networks.networks() == null) {
289// log.error("Yang2Te returns null for restconf {}", deviceId);
290// return;
291// }
292// for (org.onosproject.tetopology.management.api.Network network : networks.networks()) {
293// topologyProviderService.networkUpdated(network);
294// }
295
Henry Yu05dcc212017-01-05 16:05:26 -0500296 subscribeRestconfNotification(deviceId);
297 }
298
299 private void subscribeRestconfNotification(DeviceId deviceId) {
300
301 TeTopologyRestconfEventListener listener =
302 new TeTopologyRestconfEventListener();
303
304 listener.addCallbackFunction(TE_TOPOLOGY_LINK_NOTIFICATION,
305 new InternalLinkEventProcessor());
306 listener.addCallbackFunction(TE_TOPOLOGY_NODE_NOTIFICATION,
307 new InternalNodeEventProcessor());
308
309 if (!restconfClient.isNotificationEnabled(deviceId)) {
310 restconfClient.enableNotifications(deviceId,
311 IETF_NOTIFICATION_URI,
312 "application/json",
313 listener);
314 } else {
315 restconfClient.addNotificationListener(deviceId, listener);
316 }
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400317 }
318
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500319 private String removePrefixTagFromJson(String jsonString, String prefixTag) {
320 if (jsonString.startsWith(prefixTag)) {
321 return jsonString.substring(prefixTag.length(), jsonString.length() - 1);
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400322 }
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400323 return jsonString;
324 }
325
Henry Yu05dcc212017-01-05 16:05:26 -0500326 private class InternalLinkEventProcessor implements
327 RestconfNotificationEventProcessor<String> {
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400328
329 @Override
Henry Yu05dcc212017-01-05 16:05:26 -0500330 public void processEventPayload(String payload) {
331 String linkString = removePrefixTagFromJson(payload,
332 TE_LINK_EVENT_PREFIX);
333 log.debug("link event={}", linkString);
334 handleRestconfLinkNotification(linkString);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500335 }
336
337 private void handleRestconfLinkNotification(String linkString) {
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500338
Henry Yu8ac364b2016-12-15 18:24:20 -0500339 IetfTeTopologyEvent event = convertJson2IetfTeTopologyEvent(
340 "ietf-te-topology:te-link-event",
341 linkString);
342 if (event == null) {
343 log.error("ERROR: json to YO conversion failure");
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500344 return;
345 }
346
Henry Yu8ac364b2016-12-15 18:24:20 -0500347 if (event.type() != IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
348 log.error("ERROR: wrong YO event type: {}", event.type());
349 return;
350 }
351
352 TeLinkEvent teLinkEvent = event.subject().teLinkEvent();
353
354 log.debug("TeLinkEvent: {}", teLinkEvent);
355
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500356 NetworkLinkKey linkKey = LinkConverter.yangLinkEvent2NetworkLinkKey(
Henry Yu8ac364b2016-12-15 18:24:20 -0500357 teLinkEvent);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500358
Yuren You8be581b2017-02-01 16:35:51 -0500359 TeTopologyEventTypeEnum teLinkEventType = teLinkEvent.eventType()
360 .enumeration();
361
362 if (teLinkEventType == TeTopologyEventTypeEnum.REMOVE) {
363 topologyProviderService.linkRemoved(linkKey);
364 return;
365 }
366
367 NetworkLink networkLink = LinkConverter.yangLinkEvent2NetworkLink(teLinkEvent,
368 teTopologyService);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500369
Henry Yu8ac364b2016-12-15 18:24:20 -0500370 if (networkLink == null) {
371 log.error("ERROR: yangLinkEvent2NetworkLink returns null");
372 return;
373 }
374
375 log.debug("networkLink: {}", networkLink);
376
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500377 topologyProviderService.linkUpdated(linkKey, networkLink);
378 }
Henry Yu05dcc212017-01-05 16:05:26 -0500379 }
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500380
Henry Yu05dcc212017-01-05 16:05:26 -0500381 private class InternalNodeEventProcessor implements
382 RestconfNotificationEventProcessor<String> {
Henry Yu8ac364b2016-12-15 18:24:20 -0500383
Henry Yu05dcc212017-01-05 16:05:26 -0500384 @Override
385 public void processEventPayload(String payload) {
386 String nodeString = removePrefixTagFromJson(payload, TE_NODE_EVENT_PREFIX);
387 log.debug("node event={}", nodeString);
388 handleRestconfNodeNotification(nodeString);
Henry Yu8ac364b2016-12-15 18:24:20 -0500389 }
390
391 private void handleRestconfNodeNotification(String nodeString) {
392
393 IetfTeTopologyEvent event = convertJson2IetfTeTopologyEvent(
394 "ietf-te-topology:te-node-event",
395 nodeString);
396
397 if (event == null) {
398 log.error("ERROR: json to YO conversion failure");
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500399 return;
400 }
401
Henry Yu8ac364b2016-12-15 18:24:20 -0500402 if (event.type() != IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
403 log.error("ERROR: wrong YO event type: {}", event.type());
404 return;
405 }
406
407 TeNodeEvent teNodeEvent = event.subject().teNodeEvent();
408
409 log.debug("TeNodeEvent: {}", teNodeEvent);
410
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500411 NetworkNodeKey nodeKey = NodeConverter.yangNodeEvent2NetworkNodeKey(
Henry Yu8ac364b2016-12-15 18:24:20 -0500412 teNodeEvent);
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500413
Yuren You8be581b2017-02-01 16:35:51 -0500414 TeTopologyEventTypeEnum teNodeEventType = teNodeEvent.eventType()
415 .enumeration();
416
417 if (teNodeEventType == TeTopologyEventTypeEnum.REMOVE) {
418 topologyProviderService.nodeRemoved(nodeKey);
419 return;
420 }
421
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500422 NetworkNode networkNode = NodeConverter.yangNodeEvent2NetworkNode(
Henry Yu8ac364b2016-12-15 18:24:20 -0500423 teNodeEvent,
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500424 teTopologyService);
425
Henry Yu8ac364b2016-12-15 18:24:20 -0500426 if (networkNode == null) {
427 log.error("ERROR: yangNodeEvent2NetworkNode returns null");
428 return;
429 }
430
Henry Yu4b4a7eb2016-11-09 20:07:53 -0500431 topologyProviderService.nodeUpdated(nodeKey, networkNode);
432 }
433 }
Henry Yu05dcc212017-01-05 16:05:26 -0500434
435 private class InternalNetworkConfigListener implements NetworkConfigListener {
436
437 @Override
438 public void event(NetworkConfigEvent event) {
439 executor.execute(TeTopologyRestconfProvider.this::connectDevices);
440 }
441
442 @Override
443 public boolean isRelevant(NetworkConfigEvent event) {
444 return event.configClass().equals(RestconfServerConfig.class) &&
445 (event.type() == CONFIG_ADDED ||
446 event.type() == CONFIG_UPDATED);
447 }
448 }
449
450 private IetfTeTopologyEvent convertJson2IetfTeTopologyEvent(String uriString,
451 String jsonBody) {
452
453 YangCompositeEncodingImpl yce =
454 new YangCompositeEncodingImpl(YangResourceIdentifierType.URI,
455 uriString,
456 jsonBody);
457 Object yo = codecHandler.decode(yce,
458 YangProtocolEncodingFormat.JSON,
459 YmsOperationType.NOTIFICATION);
460
461 if (yo == null) {
462 log.error("YMS decoder error");
463 return null;
464 }
465
466 if (!(yo instanceof IetfTeTopologyEvent)) {
467 log.error("ERROR: YO is not IetfTeTopologyEvent");
468 return null;
469 }
470
471 return (IetfTeTopologyEvent) yo;
472 }
Yixiao Chen5ece00f2016-09-14 16:23:24 -0400473}