HIGUCHI Yuta
Committed by Gerrit Code Review

Remove deprecated ConfigProvider.

Change-Id: Ibf927671b0729212e9d1d2bbfd19d4aaab48b9dd
1 -/*
2 - * Copyright 2015-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 - */
16 -package org.onosproject.rest.resources;
17 -
18 -import com.fasterxml.jackson.databind.JsonNode;
19 -import com.google.common.base.Strings;
20 -import com.google.common.collect.Lists;
21 -import com.google.common.collect.Maps;
22 -
23 -import org.onlab.packet.ChassisId;
24 -import org.onlab.packet.IpAddress;
25 -import org.onlab.packet.MacAddress;
26 -import org.onlab.packet.VlanId;
27 -import org.onlab.util.Frequency;
28 -import org.onlab.util.Spectrum;
29 -import org.onosproject.net.AnnotationKeys;
30 -import org.onosproject.net.ChannelSpacing;
31 -import org.onosproject.net.ConnectPoint;
32 -import org.onosproject.net.DefaultAnnotations;
33 -import org.onosproject.net.Device;
34 -import org.onosproject.net.DeviceId;
35 -import org.onosproject.net.GridType;
36 -import org.onosproject.net.Host;
37 -import org.onosproject.net.HostId;
38 -import org.onosproject.net.HostLocation;
39 -import org.onosproject.net.Link;
40 -import org.onosproject.net.MastershipRole;
41 -import org.onosproject.net.OchSignal;
42 -import org.onosproject.net.OduSignalType;
43 -import org.onosproject.net.Port;
44 -import org.onosproject.net.PortNumber;
45 -import org.onosproject.net.SparseAnnotations;
46 -import org.onosproject.net.device.DefaultDeviceDescription;
47 -import org.onosproject.net.device.DefaultPortDescription;
48 -import org.onosproject.net.device.DeviceDescription;
49 -import org.onosproject.net.device.DeviceEvent;
50 -import org.onosproject.net.device.DeviceListener;
51 -import org.onosproject.net.device.DeviceProvider;
52 -import org.onosproject.net.device.DeviceProviderRegistry;
53 -import org.onosproject.net.device.DeviceProviderService;
54 -import org.onosproject.net.device.DeviceService;
55 -import org.onosproject.net.device.PortDescription;
56 -import org.onosproject.net.host.DefaultHostDescription;
57 -import org.onosproject.net.host.HostProvider;
58 -import org.onosproject.net.host.HostProviderRegistry;
59 -import org.onosproject.net.host.HostProviderService;
60 -import org.onosproject.net.link.DefaultLinkDescription;
61 -import org.onosproject.net.link.LinkProvider;
62 -import org.onosproject.net.link.LinkProviderRegistry;
63 -import org.onosproject.net.link.LinkProviderService;
64 -import org.onosproject.net.optical.OchPort;
65 -import org.onosproject.net.optical.OduCltPort;
66 -import org.onosproject.net.optical.OmsPort;
67 -import org.onosproject.net.provider.ProviderId;
68 -import org.slf4j.Logger;
69 -import org.slf4j.LoggerFactory;
70 -
71 -import java.net.URI;
72 -import java.util.ArrayList;
73 -import java.util.HashSet;
74 -import java.util.Iterator;
75 -import java.util.List;
76 -import java.util.Map;
77 -import java.util.Set;
78 -import java.util.concurrent.CountDownLatch;
79 -import java.util.concurrent.TimeUnit;
80 -import java.util.stream.Collectors;
81 -import java.util.stream.Stream;
82 -
83 -import static com.google.common.base.Preconditions.checkNotNull;
84 -import static org.onosproject.net.DeviceId.deviceId;
85 -import static org.onosproject.net.PortNumber.portNumber;
86 -import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
87 -import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
88 -import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
89 -import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription;
90 -import static org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription;
91 -import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
92 -
93 -/**
94 - * Provider of devices and links parsed from a JSON configuration structure.
95 - *
96 - * @deprecated in 1.5.0 (Falcon)
97 - */
98 -@Deprecated
99 -class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider {
100 -
101 - private final Logger log = LoggerFactory.getLogger(getClass());
102 -
103 - private static final ProviderId PID =
104 - new ProviderId("cfg", "org.onosproject.rest", true);
105 -
106 - private static final String UNKNOWN = "unknown";
107 -
108 - // C-band has 4.4 THz (4,400 GHz) total bandwidth
109 - private static final Frequency TOTAL = Frequency.ofGHz(4_400);
110 -
111 - private CountDownLatch deviceLatch;
112 -
113 - private final JsonNode cfg;
114 - private final DeviceService deviceService;
115 -
116 - private final DeviceProviderRegistry deviceProviderRegistry;
117 - private final LinkProviderRegistry linkProviderRegistry;
118 - private final HostProviderRegistry hostProviderRegistry;
119 -
120 - private DeviceProviderService deviceProviderService;
121 - private LinkProviderService linkProviderService;
122 - private HostProviderService hostProviderService;
123 -
124 - private DeviceListener deviceEventCounter = new DeviceEventCounter();
125 - private List<ConnectPoint> connectPoints = Lists.newArrayList();
126 - private Map<ConnectPoint, PortDescription> descriptions = Maps.newHashMap();
127 -
128 - /**
129 - * Creates a new configuration provider.
130 - *
131 - * @param cfg JSON configuration
132 - * @param deviceService device service
133 - * @param deviceProviderRegistry device provider registry
134 - * @param linkProviderRegistry link provider registry
135 - * @param hostProviderRegistry host provider registry
136 - */
137 - ConfigProvider(JsonNode cfg,
138 - DeviceService deviceService,
139 - DeviceProviderRegistry deviceProviderRegistry,
140 - LinkProviderRegistry linkProviderRegistry,
141 - HostProviderRegistry hostProviderRegistry) {
142 - this.cfg = checkNotNull(cfg, "Configuration cannot be null");
143 - this.deviceService = opticalView(checkNotNull(deviceService, "Device service cannot be null"));
144 - this.deviceProviderRegistry = checkNotNull(deviceProviderRegistry, "Device provider registry cannot be null");
145 - this.linkProviderRegistry = checkNotNull(linkProviderRegistry, "Link provider registry cannot be null");
146 - this.hostProviderRegistry = checkNotNull(hostProviderRegistry, "Host provider registry cannot be null");
147 - }
148 -
149 - /**
150 - * Parses the given JSON and provides links as configured.
151 - */
152 - void parse() {
153 - try {
154 - register();
155 - parseDevices();
156 - parseLinks();
157 - parseHosts();
158 - addMissingPorts();
159 - } finally {
160 - unregister();
161 - }
162 - }
163 -
164 - private void register() {
165 - deviceProviderService = deviceProviderRegistry.register(this);
166 - linkProviderService = linkProviderRegistry.register(this);
167 - hostProviderService = hostProviderRegistry.register(this);
168 - }
169 -
170 - private void unregister() {
171 - deviceProviderRegistry.unregister(this);
172 - linkProviderRegistry.unregister(this);
173 - hostProviderRegistry.unregister(this);
174 - }
175 -
176 - // Parses the given JSON and provides devices.
177 - private void parseDevices() {
178 - try {
179 - JsonNode nodes = cfg.get("devices");
180 - if (nodes != null) {
181 - prepareForDeviceEvents(nodes.size());
182 - for (JsonNode node : nodes) {
183 - parseDevice(node);
184 -
185 - // FIXME: hack to make sure device attributes take
186 - // This will be fixed when GossipDeviceStore uses ECM
187 - parseDevice(node);
188 - }
189 - }
190 - } finally {
191 - waitForDeviceEvents();
192 - }
193 - }
194 -
195 - // Parses the given node with device data and supplies the device.
196 - private void parseDevice(JsonNode node) {
197 - URI uri = URI.create(get(node, "uri"));
198 - Device.Type type = Device.Type.valueOf(get(node, "type", "SWITCH"));
199 - String mfr = get(node, "mfr", UNKNOWN);
200 - String hw = get(node, "hw", UNKNOWN);
201 - String sw = get(node, "sw", UNKNOWN);
202 - String serial = get(node, "serial", UNKNOWN);
203 - ChassisId cid = new ChassisId(get(node, "mac", "000000000000"));
204 - SparseAnnotations annotations = annotations(node.get("annotations"));
205 -
206 - DeviceDescription desc =
207 - new DefaultDeviceDescription(uri, type, mfr, hw, sw, serial,
208 - cid, annotations);
209 - DeviceId deviceId = deviceId(uri);
210 - deviceProviderService.deviceConnected(deviceId, desc);
211 -
212 - JsonNode ports = node.get("ports");
213 - if (ports != null) {
214 - parsePorts(deviceId, ports);
215 - }
216 - }
217 -
218 - // Parses the given node with list of device ports.
219 - private void parsePorts(DeviceId deviceId, JsonNode nodes) {
220 - List<PortDescription> ports = new ArrayList<>();
221 - for (JsonNode node : nodes) {
222 - ports.add(parsePort(deviceId, node));
223 - }
224 - deviceProviderService.updatePorts(deviceId, ports);
225 - }
226 -
227 - // Parses the given node with port information.
228 - private PortDescription parsePort(DeviceId deviceId, JsonNode node) {
229 - Port.Type type = Port.Type.valueOf(node.path("type").asText("COPPER"));
230 - // TL1-based ports have a name
231 - PortNumber port = null;
232 - if (node.has("name")) {
233 - for (Port p : deviceService.getPorts(deviceId)) {
234 - if (p.number().name().equals(node.get("name").asText())) {
235 - port = p.number();
236 - break;
237 - }
238 - }
239 - } else {
240 - port = portNumber(node.path("port").asLong(0));
241 - }
242 -
243 - if (port == null) {
244 - log.error("Cannot find port given in node {}", node);
245 - return null;
246 - }
247 -
248 - String portName = Strings.emptyToNull(port.name());
249 - SparseAnnotations annotations = null;
250 - if (portName != null) {
251 - annotations = DefaultAnnotations.builder()
252 - .set(AnnotationKeys.PORT_NAME, portName).build();
253 - }
254 - switch (type) {
255 - case COPPER:
256 - return new DefaultPortDescription(port, node.path("enabled").asBoolean(true),
257 - type, node.path("speed").asLong(1_000),
258 - annotations);
259 - case FIBER:
260 - // Currently, assume OMS when FIBER. Provide sane defaults.
261 - annotations = annotations(node.get("annotations"));
262 - return omsPortDescription(port, node.path("enabled").asBoolean(true),
263 - Spectrum.CENTER_FREQUENCY, Spectrum.CENTER_FREQUENCY.add(TOTAL),
264 - Frequency.ofGHz(100), annotations);
265 - case ODUCLT:
266 - annotations = annotations(node.get("annotations"));
267 - OduCltPort oduCltPort = (OduCltPort) deviceService.getPort(deviceId, port);
268 - return oduCltPortDescription(port, node.path("enabled").asBoolean(true),
269 - oduCltPort.signalType(), annotations);
270 - case OCH:
271 - annotations = annotations(node.get("annotations"));
272 - OchPort ochPort = (OchPort) deviceService.getPort(deviceId, port);
273 - return ochPortDescription(port, node.path("enabled").asBoolean(true),
274 - ochPort.signalType(), ochPort.isTunable(),
275 - ochPort.lambda(), annotations);
276 - case OMS:
277 - annotations = annotations(node.get("annotations"));
278 - OmsPort omsPort = (OmsPort) deviceService.getPort(deviceId, port);
279 - return omsPortDescription(port, node.path("enabled").asBoolean(true),
280 - omsPort.minFrequency(), omsPort.maxFrequency(), omsPort.grid(), annotations);
281 - default:
282 - log.warn("{}: Unsupported Port Type");
283 - }
284 - return new DefaultPortDescription(port, node.path("enabled").asBoolean(true),
285 - type, node.path("speed").asLong(1_000),
286 - annotations);
287 - }
288 -
289 - // Parses the given JSON and provides links as configured.
290 - private void parseLinks() {
291 - JsonNode nodes = cfg.get("links");
292 - if (nodes != null) {
293 - for (JsonNode node : nodes) {
294 - parseLink(node, false);
295 - if (!node.has("halfplex")) {
296 - parseLink(node, true);
297 - }
298 - }
299 - }
300 - }
301 -
302 - // Parses the given node with link data and supplies the link.
303 - private void parseLink(JsonNode node, boolean reverse) {
304 - ConnectPoint src = connectPoint(get(node, "src"));
305 - ConnectPoint dst = connectPoint(get(node, "dst"));
306 - Link.Type type = Link.Type.valueOf(get(node, "type", "DIRECT"));
307 - SparseAnnotations annotations = annotations(node.get("annotations"));
308 - // take annotations to update optical ports with correct attributes.
309 - updatePorts(src, dst, annotations);
310 - DefaultLinkDescription desc = reverse ?
311 - new DefaultLinkDescription(dst, src, type, annotations) :
312 - new DefaultLinkDescription(src, dst, type, annotations);
313 - linkProviderService.linkDetected(desc);
314 -
315 - connectPoints.add(src);
316 - connectPoints.add(dst);
317 - }
318 -
319 - private void updatePorts(ConnectPoint src, ConnectPoint dst, SparseAnnotations annotations) {
320 - final String linkType = annotations.value("optical.type");
321 - if ("cross-connect".equals(linkType)) {
322 - String value = annotations.value("bandwidth").trim();
323 - try {
324 - double bw = Double.parseDouble(value);
325 - updateOchPort(bw, src, dst);
326 - } catch (NumberFormatException e) {
327 - log.warn("Invalid bandwidth ({}), can't configure port(s)", value);
328 - return;
329 - }
330 - } else if ("WDM".equals(linkType)) {
331 - String value = annotations.value("optical.waves").trim();
332 - try {
333 - int numChls = Integer.parseInt(value);
334 - updateOmsPorts(numChls, src, dst);
335 - } catch (NumberFormatException e) {
336 - log.warn("Invalid channel ({}), can't configure port(s)", value);
337 - return;
338 - }
339 - }
340 - }
341 -
342 - // uses 'bandwidth' annotation to determine the channel spacing.
343 - private void updateOchPort(double bw, ConnectPoint srcCp, ConnectPoint dstCp) {
344 - Device src = deviceService.getDevice(srcCp.deviceId());
345 - Device dst = deviceService.getDevice(dstCp.deviceId());
346 - // bandwidth in MHz (assuming Hz - linc is not clear if that or Mb).
347 - Frequency spacing = Frequency.ofMHz(bw);
348 - // channel bandwidth is smaller than smallest standard channel spacing.
349 - ChannelSpacing chsp = null;
350 - if (spacing.compareTo(ChannelSpacing.CHL_6P25GHZ.frequency()) <= 0) {
351 - chsp = ChannelSpacing.CHL_6P25GHZ;
352 - }
353 - for (int i = 1; i < ChannelSpacing.values().length; i++) {
354 - Frequency val = ChannelSpacing.values()[i].frequency();
355 - // pick the next highest or equal channel interval.
356 - if (val.isLessThan(spacing)) {
357 - chsp = ChannelSpacing.values()[i - 1];
358 - break;
359 - }
360 - }
361 - if (chsp == null) {
362 - log.warn("Invalid channel spacing ({}), can't configure port(s)", spacing);
363 - return;
364 - }
365 - OchSignal signal = new OchSignal(GridType.DWDM, chsp, 1, 1);
366 - if (src.type() == Device.Type.ROADM) {
367 - PortDescription portDesc = ochPortDescription(srcCp.port(), true,
368 - OduSignalType.ODU4, true, signal);
369 - descriptions.put(srcCp, portDesc);
370 - deviceProviderService.portStatusChanged(srcCp.deviceId(), portDesc);
371 - }
372 - if (dst.type() == Device.Type.ROADM) {
373 - PortDescription portDesc = ochPortDescription(dstCp.port(), true,
374 - OduSignalType.ODU4, true, signal);
375 - descriptions.put(dstCp, portDesc);
376 - deviceProviderService.portStatusChanged(dstCp.deviceId(), portDesc);
377 - }
378 - }
379 -
380 - private void updateOmsPorts(int numChls, ConnectPoint srcCp, ConnectPoint dstCp) {
381 - // round down to largest slot that allows numChl channels to fit into C band range
382 - ChannelSpacing chl = null;
383 - Frequency perChl = TOTAL.floorDivision(numChls);
384 - for (int i = 0; i < ChannelSpacing.values().length; i++) {
385 - Frequency val = ChannelSpacing.values()[i].frequency();
386 - if (val.isLessThan(perChl)) {
387 - chl = ChannelSpacing.values()[i];
388 - break;
389 - }
390 - }
391 - if (chl == null) {
392 - chl = ChannelSpacing.CHL_6P25GHZ;
393 - }
394 -
395 - // if true, there was less channels than can be tightly packed.
396 - Frequency grid = chl.frequency();
397 - // say Linc's 1st slot starts at CENTER and goes up from there.
398 - Frequency min = Spectrum.CENTER_FREQUENCY.add(grid);
399 - Frequency max = Spectrum.CENTER_FREQUENCY.add(grid.multiply(numChls));
400 -
401 - PortDescription srcPortDesc = omsPortDescription(srcCp.port(), true, min, max, grid);
402 - PortDescription dstPortDesc = omsPortDescription(dstCp.port(), true, min, max, grid);
403 - descriptions.put(srcCp, srcPortDesc);
404 - descriptions.put(dstCp, dstPortDesc);
405 - deviceProviderService.portStatusChanged(srcCp.deviceId(), srcPortDesc);
406 - deviceProviderService.portStatusChanged(dstCp.deviceId(), dstPortDesc);
407 - }
408 -
409 - // Parses the given JSON and provides hosts as configured.
410 - private void parseHosts() {
411 - try {
412 - JsonNode nodes = cfg.get("hosts");
413 - if (nodes != null) {
414 - for (JsonNode node : nodes) {
415 - parseHost(node);
416 -
417 - // FIXME: hack to make sure host attributes take
418 - // This will be fixed when GossipHostStore uses ECM
419 - parseHost(node);
420 - }
421 - }
422 - } finally {
423 - hostProviderRegistry.unregister(this);
424 - }
425 - }
426 -
427 - // Parses the given node with host data and supplies the host.
428 - private void parseHost(JsonNode node) {
429 - MacAddress mac = MacAddress.valueOf(get(node, "mac"));
430 - VlanId vlanId = VlanId.vlanId((short) node.get("vlan").asInt(VlanId.UNTAGGED));
431 - HostId hostId = HostId.hostId(mac, vlanId);
432 - SparseAnnotations annotations = annotations(node.get("annotations"));
433 - HostLocation location = new HostLocation(connectPoint(get(node, "location")), 0);
434 -
435 - String[] ipStrings = get(node, "ip", "").split(",");
436 - Set<IpAddress> ips = new HashSet<>();
437 - for (String ip : ipStrings) {
438 - ips.add(IpAddress.valueOf(ip.trim()));
439 - }
440 -
441 - DefaultHostDescription desc =
442 - new DefaultHostDescription(mac, vlanId, location, ips, annotations);
443 - hostProviderService.hostDetected(hostId, desc, false);
444 -
445 - connectPoints.add(location);
446 - }
447 -
448 - // Adds any missing device ports for configured links and host locations.
449 - private void addMissingPorts() {
450 - deviceService.getDevices().forEach(this::addMissingPorts);
451 - }
452 -
453 - // Adds any missing device ports.
454 - private void addMissingPorts(Device device) {
455 - try {
456 - List<Port> ports = deviceService.getPorts(device.id());
457 - Set<ConnectPoint> existing = ports.stream()
458 - .map(p -> new ConnectPoint(device.id(), p.number()))
459 - .collect(Collectors.toSet());
460 - Set<ConnectPoint> missing = connectPoints.stream()
461 - .filter(cp -> cp.deviceId().equals(device.id()))
462 - .filter(cp -> !existing.contains(cp))
463 - .collect(Collectors.toSet());
464 -
465 - if (!missing.isEmpty()) {
466 - List<PortDescription> newPorts = Stream.concat(
467 - ports.stream().map(this::description),
468 - missing.stream().map(this::description)
469 - ).collect(Collectors.toList());
470 - deviceProviderService.updatePorts(device.id(), newPorts);
471 - }
472 - } catch (IllegalArgumentException e) {
473 - log.warn("Error pushing ports: {}", e.getMessage());
474 - }
475 - }
476 -
477 - // Creates a port description from the specified port.
478 - private PortDescription description(Port p) {
479 - switch (p.type()) {
480 - case OMS:
481 - OmsPort op = (OmsPort) p;
482 - return omsPortDescription(
483 - op.number(), op.isEnabled(), op.minFrequency(), op.maxFrequency(), op.grid());
484 - case OCH:
485 - OchPort ochp = (OchPort) p;
486 - return ochPortDescription(
487 - ochp.number(), ochp.isEnabled(), ochp.signalType(), ochp.isTunable(), ochp.lambda());
488 - case ODUCLT:
489 - OduCltPort odup = (OduCltPort) p;
490 - return oduCltPortDescription(
491 - odup.number(), odup.isEnabled(), odup.signalType());
492 - default:
493 - return new DefaultPortDescription(p.number(), p.isEnabled(), p.type(), p.portSpeed());
494 - }
495 - }
496 -
497 - // Creates a port description from the specified connection point if none created earlier.
498 - private PortDescription description(ConnectPoint cp) {
499 - PortDescription saved = descriptions.get(cp);
500 - if (saved != null) {
501 - return saved;
502 - }
503 - Port p = deviceService.getPort(cp.deviceId(), cp.port());
504 - if (p == null) {
505 - return new DefaultPortDescription(cp.port(), true);
506 - }
507 - return description(p);
508 - }
509 -
510 - // Produces set of annotations from the given JSON node.
511 - private SparseAnnotations annotations(JsonNode node) {
512 - if (node == null) {
513 - return DefaultAnnotations.EMPTY;
514 - }
515 -
516 - DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
517 - Iterator<String> it = node.fieldNames();
518 - while (it.hasNext()) {
519 - String k = it.next();
520 - builder.set(k, node.get(k).asText());
521 - }
522 - return builder.build();
523 - }
524 -
525 - // Produces a connection point from the specified uri/port text.
526 - private ConnectPoint connectPoint(String text) {
527 - int i = text.lastIndexOf("/");
528 - String portName = text.substring(i + 1);
529 - DeviceId deviceId = deviceId(text.substring(0, i));
530 -
531 - for (Port port : deviceService.getPorts(deviceId)) {
532 - PortNumber pn = port.number();
533 - if (pn.name().equals(portName)) {
534 - return new ConnectPoint(deviceId, pn);
535 - }
536 - }
537 -
538 - long portNum;
539 - try {
540 - portNum = Long.parseLong(portName);
541 - } catch (NumberFormatException e) {
542 - portNum = 0;
543 - }
544 -
545 - return new ConnectPoint(deviceId, portNumber(portNum, portName));
546 - }
547 -
548 - // Returns string form of the named property in the given JSON object.
549 - private String get(JsonNode node, String name) {
550 - return node.path(name).asText();
551 - }
552 -
553 - // Returns string form of the named property in the given JSON object.
554 - private String get(JsonNode node, String name, String defaultValue) {
555 - return node.path(name).asText(defaultValue);
556 - }
557 -
558 - @Override
559 - public void roleChanged(DeviceId device, MastershipRole newRole) {
560 - deviceProviderService.receivedRoleReply(device, newRole, newRole);
561 - }
562 -
563 - @Override
564 - public void triggerProbe(DeviceId deviceId) {
565 - }
566 -
567 - @Override
568 - public void triggerProbe(Host host) {
569 - }
570 -
571 - @Override
572 - public void changePortState(DeviceId deviceId, PortNumber portNumber,
573 - boolean enable) {
574 - }
575 -
576 - @Override
577 - public ProviderId id() {
578 - return PID;
579 - }
580 -
581 - @Override
582 - public boolean isReachable(DeviceId device) {
583 - return true;
584 - }
585 -
586 - /**
587 - * Prepares to count device added/available/removed events.
588 - *
589 - * @param count number of events to count
590 - */
591 - protected void prepareForDeviceEvents(int count) {
592 - deviceLatch = new CountDownLatch(count);
593 - deviceService.addListener(deviceEventCounter);
594 - }
595 -
596 - /**
597 - * Waits for all expected device added/available/removed events.
598 - */
599 - protected void waitForDeviceEvents() {
600 - try {
601 - deviceLatch.await(2, TimeUnit.SECONDS);
602 - } catch (InterruptedException e) {
603 - log.warn("Device events did not arrive in time");
604 - }
605 - deviceService.removeListener(deviceEventCounter);
606 - }
607 -
608 - // Counts down number of device added/available/removed events.
609 - private class DeviceEventCounter implements DeviceListener {
610 - @Override
611 - public void event(DeviceEvent event) {
612 - DeviceEvent.Type type = event.type();
613 - if (type == DEVICE_ADDED || type == DEVICE_AVAILABILITY_CHANGED) {
614 - deviceLatch.countDown();
615 - }
616 - }
617 - }
618 -
619 -
620 -
621 -}
1 -/*
2 - * Copyright 2015-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 - */
16 -package org.onosproject.rest.resources;
17 -
18 -import com.fasterxml.jackson.databind.JsonNode;
19 -import com.fasterxml.jackson.databind.ObjectMapper;
20 -import org.onlab.rest.BaseResource;
21 -import org.onosproject.net.device.DeviceProviderRegistry;
22 -import org.onosproject.net.device.DeviceService;
23 -import org.onosproject.net.host.HostProviderRegistry;
24 -import org.onosproject.net.link.LinkProviderRegistry;
25 -import org.slf4j.Logger;
26 -import org.slf4j.LoggerFactory;
27 -
28 -import javax.ws.rs.Consumes;
29 -import javax.ws.rs.POST;
30 -import javax.ws.rs.Path;
31 -import javax.ws.rs.core.MediaType;
32 -import javax.ws.rs.core.Response;
33 -import java.io.InputStream;
34 -
35 -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
36 -
37 -/**
38 - * Inject devices, ports, links and end-station hosts.
39 - */
40 -@Path("config")
41 -public class ConfigWebResource extends BaseResource {
42 -
43 - private static Logger log = LoggerFactory.getLogger(ConfigWebResource.class);
44 -
45 - /**
46 - * Upload device, port, link and host data.
47 - *
48 - * @param input JSON blob
49 - * @return 200 OK
50 - */
51 - @POST
52 - @Path("topology")
53 - @Consumes(MediaType.APPLICATION_JSON)
54 - public Response topology(InputStream input) {
55 - try {
56 - ObjectMapper mapper = new ObjectMapper();
57 - JsonNode cfg = mapper.readTree(input);
58 - new ConfigProvider(cfg, get(DeviceService.class),
59 - get(DeviceProviderRegistry.class),
60 - get(LinkProviderRegistry.class),
61 - get(HostProviderRegistry.class)).parse();
62 - return Response.ok().build();
63 - } catch (Exception e) {
64 - log.error("Unable to parse topology configuration", e);
65 - return Response.status(INTERNAL_SERVER_ERROR).entity(e.toString()).build();
66 - }
67 - }
68 -
69 -}
...@@ -40,7 +40,6 @@ public class CoreWebApplication extends AbstractWebApplication { ...@@ -40,7 +40,6 @@ public class CoreWebApplication extends AbstractWebApplication {
40 GroupsWebResource.class, 40 GroupsWebResource.class,
41 MetersWebResource.class, 41 MetersWebResource.class,
42 TopologyWebResource.class, 42 TopologyWebResource.class,
43 - ConfigWebResource.class,
44 PathsWebResource.class, 43 PathsWebResource.class,
45 StatisticsWebResource.class, 44 StatisticsWebResource.class,
46 MetricsWebResource.class, 45 MetricsWebResource.class,
......