Search in sources :

Example 6 with AddressResolver

use of io.vertx.core.impl.AddressResolver in project vert.x by eclipse.

the class HostnameResolutionTest method testServerFailover.

@Test
public void testServerFailover() throws Exception {
    FakeDNSServer server = new FakeDNSServer(FakeDNSServer.A_store(Collections.singletonMap("vertx.io", "127.0.0.1"))).port(FakeDNSServer.PORT + 2);
    try {
        AddressResolverOptions options = new AddressResolverOptions();
        options.setOptResourceEnabled(false);
        // 2 + 2
        options.setMaxQueries(4);
        server.start();
        InetSocketAddress dnsServerAddress = server.localAddress();
        // First server is unreachable
        options.addServer(dnsServerAddress.getAddress().getHostAddress() + ":" + (FakeDNSServer.PORT + 1));
        // Second server is the failed over server
        options.addServer(dnsServerAddress.getAddress().getHostAddress() + ":" + dnsServerAddress.getPort());
        AddressResolver resolver = new AddressResolver((VertxImpl) vertx, options);
        CompletableFuture<InetAddress> result = new CompletableFuture<>();
        resolver.resolveHostname("vertx.io", ar -> {
            if (ar.succeeded()) {
                result.complete(ar.result());
            } else {
                result.completeExceptionally(ar.cause());
            }
        });
        String resolved = result.get(10, TimeUnit.SECONDS).getHostAddress();
        assertEquals("127.0.0.1", resolved);
    } finally {
        server.stop();
    }
}
Also used : AddressResolverOptions(io.vertx.core.dns.AddressResolverOptions) AddressResolver(io.vertx.core.impl.AddressResolver) CompletableFuture(java.util.concurrent.CompletableFuture) InetSocketAddress(java.net.InetSocketAddress) InetAddress(java.net.InetAddress) FakeDNSServer(io.vertx.test.fakedns.FakeDNSServer) Test(org.junit.Test)

Example 7 with AddressResolver

use of io.vertx.core.impl.AddressResolver in project vert.x by eclipse.

the class HostnameResolutionTest method testResolveLocalhost.

@Test
public void testResolveLocalhost() {
    AddressResolver resolver = new AddressResolver((VertxImpl) vertx, new AddressResolverOptions());
    resolver.resolveHostname("LOCALHOST", res -> {
        if (res.succeeded()) {
            assertEquals("localhost", res.result().getHostName().toLowerCase(Locale.ENGLISH));
            resolver.resolveHostname("LocalHost", res2 -> {
                if (res2.succeeded()) {
                    assertEquals("localhost", res2.result().getHostName().toLowerCase(Locale.ENGLISH));
                    resolver.resolveHostname("localhost", res3 -> {
                        if (res3.succeeded()) {
                            assertEquals("localhost", res3.result().getHostName().toLowerCase(Locale.ENGLISH));
                            testComplete();
                        } else {
                            fail(res3.cause());
                        }
                    });
                } else {
                    fail(res2.cause());
                }
            });
        } else {
            fail(res.cause());
        }
    });
    await();
}
Also used : AddressResolverOptions(io.vertx.core.dns.AddressResolverOptions) AddressResolver(io.vertx.core.impl.AddressResolver) Test(org.junit.Test)

Example 8 with AddressResolver

use of io.vertx.core.impl.AddressResolver in project vert.x by eclipse.

the class DatagramSocketImpl method send.

@Override
public Future<Void> send(Buffer packet, int port, String host) {
    Objects.requireNonNull(packet, "no null packet accepted");
    Objects.requireNonNull(host, "no null host accepted");
    if (port < 0 || port > 65535) {
        throw new IllegalArgumentException("port out of range:" + port);
    }
    AddressResolver resolver = context.owner().addressResolver();
    PromiseInternal<Void> promise = context.promise();
    io.netty.util.concurrent.Future<InetSocketAddress> f1 = resolver.resolveHostname(context.nettyEventLoop(), host);
    f1.addListener((GenericFutureListener<io.netty.util.concurrent.Future<InetSocketAddress>>) res1 -> {
        if (res1.isSuccess()) {
            ChannelFuture f2 = channel.writeAndFlush(new DatagramPacket(packet.getByteBuf(), new InetSocketAddress(f1.getNow().getAddress(), port)));
            if (metrics != null) {
                f2.addListener(fut -> {
                    if (fut.isSuccess()) {
                        metrics.bytesWritten(null, SocketAddress.inetSocketAddress(port, host), packet.length());
                    }
                });
            }
            f2.addListener(promise);
        } else {
            promise.fail(res1.cause());
        }
    });
    return promise.future();
}
Also used : ChannelOption(io.netty.channel.ChannelOption) LoggingHandler(io.netty.handler.logging.LoggingHandler) DatagramSocket(io.vertx.core.datagram.DatagramSocket) Arguments(io.vertx.core.impl.Arguments) ContextInternal(io.vertx.core.impl.ContextInternal) ConnectionBase(io.vertx.core.net.impl.ConnectionBase) InetAddress(java.net.InetAddress) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) DatagramChannel(io.netty.channel.socket.DatagramChannel) ByteBuf(io.netty.buffer.ByteBuf) WriteStream(io.vertx.core.streams.WriteStream) DatagramPacket(io.netty.channel.socket.DatagramPacket) InternetProtocolFamily(io.netty.channel.socket.InternetProtocolFamily) AsyncResult(io.vertx.core.AsyncResult) DatagramSocketOptions(io.vertx.core.datagram.DatagramSocketOptions) MaxMessagesRecvByteBufAllocator(io.netty.channel.MaxMessagesRecvByteBufAllocator) SocketAddress(io.vertx.core.net.SocketAddress) VertxHandler(io.vertx.core.net.impl.VertxHandler) PromiseInternal(io.vertx.core.impl.future.PromiseInternal) VertxInternal(io.vertx.core.impl.VertxInternal) Transport(io.vertx.core.net.impl.transport.Transport) AddressResolver(io.vertx.core.impl.AddressResolver) NetworkInterface(java.net.NetworkInterface) GenericFutureListener(io.netty.util.concurrent.GenericFutureListener) Future(io.vertx.core.Future) InetSocketAddress(java.net.InetSocketAddress) UnknownHostException(java.net.UnknownHostException) ChannelFuture(io.netty.channel.ChannelFuture) Nullable(io.vertx.codegen.annotations.Nullable) Objects(java.util.Objects) Buffer(io.vertx.core.buffer.Buffer) io.vertx.core.spi.metrics(io.vertx.core.spi.metrics) Handler(io.vertx.core.Handler) ChannelFuture(io.netty.channel.ChannelFuture) AddressResolver(io.vertx.core.impl.AddressResolver) InetSocketAddress(java.net.InetSocketAddress) DatagramPacket(io.netty.channel.socket.DatagramPacket) Future(io.vertx.core.Future) ChannelFuture(io.netty.channel.ChannelFuture)

Example 9 with AddressResolver

use of io.vertx.core.impl.AddressResolver in project vert.x by eclipse.

the class HostnameResolutionTest method testAddressSelection.

private void testAddressSelection(AddressResolverOptions options, int expected) throws Exception {
    Function<String, ResourceRecord> createRecord = ipAddress -> new ResourceRecord() {

        @Override
        public String getDomainName() {
            return "vertx.io";
        }

        @Override
        public RecordType getRecordType() {
            return RecordType.A;
        }

        @Override
        public RecordClass getRecordClass() {
            return RecordClass.IN;
        }

        @Override
        public int getTimeToLive() {
            return 100;
        }

        @Override
        public String get(String s) {
            return DnsAttribute.IP_ADDRESS.equals(s) ? ipAddress : null;
        }
    };
    Set<ResourceRecord> records = new LinkedHashSet<>();
    records.add(createRecord.apply("127.0.0.1"));
    records.add(createRecord.apply("127.0.0.2"));
    dnsServer.store(question -> records);
    AddressResolver resolver = new AddressResolver(vertx, options);
    Set<String> resolved = Collections.synchronizedSet(new HashSet<>());
    // due to the random nature of netty's round robin algorithm
    // the below outcome is generally non-deterministic and will fail once in about 2^100 runs (virtually never)
    CountDownLatch latch = new CountDownLatch(100);
    for (int i = 0; i < 100; i++) {
        resolver.resolveHostname("vertx.io", onSuccess(inetAddress -> {
            resolved.add(inetAddress.getHostAddress());
            latch.countDown();
        }));
    }
    awaitLatch(latch);
    assertEquals(expected, resolved.size());
}
Also used : VertxException(io.vertx.core.VertxException) RecordClass(org.apache.directory.server.dns.messages.RecordClass) java.util(java.util) HttpServer(io.vertx.core.http.HttpServer) CompletableFuture(java.util.concurrent.CompletableFuture) VertxTestBase(io.vertx.test.core.VertxTestBase) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) InetAddress(java.net.InetAddress) TestUtils(io.vertx.test.core.TestUtils) JsonObject(io.vertx.core.json.JsonObject) FakeDNSServer(io.vertx.test.fakedns.FakeDNSServer) NetClient(io.vertx.core.net.NetClient) ResourceRecord(org.apache.directory.server.dns.messages.ResourceRecord) VertxImpl(io.vertx.core.impl.VertxImpl) VertxInternal(io.vertx.core.impl.VertxInternal) ChannelInitializer(io.netty.channel.ChannelInitializer) AddressResolver(io.vertx.core.impl.AddressResolver) DnsAttribute(org.apache.directory.server.dns.store.DnsAttribute) VertxOptions(io.vertx.core.VertxOptions) Test(org.junit.Test) InetSocketAddress(java.net.InetSocketAddress) UnknownHostException(java.net.UnknownHostException) File(java.io.File) ChannelFuture(io.netty.channel.ChannelFuture) Channel(io.netty.channel.Channel) TimeUnit(java.util.concurrent.TimeUnit) Bootstrap(io.netty.bootstrap.Bootstrap) CountDownLatch(java.util.concurrent.CountDownLatch) NetServerOptions(io.vertx.core.net.NetServerOptions) Buffer(io.vertx.core.buffer.Buffer) NetServer(io.vertx.core.net.NetServer) HttpMethod(io.vertx.core.http.HttpMethod) RecordType(org.apache.directory.server.dns.messages.RecordType) HttpClient(io.vertx.core.http.HttpClient) AddressResolver(io.vertx.core.impl.AddressResolver) CountDownLatch(java.util.concurrent.CountDownLatch) ResourceRecord(org.apache.directory.server.dns.messages.ResourceRecord)

Aggregations

AddressResolver (io.vertx.core.impl.AddressResolver)9 InetAddress (java.net.InetAddress)7 InetSocketAddress (java.net.InetSocketAddress)7 FakeDNSServer (io.vertx.test.fakedns.FakeDNSServer)5 CompletableFuture (java.util.concurrent.CompletableFuture)5 Test (org.junit.Test)5 ChannelFuture (io.netty.channel.ChannelFuture)3 Buffer (io.vertx.core.buffer.Buffer)3 AddressResolverOptions (io.vertx.core.dns.AddressResolverOptions)3 VertxInternal (io.vertx.core.impl.VertxInternal)3 UnknownHostException (java.net.UnknownHostException)3 ByteBuf (io.netty.buffer.ByteBuf)2 ChannelHandlerContext (io.netty.channel.ChannelHandlerContext)2 ChannelOption (io.netty.channel.ChannelOption)2 MaxMessagesRecvByteBufAllocator (io.netty.channel.MaxMessagesRecvByteBufAllocator)2 DatagramChannel (io.netty.channel.socket.DatagramChannel)2 DatagramPacket (io.netty.channel.socket.DatagramPacket)2 InternetProtocolFamily (io.netty.channel.socket.InternetProtocolFamily)2 LoggingHandler (io.netty.handler.logging.LoggingHandler)2 GenericFutureListener (io.netty.util.concurrent.GenericFutureListener)2