*/
package org.opendaylight.openflowplugin.impl.device;
-import com.google.common.collect.Iterators;
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import io.netty.util.HashedWheelTimer;
import io.netty.util.internal.ConcurrentSet;
import java.util.Collections;
-import java.util.Iterator;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration;
+import org.opendaylight.openflowplugin.api.openflow.OFPContext;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.impl.device.listener.OpenflowProtocolListenerFullImpl;
import org.opendaylight.openflowplugin.impl.services.sal.SalRoleServiceImpl;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemovedBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
private TranslatorLibrary translatorLibrary;
private final ConcurrentMap<DeviceInfo, DeviceContext> deviceContexts = new ConcurrentHashMap<>();
- private final Set<DeviceInfo> notificationCreateNodeSend = new ConcurrentSet<>();
+ private final Set<KeyedInstanceIdentifier<Node, NodeKey>> notificationCreateNodeSend = new ConcurrentSet<>();
private long barrierIntervalNanos;
private int barrierCountLimit;
@Override
public void close() {
- for (final Iterator<DeviceContext> iterator = Iterators.consumingIterator(deviceContexts.values().iterator());
- iterator.hasNext();) {
- final DeviceContext deviceCtx = iterator.next();
- deviceCtx.shutdownConnection();
- deviceCtx.shuttingDownDataStoreTransactions();
- }
-
+ deviceContexts.values().forEach(OFPContext::close);
+ deviceContexts.clear();
Optional.ofNullable(spyPool).ifPresent(ScheduledThreadPoolExecutor::shutdownNow);
spyPool = null;
}
@Override
- public CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(final KeyedInstanceIdentifier<Node, NodeKey> ii) {
+ public CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> ii) {
final WriteTransaction delWtx = dataBroker.newWriteOnlyTransaction();
delWtx.delete(LogicalDatastoreType.OPERATIONAL, ii);
final CheckedFuture<Void, TransactionCommitFailedException> delFuture = delWtx.submit();
return delFuture;
}
- @Override
- public CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(final DeviceInfo deviceInfo) {
- return this.removeDeviceFromOperationalDS(deviceInfo.getNodeInstanceIdentifier());
- }
-
public DeviceContext createContext(@Nonnull final ConnectionContext connectionContext) {
LOG.info("ConnectionEvent: Device connected to controller, Device:{}, NodeId:{}",
}
}
- @Override
- public void sendNodeRemovedNotification(@Nonnull final DeviceInfo deviceInfo) {
- notificationCreateNodeSend.remove(deviceInfo);
- NodeRemovedBuilder builder = new NodeRemovedBuilder();
- builder.setNodeRef(new NodeRef(deviceInfo.getNodeInstanceIdentifier()));
- if (LOG.isDebugEnabled()) {
- LOG.debug("Publishing node removed notification for {}", deviceInfo.getLOGValue());
- }
- notificationPublishService.offerNotification(builder.build());
- }
-
-
@Override
public void onDeviceRemoved(final DeviceInfo deviceInfo) {
deviceContexts.remove(deviceInfo);
}
@Override
- public void sendNodeAddedNotification(@Nonnull final DeviceInfo deviceInfo) {
- if (!notificationCreateNodeSend.contains(deviceInfo)) {
- notificationCreateNodeSend.add(deviceInfo);
+ public void sendNodeRemovedNotification(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> instanceIdentifier) {
+ if (notificationCreateNodeSend.remove(instanceIdentifier)) {
+ NodeRemovedBuilder builder = new NodeRemovedBuilder();
+ builder.setNodeRef(new NodeRef(instanceIdentifier));
+ LOG.info("Publishing node removed notification for {}", instanceIdentifier.firstKeyOf(Node.class).getId());
+ notificationPublishService.offerNotification(builder.build());
+ }
+ }
+
+ @Override
+ public void sendNodeAddedNotification(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> instanceIdentifier) {
+ if (!notificationCreateNodeSend.contains(instanceIdentifier)) {
+ notificationCreateNodeSend.add(instanceIdentifier);
+ final NodeId id = instanceIdentifier.firstKeyOf(Node.class).getId();
NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
- builder.setId(deviceInfo.getNodeId());
- builder.setNodeRef(new NodeRef(deviceInfo.getNodeInstanceIdentifier()));
- if (LOG.isDebugEnabled()) {
- LOG.debug("Publishing node added notification for {}", deviceInfo.getLOGValue());
- }
+ builder.setId(id);
+ builder.setNodeRef(new NodeRef(instanceIdentifier));
+ LOG.info("Publishing node added notification for {}", id);
notificationPublishService.offerNotification(builder.build());
}
}