azureml-core 1.57.0.post3__py3-none-any.whl → 1.58.0__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.
- azureml/_base_sdk_common/_version.py +1 -1
- azureml/_base_sdk_common/common.py +3 -0
- azureml/_file_utils/file_utils.py +2 -0
- azureml/_model_management/_util.py +3 -0
- azureml/_project/_compute_target_commands.py +52 -25
- azureml/_project/azureml_base_images.json +7 -7
- azureml/_project/azureml_sdk_scope.txt +45 -12
- azureml/_project/file_utilities.py +1 -0
- azureml/_project/ignore_file.py +2 -0
- azureml/_project/project_info.py +3 -0
- azureml/_project/project_manager.py +9 -0
- azureml/_restclient/artifacts_client.py +1 -0
- azureml/_restclient/jasmine_client.py +1 -13
- azureml/_vendor/azure_cli_core/keys.py +19 -22
- azureml/_workspace/_utils.py +2 -1
- azureml/core/_metrics.py +8 -4
- azureml/core/compute_target.py +16 -12
- azureml/core/conda_dependencies.py +1 -0
- azureml/core/model.py +7 -1
- azureml/core/runconfig.py +31 -5
- {azureml_core-1.57.0.post3.dist-info → azureml_core-1.58.0.dist-info}/METADATA +4 -3
- {azureml_core-1.57.0.post3.dist-info → azureml_core-1.58.0.dist-info}/RECORD +26 -26
- {azureml_core-1.57.0.post3.dist-info → azureml_core-1.58.0.dist-info}/WHEEL +1 -1
- {azureml_core-1.57.0.post3.dist-info → azureml_core-1.58.0.dist-info}/LICENSE.txt +0 -0
- {azureml_core-1.57.0.post3.dist-info → azureml_core-1.58.0.dist-info}/entry_points.txt +0 -0
- {azureml_core-1.57.0.post3.dist-info → azureml_core-1.58.0.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
|
|
1
|
-
ver = "1.
|
1
|
+
ver = "1.58.0"
|
@@ -135,6 +135,7 @@ def get_run_config_dir_path(project_path):
|
|
135
135
|
# If that does not exist default to use the new .azureml
|
136
136
|
project_path = os.path.normpath(project_path)
|
137
137
|
run_config_dir_path = os.path.join(project_path, AML_CONFIG_DIR)
|
138
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
138
139
|
if not os.path.exists(run_config_dir_path):
|
139
140
|
run_config_dir_path = os.path.join(project_path, AZUREML_DIR)
|
140
141
|
return run_config_dir_path
|
@@ -145,6 +146,7 @@ def get_run_config_dir_name(project_path):
|
|
145
146
|
# If that does not exist default to use the new .azureml
|
146
147
|
project_path = os.path.normpath(project_path)
|
147
148
|
run_config_dir_path = os.path.join(project_path, AML_CONFIG_DIR)
|
149
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
148
150
|
run_config_dir_name = AML_CONFIG_DIR
|
149
151
|
if not os.path.exists(run_config_dir_path):
|
150
152
|
run_config_dir_name = AZUREML_DIR
|
@@ -158,6 +160,7 @@ def get_config_file_name(project_config_path):
|
|
158
160
|
:return: Either project.json or config.json
|
159
161
|
:rtype: str
|
160
162
|
"""
|
163
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
161
164
|
project_config_path = os.path.normpath(project_config_path)
|
162
165
|
legacy_config_file_path = os.path.join(project_config_path, LEGACY_PROJECT_FILENAME)
|
163
166
|
if os.path.exists(legacy_config_file_path):
|
@@ -101,6 +101,7 @@ def makedirs_for_file_path(file_path):
|
|
101
101
|
file_path = os.path.normpath(file_path)
|
102
102
|
parent_path = os.path.join(file_path, os.path.pardir)
|
103
103
|
parent_path = os.path.normpath(parent_path)
|
104
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
104
105
|
if not os.path.exists(parent_path):
|
105
106
|
os.makedirs(parent_path, exist_ok=True)
|
106
107
|
return True
|
@@ -366,6 +367,7 @@ def get_directory_size(path, size_limit=None, include_function=None, exclude_fun
|
|
366
367
|
for dirpath, dirnames, filenames in os.walk(path):
|
367
368
|
for name in filenames:
|
368
369
|
full_path = os.path.normpath(os.path.join(dirpath, name))
|
370
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
369
371
|
|
370
372
|
if ((not exclude_function and not include_function)
|
371
373
|
or (exclude_function and not exclude_function(full_path))
|
@@ -151,6 +151,7 @@ def upload_dependency(workspace, dependency, create_tar=False, arcname=None, sho
|
|
151
151
|
from azureml._restclient.artifacts_client import ArtifactsClient
|
152
152
|
artifact_client = ArtifactsClient(workspace.service_context)
|
153
153
|
dependency = os.path.normpath(dependency)
|
154
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
154
155
|
if dependency.startswith('http') or dependency.startswith('wasb'):
|
155
156
|
return dependency, urlparse(dependency).path.split('/')[-1]
|
156
157
|
if not os.path.exists(dependency):
|
@@ -206,6 +207,7 @@ def wrap_execution_script(execution_script, schema_file, dependencies, log_aml_d
|
|
206
207
|
"""
|
207
208
|
new_script_loc = tempfile.mkstemp(suffix='.py')[1]
|
208
209
|
execution_script = os.path.normpath(execution_script)
|
210
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
209
211
|
dependencies.append(execution_script)
|
210
212
|
if not os.path.exists(execution_script):
|
211
213
|
raise WebserviceException('Path to execution script {} does not exist.'.format(execution_script),
|
@@ -881,6 +883,7 @@ def cleanup_docker_image(docker_client, image_id):
|
|
881
883
|
|
882
884
|
def validate_path_exists_or_throw(member, name, extra_message=''):
|
883
885
|
member = os.path.normpath(member)
|
886
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
884
887
|
if not os.path.exists(member):
|
885
888
|
raise WebserviceException("{0} {1} doesn't exist. {2}".format(name, member, extra_message),
|
886
889
|
logger=module_logger)
|
@@ -8,7 +8,7 @@ from __future__ import print_function
|
|
8
8
|
|
9
9
|
import collections
|
10
10
|
import os
|
11
|
-
import
|
11
|
+
import subprocess
|
12
12
|
|
13
13
|
import requests
|
14
14
|
import azureml._vendor.ruamel.yaml as ruamelyaml
|
@@ -141,9 +141,13 @@ def get_all_compute_target_objects(project_object):
|
|
141
141
|
# Sets the password or key info in the compute skeleton.
|
142
142
|
# If needed, looks up the workspace public key info from the
|
143
143
|
# execution service.
|
144
|
+
|
145
|
+
|
144
146
|
def _set_password_or_key_info(name, address, username, password, ssh_key_info, experiment, compute_skeleton):
|
145
|
-
|
147
|
+
|
146
148
|
from azureml.core.compute_target import _SSHBasedComputeTarget
|
149
|
+
import uuid
|
150
|
+
|
147
151
|
if not ssh_key_info:
|
148
152
|
# Credential management for password.
|
149
153
|
key = name + '#' + username + '#' + uuid.uuid4().hex
|
@@ -159,22 +163,29 @@ def _set_password_or_key_info(name, address, username, password, ssh_key_info, e
|
|
159
163
|
address_minus_port, port = address.split(":")
|
160
164
|
port = int(port)
|
161
165
|
|
162
|
-
private_key = None
|
163
166
|
if ssh_key_info and ssh_key_info.private_key_file:
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
+
private_key_file = ssh_key_info.private_key_file
|
168
|
+
passphrase = ssh_key_info.passphrase
|
169
|
+
else:
|
170
|
+
private_key_file = None
|
171
|
+
passphrase = None
|
167
172
|
|
168
173
|
try:
|
169
|
-
#
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
174
|
+
# Installing the public key on the remote host using subprocess.
|
175
|
+
public_key = response_json["publicKey"]
|
176
|
+
remote_command = (
|
177
|
+
f"echo '{public_key}' | ssh -p {port} -i {private_key_file} "
|
178
|
+
f"{username}@{address_minus_port} 'cat >> ~/.ssh/authorized_keys'"
|
179
|
+
)
|
180
|
+
|
181
|
+
if passphrase:
|
182
|
+
ssh_add_cmd = f"ssh-add {private_key_file}"
|
183
|
+
subprocess.run(["ssh-agent", "bash", "-c", ssh_add_cmd], check=True, text=True)
|
184
|
+
|
185
|
+
subprocess.run(remote_command, shell=True, check=True, text=True)
|
186
|
+
print("AML Workbench public key installed on remote host.")
|
187
|
+
|
188
|
+
except subprocess.CalledProcessError as exception:
|
178
189
|
print("Error installing public key: %s" % str(exception))
|
179
190
|
print("Please install the public key below on your compute target manually, or correct the error "
|
180
191
|
"and try again.")
|
@@ -239,18 +250,34 @@ def _write_compute_run_config(source_directory, compute_target_object, compute_y
|
|
239
250
|
# Note that currently the command line option to use a password to install keys
|
240
251
|
# is disabled, so the password case will never be reached.
|
241
252
|
# If no authentication methods succeed, it will raie paramiko.ssh_exception.AuthenticationException
|
242
|
-
def _execute_ssh_command(address, port, username, command_to_run, password=None, private_key=None):
|
243
|
-
import paramiko
|
244
|
-
|
245
|
-
ssh = paramiko.SSHClient()
|
246
253
|
|
247
|
-
ssh.set_missing_host_key_policy(paramiko.RejectPolicy())
|
248
254
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
255
|
+
def _execute_ssh_command(address, port, username, command_to_run, password=None, private_key=None):
|
256
|
+
# Construct the SSH command
|
257
|
+
ssh_command = ["ssh", "-p", str(port), f"{username}@{address}", command_to_run]
|
258
|
+
|
259
|
+
# Add the private key if provided
|
260
|
+
if private_key and not os.path.isfile(private_key):
|
261
|
+
raise FileNotFoundError(f"Private key file not found: {private_key}")
|
262
|
+
if private_key:
|
263
|
+
ssh_command.insert(1, "-i")
|
264
|
+
ssh_command.insert(2, private_key)
|
265
|
+
|
266
|
+
try:
|
267
|
+
# Execute the SSH command using subprocess
|
268
|
+
result = subprocess.run(ssh_command, check=True, capture_output=True, text=True)
|
269
|
+
|
270
|
+
# Capture the standard output and standard error
|
271
|
+
stdout_lines = result.stdout.splitlines()
|
272
|
+
stderr_lines = result.stderr.splitlines()
|
273
|
+
|
274
|
+
return stdout_lines, stderr_lines
|
275
|
+
|
276
|
+
except subprocess.CalledProcessError as e:
|
277
|
+
# Handle errors in the subprocess execution
|
278
|
+
print(f"Error executing SSH command: {e}")
|
279
|
+
stderr_lines = e.stderr.splitlines() if e.stderr else []
|
280
|
+
return [], stderr_lines
|
254
281
|
|
255
282
|
|
256
283
|
# This function contacts the execution service and gets the public key and the credential
|
@@ -1,9 +1,9 @@
|
|
1
1
|
{
|
2
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.1-cudnn8-ubuntu20.04": "
|
3
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.2-cudnn8-ubuntu20.04": "
|
4
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.3-cudnn8-ubuntu20.04": "
|
5
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.6-cudnn8-ubuntu20.04": "
|
6
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04": "
|
7
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04": "
|
8
|
-
"mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04": "
|
2
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.1-cudnn8-ubuntu20.04": "20240918.v1",
|
3
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.2-cudnn8-ubuntu20.04": "20240918.v1",
|
4
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.3-cudnn8-ubuntu20.04": "20240918.v1",
|
5
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.6-cudnn8-ubuntu20.04": "20240918.v1",
|
6
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04": "20240918.v1",
|
7
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04": "20240918.v1",
|
8
|
+
"mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04": "20240918.v1"
|
9
9
|
}
|
@@ -1,12 +1,45 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
1
|
+
azureml-core
|
2
|
+
azureml-train
|
3
|
+
azureml-sdk
|
4
|
+
azureml-defaults
|
5
|
+
azureml-train-core
|
6
|
+
azureml-automl-core
|
7
|
+
azureml-automl-runtime
|
8
|
+
azureml-training-tabular
|
9
|
+
azureml-train-automl
|
10
|
+
azureml-train-automl-client
|
11
|
+
azureml-train-automl-runtime
|
12
|
+
azureml-contrib-automl-dnn-forecasting
|
13
|
+
azureml-automl-dnn-vision
|
14
|
+
azureml-automl-dnn-nlp
|
15
|
+
azureml-contrib-automl-pipeline-steps
|
16
|
+
azureml-train-restclients-hyperdrive
|
17
|
+
azureml-telemetry
|
18
|
+
azureml-tensorboard
|
19
|
+
azureml-contrib-notebook
|
20
|
+
azureml-explain-model
|
21
|
+
azureml-interpret
|
22
|
+
azureml-contrib-server
|
23
|
+
azureml-contrib-services
|
24
|
+
azureml-contrib-iot
|
25
|
+
azureml-contrib-run
|
26
|
+
azureml-datadrift
|
27
|
+
azureml-widgets
|
28
|
+
azureml-pipeline
|
29
|
+
azureml-pipeline-core
|
30
|
+
azureml-pipeline-steps
|
31
|
+
azureml-contrib-pipeline-steps
|
32
|
+
azureml-cli-common
|
33
|
+
azureml-opendatasets
|
34
|
+
azureml-accel-models
|
35
|
+
azureml-mlflow
|
36
|
+
azureml-contrib-functions
|
37
|
+
azureml-contrib-dataset
|
38
|
+
azureml-contrib-reinforcementlearning
|
39
|
+
azureml-contrib-mir
|
40
|
+
azureml-contrib-fairness
|
41
|
+
azureml-contrib-aisc
|
42
|
+
azureml-dataset-runtime
|
43
|
+
azureml-synapse
|
44
|
+
azureml-responsibleai
|
45
|
+
azureml-automl-common-tools
|
azureml/_project/ignore_file.py
CHANGED
@@ -53,6 +53,7 @@ class IgnoreFile(object):
|
|
53
53
|
:rtype: None
|
54
54
|
"""
|
55
55
|
self._path = os.path.normpath(self._path)
|
56
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
56
57
|
return self._path and os.path.exists(self._path)
|
57
58
|
|
58
59
|
def create_if_not_exists(self, patterns_to_exclude=default_patterns):
|
@@ -63,6 +64,7 @@ class IgnoreFile(object):
|
|
63
64
|
"""
|
64
65
|
if not self.exists():
|
65
66
|
self._path = os.path.normpath(self._path)
|
67
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
66
68
|
with open(self._path, 'w') as fo:
|
67
69
|
fo.write('\n'.join(patterns_to_exclude) + '\n')
|
68
70
|
|
azureml/_project/project_info.py
CHANGED
@@ -34,6 +34,7 @@ def add(project_id, scope, project_path, is_config_file_path=False):
|
|
34
34
|
project_file_path = os.path.join(config_directory, config_file_name)
|
35
35
|
# We overwriting if project.json exists.
|
36
36
|
project_file_path = os.path.normpath(project_file_path)
|
37
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
37
38
|
with open(project_file_path, "w") as fo:
|
38
39
|
info = ProjectInfo(project_id, scope)
|
39
40
|
fo.write(json.dumps(info.__dict__))
|
@@ -78,8 +79,10 @@ def get(project_path, no_recursive_check=False):
|
|
78
79
|
for files_to_look in [LEGACY_PROJECT_FILENAME, CONFIG_FILENAME]:
|
79
80
|
config_file_path = os.path.join(project_path, config_path, files_to_look)
|
80
81
|
config_file_path = os.path.normpath(config_file_path)
|
82
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
81
83
|
if os.path.exists(config_file_path):
|
82
84
|
config_file_path = os.path.normpath(config_file_path)
|
85
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
83
86
|
with open(config_file_path) as info_json:
|
84
87
|
config_json = json.load(info_json)
|
85
88
|
# If Scope is not there, then this is an old workspace config.json config file
|
@@ -83,6 +83,7 @@ def _update_requirements_binding(repo_path, config_dir_to_use):
|
|
83
83
|
|
84
84
|
lines = []
|
85
85
|
conda_dependencies_path = os.path.normpath(conda_dependencies_path)
|
86
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
86
87
|
with open(conda_dependencies_path, "r") as infile:
|
87
88
|
for line in infile:
|
88
89
|
if requirements_version:
|
@@ -92,6 +93,7 @@ def _update_requirements_binding(repo_path, config_dir_to_use):
|
|
92
93
|
|
93
94
|
lines.append(line)
|
94
95
|
conda_dependencies_path = os.path.normpath(conda_dependencies_path)
|
96
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
95
97
|
with open(conda_dependencies_path, 'w') as outfile:
|
96
98
|
for line in lines:
|
97
99
|
outfile.write(line)
|
@@ -108,9 +110,11 @@ def attach_project(project_id, project_path, scope, compute_target_dict):
|
|
108
110
|
"""
|
109
111
|
from azureml._base_sdk_common.common import get_run_config_dir_name
|
110
112
|
project_path = os.path.normpath(project_path)
|
113
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
111
114
|
is_existing_dir = os.path.isdir(project_path)
|
112
115
|
if not is_existing_dir:
|
113
116
|
project_path = os.path.normpath(project_path)
|
117
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
114
118
|
# We creating all intermediate dirs too.
|
115
119
|
os.makedirs(os.path.abspath(project_path))
|
116
120
|
|
@@ -162,19 +166,24 @@ def _copy_default_files(path, default_fileset):
|
|
162
166
|
default_files_path = os.path.join(this_dir, default_fileset)
|
163
167
|
|
164
168
|
path = os.path.normpath(path)
|
169
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
165
170
|
if not os.path.exists(path):
|
166
171
|
path = os.path.normpath(path)
|
172
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
167
173
|
os.mkdir(path)
|
168
174
|
for filename in os.listdir(default_files_path):
|
169
175
|
orig_path = os.path.join(default_files_path, filename)
|
170
176
|
new_path = os.path.join(path, filename)
|
171
177
|
if os.path.isdir(orig_path):
|
172
178
|
new_path = os.path.normpath(new_path)
|
179
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
173
180
|
shutil.copytree(orig_path, new_path)
|
174
181
|
else:
|
175
182
|
new_path = os.path.normpath(new_path)
|
183
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
176
184
|
if not os.path.exists(new_path):
|
177
185
|
new_path = os.path.normpath(new_path)
|
186
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
178
187
|
shutil.copy(orig_path, new_path)
|
179
188
|
|
180
189
|
|
@@ -103,6 +103,7 @@ class ArtifactsClient(WorkspaceClient):
|
|
103
103
|
"""upload a local file to a new artifact"""
|
104
104
|
path = os.path.abspath(path)
|
105
105
|
path = os.path.normpath(path)
|
106
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
106
107
|
with open(path, "rb") as stream:
|
107
108
|
return self.upload_artifact_from_stream(stream, *args, **kwargs)
|
108
109
|
|
@@ -43,20 +43,8 @@ class JasmineClient(ExperimentClient):
|
|
43
43
|
except Exception:
|
44
44
|
azureml_train_automl_runtime = None
|
45
45
|
|
46
|
-
# Indicate that registry environments are supported.
|
47
|
-
# This is a change just in the release/pypi/1.57.0 branch and should not be merged back to master.
|
48
|
-
# Before azureml-core 1.57.0.post2, it did not recognize the DockerBuildContext,
|
49
|
-
# which is return by registry environments.
|
50
|
-
# Setting the version to "1.57.0.3" allows the Jasmine service to distinguish between
|
51
|
-
# the original 1.57.0 (which doesn't support registry environments) and 1.57.0.post3
|
52
|
-
# (which does support registry environments).
|
53
|
-
# Note that the version cannot be "1.57.0.post3" because Jasmine needs the version to be numeric.
|
54
|
-
azureml_train_automl_version = azureml_train_automl
|
55
|
-
if azureml_train_automl_version == "1.57.0":
|
56
|
-
azureml_train_automl_version = "1.57.0.3"
|
57
|
-
|
58
46
|
self.automl_user_agent = "azureml.train.automl/{} azureml.train.automl.runtime/{}"\
|
59
|
-
.format(
|
47
|
+
.format(azureml_train_automl, azureml_train_automl_runtime)
|
60
48
|
|
61
49
|
super(JasmineClient, self).__init__(
|
62
50
|
service_context, experiment_name, experiment_id, **kwargs)
|
@@ -6,6 +6,8 @@
|
|
6
6
|
import os
|
7
7
|
import os.path
|
8
8
|
import logging
|
9
|
+
import subprocess
|
10
|
+
|
9
11
|
|
10
12
|
from azureml.exceptions import AzureMLException
|
11
13
|
|
@@ -35,9 +37,6 @@ def is_valid_ssh_rsa_public_key(openssh_pubkey):
|
|
35
37
|
|
36
38
|
|
37
39
|
def generate_ssh_keys(private_key_filepath, public_key_filepath):
|
38
|
-
import paramiko
|
39
|
-
from paramiko.ssh_exception import PasswordRequiredException, SSHException
|
40
|
-
|
41
40
|
if os.path.isfile(public_key_filepath):
|
42
41
|
try:
|
43
42
|
with open(public_key_filepath, 'r') as public_key_file:
|
@@ -46,10 +45,9 @@ def generate_ssh_keys(private_key_filepath, public_key_filepath):
|
|
46
45
|
logger.warning("Public SSH key file '%s' already exists in the directory: '%s'. "
|
47
46
|
"New SSH key files will not be generated.",
|
48
47
|
public_key_filepath, pub_ssh_dir)
|
49
|
-
|
50
48
|
return public_key
|
51
49
|
except IOError as e:
|
52
|
-
raise
|
50
|
+
raise Exception(str(e))
|
53
51
|
|
54
52
|
ssh_dir = os.path.dirname(private_key_filepath)
|
55
53
|
if not os.path.exists(ssh_dir):
|
@@ -57,24 +55,23 @@ def generate_ssh_keys(private_key_filepath, public_key_filepath):
|
|
57
55
|
os.chmod(ssh_dir, 0o700)
|
58
56
|
|
59
57
|
if os.path.isfile(private_key_filepath):
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
logger.warning("Private SSH key file '%s' was found in the directory: '%s'. "
|
64
|
-
"A paired public key file '%s' will be generated.",
|
65
|
-
private_key_filepath, ssh_dir, public_key_filepath)
|
66
|
-
except (PasswordRequiredException, SSHException, IOError) as e:
|
67
|
-
raise AzureMLException(str(e))
|
68
|
-
|
58
|
+
logger.warning("Private SSH key file '%s' was found in the directory: '%s'. "
|
59
|
+
"A paired public key file '%s' will be generated.",
|
60
|
+
private_key_filepath, ssh_dir, public_key_filepath)
|
69
61
|
else:
|
70
|
-
#
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
62
|
+
# Generate new private key using ssh-keygen
|
63
|
+
try:
|
64
|
+
subprocess.run(
|
65
|
+
['ssh-keygen', '-t', 'rsa', '-b', '2048', '-f', private_key_filepath, '-N', ''],
|
66
|
+
check=True,
|
67
|
+
stderr=subprocess.PIPE
|
68
|
+
)
|
69
|
+
os.chmod(private_key_filepath, 0o600)
|
70
|
+
except subprocess.CalledProcessError as e:
|
71
|
+
raise Exception(f"Failed to generate SSH keys: {e.stderr.decode()}")
|
72
|
+
|
73
|
+
with open(public_key_filepath, 'r') as public_key_file:
|
74
|
+
public_key = public_key_file.read()
|
78
75
|
os.chmod(public_key_filepath, 0o644)
|
79
76
|
|
80
77
|
return public_key
|
azureml/_workspace/_utils.py
CHANGED
@@ -53,7 +53,8 @@ def get_application_insights_region(workspace_region):
|
|
53
53
|
"polandcentral": "northeurope",
|
54
54
|
"italynorth": "westeurope",
|
55
55
|
"chinaeast3": "chinaeast2",
|
56
|
-
"spaincentral": "francecentral"
|
56
|
+
"spaincentral": "francecentral",
|
57
|
+
"israelcentral": "westeurope"
|
57
58
|
}.get(workspace_region, workspace_region)
|
58
59
|
|
59
60
|
|
azureml/core/_metrics.py
CHANGED
@@ -208,12 +208,16 @@ class Metric(ChainedIdentity):
|
|
208
208
|
except AttributeError:
|
209
209
|
module_logger.debug("numpy.bool_ is unsupported")
|
210
210
|
|
211
|
-
|
212
|
-
|
211
|
+
try:
|
212
|
+
# Add str type support
|
213
|
+
_type_to_converter[np.unicode_] = str
|
214
|
+
except AttributeError:
|
215
|
+
module_logger.debug("numpy.unicode_ is unsupported")
|
216
|
+
_type_to_converter[np.str_] = str
|
213
217
|
|
214
218
|
# Add int type support
|
215
|
-
numpy_ints = [np.
|
216
|
-
numpy_unsigned_ints = [np.
|
219
|
+
numpy_ints = [np.int8, np.int16, np.int16, np.int32]
|
220
|
+
numpy_unsigned_ints = [np.uint8, np.uint8, np.uint16, np.uint32]
|
217
221
|
|
218
222
|
for numpy_int_type in numpy_ints + numpy_unsigned_ints:
|
219
223
|
_type_to_converter[numpy_int_type] = int
|
azureml/core/compute_target.py
CHANGED
@@ -18,6 +18,7 @@ from abc import ABCMeta
|
|
18
18
|
from azureml.exceptions import ComputeTargetException
|
19
19
|
from azureml.exceptions import UserErrorException
|
20
20
|
import logging
|
21
|
+
import subprocess
|
21
22
|
|
22
23
|
|
23
24
|
class AbstractComputeTarget(object):
|
@@ -384,7 +385,18 @@ def is_compute_target_prepared(experiment, source_directory, run_config):
|
|
384
385
|
return _commands.prepare_compute_target(project_object, run_config_object, check=True)
|
385
386
|
|
386
387
|
|
387
|
-
#
|
388
|
+
# Updated function to check SSH command using subprocess
|
389
|
+
def _check_ssh_command():
|
390
|
+
try:
|
391
|
+
# Test if SSH is available by running a simple SSH command
|
392
|
+
subprocess.run(["ssh", "-V"], check=True, capture_output=True, text=True)
|
393
|
+
except subprocess.CalledProcessError as e:
|
394
|
+
raise UserErrorException("SSH command failed. Ensure SSH is correctly installed and accessible.") from e
|
395
|
+
except FileNotFoundError:
|
396
|
+
raise UserErrorException("SSH command not found. Please install SSH to use legacy compute target methods.")
|
397
|
+
|
398
|
+
|
399
|
+
# Updated function to attach legacy compute target
|
388
400
|
def attach_legacy_compute_target(experiment, source_directory, compute_target):
|
389
401
|
"""Attaches a compute target to this project.
|
390
402
|
|
@@ -398,7 +410,7 @@ def attach_legacy_compute_target(experiment, source_directory, compute_target):
|
|
398
410
|
"""
|
399
411
|
logging.warning("attach_legacy_compute_target method is going to be deprecated. "
|
400
412
|
"This will be removed in the next SDK release.")
|
401
|
-
|
413
|
+
_check_ssh_command()
|
402
414
|
from azureml._project import _compute_target_commands
|
403
415
|
if isinstance(compute_target, _SSHBasedComputeTarget):
|
404
416
|
_compute_target_commands.attach_ssh_based_compute_targets(experiment, source_directory, compute_target)
|
@@ -408,7 +420,7 @@ def attach_legacy_compute_target(experiment, source_directory, compute_target):
|
|
408
420
|
raise ComputeTargetException("Unsupported compute target type. Type={}".format(type(compute_target)))
|
409
421
|
|
410
422
|
|
411
|
-
#
|
423
|
+
# Updated function to remove legacy compute target
|
412
424
|
def remove_legacy_compute_target(experiment, source_directory, compute_target_name):
|
413
425
|
"""Remove a compute target from the project.
|
414
426
|
|
@@ -423,14 +435,6 @@ def remove_legacy_compute_target(experiment, source_directory, compute_target_na
|
|
423
435
|
"""
|
424
436
|
logging.warning("remove_legacy_compute_target method is going to be deprecated. "
|
425
437
|
"This will be removed in the next SDK release.")
|
426
|
-
|
438
|
+
_check_ssh_command
|
427
439
|
from azureml._project import _compute_target_commands
|
428
440
|
_compute_target_commands.detach_compute_target(experiment, source_directory, compute_target_name)
|
429
|
-
|
430
|
-
|
431
|
-
def _check_paramiko():
|
432
|
-
try:
|
433
|
-
import paramiko
|
434
|
-
return paramiko.AuthenticationException
|
435
|
-
except ImportError:
|
436
|
-
raise UserErrorException("Please install paramiko to use deprecated legacy compute target methods.")
|
@@ -127,6 +127,7 @@ class CondaDependencies(object):
|
|
127
127
|
"""Initialize a new object to manage dependencies."""
|
128
128
|
if conda_dependencies_file_path is not None:
|
129
129
|
conda_dependencies_file_path = os.path.normpath(conda_dependencies_file_path)
|
130
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
130
131
|
with open(conda_dependencies_file_path, "r") as input:
|
131
132
|
self._conda_dependencies = ruamelyaml.round_trip_load(input)
|
132
133
|
elif _underlying_structure is not None:
|
azureml/core/model.py
CHANGED
@@ -595,6 +595,7 @@ class Model(object):
|
|
595
595
|
model_base_name = os.path.basename(os.path.abspath(model_path))
|
596
596
|
|
597
597
|
file_names, artifact_names = Model._collect_model_artifact_paths(model_path, child_paths)
|
598
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
598
599
|
file_sizes = [os.path.getsize(name) for name in file_names]
|
599
600
|
|
600
601
|
# The timeout for upload_files() is per-batch of parallel uploads, so adjust it for the biggest file.
|
@@ -633,12 +634,15 @@ class Model(object):
|
|
633
634
|
:raises: azureml.exceptions.WebserviceException
|
634
635
|
"""
|
635
636
|
model_path = os.path.normpath(model_path)
|
637
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
636
638
|
if not os.path.exists(model_path):
|
637
639
|
raise WebserviceException('Error, provided model path "{}" cannot be found'.format(model_path),
|
638
640
|
logger=module_logger)
|
639
641
|
|
640
642
|
if child_paths:
|
641
643
|
for path in child_paths:
|
644
|
+
model_path = os.path.normpath(model_path)
|
645
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
642
646
|
if not os.path.exists(os.path.join(model_path, path)):
|
643
647
|
raise WebserviceException('Error, provided child path "{}" cannot be found'.format(path),
|
644
648
|
logger=module_logger)
|
@@ -660,7 +664,7 @@ class Model(object):
|
|
660
664
|
|
661
665
|
for child_path in child_paths:
|
662
666
|
child_full_path = os.path.abspath(os.path.join(model_path, child_path))
|
663
|
-
|
667
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
664
668
|
if os.path.isdir(child_full_path):
|
665
669
|
file_names.update(os.path.abspath(os.path.join(dir_path, file_name))
|
666
670
|
for dir_path, _, file_names in os.walk(child_full_path)
|
@@ -942,6 +946,7 @@ class Model(object):
|
|
942
946
|
target_dir = os.path.normpath(target_dir)
|
943
947
|
for sas, path in sas_to_relative_download_path.items():
|
944
948
|
target_path = os.path.join(target_dir, path)
|
949
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
945
950
|
if not exist_ok and os.path.exists(target_path):
|
946
951
|
raise WebserviceException("File already exists. To overwrite, set exist_ok to True. "
|
947
952
|
"{}".format(target_path), logger=module_logger)
|
@@ -967,6 +972,7 @@ class Model(object):
|
|
967
972
|
if not exist_ok:
|
968
973
|
for tar_file_path in tar.getnames():
|
969
974
|
candidate_path = os.path.join(target_dir, tar_file_path)
|
975
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
970
976
|
if os.path.exists(candidate_path):
|
971
977
|
raise WebserviceException("File already exists. To overwrite, set exist_ok to True. "
|
972
978
|
"{}".format(candidate_path), logger=module_logger)
|
azureml/core/runconfig.py
CHANGED
@@ -1446,6 +1446,7 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1446
1446
|
# True if the specified path is a project directory. False if the path specified is a file.
|
1447
1447
|
project_dir_case = True
|
1448
1448
|
if os.path.exists(path) and os.path.isdir(path):
|
1449
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1449
1450
|
# This should be the project directory
|
1450
1451
|
if name is None and self._name is None:
|
1451
1452
|
raise UserErrorException("Cannot save a runconfig without a name specified")
|
@@ -1455,7 +1456,9 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1455
1456
|
raise UserErrorException("Name is required to save the runconfig")
|
1456
1457
|
else:
|
1457
1458
|
# A user might have specified the file location to save.
|
1458
|
-
parent_dir = os.path.dirname(path)
|
1459
|
+
parent_dir = os.path.dirname(path)
|
1460
|
+
parent_dir = os.path.normpath(parent_dir)
|
1461
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1459
1462
|
if os.path.exists(parent_dir) and os.path.isdir(parent_dir):
|
1460
1463
|
project_dir_case = False
|
1461
1464
|
else:
|
@@ -1515,6 +1518,7 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1515
1518
|
|
1516
1519
|
project_dir_case = True
|
1517
1520
|
path = os.path.normpath(path)
|
1521
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1518
1522
|
if os.path.isfile(path):
|
1519
1523
|
full_runconfig_path = path
|
1520
1524
|
project_dir_case = False
|
@@ -1527,7 +1531,8 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1527
1531
|
else:
|
1528
1532
|
run_config_dir_name = get_run_config_dir_name(path) + "/"
|
1529
1533
|
full_runconfig_path = os.path.join(path, run_config_dir_name + name)
|
1530
|
-
|
1534
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1535
|
+
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1531
1536
|
if os.path.isfile(full_runconfig_path):
|
1532
1537
|
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1533
1538
|
return RunConfiguration._load_from_path(full_runconfig_path=full_runconfig_path,
|
@@ -1537,10 +1542,13 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1537
1542
|
|
1538
1543
|
# Appending .runconfig suffix for backcompat case.
|
1539
1544
|
full_runconfig_path = full_runconfig_path + RUNCONFIGURATION_EXTENSION
|
1545
|
+
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1546
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1540
1547
|
if not os.path.isfile(full_runconfig_path) and name:
|
1541
1548
|
# check for file not in .azureml or aml_config directory
|
1542
1549
|
full_runconfig_path = os.path.join(path, name + RUNCONFIGURATION_EXTENSION)
|
1543
1550
|
|
1551
|
+
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1544
1552
|
if os.path.isfile(full_runconfig_path):
|
1545
1553
|
# Setting name=name_with_ext, so that any subsequent save happens
|
1546
1554
|
# on the name.runconfig file instead of name
|
@@ -1566,6 +1574,8 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1566
1574
|
:return: The run configuration object.
|
1567
1575
|
:rtype: RunConfiguration
|
1568
1576
|
"""
|
1577
|
+
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1578
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1569
1579
|
with open(full_runconfig_path, "r") as run_config:
|
1570
1580
|
# Loads with all the comments intact.
|
1571
1581
|
commented_map_dict = ruamelyaml.round_trip_load(run_config)
|
@@ -1590,12 +1600,19 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1590
1600
|
file_found = False
|
1591
1601
|
legacy_full_file_path = os.path.join(path, AML_CONFIG_DIR, name + RUNCONFIGURATION_EXTENSION)
|
1592
1602
|
legacy_full_file_path = os.path.normpath(legacy_full_file_path)
|
1603
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1593
1604
|
full_file_path = os.path.join(path, AZUREML_DIR, name + RUNCONFIGURATION_EXTENSION)
|
1605
|
+
legacy_full_file_path = os.path.normpath(legacy_full_file_path)
|
1594
1606
|
if os.path.isfile(legacy_full_file_path):
|
1595
1607
|
file_found = True
|
1608
|
+
legacy_full_file_path = os.path.normpath(legacy_full_file_path)
|
1596
1609
|
os.remove(legacy_full_file_path)
|
1610
|
+
full_file_path = os.path.normpath(full_file_path)
|
1611
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1597
1612
|
if os.path.isfile(full_file_path):
|
1598
1613
|
file_found = True
|
1614
|
+
full_file_path = os.path.normpath(full_file_path)
|
1615
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1599
1616
|
os.remove(full_file_path)
|
1600
1617
|
|
1601
1618
|
if file_found == False:
|
@@ -1700,12 +1717,13 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1700
1717
|
compute_target_path = os.path.join(
|
1701
1718
|
run_config_dir_path,
|
1702
1719
|
run_config_object.target + COMPUTECONTEXT_EXTENSION)
|
1703
|
-
|
1704
1720
|
compute_target_path = os.path.normpath(compute_target_path)
|
1721
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1705
1722
|
if not os.path.isfile(compute_target_path):
|
1706
1723
|
raise UserErrorException("Compute target = {} doesn't exist at {}".format(
|
1707
1724
|
run_config_object.target, compute_target_path))
|
1708
|
-
|
1725
|
+
compute_target_path = os.path.normpath(compute_target_path)
|
1726
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1709
1727
|
with open(compute_target_path, "r") as compute_target_file:
|
1710
1728
|
compute_target_dict = ruamelyaml.round_trip_load(compute_target_file)
|
1711
1729
|
if "baseDockerImage" in compute_target_dict:
|
@@ -1768,11 +1786,14 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1768
1786
|
spark_dependencies_path = os.path.join(
|
1769
1787
|
path, spark_dependencies_file)
|
1770
1788
|
spark_dependencies_path = os.path.normpath(spark_dependencies_path)
|
1789
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1771
1790
|
|
1772
1791
|
if not os.path.isfile(spark_dependencies_path):
|
1773
1792
|
raise UserErrorException("Spark dependencies file = {} doesn't exist at {}".format(
|
1774
1793
|
spark_dependencies_file, spark_dependencies_path))
|
1775
|
-
|
1794
|
+
|
1795
|
+
spark_dependencies_path = os.path.normpath(spark_dependencies_path)
|
1796
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1776
1797
|
with open(spark_dependencies_path, "r") as spark_file:
|
1777
1798
|
if use_commented_map:
|
1778
1799
|
spark_file_dict = ruamelyaml.round_trip_load(spark_file)
|
@@ -1813,11 +1834,13 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1813
1834
|
if project_dir_case:
|
1814
1835
|
run_config_dir_name = get_run_config_dir_name(path) + "/"
|
1815
1836
|
full_runconfig_path = os.path.join(path, run_config_dir_name + name)
|
1837
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1816
1838
|
full_env_path = os.path.join(path, run_config_dir_name + "environment.yml")
|
1817
1839
|
else:
|
1818
1840
|
run_config_dir_name = ""
|
1819
1841
|
full_runconfig_path = path
|
1820
1842
|
full_env_path = os.path.join(os.path.dirname(path), "environment.yml")
|
1843
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
1821
1844
|
|
1822
1845
|
if separate_environment_yaml:
|
1823
1846
|
environment_commented_map = commented_map_dict.get("environment")
|
@@ -1829,12 +1852,14 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
1829
1852
|
_yaml_set_comment_before_after_key_with_error(
|
1830
1853
|
commented_map_dict, "environment", "The file path that contains the environment configuration.")
|
1831
1854
|
|
1855
|
+
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1832
1856
|
with open(full_runconfig_path, 'w') as outfile:
|
1833
1857
|
ruamelyaml.round_trip_dump(commented_map_dict, outfile)
|
1834
1858
|
full_env_path = os.path.normpath(full_env_path)
|
1835
1859
|
with open(full_env_path, 'w') as outfile:
|
1836
1860
|
ruamelyaml.round_trip_dump(environment_commented_map, outfile)
|
1837
1861
|
else:
|
1862
|
+
full_runconfig_path = os.path.normpath(full_runconfig_path)
|
1838
1863
|
with open(full_runconfig_path, 'w') as outfile:
|
1839
1864
|
ruamelyaml.round_trip_dump(commented_map_dict, outfile)
|
1840
1865
|
|
@@ -2015,6 +2040,7 @@ class RunConfiguration(_AbstractRunConfigElement):
|
|
2015
2040
|
environment_path = os.path.join(dir_to_load,
|
2016
2041
|
commented_map_or_dict["environment"])
|
2017
2042
|
environment_path = os.path.normpath(environment_path)
|
2043
|
+
# CodeQL [SM01305] untrusted data is validated before being used in the path
|
2018
2044
|
with open(environment_path, "r") as environment_config:
|
2019
2045
|
# Replacing string path with the actual environment serialized dictionary.
|
2020
2046
|
commented_map_or_dict["environment"] = ruamelyaml.round_trip_load(environment_config)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: azureml-core
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.58.0
|
4
4
|
Summary: Azure Machine Learning core packages, modules, and classes
|
5
5
|
Home-page: https://docs.microsoft.com/python/api/overview/azure/ml/?view=azure-ml-py
|
6
6
|
Author: Microsoft Corp
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.8
|
14
14
|
Classifier: Programming Language :: Python :: 3.9
|
15
15
|
Classifier: Programming Language :: Python :: 3.10
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
16
17
|
Requires-Python: >=3.8,< 4.0
|
17
18
|
Description-Content-Type: text/x-rst
|
18
19
|
License-File: LICENSE.txt
|
@@ -22,7 +23,7 @@ Requires-Dist: pathspec<1.0.0
|
|
22
23
|
Requires-Dist: requests[socks]<3.0.0,>=2.19.1
|
23
24
|
Requires-Dist: msal<2.0.0,>=1.15.0
|
24
25
|
Requires-Dist: msal-extensions<=2.0.0,>=0.3.0
|
25
|
-
Requires-Dist: knack<0.
|
26
|
+
Requires-Dist: knack<0.13.0
|
26
27
|
Requires-Dist: azure-core<2.0.0
|
27
28
|
Requires-Dist: pkginfo
|
28
29
|
Requires-Dist: argcomplete<4
|
@@ -33,7 +34,7 @@ Requires-Dist: azure-mgmt-containerregistry<11,>=8.2.0
|
|
33
34
|
Requires-Dist: azure-mgmt-storage<=22.0.0,>=16.0.0
|
34
35
|
Requires-Dist: azure-mgmt-keyvault<11.0.0,>=0.40.0
|
35
36
|
Requires-Dist: azure-mgmt-authorization<5,>=0.40.0
|
36
|
-
Requires-Dist: azure-mgmt-network<=
|
37
|
+
Requires-Dist: azure-mgmt-network<=28.0.0
|
37
38
|
Requires-Dist: azure-graphrbac<1.0.0,>=0.40.0
|
38
39
|
Requires-Dist: azure-common<2.0.0,>=1.1.12
|
39
40
|
Requires-Dist: msrest<=0.7.1,>=0.5.1
|
@@ -8,10 +8,10 @@ azureml/_async/worker_pool.py,sha256=L0wPG7JskcjmgCfcIruIyk71pRkL0HbcTritBdcC2rk
|
|
8
8
|
azureml/_base_sdk_common/__init__.py,sha256=E04eAB1KyV8xIhdRtGDe2IaYMteRQ194h7Pem5ic8Kg,356
|
9
9
|
azureml/_base_sdk_common/_arcadia_token_wrapper.py,sha256=4dMGzRM6pdQiz7BI6PvcW2_pjs3t7lsZck39AiOvmbw,2112
|
10
10
|
azureml/_base_sdk_common/_docstring_wrapper.py,sha256=haPzBtUqTgx4gipecCMggR_pHBaMiUmlkZj-fUHo1do,3390
|
11
|
-
azureml/_base_sdk_common/_version.py,sha256=
|
11
|
+
azureml/_base_sdk_common/_version.py,sha256=TsyI948HG7RhL7LFqpWB8Z-YVuM4vAO7YCx4NnkbyDY,16
|
12
12
|
azureml/_base_sdk_common/abstract_run_config_element.py,sha256=TTTVNWr17ss1AuWkKPFXgVzcGQt11QlEJ2weIsIZ5qc,1190
|
13
13
|
azureml/_base_sdk_common/auth_utils.py,sha256=c7jiAw_u70xU7HymEgtiGvqch8OqfoGzLW6Mdjuo9Lo,2512
|
14
|
-
azureml/_base_sdk_common/common.py,sha256=
|
14
|
+
azureml/_base_sdk_common/common.py,sha256=oBQrzsb56zjFhLD1OMIfNXNLeVb_wdinDtOebwk9qLI,27836
|
15
15
|
azureml/_base_sdk_common/credentials.py,sha256=UMwCuuliSsCCQUItlOu4P0Mtd8Pk0KLXUOd-bhwboaQ,1570
|
16
16
|
azureml/_base_sdk_common/data_transformers.py,sha256=ibvHPPwWDr1sRQ4zj4rg3F-dvvuzKTLx9z8I1u_-JvU,1550
|
17
17
|
azureml/_base_sdk_common/execution_service_address.py,sha256=jNeqyFLSfrQ_5UDaZSvZmdHTN2qYglaH9LR6mNUTl8o,1517
|
@@ -205,7 +205,7 @@ azureml/_compute/data/synapse_compute_template.json,sha256=IBWiGWT7Mmp-Z_Pw-zYx4
|
|
205
205
|
azureml/_execution/__init__.py,sha256=2XIGQap-7lSF-4gfhUFtGzpx9FB7-iUVpW_2omvxiII,269
|
206
206
|
azureml/_execution/_commands.py,sha256=ejWcDHBwSqDBa1zcW33F2PdpnfLJs4p-6qnyC9ikgrE,36803
|
207
207
|
azureml/_file_utils/__init__.py,sha256=eyb8nF-WJiQdBlbj7M8WIFxvSPl2Y4qny2f4OQDGcwk,625
|
208
|
-
azureml/_file_utils/file_utils.py,sha256=
|
208
|
+
azureml/_file_utils/file_utils.py,sha256=s5fthmFjjCb5DBts50Vaom30Bz5BQQl9U_ExEbXnkdo,20707
|
209
209
|
azureml/_file_utils/upload.py,sha256=W-IcpakJ1-TWtpnaeGpXXhijixmT9coHr4aaKFgTfnk,3626
|
210
210
|
azureml/_history/__init__.py,sha256=2XIGQap-7lSF-4gfhUFtGzpx9FB7-iUVpW_2omvxiII,269
|
211
211
|
azureml/_history/utils/__init__.py,sha256=JlCCObuOLZyNhIZlsoL51KtFxiY4xKIIzIRDBcdeu6Y,183
|
@@ -232,7 +232,7 @@ azureml/_model_converters/_utils.py,sha256=hSyO7DX0yvA51M9RGD4FeFSYMvXDWpFr_8vKf
|
|
232
232
|
azureml/_model_converters/model_convert_operation.py,sha256=be45MnV-Jt-f4ebM55b6rCb-DIB0SKvs5kruXwS7SUM,8127
|
233
233
|
azureml/_model_management/__init__.py,sha256=2XIGQap-7lSF-4gfhUFtGzpx9FB7-iUVpW_2omvxiII,269
|
234
234
|
azureml/_model_management/_constants.py,sha256=KfgB8azTm16_DA1ADfTwNXTTXT1m9G5Xnepxy5uSNws,3687
|
235
|
-
azureml/_model_management/_util.py,sha256=
|
235
|
+
azureml/_model_management/_util.py,sha256=yl5_COrggUp0bNDPtuCKnWel-4OjMZ6W7iAHzfdqeY0,64470
|
236
236
|
azureml/_model_management/data/aci_service_payload_template.json,sha256=w_FE0vBE6NHC8FmP72k6YhBIPAKwcZda1CArElpPCmk,465
|
237
237
|
azureml/_model_management/data/aci_specific_service_create_payload_template.json,sha256=QbJ18ayQSLM642iWfjBef9Ra9qr4nOPchvnDptXya9o,371
|
238
238
|
azureml/_model_management/data/aks_service_payload_template.json,sha256=HJq9KXkVG1vG7l740CwlGHKBHI--dfUydAh4QEdWTcs,1091
|
@@ -246,30 +246,30 @@ azureml/_model_management/data/mms_profile_payload_template.json,sha256=4Mt0SSY_
|
|
246
246
|
azureml/_model_management/data/mms_workspace_image_payload_template.json,sha256=u6Wz3wPx9kJq8Xv-b-kj9fxof7n7zwF-7RAv8nTvQlQ,296
|
247
247
|
azureml/_project/__init__.py,sha256=fXk56x7HrgsyVMGN5yuE08JN9x0JszBhsBNBX5NOneY,412
|
248
248
|
azureml/_project/_commands.py,sha256=gUNeO7UoxFDplcm5dT68t2pAL_rTKRY8_0oZIS0O_ec,39864
|
249
|
-
azureml/_project/_compute_target_commands.py,sha256=
|
250
|
-
azureml/_project/azureml_base_images.json,sha256=
|
251
|
-
azureml/_project/azureml_sdk_scope.txt,sha256=
|
252
|
-
azureml/_project/file_utilities.py,sha256=
|
253
|
-
azureml/_project/ignore_file.py,sha256=
|
249
|
+
azureml/_project/_compute_target_commands.py,sha256=9tEnGkChnFAWvj1xAQHgFd39QOS_Vf2aZYT8DvOYh_w,13262
|
250
|
+
azureml/_project/azureml_base_images.json,sha256=IfrMyOFXosR1LSx5sAreeZKf2Jk5cfcub2F_dSQ-b2o,601
|
251
|
+
azureml/_project/azureml_sdk_scope.txt,sha256=OM-LZGG5t7Vy3Pe9sg1Ll09U5BbVf7RDyEROVEk8-L0,1067
|
252
|
+
azureml/_project/file_utilities.py,sha256=CYpLPh6VFsGirVUBXwKmm6pM_7TbGihKK-WfSlx1D3E,2679
|
253
|
+
azureml/_project/ignore_file.py,sha256=H19Yn2yngfAaK9Lfbz-uuHc-V-vqUhhKUv24IW_s2e8,3395
|
254
254
|
azureml/_project/index_location.txt,sha256=y0QQZ0ezioStHt6IkKGm3Z5FCjS7oBAtBH4QkxQOHsQ,32
|
255
255
|
azureml/_project/mappings.py,sha256=-z_Qfo0EvjqyTpvhR7pv3c8XsPzKmLNQYuQbCz8L_-s,3054
|
256
256
|
azureml/_project/project.py,sha256=yXYRHAmVwVa8LO8grXqBVojAuHsP1YWJeic7VLEA6CY,7248
|
257
257
|
azureml/_project/project_engine.py,sha256=XDIM1HofOtvKvhYeKvx45bhxLMujbqdITVAKzuVy620,2662
|
258
|
-
azureml/_project/project_info.py,sha256=
|
259
|
-
azureml/_project/project_manager.py,sha256=
|
258
|
+
azureml/_project/project_info.py,sha256=abYEbuRdS4PKwjDVokdDRKuhlMFFLHcwUZ8Jx2wcchQ,6080
|
259
|
+
azureml/_project/project_manager.py,sha256=QC6OKCe4hdu04kZGAQdaJUufP9VQvR8YparOIKTsOSM,9344
|
260
260
|
azureml/_project/project_mapper.py,sha256=XdRK6Vd3XtwmaUTh0wrruk8ZsxG1h9ANX6X7CSY7sSI,1728
|
261
261
|
azureml/_project/ssh_key_info.py,sha256=277YlmQ9abiHf4T8QCFazr1dSU-zOpAiFYqKgKvtPaU,292
|
262
262
|
azureml/_project/base_project_files/conda_dependencies.yml,sha256=vCBcx08LiXJMkTtGv-axFq0Gzna1KKG6d0NOKoIFSUY,614
|
263
263
|
azureml/_restclient/__init__.py,sha256=wvFkr6a9a2sVRWHaeH-ghtpGb3Gh25G-orZu7mXKcfw,746
|
264
264
|
azureml/_restclient/arm_template_client.py,sha256=HlENPelC9JGEQ3UUnkMEvuIQ4-KigE-72okJjtEirMk,2870
|
265
|
-
azureml/_restclient/artifacts_client.py,sha256=
|
265
|
+
azureml/_restclient/artifacts_client.py,sha256=THcPZuNDWnaoBcpfc6mpC_19qlG3aYreokQQI2v-oBQ,26700
|
266
266
|
azureml/_restclient/assets_client.py,sha256=60GcBhRKx_59HeRPZcNIVXHA4OG99FFyK9X5y_S5WVw,5426
|
267
267
|
azureml/_restclient/clientbase.py,sha256=pj3hVihypdpzu6RQvUeFheLRRoDTDJ2yGAFjHhJ7A-Y,25873
|
268
268
|
azureml/_restclient/constants.py,sha256=cG5T8xtrgPBPwckSmDLo-cXlxWx502xNzRdweNehgZQ,3190
|
269
269
|
azureml/_restclient/environment_client.py,sha256=zKHAs2PhYW1xuau7aqyQzBVDPSnSJKBvkFvlnzmRCgE,10593
|
270
270
|
azureml/_restclient/exceptions.py,sha256=LszbL91f9p3P5QdbVdu8BZDa-AusvGtuvMw9iGsVjxw,3105
|
271
271
|
azureml/_restclient/experiment_client.py,sha256=tTrw3uTBNttHEeENO5_oLkNd9wrB_-60tRERyDubrpA,19719
|
272
|
-
azureml/_restclient/jasmine_client.py,sha256=
|
272
|
+
azureml/_restclient/jasmine_client.py,sha256=0WUoX7YTAQzSjpFylBnPa8gFc0QiX3zCgEXBjyTBIDg,10589
|
273
273
|
azureml/_restclient/metrics_client.py,sha256=HmS7CWDDlQGfB823SUMuoUxAdvoyhlkdNy_o6zUSXCc,29055
|
274
274
|
azureml/_restclient/models_client.py,sha256=hc7o6zmjIPSLd8oLdoiVKPeWlszBT3js_LE3jlJWVEc,5884
|
275
275
|
azureml/_restclient/polling.py,sha256=RgfUkBcZwb-GRmwdVnvh2H4fuEOz_29Yo930vO0V5sA,741
|
@@ -896,7 +896,7 @@ azureml/_vendor/azure_cli_core/cloud.py,sha256=9n6jqK5DHBkbiK_EViGpTtkXbE0sS6a09
|
|
896
896
|
azureml/_vendor/azure_cli_core/command_recommender.py,sha256=8hN-gqcXyiNgb0Bex3Im8YYSNFa9kkL53p-33kJ4ANI,21610
|
897
897
|
azureml/_vendor/azure_cli_core/decorators.py,sha256=-nETk-pTv32MzHaeDjWFsmYAeE1ZsyUTpS8uO5gH7WU,2845
|
898
898
|
azureml/_vendor/azure_cli_core/file_util.py,sha256=DAlGXDWYwwm-4sxDhO4koBNyuK23CMYYUBO4Yz-2P3c,4490
|
899
|
-
azureml/_vendor/azure_cli_core/keys.py,sha256=
|
899
|
+
azureml/_vendor/azure_cli_core/keys.py,sha256=AZCpSBBuDvPuYxMmqG-PnKeUWf1y_NDP3znyjRcXrhA,3150
|
900
900
|
azureml/_vendor/azure_cli_core/local_context.py,sha256=vHRafF_8npLfKKj4PnTt68KucP-kqB7vTWCJSrE-d1o,9234
|
901
901
|
azureml/_vendor/azure_cli_core/mock.py,sha256=oORh2LWnlxbTBr2NwinbX9PRL3qGOHIxObJW77AZBq8,2269
|
902
902
|
azureml/_vendor/azure_cli_core/parser.py,sha256=1pAXZ9Y6m4tHOJiKE2FRiWd_AkeqCz6oymSl_9sUaRQ,17753
|
@@ -1154,7 +1154,7 @@ azureml/_vendor/ruamel/yaml/util.py,sha256=OuYsMZEqNNE8Suzc_6GwJALdQCPLy8VhPe3Qx
|
|
1154
1154
|
azureml/_workspace/__init__.py,sha256=2XIGQap-7lSF-4gfhUFtGzpx9FB7-iUVpW_2omvxiII,269
|
1155
1155
|
azureml/_workspace/_arm_deployment_orchestrator.py,sha256=SnaR44naFsUkRQKvVElA95lqJr7jH79pUBLWrHkNTQ8,6585
|
1156
1156
|
azureml/_workspace/_private_endpoint_deployment_orchestrator.py,sha256=xwAZPEAwSN-oCwx2dfdgVHBJ3yAC8vTvTP06G7KERwI,7410
|
1157
|
-
azureml/_workspace/_utils.py,sha256=
|
1157
|
+
azureml/_workspace/_utils.py,sha256=uNGJBfm54llkyIitC_XLLTqZLxLO8sLobzijQCzzohw,24438
|
1158
1158
|
azureml/_workspace/arm_template_builder.py,sha256=9EvORjIo0buprK7I9cFunFw1ENLPVZLP_-NZFJYKebk,20398
|
1159
1159
|
azureml/_workspace/custom.py,sha256=hWqmadHcUCAwvTyf5-iEfUp99YMt87H4J_tFrwkxMww,19391
|
1160
1160
|
azureml/_workspace/mlservicesworkspacetemplate.json,sha256=qfBAmfALbkvJxNK10SimckoCrsblGlkdMEa5FTc4NNE,4094
|
@@ -1172,12 +1172,12 @@ azureml/_workspace/workspacedeploy.json,sha256=YxW2BJaMcKkwJ7w-aU592HOAPLkP561_9
|
|
1172
1172
|
azureml/core/__init__.py,sha256=sLB61cIb4v168ttwc__Hjovqpxz_Hq7E7GupaNvFDJs,4381
|
1173
1173
|
azureml/core/_docs.py,sha256=Kg5aoZqaXMm_KYpTme9Ass9oHJNn-9kx-K4W-4roNEw,1890
|
1174
1174
|
azureml/core/_experiment_method.py,sha256=qaQutRXOxlSzTUikJiT2d129Q9d1OXsKml3fAcC95B8,4752
|
1175
|
-
azureml/core/_metrics.py,sha256=
|
1175
|
+
azureml/core/_metrics.py,sha256=wRITKn3QmiCS0SnlCUJpCnpzFa6OZMa0AGeeHaszank,38905
|
1176
1176
|
azureml/core/_portal.py,sha256=MvzYl-0m1M9nmorgWl7gbpHtQhkf5bL92Ul9H0pB2ds,5987
|
1177
1177
|
azureml/core/_serialization_utils.py,sha256=MnNB6Q62Wv1T1F_obbyVczkGmw1_TqgpruaSf80CWK4,12059
|
1178
1178
|
azureml/core/authentication.py,sha256=HhqjBJoTYEzaTwe9ijjHaouShy-kQBlKIH2991uqYTw,107477
|
1179
|
-
azureml/core/compute_target.py,sha256=
|
1180
|
-
azureml/core/conda_dependencies.py,sha256=
|
1179
|
+
azureml/core/compute_target.py,sha256=u2Xbfz6qA0jKbWWVrhry_DmBmXu2yYbA-hmWUsLOAFo,17909
|
1180
|
+
azureml/core/conda_dependencies.py,sha256=HdeqIaxuLPKuvT4zNVsGUDMjZalgbYpNBAXnpEwDUUs,41354
|
1181
1181
|
azureml/core/container_registry.py,sha256=PGwGMaZ0pEolaKv1s_wpAJjJoqB5krEfjbDmbkrvv5Q,2422
|
1182
1182
|
azureml/core/databricks.py,sha256=cbJT89_kc80Rfb5RoCHVttqVHI8_0HeXwSxC4fHXNQo,20593
|
1183
1183
|
azureml/core/dataset.py,sha256=lWnN4kpkEStugePes-qhTqbkKl5y3W_HjMZNWk6FRL0,65849
|
@@ -1186,12 +1186,12 @@ azureml/core/environment.py,sha256=YF8TWgsKRdzRUNISKx383SVQQNcdmPzgpZpDoePPk9w,7
|
|
1186
1186
|
azureml/core/experiment.py,sha256=yC3lVr97RoFXFZGNb1tQUdKJTlK_88jLBjKZXeLun3Q,24537
|
1187
1187
|
azureml/core/keyvault.py,sha256=QchGc35DAimaWzdeEH-1wVatFgFFSWUgMNvtH5othIM,6602
|
1188
1188
|
azureml/core/linked_service.py,sha256=zZEu28ooMIb9fUmuKtqfmNU25GwEvqKciGpDmVoqM5Y,9547
|
1189
|
-
azureml/core/model.py,sha256=
|
1189
|
+
azureml/core/model.py,sha256=Ev-eIqv44lNyDQ7Ss89meZTKUQnkZ8SgO_PMk2HtwYA,143250
|
1190
1190
|
azureml/core/private_endpoint.py,sha256=rywS6SyNxOFz8EMXC7j3vEyN6jVSf4uTy-DPthA0D0U,6354
|
1191
1191
|
azureml/core/profile.py,sha256=YqmxLsKONfrLMwmkat7fDYYKtMA3F5N1ndnr9jIWTSc,18627
|
1192
1192
|
azureml/core/resource_configuration.py,sha256=BtHJWVf_RqeNRJddVfembTOyXrSF2Tt8EwB7DLK7ZHQ,6001
|
1193
1193
|
azureml/core/run.py,sha256=evL5bH2uCwayelN-xCCG7SR3hch3Cd8UK8uVIDiOZGM,115120
|
1194
|
-
azureml/core/runconfig.py,sha256=
|
1194
|
+
azureml/core/runconfig.py,sha256=oo9Q_aCt16KgPPZ-EnfLXN6i9ITM7UXS0SUi7o3jpzk,102348
|
1195
1195
|
azureml/core/script_run.py,sha256=S8-fvK2UkuSReoWDYZKpf4TtD4JV7MD1yPuufzOMBGI,12412
|
1196
1196
|
azureml/core/script_run_config.py,sha256=wlbVeXEsliyZ2YTbxvPFwS2W0qiVRApQrv89T5cPDZE,27688
|
1197
1197
|
azureml/core/util.py,sha256=G8Olw1seYwpkIHnaMgnh-Nb9rfXqWWhsKRUAIjnflX0,1487
|
@@ -1323,9 +1323,9 @@ azureml/exceptions/__init__.py,sha256=wAB_C_TNpL8FK6GXeygupED6mG5IfSrLx_moV7NHIp
|
|
1323
1323
|
azureml/exceptions/_azureml_exception.py,sha256=XxvMTrADJiTIHSn8DHj2fmyDUhYyBuVUqxYR3cuibz4,18989
|
1324
1324
|
azureml/history/__init__.py,sha256=8U_yD6fMdk8Ok3Z-GO_ibddTgQEB-aY6BTT8t9aYGZw,274
|
1325
1325
|
azureml/history/_tracking.py,sha256=IcZoVbHsOA01eQ3Ealnxe1YbNNnQi4LA5ccINB1cTrU,18541
|
1326
|
-
azureml_core-1.
|
1327
|
-
azureml_core-1.
|
1328
|
-
azureml_core-1.
|
1329
|
-
azureml_core-1.
|
1330
|
-
azureml_core-1.
|
1331
|
-
azureml_core-1.
|
1326
|
+
azureml_core-1.58.0.dist-info/LICENSE.txt,sha256=GBoIyZ-6vJ4xjRc8U3wTw4EfkuaEdVTm_gbr1Nm8uDI,859
|
1327
|
+
azureml_core-1.58.0.dist-info/METADATA,sha256=r7XjPLKE7Ke5sDsZBlNOz6XwpR4ISz0fDoKC0bAYRVo,3165
|
1328
|
+
azureml_core-1.58.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
1329
|
+
azureml_core-1.58.0.dist-info/entry_points.txt,sha256=EKn4UdjSeleaw9lk1z12dZ7YK6tX4Ig6FYqaC2Uk8b8,154
|
1330
|
+
azureml_core-1.58.0.dist-info/top_level.txt,sha256=ZOeEa0TAXo6i5wOjwBoqfIGEuxOcKuscGgNSpizqREY,8
|
1331
|
+
azureml_core-1.58.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|