StackPortSpec.java

package com.cloudforge.core.local;

import java.net.URI;

/**
 * Metadata for a target-owned StackPort resource browser container.
 */
public record StackPortSpec(
        DeploymentTarget target,
        String containerName,
        String conflictingContainerName,
        String emulatorContainerName,
        String image,
        int hostPort,
        int containerPort,
        String displayName) {

    public StackPortSpec {
        if (target == null || target == DeploymentTarget.AWS) {
            throw new IllegalArgumentException("StackPort spec requires MINISTACK or LOCALSTACK target");
        }
    }

    public static StackPortSpec ministack() {
        return new StackPortSpec(
            DeploymentTarget.MINISTACK,
            LocalEmulatorDefaults.MINISTACK_STACKPORT_CONTAINER,
            LocalEmulatorDefaults.LOCALSTACK_STACKPORT_CONTAINER,
            LocalEmulatorDefaults.MINISTACK_CONTAINER,
            LocalEmulatorDefaults.STACKPORT_IMAGE,
            LocalEmulatorDefaults.STACKPORT_HOST_PORT,
            LocalEmulatorDefaults.STACKPORT_CONTAINER_PORT,
            "MiniStack StackPort");
    }

    public static StackPortSpec localstack() {
        return new StackPortSpec(
            DeploymentTarget.LOCALSTACK,
            LocalEmulatorDefaults.LOCALSTACK_STACKPORT_CONTAINER,
            LocalEmulatorDefaults.MINISTACK_STACKPORT_CONTAINER,
            LocalEmulatorDefaults.LOCALSTACK_CONTAINER,
            LocalEmulatorDefaults.STACKPORT_IMAGE,
            LocalEmulatorDefaults.STACKPORT_HOST_PORT,
            LocalEmulatorDefaults.STACKPORT_CONTAINER_PORT,
            "LocalStack StackPort");
    }

    public static StackPortSpec forTarget(DeploymentTarget target) {
        return switch (target) {
            case MINISTACK -> ministack();
            case LOCALSTACK -> localstack();
            case AWS -> throw new IllegalArgumentException("AWS is not a local emulator target");
        };
    }

    public URI browserUrl() {
        return URI.create("http://" + LocalEmulatorDefaults.GATEWAY_HOST + ":" + hostPort);
    }

    public String emulatorEndpointUrl() {
        return "http://" + emulatorContainerName + ":" + LocalEmulatorDefaults.GATEWAY_PORT;
    }

    /** Named StackPort endpoint key (used in {@code STACKPORT_ENDPOINTS}). */
    public String endpointConfigName() {
        return target == DeploymentTarget.MINISTACK ? "ministack" : "localstack";
    }

    public String stackPortEndpointsEnvValue() {
        return endpointConfigName() + "=" + emulatorEndpointUrl();
    }
}