private void changePortStateAtMaster(DeviceId deviceId, PortNumber portNumber, boolean enable) { DeviceProvider provider = getProvider(deviceId); if (provider != null) { log.info("Port {} on device {} being administratively brought {}", portNumber, deviceId, (enable) ? "UP" : "DOWN"); provider.changePortState(deviceId, portNumber, enable); } else { log.warn("Provider not found for {}", deviceId); } }
@Override public void updatePortStatistics(DeviceId deviceId, Collection<PortStatistics> portStatistics) { checkNotNull(deviceId, DEVICE_ID_NULL); checkNotNull(portStatistics, "Port statistics list cannot be null"); checkValidity(); DeviceEvent event = store.updatePortStatistics(this.provider().id(), deviceId, portStatistics); post(event); } }
private boolean isReachable(DeviceId deviceId) { if (deviceId == null) { return false; } DeviceProvider provider = getProvider(deviceId); if (provider != null) { boolean reachable = provider.isReachable(deviceId); if (reachable && !isLocallyConnected(deviceId)) { deviceLocalStatus.put(deviceId, new LocalStatus(true, Instant.now())); } else if (!reachable && isLocallyConnected(deviceId)) { deviceLocalStatus.put(deviceId, new LocalStatus(false, Instant.now())); } return reachable; } else { log.debug("Provider not found for {}", deviceId); return false; } }
/** * Apply role to device and send probe if MASTER. * * @param deviceId device identifier * @param newRole new role to apply to the device * @return true if the request was sent to provider */ private boolean applyRoleAndProbe(DeviceId deviceId, MastershipRole newRole) { if (newRole.equals(MastershipRole.NONE)) { //no-op return true; } DeviceProvider provider = getProvider(deviceId); if (provider == null) { log.warn("Provider for {} was not found. Cannot apply role {}", deviceId, newRole); return false; } provider.roleChanged(deviceId, newRole); if (newRole.equals(MastershipRole.MASTER)) { log.debug("sent TriggerProbe({})", deviceId); // only trigger event when request was sent to provider provider.triggerProbe(deviceId); } return true; }
/** * Apply role in reaction to provider event. * * @param deviceId device identifier * @param newRole new role to apply to the device * @return true if the request was sent to provider */ private boolean applyRole(DeviceId deviceId, MastershipRole newRole) { if (newRole.equals(MastershipRole.NONE)) { //no-op return true; } DeviceProvider provider = provider(); if (provider == null) { log.warn("Provider for {} was not found. Cannot apply role {}", deviceId, newRole); return false; } provider.roleChanged(deviceId, newRole); // not triggering probe when triggered by provider service event return true; }
@Override public void notify(DeviceEvent event) { post(event); if (event.type().equals(DeviceEvent.Type.DEVICE_REMOVED)) { // When device is administratively removed, force disconnect. DeviceId deviceId = event.subject().id(); deviceLocalStatus.remove(deviceId); DeviceProvider provider = getProvider(deviceId); if (provider != null) { log.info("Triggering disconnect for device {}", deviceId); try { provider.triggerDisconnect(deviceId); } catch (UnsupportedOperationException e) { log.warn("Unable to trigger disconnect due to {}", e.getMessage()); } } } } }
@Override public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) { checkNotNull(deviceId, DEVICE_ID_NULL); checkNotNull(portDescriptions, PORT_DESC_LIST_NULL); checkValidity(); if (!mastershipService.isLocalMaster(deviceId)) { // Never been a master for this device // any update will be ignored. log.trace("Ignoring {} port updates on standby node. {}", deviceId, portDescriptions); return; } PortDescriptionsConfig portConfig = networkConfigService.getConfig(deviceId, PortDescriptionsConfig.class); if (portConfig != null) { // Updating the ports if configuration exists (on new lists as // the passed one might be immutable) portDescriptions = Lists.newArrayList(portDescriptions); portDescriptions.addAll(portConfig.portDescriptions()); } portDescriptions = portDescriptions.stream() .map(e -> applyAllPortOps(deviceId, e)) .collect(Collectors.toList()); List<DeviceEvent> events = store.updatePorts(this.provider().id(), deviceId, portDescriptions); if (events != null) { for (DeviceEvent event : events) { post(event); } } }
DeviceEvent event = store.createOrUpdateDevice(provider().id(), deviceId, deviceDescription); applyRole(deviceId, role); List<PortDescription> complete = store.getPortDescriptions(provider().id(), deviceId) .collect(Collectors.toList()); complete.addAll(portConfig.portDescriptions()); .map(e -> applyAllPortOps(deviceId, e)) .collect(Collectors.toList()); store.updatePorts(provider().id(), deviceId, portDescriptions);
log.info("Device {} disconnected from this node", deviceId); List<PortDescription> descs = store.getPortDescriptions(provider().id(), deviceId) .map(desc -> ensurePortEnabledState(desc, false)) .collect(Collectors.toList()); store.updatePorts(this.provider().id(), deviceId, descs); try { if (mastershipService.isLocalMaster(deviceId)) {
@Override public void deletePort(DeviceId deviceId, PortDescription basePortDescription) { checkNotNull(deviceId, DEVICE_ID_NULL); checkNotNull(basePortDescription, PORT_DESCRIPTION_NULL); checkValidity(); if (!mastershipService.isLocalMaster(deviceId)) { // Never been a master for this device // any update will be ignored. log.trace("Ignoring {} port update on standby node. {}", deviceId, basePortDescription); return; } Device device = getDevice(deviceId); if (device == null) { log.trace("Device not found: {}", deviceId); } PortDescription newPortDescription = DefaultPortDescription.builder(basePortDescription) .isRemoved(true) .build(); final DeviceEvent event = store.updatePortStatus(this.provider().id(), deviceId, newPortDescription); if (event != null) { log.info("Device {} port {} status changed", deviceId, event.port().number()); post(event); } }
desc = BasicDeviceOperator.combine(cfg, desc); if (desc != null && dp != null) { de = store.createOrUpdateDevice(dp.id(), did, desc); List<PortDescription> complete = store.getPortDescriptions(dp.id(), did) .collect(Collectors.toList()); complete.addAll(portConfig.portDescriptions()); store.updatePorts(dp.id(), did, complete); } else if (event.configClass().equals(DeviceAnnotationConfig.class)) { DeviceId did = (DeviceId) event.subject(); desc = deviceAnnotationOp.combine(did, desc, prevConfig); if (desc != null && dp != null) { de = store.createOrUpdateDevice(dp.id(), did, desc); .map(provider -> store.getPortDescription(provider.id(), did, cpt.port())) .map(desc -> applyAllPortOps(cpt, desc)) .map(desc -> store.updatePortStatus(dp.id(), did, desc)) .orElse(null);