2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.test.tool.client.stress;
10 import java.net.InetSocketAddress;
11 import java.util.List;
12 import java.util.concurrent.Callable;
13 import java.util.concurrent.ExecutionException;
14 import org.opendaylight.netconf.api.messages.NetconfMessage;
15 import org.opendaylight.netconf.client.NetconfClientFactory;
16 import org.opendaylight.netconf.client.NetconfClientSession;
17 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
18 import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
19 import org.opendaylight.netconf.client.mdsal.NetconfDeviceCommunicator;
20 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
21 import org.opendaylight.netconf.transport.api.UnsupportedConfigurationException;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 public class StressClientCallable implements Callable<Boolean> {
27 private static final Logger LOG = LoggerFactory.getLogger(StressClientCallable.class);
29 private final NetconfDeviceCommunicator sessionListener;
30 private final NetconfClientSession netconfClientSession;
31 private final ExecutionStrategy executionStrategy;
33 public StressClientCallable(final Parameters params,
34 final NetconfClientFactory netconfClientFactory,
35 final NetconfClientConfiguration baseConfiguration,
36 final List<NetconfMessage> preparedMessages) {
37 sessionListener = getSessionListener(params.getInetAddress(), params.concurrentMessageLimit);
38 final var cfg = getNetconfClientConfiguration(baseConfiguration, sessionListener);
40 LOG.info("Connecting to netconf server {}:{}", params.ip, params.port);
42 netconfClientSession = netconfClientFactory.createClient(cfg).get();
43 } catch (final InterruptedException | ExecutionException | UnsupportedConfigurationException e) {
44 throw new IllegalStateException("Unable to connect", e);
46 executionStrategy = getExecutionStrategy(params, preparedMessages, sessionListener);
50 public Boolean call() {
51 executionStrategy.invoke();
52 netconfClientSession.close();
56 private static ExecutionStrategy getExecutionStrategy(final Parameters params,
57 final List<NetconfMessage> preparedMessages, final NetconfDeviceCommunicator sessionListener) {
59 return new AsyncExecutionStrategy(params, preparedMessages, sessionListener);
61 return new SyncExecutionStrategy(params, preparedMessages, sessionListener);
65 private static NetconfDeviceCommunicator getSessionListener(final InetSocketAddress inetAddress,
66 final int messageLimit) {
67 return new NetconfDeviceCommunicator(new RemoteDeviceId("secure-test", inetAddress),
68 StressClient.LOGGING_REMOTE_DEVICE, messageLimit);
71 private static NetconfClientConfiguration getNetconfClientConfiguration(final NetconfClientConfiguration base,
72 final NetconfDeviceCommunicator sessionListener) {
73 return NetconfClientConfigurationBuilder.create()
74 .withProtocol(base.getProtocol())
75 .withTcpParameters(base.getTcpParameters())
76 .withSshParameters(base.getSshParameters())
77 .withOdlHelloCapabilities(base.getOdlHelloCapabilities())
78 .withAdditionalHeader(base.getAdditionalHeader().orElse(null))
79 .withConnectionTimeoutMillis(base.getConnectionTimeoutMillis())
80 .withSessionListener(sessionListener).build();