This is an automated email from the ASF dual-hosted git repository.

martinzink pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git


The following commit(s) were added to refs/heads/main by this push:
     new ec4965477 MINIFICPP-2802 Pre-pull docker images for extension tests 
(#2169)
ec4965477 is described below

commit ec4965477e93efcefd75aee120879c321b7433cd
Author: Gabor Gyimesi <[email protected]>
AuthorDate: Thu May 7 07:34:09 2026 +0200

    MINIFICPP-2802 Pre-pull docker images for extension tests (#2169)
    
    * MINIFICPP-2802 Pre-pull docker images for extension tests
    
    Avoid issues if docker image pull is slow and that would interfere while
    running the test scenario.
---
 .../aws/tests/features/containers/s3_server_container.py      |  4 +++-
 extensions/aws/tests/features/environment.py                  |  8 +++++++-
 .../azure/tests/features/containers/azure_server_container.py |  4 +++-
 extensions/azure/tests/features/environment.py                |  7 ++++++-
 .../tests/features/containers/couchbase_server_container.py   |  4 +++-
 extensions/couchbase/tests/features/environment.py            |  4 ++++
 .../tests/features/containers/elasticsearch_container.py      |  4 +++-
 .../tests/features/containers/opensearch_container.py         |  4 +++-
 extensions/elasticsearch/tests/features/environment.py        | 11 +++++++++++
 .../tests/features/containers/fake_gcs_server_container.py    |  4 +++-
 extensions/gcp/tests/features/environment.py                  |  7 +++++++
 .../tests/features/containers/grafana_loki_container.py       |  4 +++-
 extensions/grafana-loki/tests/features/environment.py         |  4 ++++
 .../kafka/tests/features/containers/kafka_server_container.py |  4 +++-
 extensions/kafka/tests/features/environment.py                |  4 ++++
 .../mqtt/tests/features/containers/mqtt_broker_container.py   |  4 +++-
 extensions/mqtt/tests/features/environment.py                 |  3 +++
 .../opc/tests/features/containers/opc_ua_server_container.py  |  4 ++--
 extensions/opc/tests/features/environment.py                  |  7 ++++++-
 extensions/opc/tests/features/steps/steps.py                  |  4 ++--
 .../tests/features/containers/prometheus_container.py         |  4 +++-
 extensions/prometheus/tests/features/environment.py           |  3 +++
 .../splunk/tests/features/containers/splunk_container.py      |  4 +++-
 extensions/splunk/tests/features/environment.py               |  4 ++++
 .../tests/features/containers/postgress_server_container.py   |  4 +++-
 extensions/sql/tests/features/environment.py                  |  3 +++
 26 files changed, 102 insertions(+), 19 deletions(-)

diff --git a/extensions/aws/tests/features/containers/s3_server_container.py 
b/extensions/aws/tests/features/containers/s3_server_container.py
index 9a16700df..b2b76ffb1 100644
--- a/extensions/aws/tests/features/containers/s3_server_container.py
+++ b/extensions/aws/tests/features/containers/s3_server_container.py
@@ -22,8 +22,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class S3ServerContainer(LinuxContainer):
+    IMAGE = "adobe/s3mock:3.12.0"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__("adobe/s3mock:3.12.0", 
f"s3-server-{test_context.scenario_id}", test_context.network)
+        super().__init__(S3ServerContainer.IMAGE, 
f"s3-server-{test_context.scenario_id}", test_context.network)
         self.environment.append("initialBuckets=test_bucket")
 
     def deploy(self, context: MinifiTestContext | None) -> bool:
diff --git a/extensions/aws/tests/features/environment.py 
b/extensions/aws/tests/features/environment.py
index ee812b362..08e04da68 100644
--- a/extensions/aws/tests/features/environment.py
+++ b/extensions/aws/tests/features/environment.py
@@ -13,13 +13,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
+import docker
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
+from containers.s3_server_container import S3ServerContainer
+
 
 # These hooks are executed by behave before and after each scenario
 # The common_before_scenario and common_after_scenario must be called for 
proper setup and tear down
 
+def before_feature(context, feature):
+    if feature.filename.endswith("s3.feature"):
+        docker.from_env().images.pull(S3ServerContainer.IMAGE)
+
 
 def before_scenario(context, scenario):
     common_before_scenario(context, scenario)
diff --git 
a/extensions/azure/tests/features/containers/azure_server_container.py 
b/extensions/azure/tests/features/containers/azure_server_container.py
index 36f81158f..72d7d686b 100644
--- a/extensions/azure/tests/features/containers/azure_server_container.py
+++ b/extensions/azure/tests/features/containers/azure_server_container.py
@@ -25,8 +25,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class AzureServerContainer(LinuxContainer):
+    IMAGE = "mcr.microsoft.com/azure-storage/azurite:3.35.0"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__("mcr.microsoft.com/azure-storage/azurite:3.35.0",
+        super().__init__(AzureServerContainer.IMAGE,
                          f"azure-storage-server-{test_context.scenario_id}",
                          test_context.network)
         azure_storage_hostname = 
f"azure-storage-server-{test_context.scenario_id}"
diff --git a/extensions/azure/tests/features/environment.py 
b/extensions/azure/tests/features/environment.py
index ee812b362..468476614 100644
--- a/extensions/azure/tests/features/environment.py
+++ b/extensions/azure/tests/features/environment.py
@@ -13,14 +13,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
+import docker
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
+from containers.azure_server_container import AzureServerContainer
 
 # These hooks are executed by behave before and after each scenario
 # The common_before_scenario and common_after_scenario must be called for 
proper setup and tear down
 
 
+def before_all(context):
+    docker.from_env().images.pull(AzureServerContainer.IMAGE)
+
+
 def before_scenario(context, scenario):
     common_before_scenario(context, scenario)
 
diff --git 
a/extensions/couchbase/tests/features/containers/couchbase_server_container.py 
b/extensions/couchbase/tests/features/containers/couchbase_server_container.py
index d8febe939..41c8a89ee 100644
--- 
a/extensions/couchbase/tests/features/containers/couchbase_server_container.py
+++ 
b/extensions/couchbase/tests/features/containers/couchbase_server_container.py
@@ -24,8 +24,10 @@ from docker.errors import ContainerError
 
 
 class CouchbaseServerContainer(LinuxContainer):
+    IMAGE = "couchbase:enterprise-7.2.5"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__("couchbase:enterprise-7.2.5", 
f"couchbase-server-{test_context.scenario_id}", test_context.network)
+        super().__init__(CouchbaseServerContainer.IMAGE, 
f"couchbase-server-{test_context.scenario_id}", test_context.network)
 
         couchbase_cert, couchbase_key = make_server_cert(self.container_name, 
test_context.root_ca_cert, test_context.root_ca_key)
 
diff --git a/extensions/couchbase/tests/features/environment.py 
b/extensions/couchbase/tests/features/environment.py
index 9b593f032..d48dc49e1 100644
--- a/extensions/couchbase/tests/features/environment.py
+++ b/extensions/couchbase/tests/features/environment.py
@@ -12,9 +12,12 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import docker
 from minifi_behave.containers.docker_image_builder import DockerImageBuilder
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
+from containers.couchbase_server_container import CouchbaseServerContainer
 
 
 def before_all(context):
@@ -26,6 +29,7 @@ def before_all(context):
         dockerfile_content=dockerfile
     )
     builder.build()
+    docker.from_env().images.pull(CouchbaseServerContainer.IMAGE)
 
 
 def before_scenario(context, scenario):
diff --git 
a/extensions/elasticsearch/tests/features/containers/elasticsearch_container.py 
b/extensions/elasticsearch/tests/features/containers/elasticsearch_container.py
index 3d87dd0a2..45403de22 100644
--- 
a/extensions/elasticsearch/tests/features/containers/elasticsearch_container.py
+++ 
b/extensions/elasticsearch/tests/features/containers/elasticsearch_container.py
@@ -26,8 +26,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class ElasticsearchContainer(ElasticBaseContainer):
+    IMAGE = "elasticsearch:9.1.5"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__(test_context, "elasticsearch:9.1.5", 
f"elasticsearch-{test_context.scenario_id}")
+        super().__init__(test_context, ElasticsearchContainer.IMAGE, 
f"elasticsearch-{test_context.scenario_id}")
 
         http_cert, http_key = make_server_cert(self.container_name, 
test_context.root_ca_cert, test_context.root_ca_key)
         transport_cert, transport_key = 
make_cert_without_extended_usage(self.container_name, 
test_context.root_ca_cert, test_context.root_ca_key)
diff --git 
a/extensions/elasticsearch/tests/features/containers/opensearch_container.py 
b/extensions/elasticsearch/tests/features/containers/opensearch_container.py
index 964e989c0..1f09d0cce 100644
--- a/extensions/elasticsearch/tests/features/containers/opensearch_container.py
+++ b/extensions/elasticsearch/tests/features/containers/opensearch_container.py
@@ -25,8 +25,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class OpensearchContainer(ElasticBaseContainer):
+    IMAGE = "opensearchproject/opensearch:2.6.0"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__(test_context, "opensearchproject/opensearch:2.6.0", 
f"opensearch-{test_context.scenario_id}")
+        super().__init__(test_context, OpensearchContainer.IMAGE, 
f"opensearch-{test_context.scenario_id}")
 
         admin_pem, admin_key = make_server_cert(self.container_name, 
test_context.root_ca_cert, test_context.root_ca_key)
 
diff --git a/extensions/elasticsearch/tests/features/environment.py 
b/extensions/elasticsearch/tests/features/environment.py
index d9f4bcb30..eaea25090 100644
--- a/extensions/elasticsearch/tests/features/environment.py
+++ b/extensions/elasticsearch/tests/features/environment.py
@@ -12,10 +12,21 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import docker
+from containers.elasticsearch_container import ElasticsearchContainer
+from containers.opensearch_container import OpensearchContainer
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
 
 
+def before_feature(context, feature):
+    if feature.filename.endswith("elasticsearch.feature"):
+        docker.from_env().images.pull(ElasticsearchContainer.IMAGE)
+    elif feature.filename.endswith("opensearch.feature"):
+        docker.from_env().images.pull(OpensearchContainer.IMAGE)
+
+
 def before_scenario(context, scenario):
     common_before_scenario(context, scenario)
 
diff --git 
a/extensions/gcp/tests/features/containers/fake_gcs_server_container.py 
b/extensions/gcp/tests/features/containers/fake_gcs_server_container.py
index 2bb63fbf9..506478932 100644
--- a/extensions/gcp/tests/features/containers/fake_gcs_server_container.py
+++ b/extensions/gcp/tests/features/containers/fake_gcs_server_container.py
@@ -21,8 +21,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class FakeGcsServerContainer(LinuxContainer):
+    IMAGE = "fsouza/fake-gcs-server:1.45.1"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__("fsouza/fake-gcs-server:1.45.1", 
f"fake-gcs-server-{test_context.scenario_id}", test_context.network,
+        super().__init__(FakeGcsServerContainer.IMAGE, 
f"fake-gcs-server-{test_context.scenario_id}", test_context.network,
                          command=f'-scheme http -host 
fake-gcs-server-{test_context.scenario_id}')
         self.dirs.append(Directory(path="/data/test-bucket", 
files={"test-file": "preloaded data\n"}))
 
diff --git a/extensions/gcp/tests/features/environment.py 
b/extensions/gcp/tests/features/environment.py
index d9f4bcb30..057b87c71 100644
--- a/extensions/gcp/tests/features/environment.py
+++ b/extensions/gcp/tests/features/environment.py
@@ -12,10 +12,17 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import docker
+from containers.fake_gcs_server_container import FakeGcsServerContainer
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
 
 
+def before_all(context):
+    docker.from_env().images.pull(FakeGcsServerContainer.IMAGE)
+
+
 def before_scenario(context, scenario):
     common_before_scenario(context, scenario)
 
diff --git 
a/extensions/grafana-loki/tests/features/containers/grafana_loki_container.py 
b/extensions/grafana-loki/tests/features/containers/grafana_loki_container.py
index 9e907e855..d626468f7 100644
--- 
a/extensions/grafana-loki/tests/features/containers/grafana_loki_container.py
+++ 
b/extensions/grafana-loki/tests/features/containers/grafana_loki_container.py
@@ -30,8 +30,10 @@ class GrafanaLokiOptions:
 
 
 class GrafanaLokiContainer(LinuxContainer):
+    IMAGE = "grafana/loki:3.2.1"
+
     def __init__(self, test_context: MinifiTestContext, options: 
GrafanaLokiOptions):
-        super().__init__("grafana/loki:3.2.1", 
f"grafana-loki-server-{test_context.scenario_id}", test_context.network)
+        super().__init__(GrafanaLokiContainer.IMAGE, 
f"grafana-loki-server-{test_context.scenario_id}", test_context.network)
         extra_ssl_settings = ""
         if options.enable_ssl:
             grafana_loki_cert, grafana_loki_key = 
make_server_cert(self.container_name, test_context.root_ca_cert, 
test_context.root_ca_key)
diff --git a/extensions/grafana-loki/tests/features/environment.py 
b/extensions/grafana-loki/tests/features/environment.py
index 4e25390ed..1318d2f5d 100644
--- a/extensions/grafana-loki/tests/features/environment.py
+++ b/extensions/grafana-loki/tests/features/environment.py
@@ -12,6 +12,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import docker
+from containers.grafana_loki_container import GrafanaLokiContainer
 from pathlib import Path
 from minifi_behave.containers.docker_image_builder import DockerImageBuilder
 from minifi_behave.core.hooks import common_before_scenario
@@ -39,6 +42,7 @@ COPY check_log_lines_on_grafana.py 
/scripts/check_log_lines_on_grafana.py"""
         build_context_path=str(Path(__file__).resolve().parent / "resources" / 
"reverse-proxy")
     )
     reverse_proxy_builder.build()
+    docker.from_env().images.pull(GrafanaLokiContainer.IMAGE)
 
 
 def before_scenario(context, scenario):
diff --git 
a/extensions/kafka/tests/features/containers/kafka_server_container.py 
b/extensions/kafka/tests/features/containers/kafka_server_container.py
index 350a05478..d4434cd04 100644
--- a/extensions/kafka/tests/features/containers/kafka_server_container.py
+++ b/extensions/kafka/tests/features/containers/kafka_server_container.py
@@ -27,8 +27,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class KafkaServer(LinuxContainer):
+    IMAGE = "apache/kafka:4.1.0"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__("apache/kafka:4.1.0", 
f"kafka-server-{test_context.scenario_id}", test_context.network)
+        super().__init__(KafkaServer.IMAGE, 
f"kafka-server-{test_context.scenario_id}", test_context.network)
         self.environment.append("KAFKA_NODE_ID=1")
         self.environment.append("KAFKA_PROCESS_ROLES=controller,broker")
         self.environment.append("KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT")
diff --git a/extensions/kafka/tests/features/environment.py 
b/extensions/kafka/tests/features/environment.py
index 4d9f7006b..d7ee24d67 100644
--- a/extensions/kafka/tests/features/environment.py
+++ b/extensions/kafka/tests/features/environment.py
@@ -12,6 +12,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import docker
+from containers.kafka_server_container import KafkaServer
 from minifi_behave.containers.docker_image_builder import DockerImageBuilder
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
@@ -26,6 +29,7 @@ def before_all(context):
         dockerfile_content=dockerfile
     )
     builder.build()
+    docker.from_env().images.pull(KafkaServer.IMAGE)
 
 
 def before_scenario(context, scenario):
diff --git a/extensions/mqtt/tests/features/containers/mqtt_broker_container.py 
b/extensions/mqtt/tests/features/containers/mqtt_broker_container.py
index 2ed54d1ba..8d38663a5 100644
--- a/extensions/mqtt/tests/features/containers/mqtt_broker_container.py
+++ b/extensions/mqtt/tests/features/containers/mqtt_broker_container.py
@@ -25,12 +25,14 @@ from docker.errors import ContainerError
 
 
 class MqttBrokerContainer(LinuxContainer):
+    IMAGE = "eclipse-mosquitto:2.1.1-alpine"
+
     def __init__(self, test_context: MinifiTestContext):
         dockerfile = dedent("""\
             FROM {base_image}
             RUN echo 'log_dest stderr' >> /mosquitto-no-auth.conf
             CMD ["/usr/sbin/mosquitto", "--verbose", "--config-file", 
"/mosquitto-no-auth.conf"]
-            """.format(base_image='eclipse-mosquitto:2.1.1-alpine'))
+            """.format(base_image=MqttBrokerContainer.IMAGE))
 
         builder = DockerImageBuilder(
             image_tag="minifi-mqtt-broker:latest",
diff --git a/extensions/mqtt/tests/features/environment.py 
b/extensions/mqtt/tests/features/environment.py
index a98f91b7d..6cabeecf0 100644
--- a/extensions/mqtt/tests/features/environment.py
+++ b/extensions/mqtt/tests/features/environment.py
@@ -13,6 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import docker
+from containers.mqtt_broker_container import MqttBrokerContainer
 from pathlib import Path
 from minifi_behave.containers.docker_image_builder import DockerImageBuilder
 from minifi_behave.core.hooks import common_before_scenario
@@ -34,6 +36,7 @@ COPY publish_mqtt_message.py 
/scripts/publish_mqtt_message.py"""
         files_on_context={"publish_mqtt_message.py": check_log_lines_content}
     )
     mqtt_helper_builder.build()
+    docker.from_env().images.pull(MqttBrokerContainer.IMAGE)
 
 
 def before_scenario(context, scenario):
diff --git 
a/extensions/opc/tests/features/containers/opc_ua_server_container.py 
b/extensions/opc/tests/features/containers/opc_ua_server_container.py
index 5894bc0cd..5bb8a233b 100644
--- a/extensions/opc/tests/features/containers/opc_ua_server_container.py
+++ b/extensions/opc/tests/features/containers/opc_ua_server_container.py
@@ -20,10 +20,10 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class OPCUAServerContainer(LinuxContainer):
-    OPC_SERVER_IMAGE = "lordgamez/open62541:1.5.2"
+    IMAGE = "lordgamez/open62541:1.5.2"
 
     def __init__(self, test_context: MinifiTestContext, command: 
Optional[List[str]] = None):
-        super().__init__(self.OPC_SERVER_IMAGE, 
f"opcua-server-{test_context.scenario_id}", test_context.network, 
command=command)
+        super().__init__(OPCUAServerContainer.IMAGE, 
f"opcua-server-{test_context.scenario_id}", test_context.network, 
command=command)
 
     def deploy(self, context: MinifiTestContext | None) -> bool:
         super().deploy(context)
diff --git a/extensions/opc/tests/features/environment.py 
b/extensions/opc/tests/features/environment.py
index 7e9fcda28..76f86f8b8 100644
--- a/extensions/opc/tests/features/environment.py
+++ b/extensions/opc/tests/features/environment.py
@@ -14,11 +14,16 @@
 # limitations under the License.
 
 import os
-
+import docker
+from containers.opc_ua_server_container import OPCUAServerContainer
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
 
 
+def before_all(context):
+    docker.from_env().images.pull(OPCUAServerContainer.IMAGE)
+
+
 def before_scenario(context, scenario):
     common_before_scenario(context, scenario)
     context.resource_dir = os.path.join(os.path.dirname(__file__), 'resources')
diff --git a/extensions/opc/tests/features/steps/steps.py 
b/extensions/opc/tests/features/steps/steps.py
index 0dcd61c89..58f2a1ea1 100644
--- a/extensions/opc/tests/features/steps/steps.py
+++ b/extensions/opc/tests/features/steps/steps.py
@@ -79,8 +79,8 @@ def _copy_file_from_docker_image(image_name: str, file_path: 
str, output_path: s
 def place_opcua_certificate_files_in_minifi_container(context: 
MinifiTestContext, directory: str, container_name: str):
     if not hasattr(context, "opcua_cert_temp_dir"):
         context.opcua_cert_temp_dir = tempfile.TemporaryDirectory()
-        _copy_file_from_docker_image(OPCUAServerContainer.OPC_SERVER_IMAGE, 
"/opt/open62541/pki/created/server_cert.der", 
os.path.join(context.opcua_cert_temp_dir.name, "server_cert.der"))
-        _copy_file_from_docker_image(OPCUAServerContainer.OPC_SERVER_IMAGE, 
"/opt/open62541/pki/created/server_key.der", 
os.path.join(context.opcua_cert_temp_dir.name, "server_key.der"))
+        _copy_file_from_docker_image(OPCUAServerContainer.IMAGE, 
"/opt/open62541/pki/created/server_cert.der", 
os.path.join(context.opcua_cert_temp_dir.name, "server_cert.der"))
+        _copy_file_from_docker_image(OPCUAServerContainer.IMAGE, 
"/opt/open62541/pki/created/server_key.der", 
os.path.join(context.opcua_cert_temp_dir.name, "server_key.der"))
 
     
context.get_or_create_minifi_container(container_name).add_host_file(os.path.join(context.opcua_cert_temp_dir.name,
 "server_cert.der"), os.path.join(directory, "opcua_client_cert.der"))
     
context.get_or_create_minifi_container(container_name).add_host_file(os.path.join(context.opcua_cert_temp_dir.name,
 "server_key.der"), os.path.join(directory, "opcua_client_key.der"))
diff --git 
a/extensions/prometheus/tests/features/containers/prometheus_container.py 
b/extensions/prometheus/tests/features/containers/prometheus_container.py
index 4846d9307..ee962d8eb 100644
--- a/extensions/prometheus/tests/features/containers/prometheus_container.py
+++ b/extensions/prometheus/tests/features/containers/prometheus_container.py
@@ -23,8 +23,10 @@ from minifi_behave.containers.container_linux import 
LinuxContainer
 
 
 class PrometheusContainer(LinuxContainer):
+    IMAGE = "prom/prometheus:v3.9.1"
+
     def __init__(self, test_context: MinifiTestContext, ssl: bool = False):
-        super().__init__("prom/prometheus:v3.9.1", 
f"prometheus-{test_context.scenario_id}", test_context.network)
+        super().__init__(PrometheusContainer.IMAGE, 
f"prometheus-{test_context.scenario_id}", test_context.network)
         self.scenario_id = test_context.scenario_id
         extra_ssl_settings = ""
         if ssl:
diff --git a/extensions/prometheus/tests/features/environment.py 
b/extensions/prometheus/tests/features/environment.py
index df890c1fc..c62553bdf 100644
--- a/extensions/prometheus/tests/features/environment.py
+++ b/extensions/prometheus/tests/features/environment.py
@@ -12,10 +12,12 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+import docker
 from pathlib import Path
 from minifi_behave.containers.docker_image_builder import DockerImageBuilder
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
+from containers.prometheus_container import PrometheusContainer
 
 
 def before_all(context):
@@ -33,6 +35,7 @@ def before_all(context):
         files_on_context={"prometheus_checker.py": check_log_lines_content}
     )
     prometheus_helper_builder.build()
+    docker.from_env().images.pull(PrometheusContainer.IMAGE)
 
 
 def before_scenario(context, scenario):
diff --git a/extensions/splunk/tests/features/containers/splunk_container.py 
b/extensions/splunk/tests/features/containers/splunk_container.py
index 8eb87b541..f1cb7b2f5 100644
--- a/extensions/splunk/tests/features/containers/splunk_container.py
+++ b/extensions/splunk/tests/features/containers/splunk_container.py
@@ -23,8 +23,10 @@ from minifi_behave.core.ssl_utils import make_server_cert, 
dump_cert, dump_key
 
 
 class SplunkContainer(LinuxContainer):
+    IMAGE = "splunk/splunk:9.2.1-patch2"
+
     def __init__(self, test_context: MinifiTestContext):
-        super().__init__("splunk/splunk:9.2.1-patch2", 
f"splunk-{test_context.scenario_id}", test_context.network)
+        super().__init__(SplunkContainer.IMAGE, 
f"splunk-{test_context.scenario_id}", test_context.network)
         self.user = None
 
         self.environment = ["SPLUNK_LICENSE_URI=Free",
diff --git a/extensions/splunk/tests/features/environment.py 
b/extensions/splunk/tests/features/environment.py
index ca4d81cfb..782a88340 100644
--- a/extensions/splunk/tests/features/environment.py
+++ b/extensions/splunk/tests/features/environment.py
@@ -14,7 +14,9 @@
 # limitations under the License.
 
 import platform
+import docker
 
+from containers.splunk_container import SplunkContainer
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
 
@@ -25,6 +27,8 @@ def before_feature(context, feature):
         if not is_x86:
             feature.skip("This feature is only x86/x64 compatible")
 
+    docker.from_env().images.pull(SplunkContainer.IMAGE)
+
 
 def before_scenario(context, scenario):
     common_before_scenario(context, scenario)
diff --git 
a/extensions/sql/tests/features/containers/postgress_server_container.py 
b/extensions/sql/tests/features/containers/postgress_server_container.py
index b84aef130..9a9ec6f6f 100644
--- a/extensions/sql/tests/features/containers/postgress_server_container.py
+++ b/extensions/sql/tests/features/containers/postgress_server_container.py
@@ -24,6 +24,8 @@ from minifi_behave.core.minifi_test_context import 
MinifiTestContext
 
 
 class PostgresContainer(LinuxContainer):
+    IMAGE = "postgres:17.4"
+
     def __init__(self, context):
         dockerfile = dedent("""\
                 FROM {base_image}
@@ -39,7 +41,7 @@ class PostgresContainer(LinuxContainer):
                     echo "    INSERT INTO test_table2 (int_col, 
\\"tExT_Col\\") VALUES (5, 'ApPlE');" >> 
/docker-entrypoint-initdb.d/init-user-db.sh && \
                     echo "    INSERT INTO test_table2 (int_col, 
\\"tExT_Col\\") VALUES (6, 'BaNaNa');" >> 
/docker-entrypoint-initdb.d/init-user-db.sh && \
                     echo "EOSQL" >> /docker-entrypoint-initdb.d/init-user-db.sh
-                """.format(base_image='postgres:17.4'))
+                """.format(base_image=PostgresContainer.IMAGE))
         builder = DockerImageBuilder(
             image_tag="minifi-postgres-server:latest",
             dockerfile_content=dockerfile
diff --git a/extensions/sql/tests/features/environment.py 
b/extensions/sql/tests/features/environment.py
index ad369afc0..5b5cf8151 100644
--- a/extensions/sql/tests/features/environment.py
+++ b/extensions/sql/tests/features/environment.py
@@ -16,8 +16,10 @@
 #
 
 import os
+import docker
 from textwrap import dedent
 
+from containers.postgress_server_container import PostgresContainer
 from minifi_behave.containers.docker_image_builder import DockerImageBuilder
 from minifi_behave.core.hooks import common_before_scenario
 from minifi_behave.core.hooks import common_after_scenario
@@ -78,6 +80,7 @@ def before_all(context):
         dockerfile_content=dockerfile
     )
     builder.build()
+    docker.from_env().images.pull(PostgresContainer.IMAGE)
 
 
 def before_scenario(context, scenario):

Reply via email to