aioli-sdk 1.2.0.dev10__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.
Files changed (95) hide show
  1. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/PKG-INFO +1 -1
  2. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/__version__.py +1 -1
  3. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/cli.py +5 -2
  4. aioli_sdk-1.2.0.dev11/aioli/cli/template.py +398 -0
  5. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/test/test_cli.py +137 -0
  6. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/PKG-INFO +1 -1
  7. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/SOURCES.txt +1 -0
  8. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/__init__.py +1 -1
  9. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/authentication_api.py +1 -1
  10. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/deployments_api.py +1 -1
  11. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/information_api.py +1 -1
  12. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/packaged_models_api.py +18 -1
  13. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/registries_api.py +1 -1
  14. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/roles_api.py +1 -1
  15. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/templates_api.py +1 -1
  16. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/tokens_api.py +1 -1
  17. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/users_api.py +1 -1
  18. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api_client.py +1 -1
  19. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/configuration.py +2 -2
  20. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/exceptions.py +1 -1
  21. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/__init__.py +1 -1
  22. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/auto_scaling_template.py +1 -1
  23. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/autoscaling.py +1 -1
  24. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/configuration_resources.py +1 -1
  25. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment.py +1 -1
  26. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_model_version.py +1 -1
  27. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_priority.py +1 -1
  28. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_request.py +1 -1
  29. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_state.py +1 -1
  30. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_token.py +1 -1
  31. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_token_patch_request.py +1 -1
  32. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/deployment_token_request.py +1 -1
  33. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/error_response.py +1 -1
  34. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/event_info.py +1 -1
  35. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/failure_info.py +1 -1
  36. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/login_request.py +1 -1
  37. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/login_response.py +1 -1
  38. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/model_auth_token.py +1 -1
  39. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/model_response.py +1 -1
  40. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/observability.py +1 -1
  41. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/packaged_model.py +1 -1
  42. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/packaged_model_request.py +1 -1
  43. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/resource_profile.py +1 -1
  44. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/resources_template.py +1 -1
  45. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/role.py +1 -1
  46. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/role_assignment.py +1 -1
  47. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/role_assignments.py +1 -1
  48. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/security.py +1 -1
  49. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/success_response.py +1 -1
  50. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/trained_model_registry.py +1 -1
  51. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/trained_model_registry_request.py +1 -1
  52. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/user.py +1 -1
  53. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/user_patch_request.py +1 -1
  54. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/models/user_request.py +1 -1
  55. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/rest.py +1 -1
  56. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/setup.py +1 -1
  57. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/README.md +0 -0
  58. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/__init__.py +0 -0
  59. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/__init__.py +0 -0
  60. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/__main__.py +0 -0
  61. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/_util.py +0 -0
  62. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/deployment.py +0 -0
  63. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/errors.py +0 -0
  64. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/model.py +0 -0
  65. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/registry.py +0 -0
  66. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/render.py +0 -0
  67. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/role.py +0 -0
  68. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/sso.py +0 -0
  69. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/test/conftest.py +0 -0
  70. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/token.py +0 -0
  71. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/user.py +0 -0
  72. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/cli/version.py +0 -0
  73. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/__init__.py +0 -0
  74. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/api/__init__.py +0 -0
  75. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/api/_util.py +0 -0
  76. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/api/authentication.py +0 -0
  77. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/api/certs.py +0 -0
  78. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/api/errors.py +0 -0
  79. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/api/request.py +0 -0
  80. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/check.py +0 -0
  81. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/constants.py +0 -0
  82. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/declarative_argparse.py +0 -0
  83. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/requests.py +0 -0
  84. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/common/util.py +0 -0
  85. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli/util.py +0 -0
  86. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/dependency_links.txt +0 -0
  87. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/entry_points.txt +0 -0
  88. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/not-zip-safe +0 -0
  89. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/requires.txt +0 -0
  90. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aioli_sdk.egg-info/top_level.txt +0 -0
  91. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api/__init__.py +0 -0
  92. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/api_response.py +0 -0
  93. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/aiolirest/py.typed +0 -0
  94. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/pyproject.toml +0 -0
  95. {aioli_sdk-1.2.0.dev10 → aioli_sdk-1.2.0.dev11}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioli-sdk
3
- Version: 1.2.0.dev10
3
+ Version: 1.2.0.dev11
4
4
  Summary: Aioli (AI OnLine Inference), a platform for deploying AI models at scale.
5
5
  Home-page: https://github.com/determined-ai/aioli
6
6
  Author: HPE AI Solutions
@@ -1,2 +1,2 @@
1
1
  # © Copyright 2024 Hewlett Packard Enterprise Development LP
2
- __version__ = "1.2.0-dev10"
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
- netloc = urllib.parse.urlparse(parsed_args.controller).netloc
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioli-sdk
3
- Version: 1.2.0.dev10
3
+ Version: 1.2.0.dev11
4
4
  Summary: Aioli (AI OnLine Inference), a platform for deploying AI models at scale.
5
5
  Home-page: https://github.com/determined-ai/aioli
6
6
  Author: HPE AI Solutions
@@ -15,6 +15,7 @@ aioli/cli/registry.py
15
15
  aioli/cli/render.py
16
16
  aioli/cli/role.py
17
17
  aioli/cli/sso.py
18
+ aioli/cli/template.py
18
19
  aioli/cli/token.py
19
20
  aioli/cli/user.py
20
21
  aioli/cli/version.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-dev10
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-dev10
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-dev10
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-dev10
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