aioli-sdk 1.2.0.dev5__tar.gz → 1.2.0.dev7__tar.gz
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.
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/PKG-INFO +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/__version__.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/deployment.py +52 -3
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/model.py +8 -2
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/test/test_cli.py +88 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/util.py +4 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/PKG-INFO +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/SOURCES.txt +1 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/__init__.py +2 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/authentication_api.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/deployments_api.py +258 -7
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/information_api.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/packaged_models_api.py +4 -4
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/registries_api.py +4 -4
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/roles_api.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/templates_api.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/tokens_api.py +4 -4
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/users_api.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api_client.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/configuration.py +2 -2
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/exceptions.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/__init__.py +2 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/auto_scaling_template.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/autoscaling.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/configuration_resources.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment_model_version.py +1 -1
- aioli_sdk-1.2.0.dev7/aiolirest/models/deployment_priority.py +91 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment_state.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment_token.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment_token_patch_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/deployment_token_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/error_response.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/event_info.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/failure_info.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/login_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/login_response.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/model_auth_token.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/model_response.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/observability.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/packaged_model.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/packaged_model_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/resource_profile.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/resources_template.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/role.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/role_assignment.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/role_assignments.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/security.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/success_response.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/trained_model_registry.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/trained_model_registry_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/user.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/user_patch_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/models/user_request.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/rest.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/setup.py +1 -1
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/README.md +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/__main__.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/_util.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/cli.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/errors.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/registry.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/render.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/role.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/sso.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/test/conftest.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/token.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/user.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/cli/version.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/api/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/api/_util.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/api/authentication.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/api/certs.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/api/errors.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/api/request.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/check.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/constants.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/declarative_argparse.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/common/requests.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli/util.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/dependency_links.txt +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/entry_points.txt +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/not-zip-safe +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/requires.txt +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aioli_sdk.egg-info/top_level.txt +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/api_response.py +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/aiolirest/py.typed +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/pyproject.toml +0 -0
- {aioli_sdk-1.2.0.dev5 → aioli_sdk-1.2.0.dev7}/setup.cfg +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# © Copyright 2024 Hewlett Packard Enterprise Development LP
|
|
2
|
-
__version__ = "1.2.0-
|
|
2
|
+
__version__ = "1.2.0-dev7"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# © Copyright 2023-2024 Hewlett Packard Enterprise Development LP
|
|
2
2
|
import textwrap
|
|
3
3
|
from argparse import Namespace
|
|
4
|
-
from typing import Any, List
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
5
|
|
|
6
6
|
import aiolirest
|
|
7
7
|
from aioli import cli
|
|
@@ -184,6 +184,8 @@ def create(args: Namespace) -> None:
|
|
|
184
184
|
canaryTrafficPercent=args.canary_traffic_percent,
|
|
185
185
|
environment=construct_environment(args),
|
|
186
186
|
arguments=construct_arguments(args),
|
|
187
|
+
nodeSelectors=construct_node_selectors(args),
|
|
188
|
+
priorityClassName=args.priority_class_name,
|
|
187
189
|
)
|
|
188
190
|
api_instance.deployments_post(r)
|
|
189
191
|
|
|
@@ -208,6 +210,10 @@ def update(args: Namespace) -> None:
|
|
|
208
210
|
autoScaling=found.auto_scaling,
|
|
209
211
|
canaryTrafficPercent=found.canary_traffic_percent,
|
|
210
212
|
goalStatus=found.goal_status,
|
|
213
|
+
environment=found.environment,
|
|
214
|
+
arguments=found.arguments,
|
|
215
|
+
nodeSelectors=found.node_selectors,
|
|
216
|
+
priorityClassName=found.priority_class_name,
|
|
211
217
|
)
|
|
212
218
|
|
|
213
219
|
if request.auto_scaling is None:
|
|
@@ -258,6 +264,12 @@ def update(args: Namespace) -> None:
|
|
|
258
264
|
if args.arg is not None:
|
|
259
265
|
request.arguments = construct_arguments(args)
|
|
260
266
|
|
|
267
|
+
if args.node_selector is not None:
|
|
268
|
+
request.node_selectors = construct_node_selectors(args)
|
|
269
|
+
|
|
270
|
+
if args.priority_class_name is not None:
|
|
271
|
+
request.priority_class_name = args.priority_class_name
|
|
272
|
+
|
|
261
273
|
headers = {"Content-Type": "application/json"}
|
|
262
274
|
assert found.id is not None
|
|
263
275
|
api_instance.deployments_id_put(found.id, request, _headers=headers)
|
|
@@ -318,6 +330,24 @@ def str2bool(v: str) -> bool:
|
|
|
318
330
|
)
|
|
319
331
|
|
|
320
332
|
|
|
333
|
+
def construct_node_selectors(args: Namespace) -> Dict[str, str]:
|
|
334
|
+
node_selectors: Dict[str, str] = {}
|
|
335
|
+
if args.node_selector is None:
|
|
336
|
+
return node_selectors
|
|
337
|
+
|
|
338
|
+
for entry in args.node_selector:
|
|
339
|
+
if entry is None:
|
|
340
|
+
continue
|
|
341
|
+
# split to label & value
|
|
342
|
+
the_split = entry.split("=", maxsplit=1)
|
|
343
|
+
label: str = the_split[0]
|
|
344
|
+
value: str = ""
|
|
345
|
+
if len(the_split) > 1:
|
|
346
|
+
value = the_split[1]
|
|
347
|
+
node_selectors[label] = value
|
|
348
|
+
return node_selectors
|
|
349
|
+
|
|
350
|
+
|
|
321
351
|
common_deployment_args: ArgsDescription = [
|
|
322
352
|
Arg(
|
|
323
353
|
"--authentication-required",
|
|
@@ -345,17 +375,36 @@ common_deployment_args: ArgsDescription = [
|
|
|
345
375
|
Arg(
|
|
346
376
|
"-a",
|
|
347
377
|
"--arg",
|
|
378
|
+
nargs="?",
|
|
348
379
|
help="Argument to be added to the service command line. "
|
|
349
|
-
"If specifying an argument that starts with a '-', use the form --arg=<your-argument
|
|
380
|
+
"If specifying an argument that starts with a '-', use the form --arg=<your-argument>. "
|
|
381
|
+
"Specifying any --arg replaces prior args with the arguments on this invocation. "
|
|
382
|
+
"Use a single --arg with no value to clear all arguments.",
|
|
350
383
|
action="append",
|
|
351
384
|
),
|
|
352
385
|
Arg(
|
|
353
386
|
"-e",
|
|
354
387
|
"--env",
|
|
388
|
+
nargs="?",
|
|
355
389
|
help="Specifies an environment variable & value as name=value, "
|
|
356
|
-
"to be passed to the launched container"
|
|
390
|
+
"to be passed to the launched container. "
|
|
391
|
+
"Specifying any --env replaces prior environment vars with those on this invocation. "
|
|
392
|
+
"Use a single --env with no value to clear all environment vars.",
|
|
357
393
|
action="append",
|
|
358
394
|
),
|
|
395
|
+
Arg(
|
|
396
|
+
"--node-selector",
|
|
397
|
+
nargs="?",
|
|
398
|
+
help="Specifies a node selector label & value as label=value, "
|
|
399
|
+
"to be passed to the launched container. Example kubernetes.io/arch=amd64. "
|
|
400
|
+
"Specifying any --node-selector replaces prior selectors with those on this invocation. "
|
|
401
|
+
"Use a single --node-selector with no value to clear all selectors.",
|
|
402
|
+
action="append",
|
|
403
|
+
),
|
|
404
|
+
Arg(
|
|
405
|
+
"--priority-class-name",
|
|
406
|
+
help="Priority Class Name to be used for prioritization of deployments",
|
|
407
|
+
),
|
|
359
408
|
]
|
|
360
409
|
|
|
361
410
|
main_cmd = Cmd(
|
|
@@ -343,15 +343,21 @@ common_model_args: ArgsDescription = [
|
|
|
343
343
|
Arg(
|
|
344
344
|
"-a",
|
|
345
345
|
"--arg",
|
|
346
|
+
nargs="?",
|
|
346
347
|
help="Argument to be added to the service command line. "
|
|
347
|
-
"If specifying an argument that starts with a '-', use the form --arg=<your-argument
|
|
348
|
+
"If specifying an argument that starts with a '-', use the form --arg=<your-argument>. "
|
|
349
|
+
"Specifying any --arg replaces prior args with the arguments on this invocation. "
|
|
350
|
+
"Use a single --arg with no value to clear all arguments.",
|
|
348
351
|
action="append",
|
|
349
352
|
),
|
|
350
353
|
Arg(
|
|
351
354
|
"-e",
|
|
352
355
|
"--env",
|
|
356
|
+
nargs="?",
|
|
353
357
|
help="Specifies an environment variable & value as name=value, "
|
|
354
|
-
"to be passed to the launched container"
|
|
358
|
+
"to be passed to the launched container. "
|
|
359
|
+
"Specifying any --env replaces prior environment vars with those on this invocation. "
|
|
360
|
+
"Use a single --env with no value to clear all environment vars.",
|
|
355
361
|
action="append",
|
|
356
362
|
),
|
|
357
363
|
Arg("--gpu-type", help="GPU type required"),
|
|
@@ -597,6 +597,7 @@ class TestCli:
|
|
|
597
597
|
expected = (
|
|
598
598
|
'[\n' # noqa: Q000
|
|
599
599
|
' {\n' # noqa: Q000
|
|
600
|
+
' "arguments": [],\n'
|
|
600
601
|
' "autoScaling": {\n'
|
|
601
602
|
' "maxReplicas": 1,\n'
|
|
602
603
|
' "metric": "concurrency",\n'
|
|
@@ -652,6 +653,8 @@ class TestCli:
|
|
|
652
653
|
"--canary-traffic-percent 20 "
|
|
653
654
|
"-a='--debug' "
|
|
654
655
|
"-e MODS=SOME "
|
|
656
|
+
"--node-selector kubernetes.io/arch=amd64 "
|
|
657
|
+
"--priority-class-name '' "
|
|
655
658
|
"iris-tf-keras-deployment-2"
|
|
656
659
|
)
|
|
657
660
|
== 0
|
|
@@ -701,6 +704,7 @@ class TestCli:
|
|
|
701
704
|
result_list = result.split("\n")
|
|
702
705
|
args_found = False
|
|
703
706
|
other_found = False
|
|
707
|
+
node_selector_found = False
|
|
704
708
|
for line in result_list:
|
|
705
709
|
if "- --updated" in line:
|
|
706
710
|
args_found = True
|
|
@@ -708,10 +712,94 @@ class TestCli:
|
|
|
708
712
|
mods_found = True
|
|
709
713
|
if "OTHER: VALUE" in line:
|
|
710
714
|
other_found = True
|
|
715
|
+
if "kubernetes.io/arch: amd64" in line:
|
|
716
|
+
node_selector_found = True
|
|
711
717
|
|
|
712
718
|
assert args_found
|
|
713
719
|
assert mods_found
|
|
714
720
|
assert other_found
|
|
721
|
+
assert node_selector_found
|
|
722
|
+
|
|
723
|
+
def test_deployment_update_node_selectors(self, setup_login: None) -> None:
|
|
724
|
+
# Update the deployments nodeSelectors check that changes
|
|
725
|
+
# were made. Also verify arguments and environment are preserved.
|
|
726
|
+
assert (
|
|
727
|
+
os.system(
|
|
728
|
+
"aioli deployment update "
|
|
729
|
+
"--node-selector x/y=a-b "
|
|
730
|
+
"--node-selector x/z=a-c "
|
|
731
|
+
"iris-tf-keras-deployment-2"
|
|
732
|
+
)
|
|
733
|
+
== 0
|
|
734
|
+
)
|
|
735
|
+
|
|
736
|
+
result = subprocess.check_output(
|
|
737
|
+
["aioli", "deployment", "show", "iris-tf-keras-deployment-2"]
|
|
738
|
+
).decode("utf-8")
|
|
739
|
+
result_list = result.split("\n")
|
|
740
|
+
args_found = False
|
|
741
|
+
other_found = False
|
|
742
|
+
prev_node_selector_not_found = True
|
|
743
|
+
node_selector_1_found = False
|
|
744
|
+
node_selector_2_found = False
|
|
745
|
+
for line in result_list:
|
|
746
|
+
if "- --updated" in line:
|
|
747
|
+
args_found = True
|
|
748
|
+
if "MODS: UPDATED" in line:
|
|
749
|
+
mods_found = True
|
|
750
|
+
if "OTHER: VALUE" in line:
|
|
751
|
+
other_found = True
|
|
752
|
+
if "kubernetes.io/arch: amd64" in line:
|
|
753
|
+
prev_node_selector_not_found = False
|
|
754
|
+
if "x/y: a-b" in line:
|
|
755
|
+
node_selector_1_found = True
|
|
756
|
+
if "x/z: a-c" in line:
|
|
757
|
+
node_selector_2_found = True
|
|
758
|
+
assert args_found
|
|
759
|
+
assert mods_found
|
|
760
|
+
assert other_found
|
|
761
|
+
assert node_selector_1_found
|
|
762
|
+
assert node_selector_2_found
|
|
763
|
+
assert prev_node_selector_not_found
|
|
764
|
+
|
|
765
|
+
def test_deployment_clear_env_args_node_selectors(self, setup_login: None) -> None:
|
|
766
|
+
# Update the deployments and clear env/args/node_selectors
|
|
767
|
+
assert (
|
|
768
|
+
os.system(
|
|
769
|
+
"aioli deployment update "
|
|
770
|
+
"iris-tf-keras-deployment-2 "
|
|
771
|
+
"--env "
|
|
772
|
+
"--arg "
|
|
773
|
+
"--node-selector"
|
|
774
|
+
)
|
|
775
|
+
== 0
|
|
776
|
+
)
|
|
777
|
+
|
|
778
|
+
result = subprocess.check_output(
|
|
779
|
+
["aioli", "deployment", "show", "iris-tf-keras-deployment-2"]
|
|
780
|
+
).decode("utf-8")
|
|
781
|
+
result_list = result.split("\n")
|
|
782
|
+
args_not_found = True
|
|
783
|
+
mods_not_found = True
|
|
784
|
+
other_not_found = True
|
|
785
|
+
node_selector_1_not_found = True
|
|
786
|
+
node_selector_2_not_found = True
|
|
787
|
+
for line in result_list:
|
|
788
|
+
if "- --updated" in line:
|
|
789
|
+
args_not_found = False
|
|
790
|
+
if "MODS: UPDATED" in line:
|
|
791
|
+
mods_not_found = False
|
|
792
|
+
if "OTHER: VALUE" in line:
|
|
793
|
+
other_not_found = False
|
|
794
|
+
if "x/y: a-b" in line:
|
|
795
|
+
node_selector_1_not_found = False
|
|
796
|
+
if "x/z: a-c" in line:
|
|
797
|
+
node_selector_2_not_found = False
|
|
798
|
+
assert args_not_found
|
|
799
|
+
assert mods_not_found
|
|
800
|
+
assert other_not_found
|
|
801
|
+
assert node_selector_1_not_found
|
|
802
|
+
assert node_selector_2_not_found
|
|
715
803
|
|
|
716
804
|
def test_deployment_delete(self, setup_login: None) -> None:
|
|
717
805
|
assert os.system("aioli deployment delete iris-tf-keras-deployment") == 0
|
|
@@ -154,6 +154,8 @@ def construct_environment(args: Namespace) -> Dict[str, str]:
|
|
|
154
154
|
return environment
|
|
155
155
|
|
|
156
156
|
for entry in args.env:
|
|
157
|
+
if entry is None:
|
|
158
|
+
continue
|
|
157
159
|
# split to name & value
|
|
158
160
|
the_split = entry.split("=", maxsplit=1)
|
|
159
161
|
name: str = the_split[0]
|
|
@@ -170,5 +172,7 @@ def construct_arguments(args: Namespace) -> List[str]:
|
|
|
170
172
|
return arguments
|
|
171
173
|
|
|
172
174
|
for entry in args.arg:
|
|
175
|
+
if entry is None:
|
|
176
|
+
continue
|
|
173
177
|
arguments.append(entry.strip())
|
|
174
178
|
return arguments
|
|
@@ -62,6 +62,7 @@ aiolirest/models/autoscaling.py
|
|
|
62
62
|
aiolirest/models/configuration_resources.py
|
|
63
63
|
aiolirest/models/deployment.py
|
|
64
64
|
aiolirest/models/deployment_model_version.py
|
|
65
|
+
aiolirest/models/deployment_priority.py
|
|
65
66
|
aiolirest/models/deployment_request.py
|
|
66
67
|
aiolirest/models/deployment_state.py
|
|
67
68
|
aiolirest/models/deployment_token.py
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
HPE MLIS is *Aioli* -- The AI On-line Inference Platform that enables easy deployment, tracking, and serving of your packaged models regardless of your preferred AI framework.
|
|
9
9
|
|
|
10
|
-
The version of the OpenAPI document: 1.2.0-
|
|
10
|
+
The version of the OpenAPI document: 1.2.0-dev7
|
|
11
11
|
Contact: community@determined-ai
|
|
12
12
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
13
13
|
|
|
@@ -45,6 +45,7 @@ from aiolirest.models.autoscaling import Autoscaling
|
|
|
45
45
|
from aiolirest.models.configuration_resources import ConfigurationResources
|
|
46
46
|
from aiolirest.models.deployment import Deployment
|
|
47
47
|
from aiolirest.models.deployment_model_version import DeploymentModelVersion
|
|
48
|
+
from aiolirest.models.deployment_priority import DeploymentPriority
|
|
48
49
|
from aiolirest.models.deployment_request import DeploymentRequest
|
|
49
50
|
from aiolirest.models.deployment_state import DeploymentState
|
|
50
51
|
from aiolirest.models.deployment_token import DeploymentToken
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
HPE MLIS is *Aioli* -- The AI On-line Inference Platform that enables easy deployment, tracking, and serving of your packaged models regardless of your preferred AI framework.
|
|
7
7
|
|
|
8
|
-
The version of the OpenAPI document: 1.2.0-
|
|
8
|
+
The version of the OpenAPI document: 1.2.0-dev7
|
|
9
9
|
Contact: community@determined-ai
|
|
10
10
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
HPE MLIS is *Aioli* -- The AI On-line Inference Platform that enables easy deployment, tracking, and serving of your packaged models regardless of your preferred AI framework.
|
|
7
7
|
|
|
8
|
-
The version of the OpenAPI document: 1.2.0-
|
|
8
|
+
The version of the OpenAPI document: 1.2.0-dev7
|
|
9
9
|
Contact: community@determined-ai
|
|
10
10
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
11
11
|
|
|
@@ -31,6 +31,7 @@ from pydantic import StrictStr
|
|
|
31
31
|
from typing import List, Optional
|
|
32
32
|
|
|
33
33
|
from aiolirest.models.deployment import Deployment
|
|
34
|
+
from aiolirest.models.deployment_priority import DeploymentPriority
|
|
34
35
|
from aiolirest.models.deployment_request import DeploymentRequest
|
|
35
36
|
from aiolirest.models.event_info import EventInfo
|
|
36
37
|
from aiolirest.models.observability import Observability
|
|
@@ -73,7 +74,7 @@ class DeploymentsApi:
|
|
|
73
74
|
) -> List[Deployment]:
|
|
74
75
|
"""Get all deployments.
|
|
75
76
|
|
|
76
|
-
Return the properties of all configured deployments.
|
|
77
|
+
Return the properties of all configured deployments. Results are sorted by modifiedAt descending.
|
|
77
78
|
|
|
78
79
|
:param last_event: Include the most recent event for each deployment when available.
|
|
79
80
|
:type last_event: str
|
|
@@ -142,7 +143,7 @@ class DeploymentsApi:
|
|
|
142
143
|
) -> ApiResponse[List[Deployment]]:
|
|
143
144
|
"""Get all deployments.
|
|
144
145
|
|
|
145
|
-
Return the properties of all configured deployments.
|
|
146
|
+
Return the properties of all configured deployments. Results are sorted by modifiedAt descending.
|
|
146
147
|
|
|
147
148
|
:param last_event: Include the most recent event for each deployment when available.
|
|
148
149
|
:type last_event: str
|
|
@@ -211,7 +212,7 @@ class DeploymentsApi:
|
|
|
211
212
|
) -> RESTResponseType:
|
|
212
213
|
"""Get all deployments.
|
|
213
214
|
|
|
214
|
-
Return the properties of all configured deployments.
|
|
215
|
+
Return the properties of all configured deployments. Results are sorted by modifiedAt descending.
|
|
215
216
|
|
|
216
217
|
:param last_event: Include the most recent event for each deployment when available.
|
|
217
218
|
:type last_event: str
|
|
@@ -1729,7 +1730,7 @@ class DeploymentsApi:
|
|
|
1729
1730
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
|
1730
1731
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
|
1731
1732
|
) -> List[str]:
|
|
1732
|
-
"""Get all namespaces that can be selected for
|
|
1733
|
+
"""Get all namespaces that can be selected for deployments.
|
|
1733
1734
|
|
|
1734
1735
|
List of namespace names.
|
|
1735
1736
|
|
|
@@ -1794,7 +1795,7 @@ class DeploymentsApi:
|
|
|
1794
1795
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
|
1795
1796
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
|
1796
1797
|
) -> ApiResponse[List[str]]:
|
|
1797
|
-
"""Get all namespaces that can be selected for
|
|
1798
|
+
"""Get all namespaces that can be selected for deployments.
|
|
1798
1799
|
|
|
1799
1800
|
List of namespace names.
|
|
1800
1801
|
|
|
@@ -1859,7 +1860,7 @@ class DeploymentsApi:
|
|
|
1859
1860
|
_headers: Optional[Dict[StrictStr, Any]] = None,
|
|
1860
1861
|
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
|
1861
1862
|
) -> RESTResponseType:
|
|
1862
|
-
"""Get all namespaces that can be selected for
|
|
1863
|
+
"""Get all namespaces that can be selected for deployments.
|
|
1863
1864
|
|
|
1864
1865
|
List of namespace names.
|
|
1865
1866
|
|
|
@@ -2242,3 +2243,253 @@ class DeploymentsApi:
|
|
|
2242
2243
|
)
|
|
2243
2244
|
|
|
2244
2245
|
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
@validate_call
|
|
2249
|
+
def deployments_priorities_get(
|
|
2250
|
+
self,
|
|
2251
|
+
_request_timeout: Union[
|
|
2252
|
+
None,
|
|
2253
|
+
Annotated[StrictFloat, Field(gt=0)],
|
|
2254
|
+
Tuple[
|
|
2255
|
+
Annotated[StrictFloat, Field(gt=0)],
|
|
2256
|
+
Annotated[StrictFloat, Field(gt=0)]
|
|
2257
|
+
]
|
|
2258
|
+
] = None,
|
|
2259
|
+
_request_auth: Optional[Dict[StrictStr, Any]] = None,
|
|
2260
|
+
_content_type: Optional[StrictStr] = None,
|
|
2261
|
+
_headers: Optional[Dict[StrictStr, Any]] = None,
|
|
2262
|
+
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
|
2263
|
+
) -> List[DeploymentPriority]:
|
|
2264
|
+
"""Get all priority classes that can be selected for deployments.
|
|
2265
|
+
|
|
2266
|
+
List of priority classes.
|
|
2267
|
+
|
|
2268
|
+
:param _request_timeout: timeout setting for this request. If one
|
|
2269
|
+
number provided, it will be total request
|
|
2270
|
+
timeout. It can also be a pair (tuple) of
|
|
2271
|
+
(connection, read) timeouts.
|
|
2272
|
+
:type _request_timeout: int, tuple(int, int), optional
|
|
2273
|
+
:param _request_auth: set to override the auth_settings for an a single
|
|
2274
|
+
request; this effectively ignores the
|
|
2275
|
+
authentication in the spec for a single request.
|
|
2276
|
+
:type _request_auth: dict, optional
|
|
2277
|
+
:param _content_type: force content-type for the request.
|
|
2278
|
+
:type _content_type: str, Optional
|
|
2279
|
+
:param _headers: set to override the headers for a single
|
|
2280
|
+
request; this effectively ignores the headers
|
|
2281
|
+
in the spec for a single request.
|
|
2282
|
+
:type _headers: dict, optional
|
|
2283
|
+
:param _host_index: set to override the host_index for a single
|
|
2284
|
+
request; this effectively ignores the host_index
|
|
2285
|
+
in the spec for a single request.
|
|
2286
|
+
:type _host_index: int, optional
|
|
2287
|
+
:return: Returns the result object.
|
|
2288
|
+
""" # noqa: E501
|
|
2289
|
+
|
|
2290
|
+
_param = self._deployments_priorities_get_serialize(
|
|
2291
|
+
_request_auth=_request_auth,
|
|
2292
|
+
_content_type=_content_type,
|
|
2293
|
+
_headers=_headers,
|
|
2294
|
+
_host_index=_host_index
|
|
2295
|
+
)
|
|
2296
|
+
|
|
2297
|
+
_response_types_map: Dict[str, Optional[str]] = {
|
|
2298
|
+
'200': "List[DeploymentPriority]",
|
|
2299
|
+
'500': "ErrorResponse"
|
|
2300
|
+
|
|
2301
|
+
}
|
|
2302
|
+
response_data = self.api_client.call_api(
|
|
2303
|
+
*_param,
|
|
2304
|
+
_request_timeout=_request_timeout
|
|
2305
|
+
)
|
|
2306
|
+
response_data.read()
|
|
2307
|
+
return self.api_client.response_deserialize(
|
|
2308
|
+
response_data=response_data,
|
|
2309
|
+
response_types_map=_response_types_map,
|
|
2310
|
+
).data
|
|
2311
|
+
|
|
2312
|
+
|
|
2313
|
+
@validate_call
|
|
2314
|
+
def deployments_priorities_get_with_http_info(
|
|
2315
|
+
self,
|
|
2316
|
+
_request_timeout: Union[
|
|
2317
|
+
None,
|
|
2318
|
+
Annotated[StrictFloat, Field(gt=0)],
|
|
2319
|
+
Tuple[
|
|
2320
|
+
Annotated[StrictFloat, Field(gt=0)],
|
|
2321
|
+
Annotated[StrictFloat, Field(gt=0)]
|
|
2322
|
+
]
|
|
2323
|
+
] = None,
|
|
2324
|
+
_request_auth: Optional[Dict[StrictStr, Any]] = None,
|
|
2325
|
+
_content_type: Optional[StrictStr] = None,
|
|
2326
|
+
_headers: Optional[Dict[StrictStr, Any]] = None,
|
|
2327
|
+
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
|
2328
|
+
) -> ApiResponse[List[DeploymentPriority]]:
|
|
2329
|
+
"""Get all priority classes that can be selected for deployments.
|
|
2330
|
+
|
|
2331
|
+
List of priority classes.
|
|
2332
|
+
|
|
2333
|
+
:param _request_timeout: timeout setting for this request. If one
|
|
2334
|
+
number provided, it will be total request
|
|
2335
|
+
timeout. It can also be a pair (tuple) of
|
|
2336
|
+
(connection, read) timeouts.
|
|
2337
|
+
:type _request_timeout: int, tuple(int, int), optional
|
|
2338
|
+
:param _request_auth: set to override the auth_settings for an a single
|
|
2339
|
+
request; this effectively ignores the
|
|
2340
|
+
authentication in the spec for a single request.
|
|
2341
|
+
:type _request_auth: dict, optional
|
|
2342
|
+
:param _content_type: force content-type for the request.
|
|
2343
|
+
:type _content_type: str, Optional
|
|
2344
|
+
:param _headers: set to override the headers for a single
|
|
2345
|
+
request; this effectively ignores the headers
|
|
2346
|
+
in the spec for a single request.
|
|
2347
|
+
:type _headers: dict, optional
|
|
2348
|
+
:param _host_index: set to override the host_index for a single
|
|
2349
|
+
request; this effectively ignores the host_index
|
|
2350
|
+
in the spec for a single request.
|
|
2351
|
+
:type _host_index: int, optional
|
|
2352
|
+
:return: Returns the result object.
|
|
2353
|
+
""" # noqa: E501
|
|
2354
|
+
|
|
2355
|
+
_param = self._deployments_priorities_get_serialize(
|
|
2356
|
+
_request_auth=_request_auth,
|
|
2357
|
+
_content_type=_content_type,
|
|
2358
|
+
_headers=_headers,
|
|
2359
|
+
_host_index=_host_index
|
|
2360
|
+
)
|
|
2361
|
+
|
|
2362
|
+
_response_types_map: Dict[str, Optional[str]] = {
|
|
2363
|
+
'200': "List[DeploymentPriority]",
|
|
2364
|
+
'500': "ErrorResponse"
|
|
2365
|
+
|
|
2366
|
+
}
|
|
2367
|
+
response_data = self.api_client.call_api(
|
|
2368
|
+
*_param,
|
|
2369
|
+
_request_timeout=_request_timeout
|
|
2370
|
+
)
|
|
2371
|
+
response_data.read()
|
|
2372
|
+
return self.api_client.response_deserialize(
|
|
2373
|
+
response_data=response_data,
|
|
2374
|
+
response_types_map=_response_types_map,
|
|
2375
|
+
)
|
|
2376
|
+
|
|
2377
|
+
|
|
2378
|
+
@validate_call
|
|
2379
|
+
def deployments_priorities_get_without_preload_content(
|
|
2380
|
+
self,
|
|
2381
|
+
_request_timeout: Union[
|
|
2382
|
+
None,
|
|
2383
|
+
Annotated[StrictFloat, Field(gt=0)],
|
|
2384
|
+
Tuple[
|
|
2385
|
+
Annotated[StrictFloat, Field(gt=0)],
|
|
2386
|
+
Annotated[StrictFloat, Field(gt=0)]
|
|
2387
|
+
]
|
|
2388
|
+
] = None,
|
|
2389
|
+
_request_auth: Optional[Dict[StrictStr, Any]] = None,
|
|
2390
|
+
_content_type: Optional[StrictStr] = None,
|
|
2391
|
+
_headers: Optional[Dict[StrictStr, Any]] = None,
|
|
2392
|
+
_host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
|
|
2393
|
+
) -> RESTResponseType:
|
|
2394
|
+
"""Get all priority classes that can be selected for deployments.
|
|
2395
|
+
|
|
2396
|
+
List of priority classes.
|
|
2397
|
+
|
|
2398
|
+
:param _request_timeout: timeout setting for this request. If one
|
|
2399
|
+
number provided, it will be total request
|
|
2400
|
+
timeout. It can also be a pair (tuple) of
|
|
2401
|
+
(connection, read) timeouts.
|
|
2402
|
+
:type _request_timeout: int, tuple(int, int), optional
|
|
2403
|
+
:param _request_auth: set to override the auth_settings for an a single
|
|
2404
|
+
request; this effectively ignores the
|
|
2405
|
+
authentication in the spec for a single request.
|
|
2406
|
+
:type _request_auth: dict, optional
|
|
2407
|
+
:param _content_type: force content-type for the request.
|
|
2408
|
+
:type _content_type: str, Optional
|
|
2409
|
+
:param _headers: set to override the headers for a single
|
|
2410
|
+
request; this effectively ignores the headers
|
|
2411
|
+
in the spec for a single request.
|
|
2412
|
+
:type _headers: dict, optional
|
|
2413
|
+
:param _host_index: set to override the host_index for a single
|
|
2414
|
+
request; this effectively ignores the host_index
|
|
2415
|
+
in the spec for a single request.
|
|
2416
|
+
:type _host_index: int, optional
|
|
2417
|
+
:return: Returns the result object.
|
|
2418
|
+
""" # noqa: E501
|
|
2419
|
+
|
|
2420
|
+
_param = self._deployments_priorities_get_serialize(
|
|
2421
|
+
_request_auth=_request_auth,
|
|
2422
|
+
_content_type=_content_type,
|
|
2423
|
+
_headers=_headers,
|
|
2424
|
+
_host_index=_host_index
|
|
2425
|
+
)
|
|
2426
|
+
|
|
2427
|
+
_response_types_map: Dict[str, Optional[str]] = {
|
|
2428
|
+
'200': "List[DeploymentPriority]",
|
|
2429
|
+
'500': "ErrorResponse"
|
|
2430
|
+
|
|
2431
|
+
}
|
|
2432
|
+
response_data = self.api_client.call_api(
|
|
2433
|
+
*_param,
|
|
2434
|
+
_request_timeout=_request_timeout
|
|
2435
|
+
)
|
|
2436
|
+
return response_data.response
|
|
2437
|
+
|
|
2438
|
+
|
|
2439
|
+
def _deployments_priorities_get_serialize(
|
|
2440
|
+
self,
|
|
2441
|
+
_request_auth,
|
|
2442
|
+
_content_type,
|
|
2443
|
+
_headers,
|
|
2444
|
+
_host_index,
|
|
2445
|
+
) -> Tuple:
|
|
2446
|
+
|
|
2447
|
+
_host = None
|
|
2448
|
+
|
|
2449
|
+
_collection_formats: Dict[str, str] = {
|
|
2450
|
+
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
_path_params: Dict[str, str] = {}
|
|
2454
|
+
_query_params: List[Tuple[str, str]] = []
|
|
2455
|
+
_header_params: Dict[str, Optional[str]] = _headers or {}
|
|
2456
|
+
_form_params: List[Tuple[str, str]] = []
|
|
2457
|
+
_files: Dict[str, str] = {}
|
|
2458
|
+
_body_params: Optional[bytes] = None
|
|
2459
|
+
|
|
2460
|
+
# process the path parameters
|
|
2461
|
+
# process the query parameters
|
|
2462
|
+
# process the header parameters
|
|
2463
|
+
# process the form parameters
|
|
2464
|
+
# process the body parameter
|
|
2465
|
+
|
|
2466
|
+
|
|
2467
|
+
# set the HTTP header `Accept`
|
|
2468
|
+
_header_params['Accept'] = self.api_client.select_header_accept(
|
|
2469
|
+
[
|
|
2470
|
+
'*/*'
|
|
2471
|
+
]
|
|
2472
|
+
)
|
|
2473
|
+
|
|
2474
|
+
|
|
2475
|
+
# authentication setting
|
|
2476
|
+
_auth_settings: List[str] = [
|
|
2477
|
+
'ApiKeyAuth'
|
|
2478
|
+
]
|
|
2479
|
+
|
|
2480
|
+
return self.api_client.param_serialize(
|
|
2481
|
+
method='GET',
|
|
2482
|
+
resource_path='/deployments/priorities',
|
|
2483
|
+
path_params=_path_params,
|
|
2484
|
+
query_params=_query_params,
|
|
2485
|
+
header_params=_header_params,
|
|
2486
|
+
body=_body_params,
|
|
2487
|
+
post_params=_form_params,
|
|
2488
|
+
files=_files,
|
|
2489
|
+
auth_settings=_auth_settings,
|
|
2490
|
+
collection_formats=_collection_formats,
|
|
2491
|
+
_host=_host,
|
|
2492
|
+
_request_auth=_request_auth
|
|
2493
|
+
)
|
|
2494
|
+
|
|
2495
|
+
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
HPE MLIS is *Aioli* -- The AI On-line Inference Platform that enables easy deployment, tracking, and serving of your packaged models regardless of your preferred AI framework.
|
|
7
7
|
|
|
8
|
-
The version of the OpenAPI document: 1.2.0-
|
|
8
|
+
The version of the OpenAPI document: 1.2.0-dev7
|
|
9
9
|
Contact: community@determined-ai
|
|
10
10
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
11
11
|
|