All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.quarkus.test.bootstrap.LocalhostManagedResource Maven / Gradle / Ivy

The newest version!
package io.quarkus.test.bootstrap;

import java.io.IOException;
import java.util.List;

import org.junit.jupiter.api.condition.OS;

import io.quarkus.test.services.URILike;
import io.quarkus.test.utils.Command;

/**
 * Forward Docker ports from localhost to Docker host on Windows. This works around issue when
 * certificates are only generated for localhost.
 */
public final class LocalhostManagedResource implements ManagedResource {

    /**
     * Our Linux bare-metal instances use Docker on localhost.
     */
    private static final boolean FORWARD_PORT = OS.current() == OS.WINDOWS;
    private final ManagedResource delegate;

    public LocalhostManagedResource(ManagedResource delegate) {
        this.delegate = delegate;
    }

    @Override
    public String getDisplayName() {
        return delegate.getDisplayName();
    }

    @Override
    public void stop() {
        if (FORWARD_PORT) {
            try {
                // stop port proxy
                new Command("netsh", "interface", "portproxy", "delete", "v4tov4",
                        "listenport=" + getExposedPort(), "listenaddress=127.0.0.1").runAndWait();
            } catch (IOException | InterruptedException e) {
                throw new RuntimeException(
                        "Failed delete port proxy for Kafka container port " + getExposedPort(), e);
            }
        }
        delegate.stop();
    }

    @Override
    public void start() {
        delegate.start();
        if (FORWARD_PORT) {
            try {
                // forward localhost:somePort to dockerIp:somePort
                new Command("netsh", "interface", "portproxy", "add", "v4tov4", "listenport=" + getExposedPort(),
                        "listenaddress=127.0.0.1", "connectport=" + getExposedPort(),
                        "connectaddress=" + getDockerHost()).runAndWait();
            } catch (IOException | InterruptedException e) {
                throw new RuntimeException(
                        "Failed to setup forwarding for Kafka container port " + getExposedPort(), e);
            }
        }
    }

    @Override
    public URILike getURI(Protocol protocol) {
        var uriLike = delegate.getURI(protocol);
        if (FORWARD_PORT) {
            // replace Docker IP with local host
            uriLike = new URILike(uriLike.getScheme(), "localhost", uriLike.getPort(), uriLike.getPath());
        }
        return uriLike;
    }

    private String getDockerHost() {
        return delegate.getURI(Protocol.NONE).getHost();
    }

    private int getExposedPort() {
        return delegate.getURI(Protocol.NONE).getPort();
    }

    @Override
    public boolean isRunning() {
        return delegate.isRunning();
    }

    @Override
    public boolean isFailed() {
        return delegate.isFailed();
    }

    @Override
    public List logs() {
        return delegate.logs();
    }

    @Override
    public void restart() {
        delegate.restart();
    }

    @Override
    public void validate() {
        delegate.validate();
    }

    @Override
    public void afterStart() {
        delegate.afterStart();
    }

    @Override
    public URILike createURI(String scheme, String host, int port) {
        return delegate.createURI(scheme, host, port);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy