From 6a5b571f36e1b0dbb0d40cdb5c23b72701d830ec Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Mon, 24 Aug 2026 10:51:39 +0100 Subject: [PATCH 01/10] chore: pin openai/otel and align schema metadata to unblock rhoai-3.3 CI CI on rhoai-3.3 started failing after unpinned tools drifted: openai 3 dropped httpx, opentelemetry-sdk 1.43 added processor _metrics, and Alembic 1.19 compares named CHECK constraints. Pin the drifting deps and match the 3.5 schema/processor one-liners so unrelated CVE PRs can merge. Co-authored-by: Cursor --- mlflow/store/tracking/dbmodels/models.py | 4 +++- mlflow/tracing/processor/inference_table.py | 2 +- requirements/constraints.txt | 5 +++++ requirements/doc-requirements.txt | 3 ++- requirements/extra-ml-requirements.txt | 4 +++- requirements/test-requirements.txt | 4 +++- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/mlflow/store/tracking/dbmodels/models.py b/mlflow/store/tracking/dbmodels/models.py index 917e2d8137f6c..bab2e14223c49 100644 --- a/mlflow/store/tracking/dbmodels/models.py +++ b/mlflow/store/tracking/dbmodels/models.py @@ -233,7 +233,9 @@ class SqlRun(Base): __table_args__ = ( CheckConstraint(source_type.in_(SourceTypes), name="source_type"), - CheckConstraint(status.in_(RunStatusTypes), name="status"), + # Historical migrations generate this SQLite CHECK constraint without a stable name. + # Keep ORM metadata aligned with that schema so Alembic autogenerate sees no drift. + CheckConstraint(status.in_(RunStatusTypes)), CheckConstraint( lifecycle_stage.in_(LifecycleStage.view_type_to_stages(ViewType.ALL)), name="runs_lifecycle_stage", diff --git a/mlflow/tracing/processor/inference_table.py b/mlflow/tracing/processor/inference_table.py index 1d52245dcc2f8..ce024a5f54688 100644 --- a/mlflow/tracing/processor/inference_table.py +++ b/mlflow/tracing/processor/inference_table.py @@ -51,7 +51,7 @@ class InferenceTableSpanProcessor(SimpleSpanProcessor): """ def __init__(self, span_exporter: SpanExporter): - self.span_exporter = span_exporter + super().__init__(span_exporter) self._trace_manager = InMemoryTraceManager.get_instance() def on_start(self, span: OTelSpan, parent_context: Context | None = None): diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 9b44c5990ddb1..b4fa06686bd5c 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -30,3 +30,8 @@ packaging<26 # databricks-sdk 0.101.0 changed OIDC resolution to always fetch host metadata, # causing tracing tests to make real HTTP calls even with dummy hosts. databricks-sdk<0.101.0 +# opentelemetry-sdk 1.43.0 added processor _metrics and changed OTLP HTTP exporter +# error logging, which breaks InferenceTableSpanProcessor tests and +# test_error_logging_spans on rhoai-3.3. +opentelemetry-api<1.43 +opentelemetry-sdk<1.43 diff --git a/requirements/doc-requirements.txt b/requirements/doc-requirements.txt index 2b92e68016abe..d0e21484955e5 100644 --- a/requirements/doc-requirements.txt +++ b/requirements/doc-requirements.txt @@ -21,7 +21,8 @@ Flask-WTF<2 # required for testing polars dataset integration polars>=1 # required for the genai evaluation example -openai +# openai 3.0.0 switched the default HTTP client to HTTPX2 and stopped installing httpx. +openai<3 # required for the haystack # haystack-ai 3.0.0 removed OpenTelemetryTracer used by mlflow.haystack haystack-ai>=2.0.0,<3 diff --git a/requirements/extra-ml-requirements.txt b/requirements/extra-ml-requirements.txt index 362d28931ed98..740d1ada08f07 100644 --- a/requirements/extra-ml-requirements.txt +++ b/requirements/extra-ml-requirements.txt @@ -55,7 +55,9 @@ librosa ffmpeg accelerate # Required by mlflow.openai -openai +# openai 3.0.0 switched the default HTTP client to HTTPX2 and stopped installing httpx, +# which breaks genai tests that mock httpx and pyfunc lock tests that assert httpx==. +openai<3 tiktoken tenacity # Required by mlflow.llama_index diff --git a/requirements/test-requirements.txt b/requirements/test-requirements.txt index 4fb7ee399b521..f5fbb4f5c61a7 100644 --- a/requirements/test-requirements.txt +++ b/requirements/test-requirements.txt @@ -23,7 +23,9 @@ tiktoken # Required by progress bar tests tqdm[notebook] # Required for LLM eval in `mlflow.evaluate` -openai +# openai 3.0.0 switched the default HTTP client to HTTPX2 and stopped installing httpx, +# which breaks genai tests that mock httpx and pyfunc lock tests that assert httpx==. +openai<3 # Required for showing pytest stats psutil pyspark<4.1.0 From b84d9d87e4eba39aa50f990f057c078fea9c1e6f Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Mon, 24 Aug 2026 13:49:03 +0100 Subject: [PATCH 02/10] test: stop coupling rhoai-3.3 CI to openai httpx and otel exporter logs The pyfunc lock tests resolved unconstrained openai from PyPI (3.x uses httpx2, not httpx). The otel error-logging test asserted a logger call shape that no longer fires. Accept httpx or httpx2, and assert stored traces instead of exporter internals. Co-authored-by: Cursor --- ...test_model_export_with_class_and_artifacts.py | 9 ++++++--- tests/tracing/test_otel_logging.py | 16 +++++----------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/tests/pyfunc/test_model_export_with_class_and_artifacts.py b/tests/pyfunc/test_model_export_with_class_and_artifacts.py index afed648028155..743e3179b1d0f 100644 --- a/tests/pyfunc/test_model_export_with_class_and_artifacts.py +++ b/tests/pyfunc/test_model_export_with_class_and_artifacts.py @@ -2637,7 +2637,8 @@ def test_lock_model_requirements_pip_requirements(monkeypatch: pytest.MonkeyPatc assert "# Locked requirements" in contents assert "mlflow==" in contents assert "openai==" in contents - assert "httpx==" in contents + # openai<3 pulls httpx; openai 3+ pulls httpx2 instead. + assert "httpx==" in contents or "httpx2==" in contents def test_lock_model_requirements_extra_pip_requirements( @@ -2655,7 +2656,8 @@ def test_lock_model_requirements_extra_pip_requirements( assert "# Locked requirements" in contents assert "mlflow==" in contents assert "openai==" in contents - assert "httpx==" in contents + # openai<3 pulls httpx; openai 3+ pulls httpx2 instead. + assert "httpx==" in contents or "httpx2==" in contents def test_lock_model_requirements_constraints(monkeypatch: pytest.MonkeyPatch, tmp_path: Path): @@ -2673,7 +2675,8 @@ def test_lock_model_requirements_constraints(monkeypatch: pytest.MonkeyPatch, tm assert "# Locked requirements" in contents assert "mlflow==" in contents assert "openai==1.82.0" in contents - assert "httpx==" in contents + # openai 1.82.0 still depends on httpx; keep the httpx2 fallback for resolver drift. + assert "httpx==" in contents or "httpx2==" in contents @pytest.mark.parametrize( diff --git a/tests/tracing/test_otel_logging.py b/tests/tracing/test_otel_logging.py index 7fbd2d082523e..23a4610cdc838 100644 --- a/tests/tracing/test_otel_logging.py +++ b/tests/tracing/test_otel_logging.py @@ -604,23 +604,17 @@ def mock_log_spans(self, *args, **kwargs): else: return original_log_spans(self, *args, **kwargs) - with ( - mock.patch.object(SqlAlchemyStore, "log_spans", mock_log_spans), - mock.patch( - "opentelemetry.exporter.otlp.proto.http.trace_exporter._logger.error" - ) as mock_error, - ): + with mock.patch.object(SqlAlchemyStore, "log_spans", mock_log_spans): for _ in range(2): with tracer.start_as_current_span("batch-test-span-0"): pass span_processor.force_flush() - assert any( - "Failed to log OpenTelemetry spans" in error[0][2] - for error in mock_error.call_args_list - ) - assert any("test_error" in error[0][2] for error in mock_error.call_args_list) + # The OTLP HTTP exporter's logger name/call shape has drifted across SDK + # releases, so do not assert on exporter log internals. The important + # behavior is that the first failed batch does not prevent the second + # batch from being stored. traces = mlflow.search_traces( experiment_ids=[experiment_id], include_spans=False, return_type="list" From e90c5eb60d88131cc68bfd408f54c703316c6bea Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Mon, 31 Aug 2026 11:41:17 +0100 Subject: [PATCH 03/10] test: address Copilot review on httpx pin and otel error logs Keep the openai==1.82.0 lock test asserting httpx, and restore an ERROR-level caplog check so a failed span export cannot be silently swallowed. Co-authored-by: Cursor --- .../test_model_export_with_class_and_artifacts.py | 3 +-- tests/tracing/test_otel_logging.py | 15 +++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/pyfunc/test_model_export_with_class_and_artifacts.py b/tests/pyfunc/test_model_export_with_class_and_artifacts.py index 743e3179b1d0f..57eea05f1bb1a 100644 --- a/tests/pyfunc/test_model_export_with_class_and_artifacts.py +++ b/tests/pyfunc/test_model_export_with_class_and_artifacts.py @@ -2675,8 +2675,7 @@ def test_lock_model_requirements_constraints(monkeypatch: pytest.MonkeyPatch, tm assert "# Locked requirements" in contents assert "mlflow==" in contents assert "openai==1.82.0" in contents - # openai 1.82.0 still depends on httpx; keep the httpx2 fallback for resolver drift. - assert "httpx==" in contents or "httpx2==" in contents + assert "httpx==" in contents @pytest.mark.parametrize( diff --git a/tests/tracing/test_otel_logging.py b/tests/tracing/test_otel_logging.py index 23a4610cdc838..85b22f238c8f3 100644 --- a/tests/tracing/test_otel_logging.py +++ b/tests/tracing/test_otel_logging.py @@ -5,6 +5,7 @@ when using OpenTelemetry clients to send spans to MLflow's OTel endpoint. """ +import logging import shutil import time from pathlib import Path @@ -569,7 +570,7 @@ def test_mixed_trace_spans_in_single_request(mlflow_server: str): assert span_counts == [2, 1, 2] -def test_error_logging_spans(mlflow_server: str): +def test_error_logging_spans(mlflow_server: str, caplog: pytest.LogCaptureFixture): mlflow.set_tracking_uri(mlflow_server) experiment = mlflow.set_experiment("otel-error-test") experiment_id = experiment.experiment_id @@ -604,17 +605,19 @@ def mock_log_spans(self, *args, **kwargs): else: return original_log_spans(self, *args, **kwargs) - with mock.patch.object(SqlAlchemyStore, "log_spans", mock_log_spans): + # Use caplog instead of mocking the OTLP exporter logger: its name and + # Logger.error call shape have drifted across OpenTelemetry SDK releases. + with ( + mock.patch.object(SqlAlchemyStore, "log_spans", mock_log_spans), + caplog.at_level(logging.ERROR), + ): for _ in range(2): with tracer.start_as_current_span("batch-test-span-0"): pass span_processor.force_flush() - # The OTLP HTTP exporter's logger name/call shape has drifted across SDK - # releases, so do not assert on exporter log internals. The important - # behavior is that the first failed batch does not prevent the second - # batch from being stored. + assert any(record.levelno == logging.ERROR for record in caplog.records) traces = mlflow.search_traces( experiment_ids=[experiment_id], include_spans=False, return_type="list" From b97e25fa73eb70b17086be3a27f61e5163f0d7d9 Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Wed, 9 Sep 2026 11:26:43 +0100 Subject: [PATCH 04/10] ci: backport R docs build fix to rhoai-3.3 --- mlflow/R/mlflow/Dockerfile.dev | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mlflow/R/mlflow/Dockerfile.dev b/mlflow/R/mlflow/Dockerfile.dev index d673f73f4741f..7d7de1a6408c0 100644 --- a/mlflow/R/mlflow/Dockerfile.dev +++ b/mlflow/R/mlflow/Dockerfile.dev @@ -1,9 +1,8 @@ -# Our internal Jenkins job can't build an image from rocker/r-ver:>=4.2.2 (which is based on Ubuntu 22.04). -FROM rocker/r-ver:4.2.1 +FROM rocker/r-ver:4.4.2 WORKDIR /mlflow/mlflow/R/mlflow RUN apt-get update -y -RUN apt-get install lsb-release git wget libxml2-dev libgit2-dev -y +RUN apt-get install lsb-release git wget libxml2-dev libgit2-dev libcurl4-openssl-dev libuv1 -y # Install miniforge RUN wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh -O ~/miniforge.sh From 79f54105f6c7cbae090da9c8c9fd06bb66f38f3f Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Wed, 9 Sep 2026 13:45:15 +0100 Subject: [PATCH 05/10] ci: tighten rhoai-3.3 CI compatibility checks --- .github/workflows/examples.yml | 6 +++--- requirements/constraints.txt | 6 +++--- tests/tracing/test_otel_logging.py | 5 ++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index ae068cd0680e0..021a0c74ebfc2 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -123,9 +123,9 @@ jobs: run: | REPO="${{ github.repository }}" PR_NUMBER="${{ github.event.pull_request.number }}" - CHANGED_FILES=$(python dev/list_changed_files.py --repository $REPO --pr-num $PR_NUMBER | grep "Dockerfile\|\.dockerignore" || true); - DOCKER_CHANGED=$([[ ! -z "$CHANGED_FILES" ]] && echo "true" || echo "false") - echo -e "CHANGED_FILES:\nCHANGED_FILES" + CHANGED_FILES=$(python dev/list_changed_files.py --repository $REPO --pr-num $PR_NUMBER | grep -E '^(Dockerfile|\.dockerignore)$' || true) + DOCKER_CHANGED=$([[ -n "$CHANGED_FILES" ]] && echo "true" || echo "false") + echo -e "CHANGED_FILES:\n$CHANGED_FILES" echo "DOCKER_CHANGED: $DOCKER_CHANGED" echo "docker_changed=$DOCKER_CHANGED" >> $GITHUB_OUTPUT diff --git a/requirements/constraints.txt b/requirements/constraints.txt index b4fa06686bd5c..a65873bb0afd1 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -30,8 +30,8 @@ packaging<26 # databricks-sdk 0.101.0 changed OIDC resolution to always fetch host metadata, # causing tracing tests to make real HTTP calls even with dummy hosts. databricks-sdk<0.101.0 -# opentelemetry-sdk 1.43.0 added processor _metrics and changed OTLP HTTP exporter -# error logging, which breaks InferenceTableSpanProcessor tests and -# test_error_logging_spans on rhoai-3.3. +# Keep rhoai-3.3 CI on the last validated OpenTelemetry 1.42 release line. +# The processor and logging tests below support that line without depending on +# private exporter logger call shapes; this cap prevents further code-freeze drift. opentelemetry-api<1.43 opentelemetry-sdk<1.43 diff --git a/tests/tracing/test_otel_logging.py b/tests/tracing/test_otel_logging.py index 85b22f238c8f3..a134af87aacb1 100644 --- a/tests/tracing/test_otel_logging.py +++ b/tests/tracing/test_otel_logging.py @@ -617,7 +617,10 @@ def mock_log_spans(self, *args, **kwargs): span_processor.force_flush() - assert any(record.levelno == logging.ERROR for record in caplog.records) + assert call_count["count"] == 1 + assert any( + "Failed to export span batch" in record.getMessage() for record in caplog.records + ) traces = mlflow.search_traces( experiment_ids=[experiment_id], include_spans=False, return_type="list" From f461b89b9a7e7b4b4cc543c02b70c461c7110341 Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Wed, 9 Sep 2026 13:47:00 +0100 Subject: [PATCH 06/10] docs: clarify CI dependency pin rationale --- requirements/doc-requirements.txt | 2 +- requirements/extra-ml-requirements.txt | 4 ++-- requirements/test-requirements.txt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/doc-requirements.txt b/requirements/doc-requirements.txt index d0e21484955e5..08895983ec868 100644 --- a/requirements/doc-requirements.txt +++ b/requirements/doc-requirements.txt @@ -21,7 +21,7 @@ Flask-WTF<2 # required for testing polars dataset integration polars>=1 # required for the genai evaluation example -# openai 3.0.0 switched the default HTTP client to HTTPX2 and stopped installing httpx. +# rhoai-3.3's examples and integration code target OpenAI's legacy HTTPX client. openai<3 # required for the haystack # haystack-ai 3.0.0 removed OpenTelemetryTracer used by mlflow.haystack diff --git a/requirements/extra-ml-requirements.txt b/requirements/extra-ml-requirements.txt index 740d1ada08f07..084a368e7ebfb 100644 --- a/requirements/extra-ml-requirements.txt +++ b/requirements/extra-ml-requirements.txt @@ -55,8 +55,8 @@ librosa ffmpeg accelerate # Required by mlflow.openai -# openai 3.0.0 switched the default HTTP client to HTTPX2 and stopped installing httpx, -# which breaks genai tests that mock httpx and pyfunc lock tests that assert httpx==. +# OpenAI 3 switched to HTTPX2, while rhoai-3.3's integration and mocks target +# the legacy HTTPX client. Keep this maintenance branch on the compatible major. openai<3 tiktoken tenacity diff --git a/requirements/test-requirements.txt b/requirements/test-requirements.txt index f5fbb4f5c61a7..62b9e206302c8 100644 --- a/requirements/test-requirements.txt +++ b/requirements/test-requirements.txt @@ -23,8 +23,8 @@ tiktoken # Required by progress bar tests tqdm[notebook] # Required for LLM eval in `mlflow.evaluate` -# openai 3.0.0 switched the default HTTP client to HTTPX2 and stopped installing httpx, -# which breaks genai tests that mock httpx and pyfunc lock tests that assert httpx==. +# OpenAI 3 switched to HTTPX2, while rhoai-3.3's integration and mocks target +# the legacy HTTPX client. Keep this maintenance branch on the compatible major. openai<3 # Required for showing pytest stats psutil From f78249948d2f24c9eb640108f3a224aaa8e060f1 Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Wed, 9 Sep 2026 14:15:55 +0100 Subject: [PATCH 07/10] ci: stabilize rhoai-3.3 example dependencies --- .github/workflows/examples.yml | 1 + requirements/extra-ml-requirements.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 021a0c74ebfc2..2d24e7868720a 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -38,6 +38,7 @@ env: MLFLOW_HOME: ${{ github.workspace }} MLFLOW_CONDA_HOME: /usr/share/miniconda PIP_EXTRA_INDEX_URL: https://download.pytorch.org/whl/cpu + PIP_CONSTRAINT: ${{ github.workspace }}/requirements/constraints.txt PYTHONFAULTHANDLER: "1" jobs: diff --git a/requirements/extra-ml-requirements.txt b/requirements/extra-ml-requirements.txt index 084a368e7ebfb..088157e7cf71f 100644 --- a/requirements/extra-ml-requirements.txt +++ b/requirements/extra-ml-requirements.txt @@ -6,6 +6,7 @@ spacy>=3.3.0,<3.8 # Required by mlflow.tensorflow tensorflow>=2.10.0; platform_system!="Darwin" or platform_machine!="arm64" tensorflow-macos>=2.10.0; platform_system=="Darwin" and platform_machine=="arm64" +tensorboard # Required by mlflow.pytorch torch>=1.11.0 torchvision>=0.12.0 From a4636322230fb8b198aaaa02debd0f76e1c284d4 Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Wed, 9 Sep 2026 14:45:24 +0100 Subject: [PATCH 08/10] fix: support sentence-transformers 5.4 inputs Backport of upstream MLflow #23108 for the rhoai-3.3 CI dependency set. --- mlflow/sentence_transformers/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mlflow/sentence_transformers/__init__.py b/mlflow/sentence_transformers/__init__.py index 099fdbacdb61b..82ac5b8c4c866 100644 --- a/mlflow/sentence_transformers/__init__.py +++ b/mlflow/sentence_transformers/__init__.py @@ -524,9 +524,13 @@ def predict(self, sentences, params: dict[str, Any] | None = None): # Wrap the output to OpenAI format only when the input is dict `{"input": ... }` if self.task and list(sentences.columns)[0] == _LLM_V1_EMBEDDING_INPUT_KEY: convert_output_to_llm_v1_format = True - sentences = sentences.iloc[:, 0] - if type(sentences[0]) == list: + # `model.encode` rejects `pd.Series`/`DataFrame` since sentence-transformers v5.4 + # (https://github.com/huggingface/sentence-transformers/pull/3554) + sentences = sentences.iloc[:, 0].tolist() + if sentences and type(sentences[0]) == list: sentences = sentences[0] + elif type(sentences) == pd.Series: + sentences = sentences.tolist() # The encode API has additional parameters that we can add as kwargs. # See https://www.sbert.net/docs/package_reference/SentenceTransformer.html#sentence_transformers.SentenceTransformer.encode From e0927433287afa495fd709e8f3846581832a1c5d Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Thu, 10 Sep 2026 09:43:44 +0100 Subject: [PATCH 09/10] test: stabilize Windows artifact server startup --- tests/tracking/test_mlflow_artifacts.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/tracking/test_mlflow_artifacts.py b/tests/tracking/test_mlflow_artifacts.py index 99fcf54ccc446..09adbffdc29dc 100644 --- a/tests/tracking/test_mlflow_artifacts.py +++ b/tests/tracking/test_mlflow_artifacts.py @@ -17,6 +17,7 @@ MLFLOW_WORKSPACE, MLFLOW_WORKSPACE_STORE_URI, ) +from mlflow.store.tracking.sqlalchemy_store import SqlAlchemyStore from mlflow.utils.os import is_windows from tests.helper_functions import LOCALHOST, get_safe_port @@ -68,6 +69,9 @@ def artifacts_server(): artifacts_destination = os.path.join(tmpdir, "mlartifacts") url = f"http://{LOCALHOST}:{port}" default_artifact_root = f"{url}/api/2.0/mlflow-artifacts/artifacts" + # Initialize the database before launching the server process + s = SqlAlchemyStore(backend_store_uri, default_artifact_root) + s.engine.dispose() process = _launch_server( LOCALHOST, port, From 284ad5a8bc78d86ee68812148fc31aa084823406 Mon Sep 17 00:00:00 2001 From: Neri Carcasci Date: Tue, 15 Sep 2026 13:58:22 +0100 Subject: [PATCH 10/10] test: harden CI service startup Use pinned MinIO images from Quay for the artifact example and backport the upstream auth-server readiness polling fix. Signed-off-by: Neri Carcasci --- examples/mlflow_artifacts/docker-compose.yml | 4 ++-- tests/server/auth/test_auth.py | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/examples/mlflow_artifacts/docker-compose.yml b/examples/mlflow_artifacts/docker-compose.yml index a8976b60eb1d9..2a09d4f566c08 100644 --- a/examples/mlflow_artifacts/docker-compose.yml +++ b/examples/mlflow_artifacts/docker-compose.yml @@ -1,7 +1,7 @@ version: "3" services: minio: - image: minio/minio + image: quay.io/minio/minio:RELEASE.2024-12-18T13-15-44Z expose: - "9000" ports: @@ -20,7 +20,7 @@ services: command: server /data --console-address ":9001" minio-create-bucket: - image: minio/mc + image: quay.io/minio/mc:RELEASE.2024-11-21T17-21-54Z depends_on: minio: condition: service_healthy diff --git a/tests/server/auth/test_auth.py b/tests/server/auth/test_auth.py index 618dd828433e0..f894c84a5e00f 100644 --- a/tests/server/auth/test_auth.py +++ b/tests/server/auth/test_auth.py @@ -363,15 +363,15 @@ def test_create_and_delete_registered_model(client, monkeypatch): assert rm.name == "test_model" -def _wait(url: str): +def _wait(url: str, timeout: int = 10) -> None: t = time.time() - while time.time() - t < 5: + while time.time() - t < timeout: try: if requests.get(f"{url}/health").ok: - yield + return except requests.exceptions.ConnectionError: pass - time.sleep(1) + time.sleep(0.5) pytest.fail("Server did not start") @@ -412,8 +412,7 @@ def test_proxy_log_artifacts(monkeypatch, tmp_path): ) as prc: try: url = f"http://{host}:{port}" - for _ in _wait(url): - break + _wait(url) mlflow.set_tracking_uri(url) client = MlflowClient(url)