Introduce SystemListener, which does essentially the same thing.
Change-Id: I97ae5237e3313d757e1a01ad9d022cfbfda498e1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
+import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.openflowjava.protocol.api.extensibility.AlienMessageListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SslConnectionError;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
/**
* Manages a switch connection.
* @author michal.polkorab
*/
public interface ConnectionAdapter extends OpenflowProtocolService {
+ @NonNullByDefault
+ interface SystemListener {
+ void onDisconnect(DisconnectEvent disconnect);
+
+ void onSwitchIdle(SwitchIdleEvent switchIdle);
+
+ void onSslConnectionError(SslConnectionError sslConnectionError);
+ }
/**
* Disconnect corresponding switch.
*
* @param systemListener here will be pushed all system messages from library
*/
- void setSystemListener(SystemNotificationsListener systemListener);
+ void setSystemListener(SystemListener systemListener);
/**
* Set handler for alien messages received from device.
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SslConnectionError;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SslConnectionErrorBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927._switch.certificate.IssuerBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927._switch.certificate.SubjectBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.ssl.connection.error.SwitchCertificate;
private ConnectionReadyListener connectionReadyListener;
private OpenflowProtocolListener messageListener;
- private SystemNotificationsListener systemListener;
+ private SystemListener systemListener;
private AlienMessageListener alienMessageListener;
private AbstractOutboundQueueManager<?, ?> outputManager;
private OFVersionDetector versionDetector;
}
@Override
- public void setSystemListener(final SystemNotificationsListener systemListener) {
+ public void setSystemListener(final SystemListener systemListener) {
this.systemListener = systemListener;
}
return;
}
if (message instanceof Notification) {
-
// System events
- if (message instanceof DisconnectEvent) {
- systemListener.onDisconnectEvent((DisconnectEvent) message);
+ if (message instanceof DisconnectEvent disconnect) {
+ systemListener.onDisconnect(disconnect);
responseCache.invalidateAll();
disconnectOccured = true;
- } else if (message instanceof SwitchIdleEvent) {
- systemListener.onSwitchIdleEvent((SwitchIdleEvent) message);
- } else if (message instanceof SslConnectionError) {
+ } else if (message instanceof SwitchIdleEvent switchIdle) {
+ systemListener.onSwitchIdle(switchIdle);
+ } else if (message instanceof SslConnectionError sslError) {
systemListener.onSslConnectionError(new SslConnectionErrorBuilder()
- .setInfo(((SslConnectionError) message).getInfo())
- .setSwitchCertificate(buildSwitchCertificate())
- .build());
+ .setInfo(sslError.getInfo())
+ .setSwitchCertificate(buildSwitchCertificate())
+ .build());
// OpenFlow messages
- } else if (message instanceof EchoRequestMessage) {
+ } else if (message instanceof EchoRequestMessage echoRequest) {
if (outputManager != null) {
- outputManager.onEchoRequest((EchoRequestMessage) message, datapathId);
+ outputManager.onEchoRequest(echoRequest, datapathId);
} else {
- messageListener.onEchoRequestMessage((EchoRequestMessage) message);
+ messageListener.onEchoRequestMessage(echoRequest);
}
- } else if (message instanceof ErrorMessage) {
+ } else if (message instanceof ErrorMessage error) {
// Send only unmatched errors
- if (outputManager == null || !outputManager.onMessage((OfHeader) message)) {
- messageListener.onErrorMessage((ErrorMessage) message);
+ if (outputManager == null || !outputManager.onMessage(error)) {
+ messageListener.onErrorMessage(error);
}
- } else if (message instanceof ExperimenterMessage) {
+ } else if (message instanceof ExperimenterMessage experimenter) {
if (outputManager != null) {
- outputManager.onMessage((OfHeader) message);
+ outputManager.onMessage(experimenter);
}
- messageListener.onExperimenterMessage((ExperimenterMessage) message);
- } else if (message instanceof FlowRemovedMessage) {
- messageListener.onFlowRemovedMessage((FlowRemovedMessage) message);
- } else if (message instanceof HelloMessage) {
+ messageListener.onExperimenterMessage(experimenter);
+ } else if (message instanceof FlowRemovedMessage flowRemoved) {
+ messageListener.onFlowRemovedMessage(flowRemoved);
+ } else if (message instanceof HelloMessage hello) {
LOG.info("Hello received");
- messageListener.onHelloMessage((HelloMessage) message);
- } else if (message instanceof MultipartReplyMessage) {
+ messageListener.onHelloMessage(hello);
+ } else if (message instanceof MultipartReplyMessage multipartReply) {
if (outputManager != null) {
- outputManager.onMessage((OfHeader) message);
+ outputManager.onMessage(multipartReply);
}
- messageListener.onMultipartReplyMessage((MultipartReplyMessage) message);
- } else if (message instanceof PacketInMessage) {
- messageListener.onPacketInMessage((PacketInMessage) message);
- } else if (message instanceof PortStatusMessage) {
- messageListener.onPortStatusMessage((PortStatusMessage) message);
+ messageListener.onMultipartReplyMessage(multipartReply);
+ } else if (message instanceof PacketInMessage packetIn) {
+ messageListener.onPacketInMessage(packetIn);
+ } else if (message instanceof PortStatusMessage portStatus) {
+ messageListener.onPortStatusMessage(portStatus);
} else {
LOG.warn("message listening not supported for type: {}", message.getClass());
}
- } else if (message instanceof OfHeader) {
+ } else if (message instanceof OfHeader header) {
LOG.debug("OF header msg received");
- if (alienMessageListener != null && alienMessageListener.onAlienMessage((OfHeader) message)) {
- LOG.debug("Alien message {} received", message.implementedInterface());
- } else if (outputManager == null || !outputManager.onMessage((OfHeader) message)
- || message instanceof EchoOutput) {
- final RpcResponseKey key = createRpcResponseKey((OfHeader) message);
+ if (alienMessageListener != null && alienMessageListener.onAlienMessage(header)) {
+ LOG.debug("Alien message {} received", header.implementedInterface());
+ } else if (outputManager == null || !outputManager.onMessage(header) || header instanceof EchoOutput) {
+ final RpcResponseKey key = createRpcResponseKey(header);
final ResponseExpectedRpcListener<?> listener = findRpcResponse(key);
if (listener != null) {
LOG.debug("Corresponding rpcFuture found");
- listener.completed((OfHeader) message);
+ listener.completed(header);
LOG.debug("After setting rpcFuture");
responseCache.invalidate(key);
}
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter.SystemListener;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
import org.opendaylight.openflowjava.statistics.CounterEventTypes;
import org.opendaylight.openflowjava.statistics.StatisticsCounters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.common.Uint32;
private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =
notification -> notification.getValue().discard();
- @Mock SystemNotificationsListener systemListener;
- @Mock ConnectionReadyListener readyListener;
- @Mock ChannelFuture channelFuture;
- @Mock OpenflowProtocolListener messageListener;
- @Mock SocketChannel channel;
- @Mock ChannelPipeline pipeline;
- @Mock EchoInput echoInput;
- @Mock BarrierInput barrierInput;
- @Mock EchoReplyInput echoReplyInput;
- @Mock ExperimenterInput experimenterInput;
- @Mock FlowModInput flowModInput;
- @Mock GetConfigInput getConfigInput;
- @Mock GetFeaturesInput getFeaturesInput;
- @Mock GetQueueConfigInput getQueueConfigInput;
- @Mock GroupModInput groupModInput;
- @Mock HelloInput helloInput;
- @Mock MeterModInput meterModInput;
- @Mock PacketOutInput packetOutInput;
- @Mock MultipartRequestInput multipartRequestInput;
- @Mock PortModInput portModInput;
- @Mock RoleRequestInput roleRequestInput;
- @Mock SetConfigInput setConfigInput;
- @Mock TableModInput tableModInput;
- @Mock GetAsyncInput getAsyncInput;
- @Mock SetAsyncInput setAsyncInput;
+ @Mock
+ private SystemListener systemListener;
+ @Mock
+ private ConnectionReadyListener readyListener;
+ @Mock
+ private ChannelFuture channelFuture;
+ @Mock
+ private OpenflowProtocolListener messageListener;
+ @Mock
+ private SocketChannel channel;
+ @Mock
+ private ChannelPipeline pipeline;
+ @Mock
+ private EchoInput echoInput;
+ @Mock
+ private BarrierInput barrierInput;
+ @Mock
+ private EchoReplyInput echoReplyInput;
+ @Mock
+ private ExperimenterInput experimenterInput;
+ @Mock
+ private FlowModInput flowModInput;
+ @Mock
+ private GetConfigInput getConfigInput;
+ @Mock
+ private GetFeaturesInput getFeaturesInput;
+ @Mock
+ private GetQueueConfigInput getQueueConfigInput;
+ @Mock
+ private GroupModInput groupModInput;
+ @Mock
+ private HelloInput helloInput;
+ @Mock
+ private MeterModInput meterModInput;
+ @Mock
+ private PacketOutInput packetOutInput;
+ @Mock
+ private MultipartRequestInput multipartRequestInput;
+ @Mock
+ private PortModInput portModInput;
+ @Mock
+ private RoleRequestInput roleRequestInput;
+ @Mock
+ private SetConfigInput setConfigInput;
+ @Mock
+ private TableModInput tableModInput;
+ @Mock
+ private GetAsyncInput getAsyncInput;
+ @Mock
+ private SetAsyncInput setAsyncInput;
private ConnectionAdapterImpl adapter;
private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter.SystemListener;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEventBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.common.Uint32;
private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =
notification -> notification.getValue().discard();
- @Mock SocketChannel channel;
- @Mock ChannelPipeline pipeline;
- @Mock OpenflowProtocolListener messageListener;
- @Mock SystemNotificationsListener systemListener;
- @Mock ConnectionReadyListener readyListener;
- @Mock Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> mockCache;
- @Mock ChannelFuture channelFuture;
+ @Mock
+ private SocketChannel channel;
+ @Mock
+ ChannelPipeline pipeline;
+ @Mock
+ private OpenflowProtocolListener messageListener;
+ @Mock
+ private SystemListener systemListener;
+ @Mock
+ private ConnectionReadyListener readyListener;
+ @Mock
+ private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> mockCache;
+ @Mock
+ private ChannelFuture channelFuture;
private ConnectionAdapterImpl adapter;
private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;
verify(messageListener, times(1)).onPortStatusMessage((PortStatusMessage) message);
message = new SwitchIdleEventBuilder().build();
adapter.consume(message);
- verify(systemListener, times(1)).onSwitchIdleEvent((SwitchIdleEvent) message);
+ verify(systemListener, times(1)).onSwitchIdle((SwitchIdleEvent) message);
message = new DisconnectEventBuilder().build();
adapter.consume(message);
- verify(systemListener, times(1)).onDisconnectEvent((DisconnectEvent) message);
+ verify(systemListener, times(1)).onDisconnect((DisconnectEvent) message);
message = new EchoRequestMessageBuilder().build();
adapter.consume(message);
verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter.SystemListener;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
import org.opendaylight.openflowjava.protocol.impl.core.SwitchConnectionProviderImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SslConnectionError;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.Uint32;
*
* @author michal.polkorab
*/
-public class MockPlugin implements OpenflowProtocolListener, SwitchConnectionHandler,
- SystemNotificationsListener, ConnectionReadyListener {
-
+public class MockPlugin implements OpenflowProtocolListener, SwitchConnectionHandler, SystemListener,
+ ConnectionReadyListener {
protected static final Logger LOGGER = LoggerFactory.getLogger(MockPlugin.class);
- protected volatile ConnectionAdapter adapter;
+
private final SettableFuture<Void> finishedFuture;
- private int idleCounter = 0;
private final ExecutorService executorService;
- public MockPlugin(ExecutorService executorService) {
+ private int idleCounter = 0;
+
+ protected volatile ConnectionAdapter adapter;
+
+ public MockPlugin(final ExecutorService executorService) {
LOGGER.trace("Creating MockPlugin");
finishedFuture = SettableFuture.create();
this.executorService = executorService;
}
@Override
- public void onSwitchConnected(ConnectionAdapter connection) {
+ public void onSwitchConnected(final ConnectionAdapter connection) {
LOGGER.debug("onSwitchConnected: {}", connection);
- this.adapter = connection;
+ adapter = connection;
connection.setMessageListener(this);
connection.setSystemListener(this);
connection.setConnectionReadyListener(this);
}
@Override
- public boolean accept(InetAddress switchAddress) {
+ public boolean accept(final InetAddress switchAddress) {
LOGGER.debug("MockPlugin.accept(): {}", switchAddress.toString());
-
return true;
}
+ @Override
+ public void onDisconnect(final DisconnectEvent disconnect) {
+ LOGGER.debug("disconnection occured: {}", disconnect.getInfo());
+ }
+
+ @Override
+ public void onSslConnectionError(final SslConnectionError sslConnectionError) {
+ LOGGER.debug("Ssl error occured: {}", sslConnectionError.getInfo());
+ }
+
+ @Override
+ public void onSwitchIdle(final SwitchIdleEvent switchIdle) {
+ LOGGER.debug("MockPlugin.onSwitchIdleEvent() switch status: {}", switchIdle.getInfo());
+ idleCounter++;
+ }
+
@Override
public void onEchoRequestMessage(final EchoRequestMessage notification) {
LOGGER.debug("MockPlugin.onEchoRequestMessage() adapter: {}", adapter);
}
@Override
- public void onErrorMessage(ErrorMessage notification) {
+ public void onErrorMessage(final ErrorMessage notification) {
LOGGER.debug("Error message received");
-
}
@Override
- public void onExperimenterMessage(ExperimenterMessage notification) {
+ public void onExperimenterMessage(final ExperimenterMessage notification) {
LOGGER.debug("Experimenter message received");
-
}
@Override
- public void onFlowRemovedMessage(FlowRemovedMessage notification) {
+ public void onFlowRemovedMessage(final FlowRemovedMessage notification) {
LOGGER.debug("FlowRemoved message received");
-
}
@Override
- public void onHelloMessage(HelloMessage notification) {
+ public void onHelloMessage(final HelloMessage notification) {
new Thread(() -> {
LOGGER.debug("MockPlugin.onHelloMessage().run() Hello message received");
HelloInputBuilder hib = new HelloInputBuilder();
LOGGER.debug("hello msg sent");
new Thread(this::getSwitchFeatures).start();
}).start();
-
}
protected void getSwitchFeatures() {
}
@Override
- public void onMultipartReplyMessage(MultipartReplyMessage notification) {
+ public void onMultipartReplyMessage(final MultipartReplyMessage notification) {
LOGGER.debug("MultipartReply message received");
-
}
@Override
- public void onPacketInMessage(PacketInMessage notification) {
+ public void onPacketInMessage(final PacketInMessage notification) {
LOGGER.debug("PacketIn message received");
LOGGER.debug("BufferId: {}", notification.getBufferId());
LOGGER.debug("TotalLength: {}", notification.getTotalLen());
}
@Override
- public void onPortStatusMessage(PortStatusMessage notification) {
+ public void onPortStatusMessage(final PortStatusMessage notification) {
LOGGER.debug("MockPlugin.onPortStatusMessage() message received");
-
- }
-
- @Override
- public void onDisconnectEvent(DisconnectEvent notification) {
- LOGGER.debug("disconnection occured: {}", notification.getInfo());
}
public SettableFuture<Void> getFinishedFuture() {
return finishedFuture;
}
- @Override
- public void onSwitchIdleEvent(SwitchIdleEvent notification) {
- LOGGER.debug("MockPlugin.onSwitchIdleEvent() switch status: {}", notification.getInfo());
- idleCounter++;
- }
-
/**
* Returns number of occurred idleEvents.
*/
* @param host - host IP
* @param port - port number
*/
- public void initiateConnection(SwitchConnectionProviderImpl switchConnectionProvider, String host, int port) {
+ public void initiateConnection(final SwitchConnectionProviderImpl switchConnectionProvider, final String host,
+ final int port) {
LOGGER.trace("MockPlugin().initiateConnection()");
switchConnectionProvider.initiateConnection(host, port);
}
-
- @Override
- public void onSslConnectionError(SslConnectionError notification) {
- LOGGER.debug("Ssl error occured: {}", notification.getInfo());
-
- }
}
import org.opendaylight.openflowplugin.impl.connection.listener.SystemNotificationsListenerImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.OpenflowProviderConfig;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
connectionContext, handshakeContext);
connectionAdapter.setConnectionReadyListener(connectionReadyListener);
- final OpenflowProtocolListener ofMessageListener =
- new OpenflowProtocolListenerInitialImpl(connectionContext, handshakeContext);
- connectionAdapter.setMessageListener(ofMessageListener);
+ connectionAdapter.setMessageListener(
+ new OpenflowProtocolListenerInitialImpl(connectionContext, handshakeContext));
- final SystemNotificationsListener systemListener = new SystemNotificationsListenerImpl(connectionContext,
- config.getEchoReplyTimeout().getValue().toJava(), executorService, notificationPublishService);
- connectionAdapter.setSystemListener(systemListener);
+ connectionAdapter.setSystemListener(new SystemNotificationsListenerImpl(connectionContext,
+ config.getEchoReplyTimeout().getValue().toJava(), executorService, notificationPublishService));
LOG.trace("connection ballet finished");
}
*/
package org.opendaylight.openflowplugin.impl.connection.listener;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.MoreExecutors;
import java.util.Objects;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.connection.HandshakeContext;
import org.opendaylight.openflowplugin.impl.connection.HandshakeStepWrapper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
+import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public void onEchoRequestMessage(final EchoRequestMessage echoRequestMessage) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("echo request received: {}", echoRequestMessage.getXid());
- }
- EchoReplyInputBuilder builder = new EchoReplyInputBuilder();
- builder.setVersion(echoRequestMessage.getVersion());
- builder.setXid(echoRequestMessage.getXid());
- builder.setData(echoRequestMessage.getData());
+ final var xid = echoRequestMessage.getXid();
+ LOG.debug("echo request received: {}", xid);
+ Futures.addCallback(connectionContext.getConnectionAdapter().echoReply(
+ new EchoReplyInputBuilder().setXid(xid).setData(echoRequestMessage.getData()).build()),
+ new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<EchoReplyOutput> result) {
+ LOG.debug("echo reply sent: {}", xid);
+ }
- connectionContext.getConnectionAdapter().echoReply(builder.build());
+ @Override
+ public void onFailure(final Throwable cause) {
+ LOG.debug("echo reply failed: {}", xid, cause);
+ }
+ }, MoreExecutors.directExecutor());
}
@Override
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter.SystemListener;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SslConnectionError;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class SystemNotificationsListenerImpl implements SystemNotificationsListener {
-
+public class SystemNotificationsListenerImpl implements SystemListener {
private static final Logger LOG = LoggerFactory.getLogger(SystemNotificationsListenerImpl.class);
private static final Logger OF_EVENT_LOG = LoggerFactory.getLogger("OfEventLog");
private static final Xid ECHO_XID = new Xid(Uint32.ZERO);
private final NotificationPublishService notificationPublishService;
public SystemNotificationsListenerImpl(@NonNull final ConnectionContext connectionContext,
- final long echoReplyTimeout,
- @NonNull final Executor executor,
- @NonNull final NotificationPublishService notificationPublishService) {
- this.executor = requireNonNull(executor);
+ final long echoReplyTimeout, final @NonNull Executor executor,
+ @NonNull final NotificationPublishService notificationPublishService) {
this.connectionContext = requireNonNull(connectionContext);
this.echoReplyTimeout = echoReplyTimeout;
- this.notificationPublishService = notificationPublishService;
+ this.executor = requireNonNull(executor);
+ this.notificationPublishService = requireNonNull(notificationPublishService);
}
@Override
- public void onDisconnectEvent(final DisconnectEvent notification) {
- OF_EVENT_LOG.debug("Disconnect, Node: {}", connectionContext.getSafeNodeIdForLOG());
- LOG.info("ConnectionEvent: Connection closed by device, Device:{}, NodeId:{}",
- connectionContext.getConnectionAdapter().getRemoteAddress(), connectionContext.getSafeNodeIdForLOG());
- connectionContext.onConnectionClosed();
+ public void onSslConnectionError(final SslConnectionError sslConnectionError) {
+ final var switchCert = sslConnectionError.getSwitchCertificate();
+ notificationPublishService.offerNotification(new SslErrorBuilder()
+ .setType(SslErrorType.SslConFailed)
+ .setCode(Uint16.valueOf(SslErrorType.SslConFailed.getIntValue()))
+ .setNodeIpAddress(remoteAddress())
+ .setData(sslConnectionError.getInfo())
+ .setSwitchCertificate(switchCert == null ? null : new SwitchCertificateBuilder(switchCert).build())
+ .build());
}
@Override
- public void onSwitchIdleEvent(final SwitchIdleEvent notification) {
+ public void onSwitchIdle(final SwitchIdleEvent switchIdle) {
executor.execute(this::executeOnSwitchIdleEvent);
}
+ @Override
+ public void onDisconnect(final DisconnectEvent notification) {
+ OF_EVENT_LOG.debug("Disconnect, Node: {}", connectionContext.getSafeNodeIdForLOG());
+ LOG.info("ConnectionEvent: Connection closed by device, Device:{}, NodeId:{}",
+ connectionContext.getConnectionAdapter().getRemoteAddress(), connectionContext.getSafeNodeIdForLOG());
+ connectionContext.onConnectionClosed();
+ }
+
@SuppressWarnings("checkstyle:IllegalCatch")
private void executeOnSwitchIdleEvent() {
boolean shouldBeDisconnected = true;
}
}
- @Override
- public void onSslConnectionError(final SslConnectionError notification) {
- final var switchCert = notification.getSwitchCertificate();
-
- notificationPublishService.offerNotification(new SslErrorBuilder()
- .setType(SslErrorType.SslConFailed)
- .setCode(Uint16.valueOf(SslErrorType.SslConFailed.getIntValue()))
- .setNodeIpAddress(remoteAddress())
- .setData(notification.getInfo())
- .setSwitchCertificate(switchCert == null ? null : new SwitchCertificateBuilder(switchCert).build())
- .build());
- }
-
private @Nullable IpAddress remoteAddress() {
final var connectionAdapter = connectionContext.getConnectionAdapter();
if (connectionAdapter != null) {
*/
package org.opendaylight.openflowplugin.impl.device.listener;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.MoreExecutors;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowjava.protocol.api.extensibility.AlienMessageListener;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceReplyProcessor;
import org.opendaylight.openflowplugin.api.openflow.device.listener.OpenflowMessageListenerFacade;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
+import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public void onEchoRequestMessage(final EchoRequestMessage echoRequestMessage) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("echo request received: {}", echoRequestMessage.getXid());
- }
- final EchoReplyInputBuilder builder = new EchoReplyInputBuilder();
- builder.setVersion(echoRequestMessage.getVersion());
- builder.setXid(echoRequestMessage.getXid());
- builder.setData(echoRequestMessage.getData());
-
- connectionAdapter.echoReply(builder.build());
+ final var xid = echoRequestMessage.getXid();
+ LOG.debug("echo request received: {}", xid);
+ Futures.addCallback(connectionAdapter.echoReply(
+ new EchoReplyInputBuilder()
+ .setVersion(echoRequestMessage.getVersion())
+ .setXid(xid)
+ .setData(echoRequestMessage.getData())
+ .build()),
+ new FutureCallback<>() {
+ @Override
+ public void onSuccess(final RpcResult<EchoReplyOutput> result) {
+ LOG.debug("echo reply sent: {}", xid);
+ }
+
+ @Override
+ public void onFailure(final Throwable cause) {
+ LOG.debug("echo reply failed: {}", xid, cause);
+ }
+ }, MoreExecutors.directExecutor());
}
@Override
*/
package org.opendaylight.openflowplugin.impl.connection.listener;
-import org.junit.Assert;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.common.util.concurrent.Futures;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
*/
@RunWith(MockitoJUnitRunner.class)
public class OpenflowProtocolListenerInitialImplTest {
-
@Mock
private ConnectionContext connectionContext;
@Mock
@Before
public void setUp() {
- Mockito.when(connectionAdapter.isAlive()).thenReturn(true);
- Mockito.when(connectionContext.getConnectionAdapter()).thenReturn(connectionAdapter);
- Mockito.when(connectionContext.getConnectionState())
+ when(connectionAdapter.isAlive()).thenReturn(true);
+ when(connectionContext.getConnectionAdapter()).thenReturn(connectionAdapter);
+ when(connectionContext.getConnectionState())
.thenReturn(null, ConnectionContext.CONNECTION_STATE.HANDSHAKING);
- Mockito.when(handshakeContext.getHandshakeManager()).thenReturn(handshakeManager);
+ when(handshakeContext.getHandshakeManager()).thenReturn(handshakeManager);
openflowProtocolListenerInitial = new OpenflowProtocolListenerInitialImpl(connectionContext, handshakeContext);
}
@Test
public void testOnEchoRequestMessage() {
- EchoRequestMessageBuilder echoRequestMessageBld = new EchoRequestMessageBuilder()
+ when(connectionAdapter.echoReply(any())).thenReturn(Futures.immediateFuture(null));
+
+ openflowProtocolListenerInitial.onEchoRequestMessage(
+ new EchoRequestMessageBuilder()
.setXid(Uint32.valueOf(42))
- .setVersion(EncodeConstants.OF_VERSION_1_3);
- openflowProtocolListenerInitial.onEchoRequestMessage(echoRequestMessageBld.build());
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .build());
- Mockito.verify(connectionAdapter).echoReply(ArgumentMatchers.any());
+ verify(connectionAdapter).echoReply(any());
}
@Test
.setVersion(EncodeConstants.OF_VERSION_1_3);
openflowProtocolListenerInitial.onHelloMessage(helloMessageBld.build());
- Mockito.verify(handshakeManager).shake(ArgumentMatchers.any());
+ verify(handshakeManager).shake(any());
}
@Test
public void testCheckState() {
- Assert.assertFalse(openflowProtocolListenerInitial.checkState(ConnectionContext.CONNECTION_STATE.HANDSHAKING));
- Assert.assertTrue(openflowProtocolListenerInitial.checkState(ConnectionContext.CONNECTION_STATE.HANDSHAKING));
+ assertFalse(openflowProtocolListenerInitial.checkState(ConnectionContext.CONNECTION_STATE.HANDSHAKING));
+ assertTrue(openflowProtocolListenerInitial.checkState(ConnectionContext.CONNECTION_STATE.HANDSHAKING));
}
}
\ No newline at end of file
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter.SystemListener;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.connection.DeviceConnectionStatusProvider;
import org.opendaylight.openflowplugin.impl.connection.ConnectionContextImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEventBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
private ConnectionContext connectionContext;
private ConnectionContextImpl connectionContextGolem;
- private SystemNotificationsListenerImpl systemNotificationsListener;
+ private SystemListener systemNotificationsListener;
private static final NodeId NODE_ID =
new NodeId("OFP:TEST");
public void testOnDisconnectEvent1() {
DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build();
- systemNotificationsListener.onDisconnectEvent(disconnectNotification);
+ systemNotificationsListener.onDisconnect(disconnectNotification);
verifyCommonInvocationsSubSet();
Mockito.verify(connectionContext).onConnectionClosed();
@Test
public void testOnDisconnectEvent2() {
- DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build();
- systemNotificationsListener.onDisconnectEvent(disconnectNotification);
+ systemNotificationsListener.onDisconnect(new DisconnectEventBuilder().setInfo("testing disconnect").build());
verifyCommonInvocationsSubSet();
Mockito.verify(connectionContext).onConnectionClosed();
public void testOnDisconnectEvent3() {
connectionContextGolem.changeStateToTimeouting();
- DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build();
- systemNotificationsListener.onDisconnectEvent(disconnectNotification);
+ systemNotificationsListener.onDisconnect(new DisconnectEventBuilder().setInfo("testing disconnect").build());
verifyCommonInvocationsSubSet();
Mockito.verify(connectionContext).onConnectionClosed();
public void testOnDisconnectEvent4() {
Mockito.when(connectionContext.getConnectionState()).thenReturn(ConnectionContext.CONNECTION_STATE.RIP);
- DisconnectEvent disconnectNotification = new DisconnectEventBuilder().setInfo("testing disconnect").build();
- systemNotificationsListener.onDisconnectEvent(disconnectNotification);
+ systemNotificationsListener.onDisconnect(new DisconnectEventBuilder().setInfo("testing disconnect").build());
verifyCommonInvocationsSubSet();
Mockito.verify(connectionContext).onConnectionClosed();
Mockito.when(connectionAdapter.echo(any(EchoInput.class))).thenReturn(echoReply);
- SwitchIdleEvent notification = new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build();
- systemNotificationsListener.onSwitchIdleEvent(notification);
+ systemNotificationsListener.onSwitchIdle(
+ new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build());
// make sure that the idle notification processing thread started
Thread.sleep(SAFE_TIMEOUT);
Mockito.when(connectionAdapter.disconnect())
.thenReturn(Futures.immediateFailedFuture(new Exception("unit exception")));
- SwitchIdleEvent notification = new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build();
- systemNotificationsListener.onSwitchIdleEvent(notification);
+ systemNotificationsListener.onSwitchIdle(
+ new SwitchIdleEventBuilder().setInfo("wake up, device sleeps").build());
Thread.sleep(SystemNotificationsListenerImpl.MAX_ECHO_REPLY_TIMEOUT + SAFE_TIMEOUT);
package org.opendaylight.openflowplugin.impl.device.listener;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+import com.google.common.util.concurrent.Futures;
import java.net.InetSocketAddress;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceReplyProcessor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
*/
@RunWith(MockitoJUnitRunner.class)
public class OpenflowProtocolListenerFullImplTest {
-
- private OpenflowProtocolListenerFullImpl ofProtocolListener;
-
@Mock
private DeviceReplyProcessor deviceReplyProcessor;
@Mock
private final Uint32 xid = Uint32.valueOf(42);
+ private OpenflowProtocolListenerFullImpl ofProtocolListener;
+
@Before
public void setUp() {
// place for mocking method's general behavior for HandshakeContext and ConnectionContext
ofProtocolListener = new OpenflowProtocolListenerFullImpl(connectionAdapter, deviceReplyProcessor);
connectionAdapter.setMessageListener(ofProtocolListener);
- Mockito.when(connectionAdapter.getRemoteAddress())
+ when(connectionAdapter.getRemoteAddress())
.thenReturn(InetSocketAddress.createUnresolved("ofp-junit.example.org", 6663));
- Mockito.verify(connectionAdapter).setMessageListener(any(OpenflowProtocolListener.class));
+ verify(connectionAdapter).setMessageListener(any(OpenflowProtocolListener.class));
}
@After
public void tearDown() {
- Mockito.verifyNoMoreInteractions(connectionAdapter, deviceReplyProcessor);
+ verifyNoMoreInteractions(connectionAdapter, deviceReplyProcessor);
}
/**
*/
@Test
public void testOnEchoRequestMessage() {
- EchoRequestMessage echoRequestMessage = new EchoRequestMessageBuilder()
- .setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
- ofProtocolListener.onEchoRequestMessage(echoRequestMessage);
+ when(connectionAdapter.echoReply(any())).thenReturn(Futures.immediateFuture(null));
+ ofProtocolListener.onEchoRequestMessage(
+ new EchoRequestMessageBuilder().setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build());
- Mockito.verify(connectionAdapter).echoReply(any(EchoReplyInput.class));
+ verify(connectionAdapter).echoReply(any(EchoReplyInput.class));
}
/**
.setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
ofProtocolListener.onErrorMessage(errorMessage);
- Mockito.verify(deviceReplyProcessor).processReply(any(ErrorMessage.class));
+ verify(deviceReplyProcessor).processReply(any(ErrorMessage.class));
}
/**
.setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
ofProtocolListener.onExperimenterMessage(experimenterMessage);
- Mockito.verify(deviceReplyProcessor).processExperimenterMessage(ArgumentMatchers.any());
+ verify(deviceReplyProcessor).processExperimenterMessage(any());
}
/**
.setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
ofProtocolListener.onFlowRemovedMessage(flowRemovedMessage);
- Mockito.verify(deviceReplyProcessor).processFlowRemovedMessage(any(FlowRemovedMessage.class));
+ verify(deviceReplyProcessor).processFlowRemovedMessage(any(FlowRemovedMessage.class));
}
/**
.setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
ofProtocolListener.onHelloMessage(helloMessage);
- Mockito.verify(connectionAdapter).getRemoteAddress();
- Mockito.verify(connectionAdapter).disconnect();
+ verify(connectionAdapter).getRemoteAddress();
+ verify(connectionAdapter).disconnect();
}
/**
.setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
ofProtocolListener.onPacketInMessage(packetInMessage);
- Mockito.verify(deviceReplyProcessor).processPacketInMessage(any(PacketInMessage.class));
+ verify(deviceReplyProcessor).processPacketInMessage(any(PacketInMessage.class));
}
/**
.setVersion(EncodeConstants.OF_VERSION_1_3).setXid(xid).build();
ofProtocolListener.onPortStatusMessage(portStatusMessage);
- Mockito.verify(deviceReplyProcessor).processPortStatusMessage(any(PortStatusMessage.class));
+ verify(deviceReplyProcessor).processPortStatusMessage(any(PortStatusMessage.class));
}
-
}