From ade08ac0f12b7defac1d6a824756d442b8a43b65 Mon Sep 17 00:00:00 2001 From: Waldemar Hummer Date: Fri, 19 Dec 2025 16:13:15 +0100 Subject: [PATCH 1/2] tmp commit --- .../localstack_wiremock/extension.py | 29 +++++++++++++++++-- .../localstack_wiremock/utils/docker.py | 8 ++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/localstack-wiremock/localstack_wiremock/extension.py b/localstack-wiremock/localstack_wiremock/extension.py index b899051..0f3b985 100644 --- a/localstack-wiremock/localstack_wiremock/extension.py +++ b/localstack-wiremock/localstack_wiremock/extension.py @@ -1,19 +1,42 @@ +import os + +from localstack.utils.container_utils.container_client import SimpleVolumeBind, Util +from localstack.utils.files import new_tmp_file from localstack_wiremock.utils.docker import ProxiedDockerContainerExtension +# Environment variable for WireMock Cloud API token - note: if this value is specified, then the +# `wiremock/wiremock-runner` image is being used, otherwise the `wiremock/wiremock` OSS image. +ENV_WIREMOCK_API_TOKEN = "WIREMOCK_API_TOKEN" +# container port for WireMock endpoint - TODO make configurable over time +PORT = 8080 + + class WireMockExtension(ProxiedDockerContainerExtension): name = "localstack-wiremock" HOST = "wiremock." - # name of the Docker image to spin up + # name of the OSS Docker image DOCKER_IMAGE = "wiremock/wiremock" + # name of the WireMock Cloud runner Docker image + DOCKER_IMAGE_RUNNER = "wiremock/wiremock-runner" # name of the container CONTAINER_NAME = "ls-wiremock" def __init__(self): + env_vars = {} + image_name = self.DOCKER_IMAGE + if api_token := os.getenv(ENV_WIREMOCK_API_TOKEN): + env_vars["WMC_ADMIN_PORT"] = str(PORT) + # env_vars["WMC_DEFAULT_MODE"] = "record-many" + env_vars["WMC_API_TOKEN"] = api_token + env_vars["WMC_RUNNER_ENABLED"] = "true" + image_name = self.DOCKER_IMAGE_RUNNER + settings_file = Util.mountable_tmp_file() super().__init__( - image_name=self.DOCKER_IMAGE, - container_ports=[8080], + image_name=image_name, + container_ports=[PORT], container_name=self.CONTAINER_NAME, host=self.HOST, + volumes=[SimpleVolumeBind(settings_file, "/work/.wiremock/wiremock.yaml")] ) diff --git a/localstack-wiremock/localstack_wiremock/utils/docker.py b/localstack-wiremock/localstack_wiremock/utils/docker.py index 978eaba..386e4c5 100644 --- a/localstack-wiremock/localstack_wiremock/utils/docker.py +++ b/localstack-wiremock/localstack_wiremock/utils/docker.py @@ -7,7 +7,7 @@ from localstack.utils.docker_utils import DOCKER_CLIENT from localstack.extensions.api import Extension, http from localstack.http import Request -from localstack.utils.container_utils.container_client import PortMappings +from localstack.utils.container_utils.container_client import PortMappings, SimpleVolumeBind from localstack.utils.net import get_addressable_container_host from localstack.utils.sync import retry from rolo import route @@ -44,6 +44,9 @@ class ProxiedDockerContainerExtension(Extension): http2_ports: list[int] | None """List of ports for which HTTP2 proxy forwarding into the container should be enabled.""" + volumes: list[SimpleVolumeBind] | None = None, + """Optional volumes to mount into the container host.""" + def __init__( self, image_name: str, @@ -54,6 +57,7 @@ def __init__( command: list[str] | None = None, request_to_port_router: Callable[[Request], int] | None = None, http2_ports: list[int] | None = None, + volumes: list[SimpleVolumeBind] | None = None ): self.image_name = image_name self.container_ports = container_ports @@ -63,6 +67,7 @@ def __init__( self.command = command self.request_to_port_router = request_to_port_router self.http2_ports = http2_ports + self.volumes = volumes def update_gateway_routes(self, router: http.Router[http.RouteHandler]): if self.path: @@ -106,6 +111,7 @@ def start_container(self) -> None: remove=True, name=container_name, ports=ports, + volumes=self.volumes, **kwargs, ) except Exception as e: From 8aa1f10e6e541cf640f0afd686397bce98575894 Mon Sep 17 00:00:00 2001 From: Waldemar Hummer Date: Mon, 12 Jan 2026 22:28:31 +0100 Subject: [PATCH 2/2] minor fixes --- localstack-wiremock/localstack_wiremock/extension.py | 11 +++++++---- .../localstack_wiremock/utils/docker.py | 9 ++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/localstack-wiremock/localstack_wiremock/extension.py b/localstack-wiremock/localstack_wiremock/extension.py index 0f3b985..7061ac1 100644 --- a/localstack-wiremock/localstack_wiremock/extension.py +++ b/localstack-wiremock/localstack_wiremock/extension.py @@ -1,7 +1,6 @@ import os -from localstack.utils.container_utils.container_client import SimpleVolumeBind, Util -from localstack.utils.files import new_tmp_file +from localstack.utils.container_utils.container_client import Util from localstack_wiremock.utils.docker import ProxiedDockerContainerExtension @@ -26,17 +25,21 @@ class WireMockExtension(ProxiedDockerContainerExtension): def __init__(self): env_vars = {} image_name = self.DOCKER_IMAGE + kwargs = {} if api_token := os.getenv(ENV_WIREMOCK_API_TOKEN): env_vars["WMC_ADMIN_PORT"] = str(PORT) + # TODO remove? # env_vars["WMC_DEFAULT_MODE"] = "record-many" env_vars["WMC_API_TOKEN"] = api_token env_vars["WMC_RUNNER_ENABLED"] = "true" image_name = self.DOCKER_IMAGE_RUNNER - settings_file = Util.mountable_tmp_file() + settings_file = Util.mountable_tmp_file() + # TODO: set configs in YAML file + kwargs["volumes"] = ([(settings_file, "/work/.wiremock/wiremock.yaml")],) super().__init__( image_name=image_name, container_ports=[PORT], container_name=self.CONTAINER_NAME, host=self.HOST, - volumes=[SimpleVolumeBind(settings_file, "/work/.wiremock/wiremock.yaml")] + **kwargs, ) diff --git a/localstack-wiremock/localstack_wiremock/utils/docker.py b/localstack-wiremock/localstack_wiremock/utils/docker.py index 386e4c5..7a6fcb4 100644 --- a/localstack-wiremock/localstack_wiremock/utils/docker.py +++ b/localstack-wiremock/localstack_wiremock/utils/docker.py @@ -7,7 +7,10 @@ from localstack.utils.docker_utils import DOCKER_CLIENT from localstack.extensions.api import Extension, http from localstack.http import Request -from localstack.utils.container_utils.container_client import PortMappings, SimpleVolumeBind +from localstack.utils.container_utils.container_client import ( + PortMappings, + SimpleVolumeBind, +) from localstack.utils.net import get_addressable_container_host from localstack.utils.sync import retry from rolo import route @@ -44,7 +47,7 @@ class ProxiedDockerContainerExtension(Extension): http2_ports: list[int] | None """List of ports for which HTTP2 proxy forwarding into the container should be enabled.""" - volumes: list[SimpleVolumeBind] | None = None, + volumes: list[SimpleVolumeBind] | None = (None,) """Optional volumes to mount into the container host.""" def __init__( @@ -57,7 +60,7 @@ def __init__( command: list[str] | None = None, request_to_port_router: Callable[[Request], int] | None = None, http2_ports: list[int] | None = None, - volumes: list[SimpleVolumeBind] | None = None + volumes: list[SimpleVolumeBind] | None = None, ): self.image_name = image_name self.container_ports = container_ports