Committed by
Gerrit Code Review
Misc device/optical config features:
o devices and optical ports are updated with network configs o refactored AllowedEntity checks in DeviceManager o "basic" -> "optical" for OpticalPort config key o Device and OpticalPort operators can create descriptions Change-Id: I59edc368f3a8ff931954b174d4a898f6b4add5d5
Showing
4 changed files
with
117 additions
and
31 deletions
... | @@ -84,7 +84,7 @@ public class BasicNetworkConfigs { | ... | @@ -84,7 +84,7 @@ public class BasicNetworkConfigs { |
84 | }, | 84 | }, |
85 | new ConfigFactory<ConnectPoint, OpticalPortConfig>(CONNECT_POINT_SUBJECT_FACTORY, | 85 | new ConfigFactory<ConnectPoint, OpticalPortConfig>(CONNECT_POINT_SUBJECT_FACTORY, |
86 | OpticalPortConfig.class, | 86 | OpticalPortConfig.class, |
87 | - "basic") { | 87 | + "optical") { |
88 | @Override | 88 | @Override |
89 | public OpticalPortConfig createConfig() { | 89 | public OpticalPortConfig createConfig() { |
90 | return new OpticalPortConfig(); | 90 | return new OpticalPortConfig(); | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.net.device.impl; | 16 | package org.onosproject.net.device.impl; |
17 | 17 | ||
18 | import static org.slf4j.LoggerFactory.getLogger; | 18 | import static org.slf4j.LoggerFactory.getLogger; |
19 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
19 | 20 | ||
20 | import org.onosproject.net.config.ConfigOperator; | 21 | import org.onosproject.net.config.ConfigOperator; |
21 | import org.onosproject.net.config.basics.BasicDeviceConfig; | 22 | import org.onosproject.net.config.basics.BasicDeviceConfig; |
... | @@ -93,4 +94,12 @@ public final class BasicDeviceOperator implements ConfigOperator { | ... | @@ -93,4 +94,12 @@ public final class BasicDeviceOperator implements ConfigOperator { |
93 | DefaultAnnotations newAnnotations = newBuilder.build(); | 94 | DefaultAnnotations newAnnotations = newBuilder.build(); |
94 | return DefaultAnnotations.union(an, newAnnotations); | 95 | return DefaultAnnotations.union(an, newAnnotations); |
95 | } | 96 | } |
97 | + | ||
98 | + public static DeviceDescription descriptionOf(Device device) { | ||
99 | + checkNotNull(device, "Must supply non-null Device"); | ||
100 | + return new DefaultDeviceDescription(device.id().uri(), device.type(), | ||
101 | + device.manufacturer(), device.hwVersion(), | ||
102 | + device.swVersion(), device.serialNumber(), | ||
103 | + device.chassisId(), (SparseAnnotations) device.annotations()); | ||
104 | + } | ||
96 | } | 105 | } | ... | ... |
... | @@ -31,11 +31,13 @@ import org.onosproject.net.config.NetworkConfigEvent; | ... | @@ -31,11 +31,13 @@ import org.onosproject.net.config.NetworkConfigEvent; |
31 | import org.onosproject.net.config.NetworkConfigListener; | 31 | import org.onosproject.net.config.NetworkConfigListener; |
32 | import org.onosproject.net.config.NetworkConfigService; | 32 | import org.onosproject.net.config.NetworkConfigService; |
33 | import org.onosproject.net.config.basics.BasicDeviceConfig; | 33 | import org.onosproject.net.config.basics.BasicDeviceConfig; |
34 | +import org.onosproject.net.config.basics.OpticalPortConfig; | ||
34 | import org.onosproject.mastership.MastershipEvent; | 35 | import org.onosproject.mastership.MastershipEvent; |
35 | import org.onosproject.mastership.MastershipListener; | 36 | import org.onosproject.mastership.MastershipListener; |
36 | import org.onosproject.mastership.MastershipService; | 37 | import org.onosproject.mastership.MastershipService; |
37 | import org.onosproject.mastership.MastershipTerm; | 38 | import org.onosproject.mastership.MastershipTerm; |
38 | import org.onosproject.mastership.MastershipTermService; | 39 | import org.onosproject.mastership.MastershipTermService; |
40 | +import org.onosproject.net.ConnectPoint; | ||
39 | import org.onosproject.net.Device; | 41 | import org.onosproject.net.Device; |
40 | import org.onosproject.net.Device.Type; | 42 | import org.onosproject.net.Device.Type; |
41 | import org.onosproject.net.DeviceId; | 43 | import org.onosproject.net.DeviceId; |
... | @@ -64,13 +66,13 @@ import java.util.HashSet; | ... | @@ -64,13 +66,13 @@ import java.util.HashSet; |
64 | import java.util.List; | 66 | import java.util.List; |
65 | import java.util.Objects; | 67 | import java.util.Objects; |
66 | import java.util.Set; | 68 | import java.util.Set; |
69 | +import java.util.stream.Collectors; | ||
67 | import java.util.concurrent.CompletableFuture; | 70 | import java.util.concurrent.CompletableFuture; |
68 | import java.util.concurrent.ExecutionException; | 71 | import java.util.concurrent.ExecutionException; |
69 | import java.util.concurrent.ScheduledExecutorService; | 72 | import java.util.concurrent.ScheduledExecutorService; |
70 | import java.util.concurrent.TimeUnit; | 73 | import java.util.concurrent.TimeUnit; |
71 | 74 | ||
72 | import static com.google.common.base.Preconditions.checkNotNull; | 75 | import static com.google.common.base.Preconditions.checkNotNull; |
73 | -import static com.google.common.base.Preconditions.checkState; | ||
74 | import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; | 76 | import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; |
75 | import static org.onlab.util.Tools.groupedThreads; | 77 | import static org.onlab.util.Tools.groupedThreads; |
76 | import static org.onosproject.net.MastershipRole.*; | 78 | import static org.onosproject.net.MastershipRole.*; |
... | @@ -78,7 +80,6 @@ import static org.onosproject.security.AppGuard.checkPermission; | ... | @@ -78,7 +80,6 @@ import static org.onosproject.security.AppGuard.checkPermission; |
78 | import static org.slf4j.LoggerFactory.getLogger; | 80 | import static org.slf4j.LoggerFactory.getLogger; |
79 | import static org.onosproject.security.AppPermission.Type.*; | 81 | import static org.onosproject.security.AppPermission.Type.*; |
80 | 82 | ||
81 | - | ||
82 | /** | 83 | /** |
83 | * Provides implementation of the device SB & NB APIs. | 84 | * Provides implementation of the device SB & NB APIs. |
84 | */ | 85 | */ |
... | @@ -92,6 +93,7 @@ public class DeviceManager | ... | @@ -92,6 +93,7 @@ public class DeviceManager |
92 | private static final String PORT_NUMBER_NULL = "Port number cannot be null"; | 93 | private static final String PORT_NUMBER_NULL = "Port number cannot be null"; |
93 | private static final String DEVICE_DESCRIPTION_NULL = "Device description cannot be null"; | 94 | private static final String DEVICE_DESCRIPTION_NULL = "Device description cannot be null"; |
94 | private static final String PORT_DESCRIPTION_NULL = "Port description cannot be null"; | 95 | private static final String PORT_DESCRIPTION_NULL = "Port description cannot be null"; |
96 | + private static final String PORT_DESC_LIST_NULL = "Port description list cannot be null"; | ||
95 | 97 | ||
96 | private final Logger log = getLogger(getClass()); | 98 | private final Logger log = getLogger(getClass()); |
97 | 99 | ||
... | @@ -265,8 +267,7 @@ public class DeviceManager | ... | @@ -265,8 +267,7 @@ public class DeviceManager |
265 | continue; | 267 | continue; |
266 | } | 268 | } |
267 | 269 | ||
268 | - log.info("{} is reachable but did not have a valid role, reasserting", | 270 | + log.info("{} is reachable but did not have a valid role, reasserting", deviceId); |
269 | - deviceId); | ||
270 | 271 | ||
271 | // isReachable but was not MASTER or STANDBY, get a role and apply | 272 | // isReachable but was not MASTER or STANDBY, get a role and apply |
272 | // Note: NONE triggers request to MastershipService | 273 | // Note: NONE triggers request to MastershipService |
... | @@ -309,16 +310,20 @@ public class DeviceManager | ... | @@ -309,16 +310,20 @@ public class DeviceManager |
309 | return true; | 310 | return true; |
310 | } | 311 | } |
311 | 312 | ||
312 | - | ||
313 | @Override | 313 | @Override |
314 | public void deviceConnected(DeviceId deviceId, | 314 | public void deviceConnected(DeviceId deviceId, |
315 | DeviceDescription deviceDescription) { | 315 | DeviceDescription deviceDescription) { |
316 | checkNotNull(deviceId, DEVICE_ID_NULL); | 316 | checkNotNull(deviceId, DEVICE_ID_NULL); |
317 | checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL); | 317 | checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL); |
318 | checkValidity(); | 318 | checkValidity(); |
319 | - deviceDescription = validateDevice(deviceDescription, deviceId); | ||
320 | 319 | ||
321 | - // Establish my Role | 320 | + BasicDeviceConfig cfg = networkConfigService.getConfig(deviceId, BasicDeviceConfig.class); |
321 | + if (!isAllowed(cfg)) { | ||
322 | + log.warn("Device {} is not allowed", deviceId); | ||
323 | + return; | ||
324 | + } | ||
325 | + // Generate updated description and establish my Role | ||
326 | + deviceDescription = BasicDeviceOperator.combine(cfg, deviceDescription); | ||
322 | Futures.getUnchecked(mastershipService.requestRoleFor(deviceId) | 327 | Futures.getUnchecked(mastershipService.requestRoleFor(deviceId) |
323 | .thenAccept(role -> { | 328 | .thenAccept(role -> { |
324 | log.info("Local role is {} for {}", role, deviceId); | 329 | log.info("Local role is {} for {}", role, deviceId); |
... | @@ -327,22 +332,13 @@ public class DeviceManager | ... | @@ -327,22 +332,13 @@ public class DeviceManager |
327 | 332 | ||
328 | DeviceEvent event = store.createOrUpdateDevice(provider().id(), deviceId, | 333 | DeviceEvent event = store.createOrUpdateDevice(provider().id(), deviceId, |
329 | deviceDescription); | 334 | deviceDescription); |
335 | + log.info("Device {} connected", deviceId); | ||
330 | if (event != null) { | 336 | if (event != null) { |
331 | log.trace("event: {} {}", event.type(), event); | 337 | log.trace("event: {} {}", event.type(), event); |
332 | post(event); | 338 | post(event); |
333 | } | 339 | } |
334 | } | 340 | } |
335 | 341 | ||
336 | - // returns a DeviceDescription made from the union of the BasicDeviceConfig | ||
337 | - // annotations if it exists | ||
338 | - private DeviceDescription validateDevice(DeviceDescription deviceDescription, DeviceId deviceId) { | ||
339 | - BasicDeviceConfig cfg = networkConfigService.getConfig(deviceId, BasicDeviceConfig.class); | ||
340 | - checkState(cfg == null || cfg.isAllowed(), "Device " + deviceId + " is not allowed"); | ||
341 | - log.info("Device {} connected", deviceId); | ||
342 | - | ||
343 | - return BasicDeviceOperator.combine(cfg, deviceDescription); | ||
344 | - } | ||
345 | - | ||
346 | @Override | 342 | @Override |
347 | public void deviceDisconnected(DeviceId deviceId) { | 343 | public void deviceDisconnected(DeviceId deviceId) { |
348 | checkNotNull(deviceId, DEVICE_ID_NULL); | 344 | checkNotNull(deviceId, DEVICE_ID_NULL); |
... | @@ -402,8 +398,7 @@ public class DeviceManager | ... | @@ -402,8 +398,7 @@ public class DeviceManager |
402 | public void updatePorts(DeviceId deviceId, | 398 | public void updatePorts(DeviceId deviceId, |
403 | List<PortDescription> portDescriptions) { | 399 | List<PortDescription> portDescriptions) { |
404 | checkNotNull(deviceId, DEVICE_ID_NULL); | 400 | checkNotNull(deviceId, DEVICE_ID_NULL); |
405 | - checkNotNull(portDescriptions, | 401 | + checkNotNull(portDescriptions, PORT_DESC_LIST_NULL); |
406 | - "Port descriptions list cannot be null"); | ||
407 | checkValidity(); | 402 | checkValidity(); |
408 | if (!mastershipService.isLocalMaster(deviceId)) { | 403 | if (!mastershipService.isLocalMaster(deviceId)) { |
409 | // Never been a master for this device | 404 | // Never been a master for this device |
... | @@ -411,7 +406,9 @@ public class DeviceManager | ... | @@ -411,7 +406,9 @@ public class DeviceManager |
411 | log.trace("Ignoring {} port updates on standby node. {}", deviceId, portDescriptions); | 406 | log.trace("Ignoring {} port updates on standby node. {}", deviceId, portDescriptions); |
412 | return; | 407 | return; |
413 | } | 408 | } |
414 | - | 409 | + portDescriptions = portDescriptions.stream() |
410 | + .map(e -> consolidate(deviceId, e)) | ||
411 | + .collect(Collectors.toList()); | ||
415 | List<DeviceEvent> events = store.updatePorts(this.provider().id(), | 412 | List<DeviceEvent> events = store.updatePorts(this.provider().id(), |
416 | deviceId, portDescriptions); | 413 | deviceId, portDescriptions); |
417 | for (DeviceEvent event : events) { | 414 | for (DeviceEvent event : events) { |
... | @@ -433,16 +430,28 @@ public class DeviceManager | ... | @@ -433,16 +430,28 @@ public class DeviceManager |
433 | portDescription); | 430 | portDescription); |
434 | return; | 431 | return; |
435 | } | 432 | } |
436 | - | 433 | + portDescription = consolidate(deviceId, portDescription); |
437 | final DeviceEvent event = store.updatePortStatus(this.provider().id(), | 434 | final DeviceEvent event = store.updatePortStatus(this.provider().id(), |
438 | deviceId, portDescription); | 435 | deviceId, portDescription); |
439 | if (event != null) { | 436 | if (event != null) { |
440 | - log.info("Device {} port {} status changed", deviceId, event | 437 | + log.info("Device {} port {} status changed", deviceId, event.port().number()); |
441 | - .port().number()); | ||
442 | post(event); | 438 | post(event); |
443 | } | 439 | } |
444 | } | 440 | } |
445 | 441 | ||
442 | + // merges the appropriate PortConfig with the description. | ||
443 | + private PortDescription consolidate(DeviceId did, PortDescription desc) { | ||
444 | + switch (desc.type()) { | ||
445 | + case COPPER: | ||
446 | + case VIRTUAL: | ||
447 | + return desc; | ||
448 | + default: | ||
449 | + OpticalPortConfig opc = networkConfigService.getConfig( | ||
450 | + new ConnectPoint(did, desc.portNumber()), OpticalPortConfig.class); | ||
451 | + return OpticalPortOperator.combine(opc, desc); | ||
452 | + } | ||
453 | + } | ||
454 | + | ||
446 | @Override | 455 | @Override |
447 | public void receivedRoleReply(DeviceId deviceId, MastershipRole requested, | 456 | public void receivedRoleReply(DeviceId deviceId, MastershipRole requested, |
448 | MastershipRole response) { | 457 | MastershipRole response) { |
... | @@ -498,6 +507,11 @@ public class DeviceManager | ... | @@ -498,6 +507,11 @@ public class DeviceManager |
498 | } | 507 | } |
499 | } | 508 | } |
500 | 509 | ||
510 | + // by default allowed, otherwise check flag | ||
511 | + private boolean isAllowed(BasicDeviceConfig cfg) { | ||
512 | + return (cfg == null || cfg.isAllowed()); | ||
513 | + } | ||
514 | + | ||
501 | // Applies the specified role to the device; ignores NONE | 515 | // Applies the specified role to the device; ignores NONE |
502 | 516 | ||
503 | /** | 517 | /** |
... | @@ -617,7 +631,6 @@ public class DeviceManager | ... | @@ -617,7 +631,6 @@ public class DeviceManager |
617 | myNextRole = NONE; | 631 | myNextRole = NONE; |
618 | } | 632 | } |
619 | 633 | ||
620 | - | ||
621 | final boolean isReachable = isReachable(did); | 634 | final boolean isReachable = isReachable(did); |
622 | if (!isReachable) { | 635 | if (!isReachable) { |
623 | // device is not connected to this node | 636 | // device is not connected to this node |
... | @@ -695,23 +708,54 @@ public class DeviceManager | ... | @@ -695,23 +708,54 @@ public class DeviceManager |
695 | private class InternalNetworkConfigListener implements NetworkConfigListener { | 708 | private class InternalNetworkConfigListener implements NetworkConfigListener { |
696 | @Override | 709 | @Override |
697 | public boolean isRelevant(NetworkConfigEvent event) { | 710 | public boolean isRelevant(NetworkConfigEvent event) { |
698 | - return (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED || | 711 | + return (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED |
699 | - event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED) | 712 | + || event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED) |
700 | - && event.configClass().equals(BasicDeviceConfig.class); | 713 | + && (event.configClass().equals(BasicDeviceConfig.class) |
714 | + || event.configClass().equals(OpticalPortConfig.class)); | ||
701 | } | 715 | } |
702 | 716 | ||
703 | @Override | 717 | @Override |
704 | public void event(NetworkConfigEvent event) { | 718 | public void event(NetworkConfigEvent event) { |
719 | + DeviceEvent de = null; | ||
720 | + if (event.configClass().equals(BasicDeviceConfig.class)) { | ||
705 | log.info("Detected Device network config event {}", event.type()); | 721 | log.info("Detected Device network config event {}", event.type()); |
706 | - kickOutBadDevice(((DeviceId) event.subject())); | 722 | + DeviceId did = (DeviceId) event.subject(); |
723 | + BasicDeviceConfig cfg = networkConfigService.getConfig(did, BasicDeviceConfig.class); | ||
724 | + | ||
725 | + if (!isAllowed(cfg)) { | ||
726 | + kickOutBadDevice(did); | ||
727 | + } else { | ||
728 | + Device dev = getDevice(did); | ||
729 | + DeviceDescription desc = (dev == null) ? null : BasicDeviceOperator.descriptionOf(dev); | ||
730 | + desc = BasicDeviceOperator.combine(cfg, desc); | ||
731 | + if (getProvider(did) != null) { | ||
732 | + de = store.createOrUpdateDevice(getProvider(did).id(), did, desc); | ||
733 | + } | ||
734 | + } | ||
735 | + } | ||
736 | + if (event.configClass().equals(OpticalPortConfig.class)) { | ||
737 | + ConnectPoint cpt = (ConnectPoint) event.subject(); | ||
738 | + DeviceId did = cpt.deviceId(); | ||
739 | + Port dpt = getPort(did, cpt.port()); | ||
740 | + | ||
741 | + if (dpt != null) { | ||
742 | + OpticalPortConfig opc = networkConfigService.getConfig(cpt, OpticalPortConfig.class); | ||
743 | + PortDescription desc = OpticalPortOperator.descriptionOf(dpt); | ||
744 | + desc = OpticalPortOperator.combine(opc, desc); | ||
745 | + if (getProvider(did) != null) { | ||
746 | + de = store.updatePortStatus(getProvider(did).id(), did, desc); | ||
747 | + } | ||
748 | + } | ||
749 | + } | ||
750 | + | ||
751 | + if (de != null) { | ||
752 | + post(de); | ||
707 | } | 753 | } |
708 | } | 754 | } |
709 | 755 | ||
710 | // checks if the specified device is allowed by the BasicDeviceConfig | 756 | // checks if the specified device is allowed by the BasicDeviceConfig |
711 | // and if not, removes it | 757 | // and if not, removes it |
712 | private void kickOutBadDevice(DeviceId deviceId) { | 758 | private void kickOutBadDevice(DeviceId deviceId) { |
713 | - BasicDeviceConfig cfg = networkConfigService.getConfig(deviceId, BasicDeviceConfig.class); | ||
714 | - if (!cfg.isAllowed()) { | ||
715 | Device badDevice = getDevice(deviceId); | 759 | Device badDevice = getDevice(deviceId); |
716 | if (badDevice != null) { | 760 | if (badDevice != null) { |
717 | removeDevice(deviceId); | 761 | removeDevice(deviceId); | ... | ... |
... | @@ -16,11 +16,16 @@ | ... | @@ -16,11 +16,16 @@ |
16 | package org.onosproject.net.device.impl; | 16 | package org.onosproject.net.device.impl; |
17 | 17 | ||
18 | import static org.slf4j.LoggerFactory.getLogger; | 18 | import static org.slf4j.LoggerFactory.getLogger; |
19 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
19 | 20 | ||
20 | import org.onosproject.net.config.ConfigOperator; | 21 | import org.onosproject.net.config.ConfigOperator; |
21 | import org.onosproject.net.config.basics.OpticalPortConfig; | 22 | import org.onosproject.net.config.basics.OpticalPortConfig; |
22 | import org.onosproject.net.AnnotationKeys; | 23 | import org.onosproject.net.AnnotationKeys; |
23 | import org.onosproject.net.DefaultAnnotations; | 24 | import org.onosproject.net.DefaultAnnotations; |
25 | +import org.onosproject.net.OchPort; | ||
26 | +import org.onosproject.net.OduCltPort; | ||
27 | +import org.onosproject.net.OmsPort; | ||
28 | +import org.onosproject.net.Port; | ||
24 | import org.onosproject.net.PortNumber; | 29 | import org.onosproject.net.PortNumber; |
25 | import org.onosproject.net.SparseAnnotations; | 30 | import org.onosproject.net.SparseAnnotations; |
26 | import org.onosproject.net.device.DefaultPortDescription; | 31 | import org.onosproject.net.device.DefaultPortDescription; |
... | @@ -137,4 +142,32 @@ public final class OpticalPortOperator implements ConfigOperator { | ... | @@ -137,4 +142,32 @@ public final class OpticalPortOperator implements ConfigOperator { |
137 | } | 142 | } |
138 | return DefaultAnnotations.union(an, b.build()); | 143 | return DefaultAnnotations.union(an, b.build()); |
139 | } | 144 | } |
145 | + | ||
146 | + /** | ||
147 | + * Returns a description built from an existing port. | ||
148 | + * | ||
149 | + * @param port the device port | ||
150 | + * @return a PortDescription based on the port | ||
151 | + */ | ||
152 | + public static PortDescription descriptionOf(Port port) { | ||
153 | + checkNotNull(port, "Must supply non-null Port"); | ||
154 | + final PortNumber ptn = port.number(); | ||
155 | + final boolean isup = port.isEnabled(); | ||
156 | + final SparseAnnotations an = (SparseAnnotations) port.annotations(); | ||
157 | + switch (port.type()) { | ||
158 | + case OMS: | ||
159 | + OmsPort oms = (OmsPort) port; | ||
160 | + return new OmsPortDescription(ptn, isup, oms.minFrequency(), | ||
161 | + oms.maxFrequency(), oms.grid(), an); | ||
162 | + case OCH: | ||
163 | + OchPort och = (OchPort) port; | ||
164 | + return new OchPortDescription(ptn, isup, och.signalType(), | ||
165 | + och.isTunable(), och.lambda(), an); | ||
166 | + case ODUCLT: | ||
167 | + OduCltPort odu = (OduCltPort) port; | ||
168 | + return new OduCltPortDescription(ptn, isup, odu.signalType(), an); | ||
169 | + default: | ||
170 | + return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); | ||
171 | + } | ||
172 | + } | ||
140 | } | 173 | } | ... | ... |
-
Please register or login to post a comment