zenml-nightly 0.73.0.dev20250129__py3-none-any.whl → 0.73.0.dev20250130__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zenml/VERSION +1 -1
- zenml/cli/utils.py +14 -9
- zenml/integrations/gcp/constants.py +1 -1
- zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +3 -1
- zenml/integrations/gcp/step_operators/vertex_step_operator.py +1 -0
- zenml/integrations/huggingface/services/huggingface_deployment.py +72 -29
- zenml/integrations/vllm/services/vllm_deployment.py +6 -1
- zenml/zen_stores/rest_zen_store.py +3 -13
- zenml/zen_stores/secrets_stores/sql_secrets_store.py +5 -2
- zenml/zen_stores/sql_zen_store.py +24 -17
- {zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/METADATA +1 -1
- {zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/RECORD +15 -15
- {zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/entry_points.txt +0 -0
zenml/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.73.0.
|
1
|
+
0.73.0.dev20250130
|
zenml/cli/utils.py
CHANGED
@@ -76,6 +76,7 @@ from zenml.models import (
|
|
76
76
|
from zenml.models.v2.base.filter import FilterGenerator
|
77
77
|
from zenml.services import BaseService, ServiceState
|
78
78
|
from zenml.stack import StackComponent
|
79
|
+
from zenml.stack.flavor import Flavor
|
79
80
|
from zenml.stack.stack_component import StackComponentConfig
|
80
81
|
from zenml.utils import secret_utils
|
81
82
|
from zenml.utils.time_utils import expires_in
|
@@ -2151,10 +2152,11 @@ def _scrub_secret(config: StackComponentConfig) -> Dict[str, Any]:
|
|
2151
2152
|
config_dict = {}
|
2152
2153
|
config_fields = config.__class__.model_fields
|
2153
2154
|
for key, value in config_fields.items():
|
2154
|
-
if
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2155
|
+
if getattr(config, key):
|
2156
|
+
if secret_utils.is_secret_field(value):
|
2157
|
+
config_dict[key] = "********"
|
2158
|
+
else:
|
2159
|
+
config_dict[key] = getattr(config, key)
|
2158
2160
|
return config_dict
|
2159
2161
|
|
2160
2162
|
|
@@ -2164,8 +2166,6 @@ def print_debug_stack() -> None:
|
|
2164
2166
|
|
2165
2167
|
client = Client()
|
2166
2168
|
stack = client.get_stack()
|
2167
|
-
active_stack = client.active_stack
|
2168
|
-
components = _get_stack_components(active_stack)
|
2169
2169
|
|
2170
2170
|
declare("\nCURRENT STACK\n", bold=True)
|
2171
2171
|
console.print(f"Name: {stack.name}")
|
@@ -2176,7 +2176,8 @@ def print_debug_stack() -> None:
|
|
2176
2176
|
f"Workspace: {stack.workspace.name} / {str(stack.workspace.id)}"
|
2177
2177
|
)
|
2178
2178
|
|
2179
|
-
for
|
2179
|
+
for component_type, components in stack.components.items():
|
2180
|
+
component = components[0]
|
2180
2181
|
component_response = client.get_stack_component(
|
2181
2182
|
name_id_or_prefix=component.id, component_type=component.type
|
2182
2183
|
)
|
@@ -2186,8 +2187,12 @@ def print_debug_stack() -> None:
|
|
2186
2187
|
console.print(f"Name: {component.name}")
|
2187
2188
|
console.print(f"ID: {str(component.id)}")
|
2188
2189
|
console.print(f"Type: {component.type.value}")
|
2189
|
-
console.print(f"Flavor: {component.
|
2190
|
-
|
2190
|
+
console.print(f"Flavor: {component.flavor_name}")
|
2191
|
+
|
2192
|
+
flavor = Flavor.from_model(component.flavor)
|
2193
|
+
config = flavor.config_class(**component.configuration)
|
2194
|
+
|
2195
|
+
console.print(f"Configuration: {_scrub_secret(config)}")
|
2191
2196
|
if (
|
2192
2197
|
component_response.user
|
2193
2198
|
and component_response.user.name
|
@@ -16,7 +16,7 @@
|
|
16
16
|
from google.cloud.aiplatform_v1.types.job_state import JobState
|
17
17
|
|
18
18
|
VERTEX_ENDPOINT_SUFFIX = "-aiplatform.googleapis.com"
|
19
|
-
POLLING_INTERVAL_IN_SECONDS =
|
19
|
+
POLLING_INTERVAL_IN_SECONDS = 10
|
20
20
|
CONNECTION_ERROR_RETRY_LIMIT = 5
|
21
21
|
_VERTEX_JOB_STATE_SUCCEEDED = JobState.JOB_STATE_SUCCEEDED
|
22
22
|
_VERTEX_JOB_STATE_FAILED = JobState.JOB_STATE_FAILED
|
@@ -51,7 +51,8 @@ class VertexStepOperatorSettings(BaseSettings):
|
|
51
51
|
https://cloud.google.com/vertex-ai/docs/training/configure-compute#boot_disk_options
|
52
52
|
boot_disk_type: Type of the boot disk. (Default: pd-ssd)
|
53
53
|
https://cloud.google.com/vertex-ai/docs/training/configure-compute#boot_disk_options
|
54
|
-
|
54
|
+
persistent_resource_id: The ID of the persistent resource to use for the job.
|
55
|
+
https://cloud.google.com/vertex-ai/docs/training/persistent-resource-overview
|
55
56
|
"""
|
56
57
|
|
57
58
|
accelerator_type: Optional[str] = None
|
@@ -59,6 +60,7 @@ class VertexStepOperatorSettings(BaseSettings):
|
|
59
60
|
machine_type: str = "n1-standard-4"
|
60
61
|
boot_disk_size_gb: int = 100
|
61
62
|
boot_disk_type: str = "pd-ssd"
|
63
|
+
persistent_resource_id: Optional[str] = None
|
62
64
|
|
63
65
|
|
64
66
|
class VertexStepOperatorConfig(
|
@@ -13,17 +13,18 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Implementation of the Hugging Face Deployment service."""
|
15
15
|
|
16
|
-
from typing import Any, Generator, Optional, Tuple
|
16
|
+
from typing import Any, Dict, Generator, Optional, Tuple
|
17
17
|
|
18
18
|
from huggingface_hub import (
|
19
19
|
InferenceClient,
|
20
20
|
InferenceEndpoint,
|
21
21
|
InferenceEndpointError,
|
22
22
|
InferenceEndpointStatus,
|
23
|
+
InferenceEndpointType,
|
23
24
|
create_inference_endpoint,
|
24
25
|
get_inference_endpoint,
|
25
26
|
)
|
26
|
-
from huggingface_hub.
|
27
|
+
from huggingface_hub.errors import HfHubHTTPError
|
27
28
|
from pydantic import Field
|
28
29
|
|
29
30
|
from zenml.client import Client
|
@@ -138,30 +139,67 @@ class HuggingFaceDeploymentService(BaseDeploymentService):
|
|
138
139
|
"""
|
139
140
|
return self.hf_endpoint.client
|
140
141
|
|
142
|
+
def _validate_endpoint_configuration(self) -> Dict[str, str]:
|
143
|
+
"""Validates the configuration to provision a Huggingface service.
|
144
|
+
|
145
|
+
Raises:
|
146
|
+
ValueError: if there is a missing value in the configuration
|
147
|
+
|
148
|
+
Returns:
|
149
|
+
The validated configuration values.
|
150
|
+
"""
|
151
|
+
configuration = {}
|
152
|
+
missing_keys = []
|
153
|
+
|
154
|
+
for k, v in {
|
155
|
+
"repository": self.config.repository,
|
156
|
+
"framework": self.config.framework,
|
157
|
+
"accelerator": self.config.accelerator,
|
158
|
+
"instance_size": self.config.instance_size,
|
159
|
+
"instance_type": self.config.instance_type,
|
160
|
+
"region": self.config.region,
|
161
|
+
"vendor": self.config.vendor,
|
162
|
+
"endpoint_type": self.config.endpoint_type,
|
163
|
+
}.items():
|
164
|
+
if v is None:
|
165
|
+
missing_keys.append(k)
|
166
|
+
else:
|
167
|
+
configuration[k] = v
|
168
|
+
|
169
|
+
if missing_keys:
|
170
|
+
raise ValueError(
|
171
|
+
f"Missing values in the Huggingface Service "
|
172
|
+
f"configuration: {', '.join(missing_keys)}"
|
173
|
+
)
|
174
|
+
|
175
|
+
return configuration
|
176
|
+
|
141
177
|
def provision(self) -> None:
|
142
178
|
"""Provision or update remote Hugging Face deployment instance.
|
143
179
|
|
144
180
|
Raises:
|
145
|
-
Exception: If any unexpected error while creating inference
|
181
|
+
Exception: If any unexpected error while creating inference
|
182
|
+
endpoint.
|
146
183
|
"""
|
147
184
|
try:
|
148
|
-
|
185
|
+
validated_config = self._validate_endpoint_configuration()
|
186
|
+
|
149
187
|
hf_endpoint = create_inference_endpoint(
|
150
188
|
name=self._generate_an_endpoint_name(),
|
151
|
-
repository=
|
152
|
-
framework=
|
153
|
-
accelerator=
|
154
|
-
instance_size=
|
155
|
-
instance_type=
|
156
|
-
region=
|
157
|
-
vendor=
|
189
|
+
repository=validated_config["repository"],
|
190
|
+
framework=validated_config["framework"],
|
191
|
+
accelerator=validated_config["accelerator"],
|
192
|
+
instance_size=validated_config["instance_size"],
|
193
|
+
instance_type=validated_config["instance_type"],
|
194
|
+
region=validated_config["region"],
|
195
|
+
vendor=validated_config["vendor"],
|
158
196
|
account_id=self.config.account_id,
|
159
197
|
min_replica=self.config.min_replica,
|
160
198
|
max_replica=self.config.max_replica,
|
161
199
|
revision=self.config.revision,
|
162
200
|
task=self.config.task,
|
163
201
|
custom_image=self.config.custom_image,
|
164
|
-
type=
|
202
|
+
type=InferenceEndpointType(validated_config["endpoint_type"]),
|
165
203
|
token=self.get_token(),
|
166
204
|
namespace=self.config.namespace,
|
167
205
|
).wait(timeout=POLLING_TIMEOUT)
|
@@ -172,21 +210,25 @@ class HuggingFaceDeploymentService(BaseDeploymentService):
|
|
172
210
|
)
|
173
211
|
# Catch-all for any other unexpected errors
|
174
212
|
raise Exception(
|
175
|
-
|
213
|
+
"An unexpected error occurred while provisioning the "
|
214
|
+
f"Hugging Face inference endpoint: {e}"
|
176
215
|
)
|
177
216
|
|
178
217
|
# Check if the endpoint URL is available after provisioning
|
179
218
|
if hf_endpoint.url:
|
180
219
|
logger.info(
|
181
|
-
|
220
|
+
"Hugging Face inference endpoint successfully deployed "
|
221
|
+
f"and available. Endpoint URL: {hf_endpoint.url}"
|
182
222
|
)
|
183
223
|
else:
|
184
224
|
logger.error(
|
185
|
-
"Failed to start Hugging Face inference endpoint
|
225
|
+
"Failed to start Hugging Face inference endpoint "
|
226
|
+
"service: No URL available, please check the Hugging "
|
227
|
+
"Face console for more details."
|
186
228
|
)
|
187
229
|
|
188
230
|
def check_status(self) -> Tuple[ServiceState, str]:
|
189
|
-
"""Check the
|
231
|
+
"""Check the current operational state of the Hugging Face deployment.
|
190
232
|
|
191
233
|
Returns:
|
192
234
|
The operational state of the Hugging Face deployment and a message
|
@@ -196,26 +238,29 @@ class HuggingFaceDeploymentService(BaseDeploymentService):
|
|
196
238
|
try:
|
197
239
|
status = self.hf_endpoint.status
|
198
240
|
if status == InferenceEndpointStatus.RUNNING:
|
199
|
-
return
|
241
|
+
return ServiceState.ACTIVE, ""
|
200
242
|
|
201
243
|
elif status == InferenceEndpointStatus.SCALED_TO_ZERO:
|
202
244
|
return (
|
203
245
|
ServiceState.SCALED_TO_ZERO,
|
204
|
-
"Hugging Face Inference Endpoint is scaled to zero, but
|
246
|
+
"Hugging Face Inference Endpoint is scaled to zero, but "
|
247
|
+
"still running. It will be started on demand.",
|
205
248
|
)
|
206
249
|
|
207
250
|
elif status == InferenceEndpointStatus.FAILED:
|
208
251
|
return (
|
209
252
|
ServiceState.ERROR,
|
210
|
-
"Hugging Face Inference Endpoint deployment is inactive
|
253
|
+
"Hugging Face Inference Endpoint deployment is inactive "
|
254
|
+
"or not found",
|
211
255
|
)
|
212
256
|
elif status == InferenceEndpointStatus.PENDING:
|
213
|
-
return
|
214
|
-
return
|
257
|
+
return ServiceState.PENDING_STARTUP, ""
|
258
|
+
return ServiceState.PENDING_STARTUP, ""
|
215
259
|
except (InferenceEndpointError, HfHubHTTPError):
|
216
260
|
return (
|
217
261
|
ServiceState.INACTIVE,
|
218
|
-
"Hugging Face Inference Endpoint deployment is inactive or
|
262
|
+
"Hugging Face Inference Endpoint deployment is inactive or "
|
263
|
+
"not found",
|
219
264
|
)
|
220
265
|
|
221
266
|
def deprovision(self, force: bool = False) -> None:
|
@@ -253,15 +298,13 @@ class HuggingFaceDeploymentService(BaseDeploymentService):
|
|
253
298
|
)
|
254
299
|
if self.prediction_url is not None:
|
255
300
|
if self.hf_endpoint.task == "text-generation":
|
256
|
-
|
301
|
+
return self.inference_client.text_generation(
|
257
302
|
data, max_new_tokens=max_new_tokens
|
258
303
|
)
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
)
|
264
|
-
return result
|
304
|
+
# TODO: Add support for all different supported tasks
|
305
|
+
raise NotImplementedError(
|
306
|
+
"Tasks other than text-generation is not implemented."
|
307
|
+
)
|
265
308
|
|
266
309
|
def get_logs(
|
267
310
|
self, follow: bool = False, tail: Optional[int] = None
|
@@ -152,9 +152,14 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
|
|
152
152
|
parser: argparse.ArgumentParser = make_arg_parser(
|
153
153
|
FlexibleArgumentParser()
|
154
154
|
)
|
155
|
-
|
155
|
+
# pass in empty list to get default args
|
156
|
+
# otherwise it will try to get the args from sys.argv
|
157
|
+
# and if there's a --config in there, it will want to use
|
158
|
+
# that file for vLLM configuration, which is not what we want
|
159
|
+
args: argparse.Namespace = parser.parse_args(args=[])
|
156
160
|
# Override port with the available port
|
157
161
|
self.config.port = self.endpoint.status.port or self.config.port
|
162
|
+
|
158
163
|
# Update the arguments in place
|
159
164
|
args.__dict__.update(self.config.model_dump())
|
160
165
|
uvloop.run(run_server(args=args))
|
@@ -365,17 +365,16 @@ class RestZenStoreConfiguration(StoreConfiguration):
|
|
365
365
|
|
366
366
|
if os.path.isfile(verify_ssl):
|
367
367
|
with open(verify_ssl, "r") as f:
|
368
|
-
|
368
|
+
cert_content = f.read()
|
369
369
|
|
370
370
|
fileio.makedirs(str(secret_folder))
|
371
371
|
file_path = Path(secret_folder, "ca_bundle.pem")
|
372
372
|
with os.fdopen(
|
373
373
|
os.open(file_path, flags=os.O_RDWR | os.O_CREAT, mode=0o600), "w"
|
374
374
|
) as f:
|
375
|
-
f.write(
|
376
|
-
verify_ssl = str(file_path)
|
375
|
+
f.write(cert_content)
|
377
376
|
|
378
|
-
return
|
377
|
+
return str(file_path)
|
379
378
|
|
380
379
|
@classmethod
|
381
380
|
def supports_url_scheme(cls, url: str) -> bool:
|
@@ -389,15 +388,6 @@ class RestZenStoreConfiguration(StoreConfiguration):
|
|
389
388
|
"""
|
390
389
|
return urlparse(url).scheme in ("http", "https")
|
391
390
|
|
392
|
-
def expand_certificates(self) -> None:
|
393
|
-
"""Expands the certificates in the verify_ssl field."""
|
394
|
-
# Load the certificate values back into the configuration
|
395
|
-
if isinstance(self.verify_ssl, str) and os.path.isfile(
|
396
|
-
self.verify_ssl
|
397
|
-
):
|
398
|
-
with open(self.verify_ssl, "r") as f:
|
399
|
-
self.verify_ssl = f.read()
|
400
|
-
|
401
391
|
@model_validator(mode="before")
|
402
392
|
@classmethod
|
403
393
|
@before_validator_handler
|
@@ -37,6 +37,7 @@ from zenml.exceptions import (
|
|
37
37
|
IllegalOperationError,
|
38
38
|
)
|
39
39
|
from zenml.logger import get_logger
|
40
|
+
from zenml.utils.secret_utils import PlainSerializedSecretStr
|
40
41
|
from zenml.zen_stores.schemas import (
|
41
42
|
SecretSchema,
|
42
43
|
)
|
@@ -62,7 +63,7 @@ class SqlSecretsStoreConfiguration(SecretsStoreConfiguration):
|
|
62
63
|
"""
|
63
64
|
|
64
65
|
type: SecretsStoreType = SecretsStoreType.SQL
|
65
|
-
encryption_key: Optional[
|
66
|
+
encryption_key: Optional[PlainSerializedSecretStr] = None
|
66
67
|
model_config = ConfigDict(
|
67
68
|
# Don't validate attributes when assigning them. This is necessary
|
68
69
|
# because the certificate attributes can be expanded to the contents
|
@@ -159,7 +160,9 @@ class SqlSecretsStore(BaseSecretsStore):
|
|
159
160
|
# Initialize the encryption engine
|
160
161
|
if self.config.encryption_key:
|
161
162
|
self._encryption_engine = AesGcmEngine()
|
162
|
-
self._encryption_engine._update_key(
|
163
|
+
self._encryption_engine._update_key(
|
164
|
+
self.config.encryption_key.get_secret_value()
|
165
|
+
)
|
163
166
|
|
164
167
|
# Nothing else to do here, the SQL ZenML store back-end is already
|
165
168
|
# initialized
|
@@ -304,6 +304,7 @@ from zenml.utils.networking_utils import (
|
|
304
304
|
replace_localhost_with_internal_hostname,
|
305
305
|
)
|
306
306
|
from zenml.utils.pydantic_utils import before_validator_handler
|
307
|
+
from zenml.utils.secret_utils import PlainSerializedSecretStr
|
307
308
|
from zenml.utils.string_utils import (
|
308
309
|
format_name_template,
|
309
310
|
random_str,
|
@@ -460,11 +461,11 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
460
461
|
|
461
462
|
driver: Optional[SQLDatabaseDriver] = None
|
462
463
|
database: Optional[str] = None
|
463
|
-
username: Optional[
|
464
|
-
password: Optional[
|
465
|
-
ssl_ca: Optional[
|
466
|
-
ssl_cert: Optional[
|
467
|
-
ssl_key: Optional[
|
464
|
+
username: Optional[PlainSerializedSecretStr] = None
|
465
|
+
password: Optional[PlainSerializedSecretStr] = None
|
466
|
+
ssl_ca: Optional[PlainSerializedSecretStr] = None
|
467
|
+
ssl_cert: Optional[PlainSerializedSecretStr] = None
|
468
|
+
ssl_key: Optional[PlainSerializedSecretStr] = None
|
468
469
|
ssl_verify_server_cert: bool = False
|
469
470
|
pool_size: int = 20
|
470
471
|
max_overflow: int = 20
|
@@ -611,10 +612,10 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
611
612
|
self.database = sql_url.database
|
612
613
|
elif sql_url.drivername == SQLDatabaseDriver.MYSQL:
|
613
614
|
if sql_url.username:
|
614
|
-
self.username = sql_url.username
|
615
|
+
self.username = PlainSerializedSecretStr(sql_url.username)
|
615
616
|
sql_url = sql_url._replace(username=None)
|
616
617
|
if sql_url.password:
|
617
|
-
self.password = sql_url.password
|
618
|
+
self.password = PlainSerializedSecretStr(sql_url.password)
|
618
619
|
sql_url = sql_url._replace(password=None)
|
619
620
|
if sql_url.database:
|
620
621
|
self.database = sql_url.database
|
@@ -642,13 +643,13 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
642
643
|
for k, v in sql_url.query.items():
|
643
644
|
if k == "ssl_ca":
|
644
645
|
if r := _get_query_result(v):
|
645
|
-
self.ssl_ca = r
|
646
|
+
self.ssl_ca = PlainSerializedSecretStr(r)
|
646
647
|
elif k == "ssl_cert":
|
647
648
|
if r := _get_query_result(v):
|
648
|
-
self.ssl_cert = r
|
649
|
+
self.ssl_cert = PlainSerializedSecretStr(r)
|
649
650
|
elif k == "ssl_key":
|
650
651
|
if r := _get_query_result(v):
|
651
|
-
self.ssl_key = r
|
652
|
+
self.ssl_key = PlainSerializedSecretStr(r)
|
652
653
|
elif k == "ssl_verify_server_cert":
|
653
654
|
if r := _get_query_result(v):
|
654
655
|
if is_true_string_value(r):
|
@@ -688,7 +689,7 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
688
689
|
)
|
689
690
|
for key in ["ssl_key", "ssl_ca", "ssl_cert"]:
|
690
691
|
content = getattr(self, key)
|
691
|
-
if content and not os.path.isfile(content):
|
692
|
+
if content and not os.path.isfile(content.get_secret_value()):
|
692
693
|
fileio.makedirs(str(secret_folder))
|
693
694
|
file_path = Path(secret_folder, f"{key}.pem")
|
694
695
|
with os.fdopen(
|
@@ -697,7 +698,7 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
697
698
|
),
|
698
699
|
"w",
|
699
700
|
) as f:
|
700
|
-
f.write(content)
|
701
|
+
f.write(content.get_secret_value())
|
701
702
|
setattr(self, key, str(file_path))
|
702
703
|
|
703
704
|
self.url = str(sql_url)
|
@@ -732,7 +733,7 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
732
733
|
# Load the certificate values back into the configuration
|
733
734
|
for key in ["ssl_key", "ssl_ca", "ssl_cert"]:
|
734
735
|
file_path = getattr(self, key, None)
|
735
|
-
if file_path and os.path.isfile(file_path):
|
736
|
+
if file_path and os.path.isfile(file_path.get_secret_value()):
|
736
737
|
with open(file_path, "r") as f:
|
737
738
|
setattr(self, key, f.read())
|
738
739
|
|
@@ -780,8 +781,8 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
780
781
|
|
781
782
|
sql_url = sql_url._replace(
|
782
783
|
drivername="mysql+pymysql",
|
783
|
-
username=self.username,
|
784
|
-
password=self.password,
|
784
|
+
username=self.username.get_secret_value(),
|
785
|
+
password=self.password.get_secret_value(),
|
785
786
|
database=database,
|
786
787
|
)
|
787
788
|
|
@@ -792,11 +793,17 @@ class SqlZenStoreConfiguration(StoreConfiguration):
|
|
792
793
|
ssl_setting = getattr(self, key)
|
793
794
|
if not ssl_setting:
|
794
795
|
continue
|
795
|
-
if not os.path.isfile(ssl_setting):
|
796
|
+
if not os.path.isfile(ssl_setting.get_secret_value()):
|
796
797
|
logger.warning(
|
797
798
|
f"Database SSL setting `{key}` is not a file. "
|
798
799
|
)
|
799
|
-
sqlalchemy_ssl_args[key.
|
800
|
+
sqlalchemy_ssl_args[key.lstrip("ssl_")] = (
|
801
|
+
ssl_setting.get_secret_value()
|
802
|
+
)
|
803
|
+
sqlalchemy_ssl_args[key.removeprefix("ssl_")] = (
|
804
|
+
ssl_setting.get_secret_value()
|
805
|
+
)
|
806
|
+
|
800
807
|
if len(sqlalchemy_ssl_args) > 0:
|
801
808
|
sqlalchemy_ssl_args["check_hostname"] = (
|
802
809
|
self.ssl_verify_server_cert
|
{zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/RECORD
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
|
2
|
-
zenml/VERSION,sha256=
|
2
|
+
zenml/VERSION,sha256=wW7R7I2rStFIfLzfJIdNqUBozH4gk7VR6MkRm4Ntduk,19
|
3
3
|
zenml/__init__.py,sha256=SkMObQA41ajqdZqGErN00S1Vf3KAxpLvbZ-OBy5uYoo,2130
|
4
4
|
zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
|
5
5
|
zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
|
@@ -52,7 +52,7 @@ zenml/cli/stack_components.py,sha256=7RXVCJTX6sU-CiyDeu4kGYPJZ7QRQjDTptsvl__sI_A
|
|
52
52
|
zenml/cli/tag.py,sha256=Co-AL1eNZMf_AsqlcnJpoZ_k7UKa0l5X_g_TLpJdGes,4884
|
53
53
|
zenml/cli/text_utils.py,sha256=bY1GIjoULt1cW2FyrPlMoAXNS2R7cSOjDFEZQqrpVQ8,3553
|
54
54
|
zenml/cli/user_management.py,sha256=fTuRworQahst_j78qPYTtgciUeUOxwo7efiyPwmj2tI,13075
|
55
|
-
zenml/cli/utils.py,sha256=
|
55
|
+
zenml/cli/utils.py,sha256=kqTFuEyXgx0eP_7mtWwmDwF3JvDSQ7dnOMhlNYSSJfM,86594
|
56
56
|
zenml/cli/version.py,sha256=nm1iSU_1V6-MUwpMKeXcwFhLYGUMLswvQL67cEuCpxA,3635
|
57
57
|
zenml/cli/workspace.py,sha256=bp02aXou574ToWPD8OAIB_cg3mvpE011H8aMKegT-nU,2970
|
58
58
|
zenml/client.py,sha256=Aj3-Ofz9t0MltZarqdgb4fSFqhrl6SWC5VjEoHkcCdU,283629
|
@@ -256,7 +256,7 @@ zenml/integrations/feast/flavors/feast_feature_store_flavor.py,sha256=E0k2iwgNti
|
|
256
256
|
zenml/integrations/gcp/__init__.py,sha256=H8iCKBFOOF4WFuZFqMc4ihgrFz-EOxfkstImNYo2dmE,2943
|
257
257
|
zenml/integrations/gcp/artifact_stores/__init__.py,sha256=zYQkZBI4-COGX-E0NS7G-hLT88wbQBnYY6Oh1gruSRs,798
|
258
258
|
zenml/integrations/gcp/artifact_stores/gcp_artifact_store.py,sha256=XfSIJ4HtsZvaUrUtzXvUp7QHr3WbgVDNsz7_q1h-DCo,10988
|
259
|
-
zenml/integrations/gcp/constants.py,sha256=
|
259
|
+
zenml/integrations/gcp/constants.py,sha256=ZBQS_ZEjerUrJq-hH3UusgZAvB45FLgxNv11TSt3qhw,1334
|
260
260
|
zenml/integrations/gcp/experiment_trackers/__init__.py,sha256=TBBlZZaeJS-wza6mU54GDlRBdi3b5DcxDxVStQxds0o,775
|
261
261
|
zenml/integrations/gcp/experiment_trackers/vertex_experiment_tracker.py,sha256=7vhCibjKZgPbw85ja_VVM1bH-P_M5F60xGnsXzNkCls,7181
|
262
262
|
zenml/integrations/gcp/flavors/__init__.py,sha256=GcB8EvYjXM_VSku16jnDSNyJYMgKc2ZiM_odyKEc1uc,1654
|
@@ -264,7 +264,7 @@ zenml/integrations/gcp/flavors/gcp_artifact_store_flavor.py,sha256=Ts2jvR3IgGH8Y
|
|
264
264
|
zenml/integrations/gcp/flavors/gcp_image_builder_flavor.py,sha256=K6sE9D-okbdlctNwNeDYEfhWmMXXW-S92x342dnhjqY,4451
|
265
265
|
zenml/integrations/gcp/flavors/vertex_experiment_tracker_flavor.py,sha256=icexIPoqyJ_tsO6M5-Vncd1TAUaKTGbdUG0cDOYC6Kc,6834
|
266
266
|
zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py,sha256=m01jsJbyX9i29l4VmCNKRo6skwyLi_RQgTJM5oKWMMQ,9907
|
267
|
-
zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py,sha256=
|
267
|
+
zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py,sha256=VHg2coeKoBJjSYkiVSTtbfKRg9qW9o8_QZ_xXskfzI4,6653
|
268
268
|
zenml/integrations/gcp/google_credentials_mixin.py,sha256=bPy3JYCCcyuTmPiVFqbY81YJ5g1yRdzHLlBlokvbeqg,4026
|
269
269
|
zenml/integrations/gcp/image_builders/__init__.py,sha256=2IvTL6U2YpUoxGQXeXew-6WFoL5hHIxkqr4DaA5Ez9w,786
|
270
270
|
zenml/integrations/gcp/image_builders/gcp_image_builder.py,sha256=dNpMJa1TITUOHSn5nj1gWTFwVNmvWz321A_JoTMOqCM,9114
|
@@ -273,7 +273,7 @@ zenml/integrations/gcp/orchestrators/vertex_orchestrator.py,sha256=7O-Wh-LTGKOWp
|
|
273
273
|
zenml/integrations/gcp/service_connectors/__init__.py,sha256=fdydawaor8KAtMYvRZieiTuA1i5QATxXXgI-yV1lsn8,788
|
274
274
|
zenml/integrations/gcp/service_connectors/gcp_service_connector.py,sha256=-QmTN9RbbuxIJjWrzx6eZoCqMGXHeJZ_w_2tBHd-FoQ,94807
|
275
275
|
zenml/integrations/gcp/step_operators/__init__.py,sha256=iPkob2LtPIQ-OHszhbNz_ojhoovL6SprmTx37It4EJ8,808
|
276
|
-
zenml/integrations/gcp/step_operators/vertex_step_operator.py,sha256=
|
276
|
+
zenml/integrations/gcp/step_operators/vertex_step_operator.py,sha256=X8CCniyAo7NHiy3Mv_YSKQ4Hw3UYMXob6B3uWKsCJ-0,13567
|
277
277
|
zenml/integrations/github/__init__.py,sha256=A8Yd--BbAG3HEfbWYOIEy_kzyLs2tBiawiLMosXd1Do,1467
|
278
278
|
zenml/integrations/github/code_repositories/__init__.py,sha256=ub_hSE2ks2mZB1aeHRjQYz7QIRQIgOw2s080IIqJaGs,817
|
279
279
|
zenml/integrations/github/code_repositories/github_code_repository.py,sha256=7s4NjOn_bItAbwcxQQQfo9IlW8vowleUQMiBjjn6iJo,7041
|
@@ -308,7 +308,7 @@ zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.
|
|
308
308
|
zenml/integrations/huggingface/model_deployers/__init__.py,sha256=58O81P3mCg9LO3iaU7jMqBqZb0o5zSXS0r7nb2ogN1Q,840
|
309
309
|
zenml/integrations/huggingface/model_deployers/huggingface_model_deployer.py,sha256=2pfKewps4sI7dLBTyARaK8e-TRpsJX9pTdJqJe7XRwo,9095
|
310
310
|
zenml/integrations/huggingface/services/__init__.py,sha256=QkGAmOdUBQLKfMpaG-u_rXjBVtQRx0ip2fii10IM3P0,815
|
311
|
-
zenml/integrations/huggingface/services/huggingface_deployment.py,sha256=
|
311
|
+
zenml/integrations/huggingface/services/huggingface_deployment.py,sha256=TcqealbqKBiCpbKhw79syr3wA1svM16OdWBQF9Zknn0,11917
|
312
312
|
zenml/integrations/huggingface/steps/__init__.py,sha256=tjsmnE9lJcXsE46YGPNWJICHXDUWn34m7jE-os-CFLo,879
|
313
313
|
zenml/integrations/huggingface/steps/accelerate_runner.py,sha256=0fazQcqopAVRCInNePsIEy2Vn4EePioAetWXhewXpFA,6387
|
314
314
|
zenml/integrations/huggingface/steps/huggingface_deployer.py,sha256=Wk1wzYwy-kpA-IJAHzukUpIGRxrhZTuyXNYVriXBqCI,4103
|
@@ -547,7 +547,7 @@ zenml/integrations/vllm/flavors/vllm_model_deployer_flavor.py,sha256=_3P0-qyjdsV
|
|
547
547
|
zenml/integrations/vllm/model_deployers/__init__.py,sha256=Z38oWIfkArNsxCm3rQkTdYK4dbtx2BpTUw1gw_kl6Do,803
|
548
548
|
zenml/integrations/vllm/model_deployers/vllm_model_deployer.py,sha256=OYPNSkB-I5r4eQ_7kr4F7GDwNj6efcsio8WRteQ5cYI,9665
|
549
549
|
zenml/integrations/vllm/services/__init__.py,sha256=Id28GEfHECI0RnGAGGNioD9eZ6aJxdNebe112VgC59g,788
|
550
|
-
zenml/integrations/vllm/services/vllm_deployment.py,sha256=
|
550
|
+
zenml/integrations/vllm/services/vllm_deployment.py,sha256=UkSMVk3usu4kUEqbs6vUjdy25tcoZCWT8zkJvRXiao4,7071
|
551
551
|
zenml/integrations/wandb/__init__.py,sha256=LBlnX4chpaB3atIsxkF0RSz2AJs9gHQWRptkgkqF6lw,1711
|
552
552
|
zenml/integrations/wandb/experiment_trackers/__init__.py,sha256=8nFyyvh-PTF5d9ZfjS7xFSWTWSpreRB1azePv-Ex2sc,771
|
553
553
|
zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py,sha256=xNkF-3-WwpC8OV38T5evV35t6rH5o3O6uBlX4cimsKs,5092
|
@@ -1246,7 +1246,7 @@ zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.p
|
|
1246
1246
|
zenml/zen_stores/migrations/versions/f3b3964e3a0f_add_oauth_devices.py,sha256=2CR4R-7Vx6j_AXxo-e5Guy6OX-ZnS47HSKSGfqlO-y0,3065
|
1247
1247
|
zenml/zen_stores/migrations/versions/f49904a80aa7_increase_length_of_artifact_table_sources.py,sha256=kLgfDUnQdAb5_SyFx3VKXDLC0YbuBKf9iXRDNeBin7Q,1618
|
1248
1248
|
zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py,sha256=kn-ng5EHe_mmLfffIFbz7T59z-to3oMx8III_4wOsz4,1956
|
1249
|
-
zenml/zen_stores/rest_zen_store.py,sha256=
|
1249
|
+
zenml/zen_stores/rest_zen_store.py,sha256=tB890hOnYaixDKWr7xddpNsNI0GxLV7D4PQd-TE4LiU,159783
|
1250
1250
|
zenml/zen_stores/schemas/__init__.py,sha256=vMb0Pyf94aMWZDWpPKuRaxNoMsTp9DZNKSQScm9Vd5I,4339
|
1251
1251
|
zenml/zen_stores/schemas/action_schemas.py,sha256=uAWlV3Uy8LERBlu7PHCsWEEF4ww6olsVetzVBWmdDSc,6298
|
1252
1252
|
zenml/zen_stores/schemas/api_key_schemas.py,sha256=d_ewTrIJpRjLWupOZFpWcPSlRiHxiBsZJc_qSU7tMMk,7262
|
@@ -1288,12 +1288,12 @@ zenml/zen_stores/secrets_stores/gcp_secrets_store.py,sha256=qcVyXlDQ3Ur1RQVyzvMY
|
|
1288
1288
|
zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py,sha256=NfW1EHIA99lsebtSvH_7yhIcLqpTICKTZDKf0Ai255Y,11672
|
1289
1289
|
zenml/zen_stores/secrets_stores/secrets_store_interface.py,sha256=Q2Jbnt2Pp7NGlR-u1YBfRZV2g8su2Fd0ArBMdksAE-Q,2819
|
1290
1290
|
zenml/zen_stores/secrets_stores/service_connector_secrets_store.py,sha256=kPYX-Z_OOhZCI1CP77ncfV7IsV4e8brklnTXmKxZYNc,7078
|
1291
|
-
zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=
|
1292
|
-
zenml/zen_stores/sql_zen_store.py,sha256=
|
1291
|
+
zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=nEO0bAPlULBLxLVk-UTRIZiUeVpATggo8qCsKmgEU1E,8788
|
1292
|
+
zenml/zen_stores/sql_zen_store.py,sha256=GEBQDPhm52-YyxLBJcebNviwtr-VK_dnaHrg21fzJOw,417086
|
1293
1293
|
zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
|
1294
1294
|
zenml/zen_stores/zen_store_interface.py,sha256=vf2gKBWfUUPtcGZC35oQB6pPNVzWVyQC8nWxVLjfrxM,92692
|
1295
|
-
zenml_nightly-0.73.0.
|
1296
|
-
zenml_nightly-0.73.0.
|
1297
|
-
zenml_nightly-0.73.0.
|
1298
|
-
zenml_nightly-0.73.0.
|
1299
|
-
zenml_nightly-0.73.0.
|
1295
|
+
zenml_nightly-0.73.0.dev20250130.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
|
1296
|
+
zenml_nightly-0.73.0.dev20250130.dist-info/METADATA,sha256=Iil8YHORJo4k5qoNT03yMS74Osq372zX8vYS7n7ak6k,21355
|
1297
|
+
zenml_nightly-0.73.0.dev20250130.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
1298
|
+
zenml_nightly-0.73.0.dev20250130.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
|
1299
|
+
zenml_nightly-0.73.0.dev20250130.dist-info/RECORD,,
|
{zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/LICENSE
RENAMED
File without changes
|
{zenml_nightly-0.73.0.dev20250129.dist-info → zenml_nightly-0.73.0.dev20250130.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|