-
Notifications
You must be signed in to change notification settings - Fork 1.6k
MINOR: Minor misc fixes #25850
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
MINOR: Minor misc fixes #25850
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR applies small robustness and dependency-loading fixes across the ingestion framework to prevent crashes in edge cases, reduce optional-cloud dependency import issues, and correct the MLflow MLStore storage location used during ingestion.
Changes:
- Prevent
_print_execution_time_summary()from callingtabulate()with an empty execution-time summary. - Lazy-import cloud-provider Datalake clients in
_get_client()to avoid importing unused SDKs at module load time. - Use MLflow run
artifact_uri(when available) forMlStore.storage, and pass the run into_get_ml_store().
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
ingestion/src/metadata/workflow/workflow_output_handler.py |
Adds an early return to avoid tabulate() crashing when no execution-time entries exist. |
ingestion/src/metadata/ingestion/source/database/datalake/connection.py |
Moves S3/GCS/Azure client imports into provider-specific branches to avoid loading optional SDKs unnecessarily. |
ingestion/src/metadata/ingestion/source/mlmodel/mlflow/metadata.py |
Adjusts MLflow MLStore storage to prefer the run’s artifact_uri and updates method signature accordingly. |
| def _get_ml_store( # pylint: disable=arguments-differ | ||
| self, | ||
| version: ModelVersion, | ||
| run, | ||
| ) -> Optional[MlStore]: |
Copilot
AI
Feb 12, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
run is introduced as a new parameter but is left untyped. This module otherwise imports and uses MLflow entity types (e.g., RunData, ModelVersion), so adding a Run/Optional[Run] annotation would keep the API self-documenting and improve IDE/static analysis support.
🛡️ TRIVY SCAN RESULT 🛡️ Target:
|
| Package | Vulnerability ID | Severity | Installed Version | Fixed Version |
|---|---|---|---|---|
linux-libc-dev |
CVE-2024-46786 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-21946 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-22022 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-22083 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-22107 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-22121 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-37926 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-38022 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-38129 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-38361 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-38718 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-39871 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-68340 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-68349 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-68800 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-71085 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2025-71116 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-22984 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-22990 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-23001 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-23010 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-23054 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-23074 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-23084 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
linux-libc-dev |
CVE-2026-23097 | 🚨 HIGH | 6.1.159-1 | 6.1.162-1 |
pcre2 |
CVE-2022-1586 | 🔥 CRITICAL | 10.32-3.el8_6 | 10.40-1 |
pcre2 |
CVE-2022-1587 | 🔥 CRITICAL | 10.32-3.el8_6 | 10.40-1 |
pcre2 |
CVE-2019-20454 | 🚨 HIGH | 10.32-3.el8_6 | 10.34-1 |
🛡️ TRIVY SCAN RESULT 🛡️
Target: Java
Vulnerabilities (33)
| Package | Vulnerability ID | Severity | Installed Version | Fixed Version |
|---|---|---|---|---|
com.fasterxml.jackson.core:jackson-core |
CVE-2025-52999 | 🚨 HIGH | 2.12.7 | 2.15.0 |
com.fasterxml.jackson.core:jackson-core |
CVE-2025-52999 | 🚨 HIGH | 2.13.4 | 2.15.0 |
com.fasterxml.jackson.core:jackson-databind |
CVE-2022-42003 | 🚨 HIGH | 2.12.7 | 2.12.7.1, 2.13.4.2 |
com.fasterxml.jackson.core:jackson-databind |
CVE-2022-42004 | 🚨 HIGH | 2.12.7 | 2.12.7.1, 2.13.4 |
com.google.code.gson:gson |
CVE-2022-25647 | 🚨 HIGH | 2.2.4 | 2.8.9 |
com.google.protobuf:protobuf-java |
CVE-2021-22569 | 🚨 HIGH | 3.3.0 | 3.16.1, 3.18.2, 3.19.2 |
com.google.protobuf:protobuf-java |
CVE-2022-3509 | 🚨 HIGH | 3.3.0 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2022-3510 | 🚨 HIGH | 3.3.0 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2024-7254 | 🚨 HIGH | 3.3.0 | 3.25.5, 4.27.5, 4.28.2 |
com.google.protobuf:protobuf-java |
CVE-2021-22569 | 🚨 HIGH | 3.7.1 | 3.16.1, 3.18.2, 3.19.2 |
com.google.protobuf:protobuf-java |
CVE-2022-3509 | 🚨 HIGH | 3.7.1 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2022-3510 | 🚨 HIGH | 3.7.1 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2024-7254 | 🚨 HIGH | 3.7.1 | 3.25.5, 4.27.5, 4.28.2 |
com.nimbusds:nimbus-jose-jwt |
CVE-2023-52428 | 🚨 HIGH | 9.8.1 | 9.37.2 |
com.squareup.okhttp3:okhttp |
CVE-2021-0341 | 🚨 HIGH | 3.12.12 | 4.9.2 |
commons-beanutils:commons-beanutils |
CVE-2025-48734 | 🚨 HIGH | 1.9.4 | 1.11.0 |
commons-io:commons-io |
CVE-2024-47554 | 🚨 HIGH | 2.8.0 | 2.14.0 |
dnsjava:dnsjava |
CVE-2024-25638 | 🚨 HIGH | 2.1.7 | 3.6.0 |
io.netty:netty-codec-http2 |
CVE-2025-55163 | 🚨 HIGH | 4.1.96.Final | 4.2.4.Final, 4.1.124.Final |
io.netty:netty-codec-http2 |
GHSA-xpw8-rcwv-8f8p | 🚨 HIGH | 4.1.96.Final | 4.1.100.Final |
io.netty:netty-handler |
CVE-2025-24970 | 🚨 HIGH | 4.1.96.Final | 4.1.118.Final |
net.minidev:json-smart |
CVE-2021-31684 | 🚨 HIGH | 1.3.2 | 1.3.3, 2.4.4 |
net.minidev:json-smart |
CVE-2023-1370 | 🚨 HIGH | 1.3.2 | 2.4.9 |
org.apache.avro:avro |
CVE-2024-47561 | 🔥 CRITICAL | 1.7.7 | 1.11.4 |
org.apache.avro:avro |
CVE-2023-39410 | 🚨 HIGH | 1.7.7 | 1.11.3 |
org.apache.derby:derby |
CVE-2022-46337 | 🔥 CRITICAL | 10.14.2.0 | 10.14.3, 10.15.2.1, 10.16.1.2, 10.17.1.0 |
org.apache.ivy:ivy |
CVE-2022-46751 | 🚨 HIGH | 2.5.1 | 2.5.2 |
org.apache.mesos:mesos |
CVE-2018-1330 | 🚨 HIGH | 1.4.3 | 1.6.0 |
org.apache.thrift:libthrift |
CVE-2019-0205 | 🚨 HIGH | 0.12.0 | 0.13.0 |
org.apache.thrift:libthrift |
CVE-2020-13949 | 🚨 HIGH | 0.12.0 | 0.14.0 |
org.apache.zookeeper:zookeeper |
CVE-2023-44981 | 🔥 CRITICAL | 3.6.3 | 3.7.2, 3.8.3, 3.9.1 |
org.eclipse.jetty:jetty-server |
CVE-2024-13009 | 🚨 HIGH | 9.4.56.v20240826 | 9.4.57.v20241219 |
org.lz4:lz4-java |
CVE-2025-12183 | 🚨 HIGH | 1.8.0 | 1.8.1 |
🛡️ TRIVY SCAN RESULT 🛡️
Target: Node.js
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: Python
Vulnerabilities (9)
| Package | Vulnerability ID | Severity | Installed Version | Fixed Version |
|---|---|---|---|---|
apache-airflow |
CVE-2025-68438 | 🚨 HIGH | 3.1.5 | 3.1.6 |
apache-airflow |
CVE-2025-68675 | 🚨 HIGH | 3.1.5 | 3.1.6 |
cryptography |
CVE-2026-26007 | 🚨 HIGH | 42.0.8 | 46.0.5 |
jaraco.context |
CVE-2026-23949 | 🚨 HIGH | 6.0.1 | 6.1.0 |
starlette |
CVE-2025-62727 | 🚨 HIGH | 0.48.0 | 0.49.1 |
urllib3 |
CVE-2025-66418 | 🚨 HIGH | 1.26.20 | 2.6.0 |
urllib3 |
CVE-2025-66471 | 🚨 HIGH | 1.26.20 | 2.6.0 |
urllib3 |
CVE-2026-21441 | 🚨 HIGH | 1.26.20 | 2.6.3 |
wheel |
CVE-2026-24049 | 🚨 HIGH | 0.45.1 | 0.46.2 |
🛡️ TRIVY SCAN RESULT 🛡️
Target: /etc/ssl/private/ssl-cert-snakeoil.key
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/extended_sample_data.yaml
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/lineage.yaml
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/sample_data.json
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/sample_data.yaml
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/sample_data_aut.yaml
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/sample_usage.json
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/sample_usage.yaml
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /ingestion/pipelines/sample_usage_aut.yaml
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️ Target:
|
| Package | Vulnerability ID | Severity | Installed Version | Fixed Version |
|---|---|---|---|---|
libpam-modules |
CVE-2025-6020 | 🚨 HIGH | 1.5.2-6+deb12u1 | 1.5.2-6+deb12u2 |
libpam-modules-bin |
CVE-2025-6020 | 🚨 HIGH | 1.5.2-6+deb12u1 | 1.5.2-6+deb12u2 |
libpam-runtime |
CVE-2025-6020 | 🚨 HIGH | 1.5.2-6+deb12u1 | 1.5.2-6+deb12u2 |
libpam0g |
CVE-2025-6020 | 🚨 HIGH | 1.5.2-6+deb12u1 | 1.5.2-6+deb12u2 |
pcre2 |
CVE-2022-1586 | 🔥 CRITICAL | 10.32-3.el8_6 | 10.40-1 |
pcre2 |
CVE-2022-1587 | 🔥 CRITICAL | 10.32-3.el8_6 | 10.40-1 |
pcre2 |
CVE-2019-20454 | 🚨 HIGH | 10.32-3.el8_6 | 10.34-1 |
🛡️ TRIVY SCAN RESULT 🛡️
Target: Java
Vulnerabilities (33)
| Package | Vulnerability ID | Severity | Installed Version | Fixed Version |
|---|---|---|---|---|
com.fasterxml.jackson.core:jackson-core |
CVE-2025-52999 | 🚨 HIGH | 2.12.7 | 2.15.0 |
com.fasterxml.jackson.core:jackson-core |
CVE-2025-52999 | 🚨 HIGH | 2.13.4 | 2.15.0 |
com.fasterxml.jackson.core:jackson-databind |
CVE-2022-42003 | 🚨 HIGH | 2.12.7 | 2.12.7.1, 2.13.4.2 |
com.fasterxml.jackson.core:jackson-databind |
CVE-2022-42004 | 🚨 HIGH | 2.12.7 | 2.12.7.1, 2.13.4 |
com.google.code.gson:gson |
CVE-2022-25647 | 🚨 HIGH | 2.2.4 | 2.8.9 |
com.google.protobuf:protobuf-java |
CVE-2021-22569 | 🚨 HIGH | 3.3.0 | 3.16.1, 3.18.2, 3.19.2 |
com.google.protobuf:protobuf-java |
CVE-2022-3509 | 🚨 HIGH | 3.3.0 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2022-3510 | 🚨 HIGH | 3.3.0 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2024-7254 | 🚨 HIGH | 3.3.0 | 3.25.5, 4.27.5, 4.28.2 |
com.google.protobuf:protobuf-java |
CVE-2021-22569 | 🚨 HIGH | 3.7.1 | 3.16.1, 3.18.2, 3.19.2 |
com.google.protobuf:protobuf-java |
CVE-2022-3509 | 🚨 HIGH | 3.7.1 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2022-3510 | 🚨 HIGH | 3.7.1 | 3.16.3, 3.19.6, 3.20.3, 3.21.7 |
com.google.protobuf:protobuf-java |
CVE-2024-7254 | 🚨 HIGH | 3.7.1 | 3.25.5, 4.27.5, 4.28.2 |
com.nimbusds:nimbus-jose-jwt |
CVE-2023-52428 | 🚨 HIGH | 9.8.1 | 9.37.2 |
com.squareup.okhttp3:okhttp |
CVE-2021-0341 | 🚨 HIGH | 3.12.12 | 4.9.2 |
commons-beanutils:commons-beanutils |
CVE-2025-48734 | 🚨 HIGH | 1.9.4 | 1.11.0 |
commons-io:commons-io |
CVE-2024-47554 | 🚨 HIGH | 2.8.0 | 2.14.0 |
dnsjava:dnsjava |
CVE-2024-25638 | 🚨 HIGH | 2.1.7 | 3.6.0 |
io.netty:netty-codec-http2 |
CVE-2025-55163 | 🚨 HIGH | 4.1.96.Final | 4.2.4.Final, 4.1.124.Final |
io.netty:netty-codec-http2 |
GHSA-xpw8-rcwv-8f8p | 🚨 HIGH | 4.1.96.Final | 4.1.100.Final |
io.netty:netty-handler |
CVE-2025-24970 | 🚨 HIGH | 4.1.96.Final | 4.1.118.Final |
net.minidev:json-smart |
CVE-2021-31684 | 🚨 HIGH | 1.3.2 | 1.3.3, 2.4.4 |
net.minidev:json-smart |
CVE-2023-1370 | 🚨 HIGH | 1.3.2 | 2.4.9 |
org.apache.avro:avro |
CVE-2024-47561 | 🔥 CRITICAL | 1.7.7 | 1.11.4 |
org.apache.avro:avro |
CVE-2023-39410 | 🚨 HIGH | 1.7.7 | 1.11.3 |
org.apache.derby:derby |
CVE-2022-46337 | 🔥 CRITICAL | 10.14.2.0 | 10.14.3, 10.15.2.1, 10.16.1.2, 10.17.1.0 |
org.apache.ivy:ivy |
CVE-2022-46751 | 🚨 HIGH | 2.5.1 | 2.5.2 |
org.apache.mesos:mesos |
CVE-2018-1330 | 🚨 HIGH | 1.4.3 | 1.6.0 |
org.apache.thrift:libthrift |
CVE-2019-0205 | 🚨 HIGH | 0.12.0 | 0.13.0 |
org.apache.thrift:libthrift |
CVE-2020-13949 | 🚨 HIGH | 0.12.0 | 0.14.0 |
org.apache.zookeeper:zookeeper |
CVE-2023-44981 | 🔥 CRITICAL | 3.6.3 | 3.7.2, 3.8.3, 3.9.1 |
org.eclipse.jetty:jetty-server |
CVE-2024-13009 | 🚨 HIGH | 9.4.56.v20240826 | 9.4.57.v20241219 |
org.lz4:lz4-java |
CVE-2025-12183 | 🚨 HIGH | 1.8.0 | 1.8.1 |
🛡️ TRIVY SCAN RESULT 🛡️
Target: Node.js
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: Python
Vulnerabilities (19)
| Package | Vulnerability ID | Severity | Installed Version | Fixed Version |
|---|---|---|---|---|
Werkzeug |
CVE-2024-34069 | 🚨 HIGH | 2.2.3 | 3.0.3 |
aiohttp |
CVE-2025-69223 | 🚨 HIGH | 3.12.12 | 3.13.3 |
aiohttp |
CVE-2025-69223 | 🚨 HIGH | 3.13.2 | 3.13.3 |
apache-airflow |
CVE-2025-68438 | 🚨 HIGH | 3.1.5 | 3.1.6 |
apache-airflow |
CVE-2025-68675 | 🚨 HIGH | 3.1.5 | 3.1.6 |
azure-core |
CVE-2026-21226 | 🚨 HIGH | 1.37.0 | 1.38.0 |
cryptography |
CVE-2026-26007 | 🚨 HIGH | 42.0.8 | 46.0.5 |
jaraco.context |
CVE-2026-23949 | 🚨 HIGH | 5.3.0 | 6.1.0 |
jaraco.context |
CVE-2026-23949 | 🚨 HIGH | 6.0.1 | 6.1.0 |
protobuf |
CVE-2026-0994 | 🚨 HIGH | 4.25.8 | 6.33.5, 5.29.6 |
pyasn1 |
CVE-2026-23490 | 🚨 HIGH | 0.6.1 | 0.6.2 |
python-multipart |
CVE-2026-24486 | 🚨 HIGH | 0.0.20 | 0.0.22 |
ray |
CVE-2025-62593 | 🔥 CRITICAL | 2.47.1 | 2.52.0 |
starlette |
CVE-2025-62727 | 🚨 HIGH | 0.48.0 | 0.49.1 |
urllib3 |
CVE-2025-66418 | 🚨 HIGH | 1.26.20 | 2.6.0 |
urllib3 |
CVE-2025-66471 | 🚨 HIGH | 1.26.20 | 2.6.0 |
urllib3 |
CVE-2026-21441 | 🚨 HIGH | 1.26.20 | 2.6.3 |
wheel |
CVE-2026-24049 | 🚨 HIGH | 0.45.1 | 0.46.2 |
wheel |
CVE-2026-24049 | 🚨 HIGH | 0.45.1 | 0.46.2 |
🛡️ TRIVY SCAN RESULT 🛡️
Target: /etc/ssl/private/ssl-cert-snakeoil.key
No Vulnerabilities Found
🛡️ TRIVY SCAN RESULT 🛡️
Target: /home/airflow/openmetadata-airflow-apis/openmetadata_managed_apis.egg-info/PKG-INFO
No Vulnerabilities Found
🔍 CI failure analysis for 831fd0a: All CI failures (Python 3.10 setup failure, Playwright E2E, Python 3.11 Oracle lineage) are unrelated to this PR's Python backend ingestion changes. py-run-tests 3.10 failed due to missing cachetools dependency during environment setup.IssueMultiple CI jobs have failed across different test suites:
Root CauseAll test failures are unrelated to the changes in this PR. The PR modifies only Python ingestion backend files:
DetailsNEW: Python Test Environment Setup Failure (py-run-tests 3.10)Error Type: Dependency installation failure during test environment setup Error Message: ModuleNotFoundError: No module named 'cachetools'Location: Import Chain Leading to Failure: What Happened:
Additional Setup Issues Noted:
Why This Is Unrelated to PR Changes:
Detailed Analysis:
Playwright E2E Test Failures (playwright-ci-postgresql 2, 6) - Previously ReportedTest Results: 1 failed, 3 flaky, 290 passed (98.6% pass rate) Failures:
Why Unrelated: Frontend TypeScript/React UI tests have no connection to Python backend ingestion module changes. Python Test Failures (py-run-tests 3.11) - Previously ReportedTest Results: 4 failed, 3821 passed (99.9% pass rate) Failures: All 4 in Oracle view lineage tests ( Why Unrelated: Oracle connector is completely separate from Datalake/MLflow/workflow modules. Likely regression from main branch merge. Summary Table: Modified Files vs Failures
Supporting Evidence
Code Review 👍 Approved with suggestions 0 resolved / 1 findingsClean, well-scoped bugfixes for three independent issues. The minor type annotation suggestion from the previous review remains unaddressed on the 💡 Quality: Missing type annotation for
|
| Auto-apply | Compact |
|
|
Was this helpful? React with 👍 / 👎 | Gitar
Fix IndexError crash in _print_execution_time_summary() when no execution time entries are recorded. The tabulate() call passes a 6-element colalign tuple but the table has 0 columns when data is empty, causing an index-out-of-range. Fix: early return when the summary table has no rows.
Move cloud-provider client imports (DatalakeS3Client, DatalakeGcsClient, DatalakeAzureBlobClient) behind lazy-imports inside _get_client(). This avoids importing all three cloud SDKs (boto3, google-cloud, azure) at module load time. Only the one actually needed gets imported. Reduces import-time errors when optional cloud dependencies aren't installed.
Fix _get_ml_store() to use the run's artifact_uri for the ML store storage location instead of version.source. The model version's source field points to the model artifact path, while run.info.artifact_uri points to the actual storage root. The run object is now passed as a parameter.