Search in sources :

Example 1 with KeyPairProvider

use of org.opendaylight.netconf.shaded.sshd.common.keyprovider.KeyPairProvider in project netconf by opendaylight.

the class NetconfDeviceSimulator method start.

public List<Integer> start() {
    LOG.info("Starting {}, {} simulated devices starting on port {}", configuration.getDeviceCount(), configuration.isSsh() ? "SSH" : "TCP", configuration.getStartingPort());
    final SharedSchemaRepository schemaRepo = new SharedSchemaRepository("netconf-simulator");
    final Set<Capability> capabilities = parseSchemasToModuleCapabilities(schemaRepo);
    final NetconfServerDispatcherImpl dispatcher = createDispatcher(capabilities, sourceIdentifier -> schemaRepo.getSchemaSource(sourceIdentifier, YangTextSchemaSource.class));
    int currentPort = configuration.getStartingPort();
    final List<Integer> openDevices = new ArrayList<>();
    // Generate key to temp folder
    final KeyPairProvider keyPairProvider = new VirtualKeyPairProvider();
    final AsynchronousChannelGroup group;
    try {
        group = AsynchronousChannelGroup.withThreadPool(nioExecutor);
    } catch (final IOException e) {
        throw new IllegalStateException("Failed to create group", e);
    }
    for (int i = 0; i < configuration.getDeviceCount(); i++) {
        if (currentPort > 65535) {
            LOG.warn("Port cannot be greater than 65535, stopping further attempts.");
            break;
        }
        final InetSocketAddress address = getAddress(configuration.getIp(), currentPort);
        final ChannelFuture server;
        if (configuration.isSsh()) {
            final InetSocketAddress bindingAddress = InetSocketAddress.createUnresolved("0.0.0.0", currentPort);
            final LocalAddress tcpLocalAddress = new LocalAddress(address.toString());
            server = dispatcher.createLocalServer(tcpLocalAddress);
            try {
                final SshProxyServer sshServer = new SshProxyServer(minaTimerExecutor, nettyThreadgroup, group);
                sshServer.bind(getSshConfiguration(bindingAddress, tcpLocalAddress, keyPairProvider));
                sshWrappers.add(sshServer);
            } catch (final BindException e) {
                LOG.warn("Cannot start simulated device on {}, port already in use. Skipping.", address);
                // Close local server and continue
                server.cancel(true);
                if (server.isDone()) {
                    server.channel().close();
                }
                continue;
            } catch (final IOException e) {
                LOG.warn("Cannot start simulated device on {} due to IOException.", address, e);
                break;
            } finally {
                currentPort++;
            }
            try {
                server.get();
            } catch (final InterruptedException e) {
                throw new RuntimeException(e);
            } catch (final ExecutionException e) {
                LOG.warn("Cannot start ssh simulated device on {}, skipping", address, e);
                continue;
            }
            LOG.debug("Simulated SSH device started on {}", address);
        } else {
            server = dispatcher.createServer(address);
            currentPort++;
            try {
                server.get();
            } catch (final InterruptedException e) {
                throw new RuntimeException(e);
            } catch (final ExecutionException e) {
                LOG.warn("Cannot start tcp simulated device on {}, skipping", address, e);
                continue;
            }
            LOG.debug("Simulated TCP device started on {}", server.channel().localAddress());
        }
        devicesChannels.add(server.channel());
        openDevices.add(currentPort - 1);
    }
    if (openDevices.size() == configuration.getDeviceCount()) {
        LOG.info("All simulated devices started successfully from port {} to {}", configuration.getStartingPort(), currentPort - 1);
    } else if (openDevices.size() == 0) {
        LOG.warn("No simulated devices started.");
    } else {
        LOG.warn("Not all simulated devices started successfully. Started devices ar on ports {}", openDevices);
    }
    return openDevices;
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) LocalAddress(io.netty.channel.local.LocalAddress) Capability(org.opendaylight.netconf.api.capability.Capability) YangModuleCapability(org.opendaylight.netconf.api.capability.YangModuleCapability) BasicCapability(org.opendaylight.netconf.api.capability.BasicCapability) YangTextSchemaSource(org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource) SshProxyServer(org.opendaylight.netconf.ssh.SshProxyServer) InetSocketAddress(java.net.InetSocketAddress) ArrayList(java.util.ArrayList) BindException(java.net.BindException) IOException(java.io.IOException) NetconfServerDispatcherImpl(org.opendaylight.netconf.impl.NetconfServerDispatcherImpl) KeyPairProvider(org.opendaylight.netconf.shaded.sshd.common.keyprovider.KeyPairProvider) AsynchronousChannelGroup(java.nio.channels.AsynchronousChannelGroup) ExecutionException(java.util.concurrent.ExecutionException) SharedSchemaRepository(org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository)

Aggregations

ChannelFuture (io.netty.channel.ChannelFuture)1 LocalAddress (io.netty.channel.local.LocalAddress)1 IOException (java.io.IOException)1 BindException (java.net.BindException)1 InetSocketAddress (java.net.InetSocketAddress)1 AsynchronousChannelGroup (java.nio.channels.AsynchronousChannelGroup)1 ArrayList (java.util.ArrayList)1 ExecutionException (java.util.concurrent.ExecutionException)1 BasicCapability (org.opendaylight.netconf.api.capability.BasicCapability)1 Capability (org.opendaylight.netconf.api.capability.Capability)1 YangModuleCapability (org.opendaylight.netconf.api.capability.YangModuleCapability)1 NetconfServerDispatcherImpl (org.opendaylight.netconf.impl.NetconfServerDispatcherImpl)1 KeyPairProvider (org.opendaylight.netconf.shaded.sshd.common.keyprovider.KeyPairProvider)1 SshProxyServer (org.opendaylight.netconf.ssh.SshProxyServer)1 YangTextSchemaSource (org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource)1 SharedSchemaRepository (org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository)1