Committed by
Gerrit Code Review
Miscellaneous fixes for reading Linc-OE port types.
- Keep track of created PortDescriptions so that they can be replayed when configurations don't stick - Push topology configs to all cluster members (Temporary hack until Configs are made Mastership-aware) - Port type consistency for Optical ports - default to FIBER port type Change-Id: Ib2c9e2839c212d2998206bd0106490b2b38446a9
Showing
5 changed files
with
69 additions
and
47 deletions
... | @@ -189,6 +189,11 @@ public final class DefaultAnnotations implements SparseAnnotations { | ... | @@ -189,6 +189,11 @@ public final class DefaultAnnotations implements SparseAnnotations { |
189 | throw new IllegalArgumentException("Expecting HashMap instance"); | 189 | throw new IllegalArgumentException("Expecting HashMap instance"); |
190 | } | 190 | } |
191 | 191 | ||
192 | + @Override | ||
193 | + public String toString() { | ||
194 | + return (map == null) ? "null" : map.toString(); | ||
195 | + } | ||
196 | + | ||
192 | /** | 197 | /** |
193 | * Facility for gradually building model annotations. | 198 | * Facility for gradually building model annotations. |
194 | */ | 199 | */ | ... | ... |
... | @@ -1023,11 +1023,12 @@ public class GossipDeviceStore | ... | @@ -1023,11 +1023,12 @@ public class GossipDeviceStore |
1023 | continue; | 1023 | continue; |
1024 | } | 1024 | } |
1025 | annotations = merge(annotations, otherPortDesc.value().annotations()); | 1025 | annotations = merge(annotations, otherPortDesc.value().annotations()); |
1026 | - switch (otherPortDesc.value().type()) { | 1026 | + PortDescription other = otherPortDesc.value(); |
1027 | + switch (other.type()) { | ||
1027 | case OMS: | 1028 | case OMS: |
1028 | OmsPortDescription omsPortDesc = (OmsPortDescription) otherPortDesc.value(); | 1029 | OmsPortDescription omsPortDesc = (OmsPortDescription) otherPortDesc.value(); |
1029 | updated = new OmsPort(device, number, isEnabled, omsPortDesc.minFrequency(), | 1030 | updated = new OmsPort(device, number, isEnabled, omsPortDesc.minFrequency(), |
1030 | - omsPortDesc.maxFrequency(), omsPortDesc.grid()); | 1031 | + omsPortDesc.maxFrequency(), omsPortDesc.grid(), annotations); |
1031 | break; | 1032 | break; |
1032 | case OCH: | 1033 | case OCH: |
1033 | OchPortDescription ochPortDesc = (OchPortDescription) otherPortDesc.value(); | 1034 | OchPortDescription ochPortDesc = (OchPortDescription) otherPortDesc.value(); |
... | @@ -1039,7 +1040,8 @@ public class GossipDeviceStore | ... | @@ -1039,7 +1040,8 @@ public class GossipDeviceStore |
1039 | updated = new OduCltPort(device, number, isEnabled, oduCltPortDesc.signalType(), annotations); | 1040 | updated = new OduCltPort(device, number, isEnabled, oduCltPortDesc.signalType(), annotations); |
1040 | break; | 1041 | break; |
1041 | default: | 1042 | default: |
1042 | - updated = new DefaultPort(device, number, isEnabled, annotations); | 1043 | + updated = new DefaultPort( |
1044 | + device, number, isEnabled, other.type(), other.portSpeed(), annotations); | ||
1043 | } | 1045 | } |
1044 | newest = otherPortDesc.timestamp(); | 1046 | newest = otherPortDesc.timestamp(); |
1045 | } | 1047 | } |
... | @@ -1047,7 +1049,10 @@ public class GossipDeviceStore | ... | @@ -1047,7 +1049,10 @@ public class GossipDeviceStore |
1047 | if (portDesc == null) { | 1049 | if (portDesc == null) { |
1048 | return updated == null ? new DefaultPort(device, number, false, annotations) : updated; | 1050 | return updated == null ? new DefaultPort(device, number, false, annotations) : updated; |
1049 | } | 1051 | } |
1050 | - return updated == null ? new DefaultPort(device, number, isEnabled, annotations) : updated; | 1052 | + PortDescription current = portDesc.value(); |
1053 | + return updated == null | ||
1054 | + ? new DefaultPort(device, number, isEnabled, current.type(), current.portSpeed(), annotations) | ||
1055 | + : updated; | ||
1051 | } | 1056 | } |
1052 | 1057 | ||
1053 | /** | 1058 | /** | ... | ... |
... | @@ -342,7 +342,6 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -342,7 +342,6 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
342 | if (sw.isOptical()) { | 342 | if (sw.isOptical()) { |
343 | OpenFlowOpticalSwitch opsw = (OpenFlowOpticalSwitch) sw; | 343 | OpenFlowOpticalSwitch opsw = (OpenFlowOpticalSwitch) sw; |
344 | opsw.getPortTypes().forEach(type -> { | 344 | opsw.getPortTypes().forEach(type -> { |
345 | - LOG.debug("ports: {}", opsw.getPortsOf(type)); | ||
346 | opsw.getPortsOf(type).forEach( | 345 | opsw.getPortsOf(type).forEach( |
347 | op -> { | 346 | op -> { |
348 | portDescs.add(buildPortDescription(type, (OFPortOptical) op)); | 347 | portDescs.add(buildPortDescription(type, (OFPortOptical) op)); |
... | @@ -398,10 +397,10 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -398,10 +397,10 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
398 | private PortDescription buildPortDescription(PortDescPropertyType ptype, OFPortOptical port) { | 397 | private PortDescription buildPortDescription(PortDescPropertyType ptype, OFPortOptical port) { |
399 | // Minimally functional fixture. This needs to be fixed as we add better support. | 398 | // Minimally functional fixture. This needs to be fixed as we add better support. |
400 | PortNumber portNo = PortNumber.portNumber(port.getPortNo().getPortNumber()); | 399 | PortNumber portNo = PortNumber.portNumber(port.getPortNo().getPortNumber()); |
400 | + | ||
401 | boolean enabled = !port.getState().contains(OFPortState.LINK_DOWN) | 401 | boolean enabled = !port.getState().contains(OFPortState.LINK_DOWN) |
402 | && !port.getConfig().contains(OFPortConfig.PORT_DOWN); | 402 | && !port.getConfig().contains(OFPortConfig.PORT_DOWN); |
403 | SparseAnnotations annotations = makePortNameAnnotation(port.getName()); | 403 | SparseAnnotations annotations = makePortNameAnnotation(port.getName()); |
404 | - Port.Type type = FIBER; | ||
405 | 404 | ||
406 | if (port.getVersion() == OFVersion.OF_13 | 405 | if (port.getVersion() == OFVersion.OF_13 |
407 | && ptype == PortDescPropertyType.OPTICAL_TRANSPORT) { | 406 | && ptype == PortDescPropertyType.OPTICAL_TRANSPORT) { |
... | @@ -411,7 +410,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -411,7 +410,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
411 | // removable once 1.4+ support complete. | 410 | // removable once 1.4+ support complete. |
412 | LOG.debug("Unsupported optical port properties"); | 411 | LOG.debug("Unsupported optical port properties"); |
413 | } | 412 | } |
414 | - return new DefaultPortDescription(portNo, enabled, type, 0, annotations); | 413 | + return new DefaultPortDescription(portNo, enabled, FIBER, 0, annotations); |
415 | } | 414 | } |
416 | 415 | ||
417 | private PortDescription buildPortDescription(OFPortStatus status) { | 416 | private PortDescription buildPortDescription(OFPortStatus status) { | ... | ... |
... | @@ -445,12 +445,12 @@ class LINCSwitch(OpticalSwitch): | ... | @@ -445,12 +445,12 @@ class LINCSwitch(OpticalSwitch): |
445 | sleep(SLEEP_TIME) | 445 | sleep(SLEEP_TIME) |
446 | 446 | ||
447 | info('*** Pushing Topology.json to ONOS\n') | 447 | info('*** Pushing Topology.json to ONOS\n') |
448 | - output = quietRun('%s/tools/test/bin/onos-topo-cfg %s Topology.json' % (LINCSwitch.onosDir, LINCSwitch.controllers[ 0 ].ip), shell=True) | 448 | + for index in range(len(LINCSwitch.controllers)): |
449 | - | 449 | + output = quietRun('%s/tools/test/bin/onos-topo-cfg %s Topology.json &' % (LINCSwitch.onosDir, LINCSwitch.controllers[ index ].ip), shell=True) |
450 | - # successful output contains the two characters '{}' | 450 | + # successful output contains the two characters '{}' |
451 | - # if there is more output than this, there is an issue | 451 | + # if there is more output than this, there is an issue |
452 | - if output.strip('{}'): | 452 | + if output.strip('{}'): |
453 | - warn('***WARNING: Could not push topology file to ONOS: %s\n' % output) | 453 | + warn('***WARNING: Could not push topology file to ONOS: %s\n' % output) |
454 | 454 | ||
455 | @staticmethod | 455 | @staticmethod |
456 | def waitStarted(net, timeout=TIMEOUT): | 456 | def waitStarted(net, timeout=TIMEOUT): | ... | ... |
... | @@ -16,13 +16,16 @@ | ... | @@ -16,13 +16,16 @@ |
16 | package org.onosproject.rest.resources; | 16 | package org.onosproject.rest.resources; |
17 | 17 | ||
18 | import com.fasterxml.jackson.databind.JsonNode; | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | +import com.google.common.base.Strings; | ||
19 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
21 | +import com.google.common.collect.Maps; | ||
20 | 22 | ||
21 | import org.onlab.packet.ChassisId; | 23 | import org.onlab.packet.ChassisId; |
22 | import org.onlab.packet.IpAddress; | 24 | import org.onlab.packet.IpAddress; |
23 | import org.onlab.packet.MacAddress; | 25 | import org.onlab.packet.MacAddress; |
24 | import org.onlab.packet.VlanId; | 26 | import org.onlab.packet.VlanId; |
25 | import org.onlab.util.Frequency; | 27 | import org.onlab.util.Frequency; |
28 | +import org.onosproject.net.AnnotationKeys; | ||
26 | import org.onosproject.net.ChannelSpacing; | 29 | import org.onosproject.net.ChannelSpacing; |
27 | import org.onosproject.net.ConnectPoint; | 30 | import org.onosproject.net.ConnectPoint; |
28 | import org.onosproject.net.DefaultAnnotations; | 31 | import org.onosproject.net.DefaultAnnotations; |
... | @@ -40,6 +43,7 @@ import org.onosproject.net.OduCltPort; | ... | @@ -40,6 +43,7 @@ import org.onosproject.net.OduCltPort; |
40 | import org.onosproject.net.OduSignalType; | 43 | import org.onosproject.net.OduSignalType; |
41 | import org.onosproject.net.OmsPort; | 44 | import org.onosproject.net.OmsPort; |
42 | import org.onosproject.net.Port; | 45 | import org.onosproject.net.Port; |
46 | +import org.onosproject.net.PortNumber; | ||
43 | import org.onosproject.net.SparseAnnotations; | 47 | import org.onosproject.net.SparseAnnotations; |
44 | import org.onosproject.net.device.DefaultDeviceDescription; | 48 | import org.onosproject.net.device.DefaultDeviceDescription; |
45 | import org.onosproject.net.device.DefaultPortDescription; | 49 | import org.onosproject.net.device.DefaultPortDescription; |
... | @@ -71,6 +75,7 @@ import java.util.ArrayList; | ... | @@ -71,6 +75,7 @@ import java.util.ArrayList; |
71 | import java.util.HashSet; | 75 | import java.util.HashSet; |
72 | import java.util.Iterator; | 76 | import java.util.Iterator; |
73 | import java.util.List; | 77 | import java.util.List; |
78 | +import java.util.Map; | ||
74 | import java.util.Set; | 79 | import java.util.Set; |
75 | import java.util.concurrent.CountDownLatch; | 80 | import java.util.concurrent.CountDownLatch; |
76 | import java.util.concurrent.TimeUnit; | 81 | import java.util.concurrent.TimeUnit; |
... | @@ -113,6 +118,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -113,6 +118,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
113 | 118 | ||
114 | private DeviceListener deviceEventCounter = new DeviceEventCounter(); | 119 | private DeviceListener deviceEventCounter = new DeviceEventCounter(); |
115 | private List<ConnectPoint> connectPoints = Lists.newArrayList(); | 120 | private List<ConnectPoint> connectPoints = Lists.newArrayList(); |
121 | + private Map<ConnectPoint, PortDescription> descriptions = Maps.newHashMap(); | ||
116 | 122 | ||
117 | /** | 123 | /** |
118 | * Creates a new configuration provider. | 124 | * Creates a new configuration provider. |
... | @@ -216,24 +222,29 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -216,24 +222,29 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
216 | // Parses the given node with port information. | 222 | // Parses the given node with port information. |
217 | private PortDescription parsePort(JsonNode node) { | 223 | private PortDescription parsePort(JsonNode node) { |
218 | Port.Type type = Port.Type.valueOf(node.path("type").asText("COPPER")); | 224 | Port.Type type = Port.Type.valueOf(node.path("type").asText("COPPER")); |
225 | + PortNumber port = portNumber(node.path("port").asLong(0)); | ||
226 | + String portName = Strings.emptyToNull(port.name()); | ||
227 | + SparseAnnotations annotations = null; | ||
228 | + if (portName != null) { | ||
229 | + annotations = DefaultAnnotations.builder() | ||
230 | + .set(AnnotationKeys.PORT_NAME, portName).build(); | ||
231 | + } | ||
219 | switch (type) { | 232 | switch (type) { |
220 | case COPPER: | 233 | case COPPER: |
221 | - return new DefaultPortDescription(portNumber(node.path("port").asLong(0)), | 234 | + return new DefaultPortDescription(port, node.path("enabled").asBoolean(true), |
222 | - node.path("enabled").asBoolean(true), | 235 | + type, node.path("speed").asLong(1_000), |
223 | - type, node.path("speed").asLong(1_000)); | 236 | + annotations); |
224 | case FIBER: | 237 | case FIBER: |
225 | // Currently, assume OMS when FIBER. Provide sane defaults. | 238 | // Currently, assume OMS when FIBER. Provide sane defaults. |
226 | - return new OmsPortDescription(portNumber(node.path("port").asLong(0)), | 239 | + return new OmsPortDescription(port, node.path("enabled").asBoolean(true), |
227 | - node.path("enabled").asBoolean(true), | 240 | + CENTER, CENTER.add(TOTAL), |
228 | - CENTER, | 241 | + Frequency.ofGHz(100), annotations); |
229 | - CENTER.add(TOTAL), | ||
230 | - Frequency.ofGHz(100)); | ||
231 | default: | 242 | default: |
232 | log.warn("{}: Unsupported Port Type"); | 243 | log.warn("{}: Unsupported Port Type"); |
233 | } | 244 | } |
234 | - return new DefaultPortDescription(portNumber(node.path("port").asLong(0)), | 245 | + return new DefaultPortDescription(port, node.path("enabled").asBoolean(true), |
235 | - node.path("enabled").asBoolean(true), | 246 | + type, node.path("speed").asLong(1_000), |
236 | - type, node.path("speed").asLong(1_000)); | 247 | + annotations); |
237 | } | 248 | } |
238 | 249 | ||
239 | // Parses the given JSON and provides links as configured. | 250 | // Parses the given JSON and provides links as configured. |
... | @@ -267,17 +278,12 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -267,17 +278,12 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
267 | } | 278 | } |
268 | 279 | ||
269 | private void updatePorts(ConnectPoint src, ConnectPoint dst, SparseAnnotations annotations) { | 280 | private void updatePorts(ConnectPoint src, ConnectPoint dst, SparseAnnotations annotations) { |
270 | - DeviceId srcId = src.deviceId(); | ||
271 | - DeviceId dstId = dst.deviceId(); | ||
272 | - Port srcPort = deviceService.getPort(srcId, src.port()); | ||
273 | - Port dstPort = deviceService.getPort(dstId, dst.port()); | ||
274 | - | ||
275 | final String linkType = annotations.value("optical.type"); | 281 | final String linkType = annotations.value("optical.type"); |
276 | if ("cross-connect".equals(linkType)) { | 282 | if ("cross-connect".equals(linkType)) { |
277 | String value = annotations.value("bandwidth").trim(); | 283 | String value = annotations.value("bandwidth").trim(); |
278 | try { | 284 | try { |
279 | double bw = Double.parseDouble(value); | 285 | double bw = Double.parseDouble(value); |
280 | - updateOchPort(bw, srcPort, dstPort, srcId, dstId); | 286 | + updateOchPort(bw, src, dst); |
281 | } catch (NumberFormatException e) { | 287 | } catch (NumberFormatException e) { |
282 | log.warn("Invalid bandwidth ({}), can't configure port(s)", value); | 288 | log.warn("Invalid bandwidth ({}), can't configure port(s)", value); |
283 | return; | 289 | return; |
... | @@ -286,7 +292,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -286,7 +292,7 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
286 | String value = annotations.value("optical.waves").trim(); | 292 | String value = annotations.value("optical.waves").trim(); |
287 | try { | 293 | try { |
288 | int numChls = Integer.parseInt(value); | 294 | int numChls = Integer.parseInt(value); |
289 | - updateOMSPorts(numChls, srcPort, dstPort, srcId, dstId); | 295 | + updateOMSPorts(numChls, src, dst); |
290 | } catch (NumberFormatException e) { | 296 | } catch (NumberFormatException e) { |
291 | log.warn("Invalid channel ({}), can't configure port(s)", value); | 297 | log.warn("Invalid channel ({}), can't configure port(s)", value); |
292 | return; | 298 | return; |
... | @@ -295,10 +301,10 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -295,10 +301,10 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
295 | } | 301 | } |
296 | 302 | ||
297 | // uses 'bandwidth' annotation to determine the channel spacing. | 303 | // uses 'bandwidth' annotation to determine the channel spacing. |
298 | - private void updateOchPort(double bw, Port srcPort, Port dstPort, DeviceId srcId, DeviceId dstId) { | 304 | + private void updateOchPort(double bw, ConnectPoint srcCp, ConnectPoint dstCp) { |
299 | - Device src = deviceService.getDevice(srcId); | 305 | + Device src = deviceService.getDevice(srcCp.deviceId()); |
300 | - Device dst = deviceService.getDevice(dstId); | 306 | + Device dst = deviceService.getDevice(dstCp.deviceId()); |
301 | - // bandwidth in MHz (assuming Hz - linc is not clear if Hz or b). | 307 | + // bandwidth in MHz (assuming Hz - linc is not clear if that or Mb). |
302 | Frequency spacing = Frequency.ofMHz(bw); | 308 | Frequency spacing = Frequency.ofMHz(bw); |
303 | // channel bandwidth is smaller than smallest standard channel spacing. | 309 | // channel bandwidth is smaller than smallest standard channel spacing. |
304 | ChannelSpacing chsp = null; | 310 | ChannelSpacing chsp = null; |
... | @@ -319,20 +325,21 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -319,20 +325,21 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
319 | } | 325 | } |
320 | OchSignal signal = new OchSignal(GridType.DWDM, chsp, 1, 1); | 326 | OchSignal signal = new OchSignal(GridType.DWDM, chsp, 1, 1); |
321 | if (src.type() == Device.Type.ROADM) { | 327 | if (src.type() == Device.Type.ROADM) { |
322 | - PortDescription portDesc = new OchPortDescription(srcPort.number(), srcPort.isEnabled(), | 328 | + PortDescription portDesc = new OchPortDescription(srcCp.port(), true, |
323 | OduSignalType.ODU4, true, signal); | 329 | OduSignalType.ODU4, true, signal); |
324 | - deviceProviderService.portStatusChanged(srcId, portDesc); | 330 | + descriptions.put(srcCp, portDesc); |
331 | + deviceProviderService.portStatusChanged(srcCp.deviceId(), portDesc); | ||
325 | } | 332 | } |
326 | if (dst.type() == Device.Type.ROADM) { | 333 | if (dst.type() == Device.Type.ROADM) { |
327 | - PortDescription portDesc = new OchPortDescription(dstPort.number(), dstPort.isEnabled(), | 334 | + PortDescription portDesc = new OchPortDescription(dstCp.port(), true, |
328 | OduSignalType.ODU4, true, signal); | 335 | OduSignalType.ODU4, true, signal); |
329 | - deviceProviderService.portStatusChanged(dstId, portDesc); | 336 | + descriptions.put(dstCp, portDesc); |
337 | + deviceProviderService.portStatusChanged(dstCp.deviceId(), portDesc); | ||
330 | } | 338 | } |
331 | } | 339 | } |
332 | 340 | ||
333 | - private void updateOMSPorts(int numChls, Port srcPort, Port dstPort, DeviceId srcId, DeviceId dstId) { | 341 | + private void updateOMSPorts(int numChls, ConnectPoint srcCp, ConnectPoint dstCp) { |
334 | - // round down to largest slot that allows numChl channels to fit into C | 342 | + // round down to largest slot that allows numChl channels to fit into C band range |
335 | - // band range | ||
336 | ChannelSpacing chl = null; | 343 | ChannelSpacing chl = null; |
337 | Frequency perChl = TOTAL.floorDivision(numChls); | 344 | Frequency perChl = TOTAL.floorDivision(numChls); |
338 | for (int i = 0; i < ChannelSpacing.values().length; i++) { | 345 | for (int i = 0; i < ChannelSpacing.values().length; i++) { |
... | @@ -352,10 +359,12 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -352,10 +359,12 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
352 | Frequency min = CENTER.add(grid); | 359 | Frequency min = CENTER.add(grid); |
353 | Frequency max = CENTER.add(grid.multiply(numChls)); | 360 | Frequency max = CENTER.add(grid.multiply(numChls)); |
354 | 361 | ||
355 | - PortDescription srcPortDesc = new OmsPortDescription(srcPort.number(), srcPort.isEnabled(), min, max, grid); | 362 | + PortDescription srcPortDesc = new OmsPortDescription(srcCp.port(), true, min, max, grid); |
356 | - PortDescription dstPortDesc = new OmsPortDescription(dstPort.number(), dstPort.isEnabled(), min, max, grid); | 363 | + PortDescription dstPortDesc = new OmsPortDescription(dstCp.port(), true, min, max, grid); |
357 | - deviceProviderService.portStatusChanged(srcId, srcPortDesc); | 364 | + descriptions.put(srcCp, srcPortDesc); |
358 | - deviceProviderService.portStatusChanged(dstId, dstPortDesc); | 365 | + descriptions.put(dstCp, dstPortDesc); |
366 | + deviceProviderService.portStatusChanged(srcCp.deviceId(), srcPortDesc); | ||
367 | + deviceProviderService.portStatusChanged(dstCp.deviceId(), dstPortDesc); | ||
359 | } | 368 | } |
360 | 369 | ||
361 | // Parses the given JSON and provides hosts as configured. | 370 | // Parses the given JSON and provides hosts as configured. |
... | @@ -440,8 +449,12 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { | ... | @@ -440,8 +449,12 @@ class ConfigProvider implements DeviceProvider, LinkProvider, HostProvider { |
440 | } | 449 | } |
441 | } | 450 | } |
442 | 451 | ||
443 | - // Creates a port description from the specified connection point. | 452 | + // Creates a port description from the specified connection point if none created earlier. |
444 | private PortDescription description(ConnectPoint cp) { | 453 | private PortDescription description(ConnectPoint cp) { |
454 | + PortDescription saved = descriptions.get(cp); | ||
455 | + if (saved != null) { | ||
456 | + return saved; | ||
457 | + } | ||
445 | Port p = deviceService.getPort(cp.deviceId(), cp.port()); | 458 | Port p = deviceService.getPort(cp.deviceId(), cp.port()); |
446 | if (p == null) { | 459 | if (p == null) { |
447 | return new DefaultPortDescription(cp.port(), true); | 460 | return new DefaultPortDescription(cp.port(), true); | ... | ... |
-
Please register or login to post a comment