aioli-sdk 1.2.0.dev9__tar.gz → 1.2.0.dev11__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.dev9 → aioli_sdk-1.2.0.dev11}/PKG-INFO +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/__version__.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/cli.py +5 -2
- aioli_sdk-1.2.0.dev11/aioli/cli/template.py +398 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/test/test_cli.py +137 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/PKG-INFO +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/SOURCES.txt +1 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/__init__.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/authentication_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/deployments_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/information_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/packaged_models_api.py +18 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/registries_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/roles_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/templates_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/tokens_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/users_api.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api_client.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/configuration.py +2 -2
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/exceptions.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/__init__.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/auto_scaling_template.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/autoscaling.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/configuration_resources.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_model_version.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_priority.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_state.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_token.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_token_patch_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_token_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/error_response.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/event_info.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/failure_info.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/login_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/login_response.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/model_auth_token.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/model_response.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/observability.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/packaged_model.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/packaged_model_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/resource_profile.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/resources_template.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/role.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/role_assignment.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/role_assignments.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/security.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/success_response.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/trained_model_registry.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/trained_model_registry_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/user.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/user_patch_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/models/user_request.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/rest.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/setup.py +1 -1
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/README.md +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/__main__.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/_util.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/deployment.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/errors.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/model.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/registry.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/render.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/role.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/sso.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/test/conftest.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/token.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/user.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/cli/version.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/api/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/api/_util.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/api/authentication.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/api/certs.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/api/errors.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/api/request.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/check.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/constants.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/declarative_argparse.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/requests.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/common/util.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli/util.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/dependency_links.txt +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/entry_points.txt +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/not-zip-safe +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/requires.txt +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/top_level.txt +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api/__init__.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/api_response.py +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/aiolirest/py.typed +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/pyproject.toml +0 -0
- {aioli_sdk-1.2.0.dev9 → aioli_sdk-1.2.0.dev11}/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-dev11"
|
|
@@ -22,6 +22,7 @@ from aioli.cli.model import args_description as model_args_description
|
|
|
22
22
|
from aioli.cli.registry import args_description as registry_args_description
|
|
23
23
|
from aioli.cli.role import args_description as role_args_description
|
|
24
24
|
from aioli.cli.sso import args_description as sso_args_description
|
|
25
|
+
from aioli.cli.template import args_description as template_args_description
|
|
25
26
|
from aioli.cli.token import args_description as deployment_token_args_description
|
|
26
27
|
from aioli.cli.user import args_description as user_args_description
|
|
27
28
|
from aioli.cli.version import args_description as version_args_description
|
|
@@ -62,6 +63,7 @@ all_args_description: ArgsDescription = (
|
|
|
62
63
|
+ role_args_description
|
|
63
64
|
+ sso_args_description
|
|
64
65
|
+ deployment_token_args_description
|
|
66
|
+
+ template_args_description
|
|
65
67
|
)
|
|
66
68
|
|
|
67
69
|
|
|
@@ -98,9 +100,10 @@ def main(
|
|
|
98
100
|
|
|
99
101
|
parsed_args = parser.parse_args(args)
|
|
100
102
|
parsed_args.controller = parsed_args.controller.rstrip("/")
|
|
101
|
-
|
|
103
|
+
url = urllib.parse.urlparse(parsed_args.controller)
|
|
104
|
+
netloc = url.netloc
|
|
102
105
|
if netloc:
|
|
103
|
-
parsed_args.controller = netloc
|
|
106
|
+
parsed_args.controller = url.scheme + "://" + url.netloc
|
|
104
107
|
|
|
105
108
|
v = vars(parsed_args)
|
|
106
109
|
if not v.get("func"):
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
# © Copyright 2024 Hewlett Packard Enterprise Development LP
|
|
2
|
+
from argparse import Namespace
|
|
3
|
+
from typing import Any, List
|
|
4
|
+
|
|
5
|
+
import aiolirest
|
|
6
|
+
from aioli import cli
|
|
7
|
+
from aioli.cli import render
|
|
8
|
+
from aioli.common.api import authentication
|
|
9
|
+
from aioli.common.api.errors import NotFoundException
|
|
10
|
+
from aioli.common.declarative_argparse import Arg, Cmd, Group, ArgsDescription
|
|
11
|
+
from aiolirest.models.auto_scaling_template import AutoScalingTemplate
|
|
12
|
+
from aiolirest.models.autoscaling import Autoscaling
|
|
13
|
+
from aiolirest.models.configuration_resources import ConfigurationResources
|
|
14
|
+
from aiolirest.models.resource_profile import ResourceProfile
|
|
15
|
+
from aiolirest.models.resources_template import ResourcesTemplate
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@authentication.required
|
|
19
|
+
def list_resource_templates(args: Namespace) -> None:
|
|
20
|
+
with cli.setup_session(args) as session:
|
|
21
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
22
|
+
response = api_instance.templates_resources_get()
|
|
23
|
+
|
|
24
|
+
def format_resource_template(rt: ResourcesTemplate) -> List[Any]:
|
|
25
|
+
result = [
|
|
26
|
+
rt.name,
|
|
27
|
+
rt.description,
|
|
28
|
+
"Request: " + rt.resources.requests.cpu + ", Limit: " + rt.resources.limits.cpu,
|
|
29
|
+
"Request: " + rt.resources.requests.memory + ", Limit: " + rt.resources.limits.memory,
|
|
30
|
+
"Request: " + rt.resources.requests.gpu + ", Limit: " + rt.resources.limits.gpu,
|
|
31
|
+
rt.resources.gpu_type,
|
|
32
|
+
]
|
|
33
|
+
return result
|
|
34
|
+
|
|
35
|
+
headers = ["Name", "Description", "CPU", "Memory", "GPU", "GPU Type"]
|
|
36
|
+
values = [format_resource_template(rt) for rt in response]
|
|
37
|
+
render.tabulate_or_csv(headers, values, False)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def lookup_resource_template(name: str, api: aiolirest.TemplatesApi) -> ResourcesTemplate:
|
|
41
|
+
for rt in api.templates_resources_get():
|
|
42
|
+
if rt.name == name:
|
|
43
|
+
return rt
|
|
44
|
+
raise NotFoundException(f"resource template {name} not found")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@authentication.required
|
|
48
|
+
def show_resource_template(args: Namespace) -> None:
|
|
49
|
+
with cli.setup_session(args) as session:
|
|
50
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
51
|
+
|
|
52
|
+
resource_template = lookup_resource_template(args.name, api_instance)
|
|
53
|
+
|
|
54
|
+
rtd = resource_template.to_dict()
|
|
55
|
+
if args.json:
|
|
56
|
+
render.print_json(rtd)
|
|
57
|
+
else:
|
|
58
|
+
print(render.format_object_as_yaml(rtd))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@authentication.required
|
|
62
|
+
def create_resource_template(args: Namespace) -> None:
|
|
63
|
+
with cli.setup_session(args) as session:
|
|
64
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
65
|
+
|
|
66
|
+
rt = ResourcesTemplate(
|
|
67
|
+
description=args.description,
|
|
68
|
+
name=args.name,
|
|
69
|
+
resources=ConfigurationResources(
|
|
70
|
+
gpu_type=args.gpu_type,
|
|
71
|
+
limits=ResourceProfile(
|
|
72
|
+
cpu=args.limits_cpu, gpu=args.limits_gpu, memory=args.limits_memory
|
|
73
|
+
),
|
|
74
|
+
requests=ResourceProfile(
|
|
75
|
+
cpu=args.requests_cpu, gpu=args.requests_gpu, memory=args.requests_memory
|
|
76
|
+
),
|
|
77
|
+
),
|
|
78
|
+
)
|
|
79
|
+
api_instance.templates_resources_post(rt)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@authentication.required
|
|
83
|
+
def update_resource_template(args: Namespace) -> None:
|
|
84
|
+
with cli.setup_session(args) as session:
|
|
85
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
86
|
+
found = lookup_resource_template(args.templatename, api_instance)
|
|
87
|
+
|
|
88
|
+
orig_name = found.name
|
|
89
|
+
|
|
90
|
+
if args.name is not None:
|
|
91
|
+
found.name = args.name
|
|
92
|
+
|
|
93
|
+
if args.description is not None:
|
|
94
|
+
found.description = args.description
|
|
95
|
+
|
|
96
|
+
if args.gpu_type is not None:
|
|
97
|
+
found.resources.gpu_type = args.gpu_type
|
|
98
|
+
|
|
99
|
+
if args.limits_cpu is not None:
|
|
100
|
+
found.resources.limits.cpu = args.limits_cpu
|
|
101
|
+
|
|
102
|
+
if args.limits_memory is not None:
|
|
103
|
+
found.resources.limits.memory = args.limits_memory
|
|
104
|
+
|
|
105
|
+
if args.limits_gpu is not None:
|
|
106
|
+
found.resources.limits.gpu = args.limits_gpu
|
|
107
|
+
|
|
108
|
+
if args.requests_cpu is not None:
|
|
109
|
+
found.resources.requests.cpu = args.requests_cpu
|
|
110
|
+
|
|
111
|
+
if args.requests_memory is not None:
|
|
112
|
+
found.resources.requests.memory = args.requests_memory
|
|
113
|
+
|
|
114
|
+
if args.requests_gpu is not None:
|
|
115
|
+
found.resources.requests.gpu = args.requests_gpu
|
|
116
|
+
|
|
117
|
+
headers = {"Content-Type": "application/json"}
|
|
118
|
+
assert orig_name is not None
|
|
119
|
+
api_instance.templates_resources_name_put(orig_name, found, _headers=headers)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@authentication.required
|
|
123
|
+
def delete_resource_template(args: Namespace) -> None:
|
|
124
|
+
with cli.setup_session(args) as session:
|
|
125
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
126
|
+
found = lookup_resource_template(args.name, api_instance)
|
|
127
|
+
assert found.name is not None
|
|
128
|
+
api_instance.templates_resources_name_delete(found.name)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@authentication.required
|
|
132
|
+
def list_autoscaling_templates(args: Namespace) -> None:
|
|
133
|
+
with cli.setup_session(args) as session:
|
|
134
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
135
|
+
response = api_instance.templates_autoscaling_get()
|
|
136
|
+
|
|
137
|
+
def format_autoscaling_template(at: AutoScalingTemplate) -> List[Any]:
|
|
138
|
+
result = [
|
|
139
|
+
at.name,
|
|
140
|
+
at.description,
|
|
141
|
+
at.auto_scaling.min_replicas,
|
|
142
|
+
at.auto_scaling.max_replicas,
|
|
143
|
+
at.auto_scaling.metric,
|
|
144
|
+
at.auto_scaling.target,
|
|
145
|
+
]
|
|
146
|
+
return result
|
|
147
|
+
|
|
148
|
+
headers = ["Name", "Description", "MinReplicas", "MaxReplicas", "Metric", "Target"]
|
|
149
|
+
values = [format_autoscaling_template(at) for at in response]
|
|
150
|
+
render.tabulate_or_csv(headers, values, False)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def lookup_autoscaling_template(name: str, api: aiolirest.TemplatesApi) -> AutoScalingTemplate:
|
|
154
|
+
for at in api.templates_autoscaling_get():
|
|
155
|
+
if at.name == name:
|
|
156
|
+
return at
|
|
157
|
+
raise NotFoundException(f"autoscaling template {name} not found")
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@authentication.required
|
|
161
|
+
def show_autoscaling_template(args: Namespace) -> None:
|
|
162
|
+
with cli.setup_session(args) as session:
|
|
163
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
164
|
+
|
|
165
|
+
autoscaling_template = lookup_autoscaling_template(args.name, api_instance)
|
|
166
|
+
|
|
167
|
+
atd = autoscaling_template.to_dict()
|
|
168
|
+
if args.json:
|
|
169
|
+
render.print_json(atd)
|
|
170
|
+
else:
|
|
171
|
+
print(render.format_object_as_yaml(atd))
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@authentication.required
|
|
175
|
+
def create_autoscaling_template(args: Namespace) -> None:
|
|
176
|
+
with cli.setup_session(args) as session:
|
|
177
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
178
|
+
|
|
179
|
+
at = AutoScalingTemplate(
|
|
180
|
+
auto_scaling=Autoscaling(
|
|
181
|
+
autoscaling_max_replicas=args.autoscaling_max_replicas,
|
|
182
|
+
metric=args.autoscaling_metric,
|
|
183
|
+
min_replicas=args.autoscaling_min_replicas,
|
|
184
|
+
target=args.autoscaling_target,
|
|
185
|
+
),
|
|
186
|
+
description=args.description,
|
|
187
|
+
name=args.name,
|
|
188
|
+
)
|
|
189
|
+
api_instance.templates_autoscaling_post(at)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@authentication.required
|
|
193
|
+
def update_autoscaling_template(args: Namespace) -> None:
|
|
194
|
+
with cli.setup_session(args) as session:
|
|
195
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
196
|
+
found = lookup_autoscaling_template(args.templatename, api_instance)
|
|
197
|
+
|
|
198
|
+
orig_name = found.name
|
|
199
|
+
|
|
200
|
+
if args.name is not None:
|
|
201
|
+
found.name = args.name
|
|
202
|
+
|
|
203
|
+
if args.description is not None:
|
|
204
|
+
found.description = args.description
|
|
205
|
+
|
|
206
|
+
if args.autoscaling_min_replicas is not None:
|
|
207
|
+
found.auto_scaling.min_replicas = args.autoscaling_min_replicas
|
|
208
|
+
|
|
209
|
+
if args.autoscaling_max_replicas is not None:
|
|
210
|
+
found.auto_scaling.max_replicas = args.autoscaling_max_replicas
|
|
211
|
+
|
|
212
|
+
if args.autoscaling_metric is not None:
|
|
213
|
+
found.auto_scaling.metric = args.autoscaling_metric
|
|
214
|
+
|
|
215
|
+
if args.autoscaling_target is not None:
|
|
216
|
+
found.auto_scaling.target = args.autoscaling_target
|
|
217
|
+
|
|
218
|
+
headers = {"Content-Type": "application/json"}
|
|
219
|
+
assert orig_name is not None
|
|
220
|
+
api_instance.templates_autoscaling_name_put(orig_name, found, _headers=headers)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
@authentication.required
|
|
224
|
+
def delete_autoscaling_template(args: Namespace) -> None:
|
|
225
|
+
with cli.setup_session(args) as session:
|
|
226
|
+
api_instance = aiolirest.TemplatesApi(session)
|
|
227
|
+
found = lookup_autoscaling_template(args.name, api_instance)
|
|
228
|
+
assert found.name is not None
|
|
229
|
+
api_instance.templates_autoscaling_name_delete(found.name)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
common_resource_template_args: ArgsDescription = [
|
|
233
|
+
Arg("--description", help="Description of the resource template."),
|
|
234
|
+
Arg("--gpu-type", help="GPU type required"),
|
|
235
|
+
Arg("--limits-cpu", help="CPU limit"),
|
|
236
|
+
Arg("--limits-memory", help="Memory limit"),
|
|
237
|
+
Arg("--limits-gpu", help="GPU limit"),
|
|
238
|
+
Arg("--requests-cpu", help="CPU request"),
|
|
239
|
+
Arg("--requests-memory", help="Memory request"),
|
|
240
|
+
Arg("--requests-gpu", help="GPU request"),
|
|
241
|
+
]
|
|
242
|
+
|
|
243
|
+
main_cmd = Cmd(
|
|
244
|
+
"template|s",
|
|
245
|
+
None,
|
|
246
|
+
"manage templates",
|
|
247
|
+
[
|
|
248
|
+
Cmd(
|
|
249
|
+
"resource|s",
|
|
250
|
+
None,
|
|
251
|
+
"manage resource templates",
|
|
252
|
+
[
|
|
253
|
+
Cmd("list ls", list_resource_templates, "list resource templates", []),
|
|
254
|
+
Cmd(
|
|
255
|
+
"show",
|
|
256
|
+
show_resource_template,
|
|
257
|
+
"show a resource template",
|
|
258
|
+
[
|
|
259
|
+
Arg("name", help="The name of the resource template."),
|
|
260
|
+
Group(
|
|
261
|
+
Arg("--yaml", action="store_true", help="print as YAML", default=True),
|
|
262
|
+
Arg("--json", action="store_true", help="print as JSON"),
|
|
263
|
+
),
|
|
264
|
+
],
|
|
265
|
+
),
|
|
266
|
+
Cmd(
|
|
267
|
+
"create",
|
|
268
|
+
create_resource_template,
|
|
269
|
+
"create a resource template",
|
|
270
|
+
[
|
|
271
|
+
Arg(
|
|
272
|
+
"name",
|
|
273
|
+
help="The name of the resource resource template. Must begin "
|
|
274
|
+
+ "with a letter, but may contain letters, numbers, "
|
|
275
|
+
+ "underscore, and hyphen.",
|
|
276
|
+
),
|
|
277
|
+
]
|
|
278
|
+
+ common_resource_template_args,
|
|
279
|
+
),
|
|
280
|
+
Cmd(
|
|
281
|
+
"delete",
|
|
282
|
+
delete_resource_template,
|
|
283
|
+
"delete a resource template",
|
|
284
|
+
[Arg("name", help="The name of the resource template.")],
|
|
285
|
+
),
|
|
286
|
+
Cmd(
|
|
287
|
+
"update",
|
|
288
|
+
update_resource_template,
|
|
289
|
+
"update a resource template",
|
|
290
|
+
[
|
|
291
|
+
Arg("templatename", help="The name of the resource template."),
|
|
292
|
+
Arg(
|
|
293
|
+
"--name",
|
|
294
|
+
help="The new name of the resource template. Must begin "
|
|
295
|
+
"with a letter, but may contain letters, numbers, and hyphen.",
|
|
296
|
+
),
|
|
297
|
+
]
|
|
298
|
+
+ common_resource_template_args,
|
|
299
|
+
),
|
|
300
|
+
],
|
|
301
|
+
),
|
|
302
|
+
Cmd(
|
|
303
|
+
"autoscaling|s",
|
|
304
|
+
None,
|
|
305
|
+
"manage autoscaling templates",
|
|
306
|
+
[
|
|
307
|
+
Cmd("list ls", list_autoscaling_templates, "list autoscaling templates", []),
|
|
308
|
+
Cmd(
|
|
309
|
+
"show",
|
|
310
|
+
show_autoscaling_template,
|
|
311
|
+
"show an autoscaling template",
|
|
312
|
+
[
|
|
313
|
+
Arg("name", help="The name of the autoscaling template."),
|
|
314
|
+
Group(
|
|
315
|
+
Arg("--yaml", action="store_true", help="print as YAML", default=True),
|
|
316
|
+
Arg("--json", action="store_true", help="print as JSON"),
|
|
317
|
+
),
|
|
318
|
+
],
|
|
319
|
+
),
|
|
320
|
+
Cmd(
|
|
321
|
+
"create",
|
|
322
|
+
create_autoscaling_template,
|
|
323
|
+
"create an autoscaling template",
|
|
324
|
+
[
|
|
325
|
+
Arg(
|
|
326
|
+
"name",
|
|
327
|
+
help="The name of the autoscaling template. Must begin with a letter, "
|
|
328
|
+
+ "but may contain letters, numbers, underscore, and hyphen.",
|
|
329
|
+
),
|
|
330
|
+
Arg("--description", help="Description of the autoscaling template."),
|
|
331
|
+
Arg(
|
|
332
|
+
"--autoscaling-min-replicas",
|
|
333
|
+
help="Minimum number of replicas.",
|
|
334
|
+
required="true",
|
|
335
|
+
type=int,
|
|
336
|
+
),
|
|
337
|
+
Arg(
|
|
338
|
+
"--autoscaling-max-replicas",
|
|
339
|
+
help="Maximum number of replicas.",
|
|
340
|
+
required="true",
|
|
341
|
+
type=int,
|
|
342
|
+
),
|
|
343
|
+
Arg(
|
|
344
|
+
"--autoscaling-metric",
|
|
345
|
+
help="Metric name which controls autoscaling. Possible values include "
|
|
346
|
+
+ "concurrency, rps, cpu, or memory.",
|
|
347
|
+
required="true",
|
|
348
|
+
),
|
|
349
|
+
Arg(
|
|
350
|
+
"--autoscaling-target",
|
|
351
|
+
help="Metric target value.",
|
|
352
|
+
required="true",
|
|
353
|
+
type=int,
|
|
354
|
+
),
|
|
355
|
+
],
|
|
356
|
+
),
|
|
357
|
+
Cmd(
|
|
358
|
+
"delete",
|
|
359
|
+
delete_autoscaling_template,
|
|
360
|
+
"delete an autoscaling template",
|
|
361
|
+
[Arg("name", help="The name of the autoscaling template.")],
|
|
362
|
+
),
|
|
363
|
+
Cmd(
|
|
364
|
+
"update",
|
|
365
|
+
update_autoscaling_template,
|
|
366
|
+
"update an autoscaling template",
|
|
367
|
+
[
|
|
368
|
+
Arg("templatename", help="The name of the autoscaling template."),
|
|
369
|
+
Arg(
|
|
370
|
+
"--name",
|
|
371
|
+
help="The name of the autoscaling template. Must begin with a letter, "
|
|
372
|
+
+ "but may contain letters, numbers, underscore, and hyphen.",
|
|
373
|
+
),
|
|
374
|
+
Arg("--description", help="Description of the autoscaling template."),
|
|
375
|
+
Arg(
|
|
376
|
+
"--autoscaling-min-replicas",
|
|
377
|
+
help="Minimum number of replicas.",
|
|
378
|
+
type=int,
|
|
379
|
+
),
|
|
380
|
+
Arg(
|
|
381
|
+
"--autoscaling-max-replicas",
|
|
382
|
+
help="Maximum number of replicas.",
|
|
383
|
+
type=int,
|
|
384
|
+
),
|
|
385
|
+
Arg(
|
|
386
|
+
"--autoscaling-metric",
|
|
387
|
+
help="Metric name which controls autoscaling. "
|
|
388
|
+
+ "Possible values include concurrency, rps, cpu, or memory.",
|
|
389
|
+
),
|
|
390
|
+
Arg("--autoscaling-target", help="Metric target value.", type=int),
|
|
391
|
+
],
|
|
392
|
+
),
|
|
393
|
+
],
|
|
394
|
+
),
|
|
395
|
+
],
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
args_description = [main_cmd] # type: List[Any]
|
|
@@ -850,3 +850,140 @@ class TestCli:
|
|
|
850
850
|
expected = "testuser-r | | True | True"
|
|
851
851
|
actual = subprocess.check_output(["aioli", "user", "list"]).decode("utf-8")
|
|
852
852
|
assert (actual.find(expected)) > 0
|
|
853
|
+
|
|
854
|
+
def test_template_resource_create_and_update(self, setup_login: None) -> None:
|
|
855
|
+
# Create a resource template
|
|
856
|
+
assert (
|
|
857
|
+
os.system(
|
|
858
|
+
"aioli template resource create my-template "
|
|
859
|
+
'--description "My test reource template" '
|
|
860
|
+
"--gpu-type nvidia "
|
|
861
|
+
"--limits-cpu 10 "
|
|
862
|
+
"--limits-memory 10Gi "
|
|
863
|
+
"--limits-gpu 4 "
|
|
864
|
+
"--requests-cpu 0 "
|
|
865
|
+
"--requests-memory 10Gi "
|
|
866
|
+
"--requests-gpu 4 "
|
|
867
|
+
)
|
|
868
|
+
== 0
|
|
869
|
+
)
|
|
870
|
+
|
|
871
|
+
expected = (
|
|
872
|
+
"my-template | My test reource template | Request: 0, Limit: 10 |"
|
|
873
|
+
" Request: 10Gi, Limit: 10Gi | Request: 4, Limit: 4 | nvidia"
|
|
874
|
+
)
|
|
875
|
+
actual = subprocess.check_output(["aioli", "template", "resource", "list"]).decode("utf-8")
|
|
876
|
+
assert (actual.find(expected)) > 0
|
|
877
|
+
|
|
878
|
+
# Make an update where gpu_type remains unchanged
|
|
879
|
+
assert (
|
|
880
|
+
os.system(
|
|
881
|
+
"aioli template resource update my-template "
|
|
882
|
+
'--description "My updated test resource template" '
|
|
883
|
+
"--limits-cpu 5 "
|
|
884
|
+
"--limits-memory 100Gi "
|
|
885
|
+
"--limits-gpu 0 "
|
|
886
|
+
"--requests-cpu 5 "
|
|
887
|
+
"--requests-memory 100Gi "
|
|
888
|
+
"--requests-gpu 0 "
|
|
889
|
+
)
|
|
890
|
+
== 0
|
|
891
|
+
)
|
|
892
|
+
|
|
893
|
+
expected = (
|
|
894
|
+
"my-template | My updated test resource template | Request: 5, Limit: 5 |"
|
|
895
|
+
" Request: 100Gi, Limit: 100Gi | Request: 0, Limit: 0 | nvidia"
|
|
896
|
+
)
|
|
897
|
+
actual = subprocess.check_output(["aioli", "template", "resource", "list"]).decode("utf-8")
|
|
898
|
+
assert (actual.find(expected)) > 0
|
|
899
|
+
|
|
900
|
+
def test_template_autoscaling_create_and_update(self, setup_login: None) -> None:
|
|
901
|
+
# Create a resource template
|
|
902
|
+
assert (
|
|
903
|
+
os.system(
|
|
904
|
+
"aioli template autoscaling create my-template "
|
|
905
|
+
'--description "My test autoscaling template" '
|
|
906
|
+
"--autoscaling-min-replicas 0 "
|
|
907
|
+
"--autoscaling-max-replicas 2 "
|
|
908
|
+
"--autoscaling-metric rps "
|
|
909
|
+
"--autoscaling-target 25 "
|
|
910
|
+
)
|
|
911
|
+
== 0
|
|
912
|
+
)
|
|
913
|
+
|
|
914
|
+
expected = (
|
|
915
|
+
"my-template | My test autoscaling template "
|
|
916
|
+
" |"
|
|
917
|
+
" 0 | 0 | rps | 25"
|
|
918
|
+
)
|
|
919
|
+
actual = subprocess.check_output(["aioli", "template", "autoscaling", "list"]).decode(
|
|
920
|
+
"utf-8"
|
|
921
|
+
)
|
|
922
|
+
assert (actual.find(expected)) > 0
|
|
923
|
+
|
|
924
|
+
# Make an update where autoscaling_metric remains unchanged
|
|
925
|
+
assert (
|
|
926
|
+
os.system(
|
|
927
|
+
"aioli template autoscaling update my-template "
|
|
928
|
+
'--description "My updated test autoscaling template" '
|
|
929
|
+
"--autoscaling-min-replicas 2 "
|
|
930
|
+
"--autoscaling-max-replicas 2 "
|
|
931
|
+
"--autoscaling-target 50 "
|
|
932
|
+
)
|
|
933
|
+
== 0
|
|
934
|
+
)
|
|
935
|
+
|
|
936
|
+
expected = (
|
|
937
|
+
"my-template | My updated test autoscaling template "
|
|
938
|
+
" | 2 | 2 | rps | 50"
|
|
939
|
+
)
|
|
940
|
+
|
|
941
|
+
actual = subprocess.check_output(["aioli", "template", "autoscaling", "list"]).decode(
|
|
942
|
+
"utf-8"
|
|
943
|
+
)
|
|
944
|
+
assert (actual.find(expected)) > 0
|
|
945
|
+
|
|
946
|
+
def test_template_resource_show(self, setup_login: None) -> None:
|
|
947
|
+
assert os.system("aioli template resource show my-template") == 0
|
|
948
|
+
|
|
949
|
+
expected = yaml.safe_load(
|
|
950
|
+
"description: My updated test resource template\n"
|
|
951
|
+
"name: my-template\n"
|
|
952
|
+
"resources:\n"
|
|
953
|
+
" gpuType: nvidia\n"
|
|
954
|
+
" limits:\n"
|
|
955
|
+
" cpu: '5'\n"
|
|
956
|
+
" gpu: '0'\n"
|
|
957
|
+
" memory: 100Gi\n"
|
|
958
|
+
" requests:\n"
|
|
959
|
+
" cpu: '5'\n"
|
|
960
|
+
" gpu: '0'\n"
|
|
961
|
+
" memory: 100Gi\n"
|
|
962
|
+
)
|
|
963
|
+
actual = yaml.safe_load(
|
|
964
|
+
subprocess.check_output(["aioli", "template", "resource", "show", "my-template"])
|
|
965
|
+
)
|
|
966
|
+
assert actual == expected
|
|
967
|
+
|
|
968
|
+
def test_template_autoscaling_show(self, setup_login: None) -> None:
|
|
969
|
+
assert os.system("aioli template autoscaling show my-template") == 0
|
|
970
|
+
|
|
971
|
+
expected = yaml.safe_load(
|
|
972
|
+
"autoScaling:\n"
|
|
973
|
+
" maxReplicas: 2\n"
|
|
974
|
+
" metric: rps\n"
|
|
975
|
+
" minReplicas: 2\n"
|
|
976
|
+
" target: 50\n"
|
|
977
|
+
"description: My updated test autoscaling template\n"
|
|
978
|
+
"name: my-template\n"
|
|
979
|
+
)
|
|
980
|
+
actual = yaml.safe_load(
|
|
981
|
+
subprocess.check_output(["aioli", "template", "autoscaling", "show", "my-template"])
|
|
982
|
+
)
|
|
983
|
+
assert actual == expected
|
|
984
|
+
|
|
985
|
+
def test_template_resource_delete(self, setup_login: None) -> None:
|
|
986
|
+
assert os.system("aioli template resource delete my-template") == 0
|
|
987
|
+
|
|
988
|
+
def test_template_autoscaling_delete(self, setup_login: None) -> None:
|
|
989
|
+
assert os.system("aioli template autoscaling delete my-template") == 0
|
|
@@ -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-dev11
|
|
11
11
|
Contact: community@determined-ai
|
|
12
12
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
13
13
|
|
|
@@ -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-dev11
|
|
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-dev11
|
|
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-dev11
|
|
9
9
|
Contact: community@determined-ai
|
|
10
10
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
11
11
|
|