aioli-sdk 1.3.0.dev15__tar.gz → 1.3.0.dev17__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 (106) hide show
  1. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/PKG-INFO +1 -1
  2. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/__version__.py +1 -1
  3. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/cli.py +2 -0
  4. aioli_sdk-1.3.0.dev17/aioli/cli/project.py +181 -0
  5. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/test/test_cli.py +105 -0
  6. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/PKG-INFO +1 -1
  7. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/SOURCES.txt +1 -0
  8. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/__init__.py +1 -1
  9. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/authentication_api.py +1 -1
  10. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/deployments_api.py +1 -1
  11. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/information_api.py +1 -1
  12. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/packaged_models_api.py +1 -1
  13. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/projects_api.py +1 -1
  14. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/registries_api.py +1 -1
  15. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/roles_api.py +1 -1
  16. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/templates_api.py +1 -1
  17. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/tokens_api.py +1 -1
  18. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/users_api.py +4 -4
  19. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api_client.py +1 -1
  20. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/configuration.py +2 -2
  21. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/exceptions.py +1 -1
  22. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/__init__.py +1 -1
  23. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/auto_scaling_template.py +1 -1
  24. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/auto_scaling_template_request.py +1 -1
  25. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/autoscaling.py +1 -1
  26. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/configuration_resources.py +1 -1
  27. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/controller_config.py +1 -1
  28. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/controller_status.py +1 -1
  29. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment.py +1 -1
  30. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_model_version.py +1 -1
  31. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_priority.py +1 -1
  32. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_request.py +1 -1
  33. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_state.py +1 -1
  34. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_token.py +1 -1
  35. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_token_patch_request.py +1 -1
  36. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/deployment_token_request.py +1 -1
  37. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/error_response.py +1 -1
  38. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/event_info.py +1 -1
  39. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/ezua_info.py +1 -1
  40. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/failure_info.py +1 -1
  41. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/login_request.py +1 -1
  42. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/login_response.py +1 -1
  43. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/model_auth_token.py +1 -1
  44. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/model_response.py +1 -1
  45. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/observability.py +1 -1
  46. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/packaged_model.py +1 -1
  47. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/packaged_model_request.py +1 -1
  48. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/project.py +1 -1
  49. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/project_request.py +1 -1
  50. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/resource_profile.py +1 -1
  51. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/resources_template.py +1 -1
  52. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/resources_template_request.py +1 -1
  53. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/role.py +1 -1
  54. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/role_assignment.py +1 -1
  55. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/role_assignments.py +1 -1
  56. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/security.py +1 -1
  57. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/success_response.py +1 -1
  58. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/telemetry_info.py +1 -1
  59. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/trained_model_registry.py +1 -1
  60. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/trained_model_registry_request.py +1 -1
  61. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/user.py +1 -1
  62. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/user_patch_request.py +4 -2
  63. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/user_request.py +4 -2
  64. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/models/user_session.py +1 -1
  65. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/rest.py +1 -1
  66. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/setup.py +1 -1
  67. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/README.md +0 -0
  68. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/__init__.py +0 -0
  69. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/__init__.py +0 -0
  70. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/__main__.py +0 -0
  71. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/_util.py +0 -0
  72. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/deployment.py +0 -0
  73. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/errors.py +0 -0
  74. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/model.py +0 -0
  75. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/registry.py +0 -0
  76. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/render.py +0 -0
  77. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/role.py +0 -0
  78. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/sso.py +0 -0
  79. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/template.py +0 -0
  80. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/test/conftest.py +0 -0
  81. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/token.py +0 -0
  82. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/user.py +0 -0
  83. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/cli/version.py +0 -0
  84. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/__init__.py +0 -0
  85. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/api/__init__.py +0 -0
  86. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/api/_util.py +0 -0
  87. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/api/authentication.py +0 -0
  88. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/api/certs.py +0 -0
  89. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/api/errors.py +0 -0
  90. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/api/request.py +0 -0
  91. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/check.py +0 -0
  92. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/constants.py +0 -0
  93. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/declarative_argparse.py +0 -0
  94. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/requests.py +0 -0
  95. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/common/util.py +0 -0
  96. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli/util.py +0 -0
  97. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/dependency_links.txt +0 -0
  98. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/entry_points.txt +0 -0
  99. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/not-zip-safe +0 -0
  100. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/requires.txt +0 -0
  101. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aioli_sdk.egg-info/top_level.txt +0 -0
  102. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api/__init__.py +0 -0
  103. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/api_response.py +0 -0
  104. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/aiolirest/py.typed +0 -0
  105. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/pyproject.toml +0 -0
  106. {aioli_sdk-1.3.0.dev15 → aioli_sdk-1.3.0.dev17}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioli-sdk
3
- Version: 1.3.0.dev15
3
+ Version: 1.3.0.dev17
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.3.0-dev15"
2
+ __version__ = "1.3.0-dev17"
@@ -19,6 +19,7 @@ import aioli
19
19
  from aioli.cli import render
20
20
  from aioli.cli.deployment import args_description as deployment_args_description
21
21
  from aioli.cli.model import args_description as model_args_description
22
+ from aioli.cli.project import args_description as project_args_description
22
23
  from aioli.cli.registry import args_description as registry_args_description
23
24
  from aioli.cli.role import args_description as role_args_description
24
25
  from aioli.cli.sso import args_description as sso_args_description
@@ -55,6 +56,7 @@ args_description: ArgsDescription = [
55
56
  ]
56
57
  all_args_description: ArgsDescription = (
57
58
  args_description
59
+ + project_args_description
58
60
  + registry_args_description
59
61
  + model_args_description
60
62
  + deployment_args_description
@@ -0,0 +1,181 @@
1
+ # © Copyright 2024 Hewlett Packard Enterprise Development LP
2
+ from argparse import Namespace
3
+ from typing import Any, Dict, 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
11
+ from aiolirest.models.project import Project
12
+ from aiolirest.models.project_request import ProjectRequest
13
+
14
+
15
+ @authentication.required
16
+ def list_projects(args: Namespace) -> None:
17
+ with cli.setup_session(args) as session:
18
+ api_instance = aiolirest.ProjectsApi(session)
19
+ response = api_instance.projects_get()
20
+
21
+ if args.json:
22
+ render.print_json(format_json(response))
23
+ elif args.yaml:
24
+ print(render.format_object_as_yaml(format_json(response)))
25
+ else:
26
+ headers = ["Name", "Description", "Owner"]
27
+ values = [[p.name, p.description, p.owner] for p in response]
28
+ values.sort() # sort values by the first column
29
+ render.tabulate_or_csv(headers, values, args.csv)
30
+
31
+
32
+ def format_json(response: List[Project]) -> List[Dict[str, str]]:
33
+ return [project_to_dict(r) for r in response]
34
+
35
+
36
+ def project_to_dict(project: Project) -> Dict[str, str]:
37
+ # Don't use the r.to_json() method as it adds backslash escapes for double quotes
38
+ d: Dict[str, str] = project.to_dict()
39
+ d.pop("id")
40
+ d.pop("modifiedAt")
41
+ return d
42
+
43
+
44
+ @authentication.required
45
+ def create_project(args: Namespace) -> None:
46
+ with cli.setup_session(args) as session:
47
+ api_instance = aiolirest.ProjectsApi(session)
48
+
49
+ project_request = ProjectRequest(
50
+ name=args.name,
51
+ description=args.description,
52
+ owner=args.owner,
53
+ )
54
+ api_instance.projects_post(project_request)
55
+
56
+
57
+ @authentication.required
58
+ def update_project(args: Namespace) -> None:
59
+ with cli.setup_session(args) as session:
60
+ api_instance = aiolirest.ProjectsApi(session)
61
+ found = lookup_project(args.projectname, api_instance)
62
+ request = ProjectRequest(
63
+ name=found.name,
64
+ description=found.description,
65
+ owner=found.owner,
66
+ )
67
+ if args.name is not None:
68
+ request.name = args.name
69
+
70
+ if args.description is not None:
71
+ request.description = args.description
72
+
73
+ if args.owner is not None:
74
+ request.owner = args.owner
75
+
76
+ headers = {"Content-Type": "application/json"}
77
+ assert found.id is not None
78
+ api_instance.projects_id_put(found.id, request, _headers=headers)
79
+
80
+
81
+ @authentication.required
82
+ def delete_project(args: Namespace) -> None:
83
+ with cli.setup_session(args) as session:
84
+ api_instance = aiolirest.ProjectsApi(session)
85
+ found = lookup_project(args.name, api_instance)
86
+ assert found.id is not None
87
+ api_instance.projects_id_delete(found.id)
88
+
89
+
90
+ @authentication.required
91
+ def show_project(args: Namespace) -> None:
92
+ with cli.setup_session(args) as session:
93
+ api_instance = aiolirest.ProjectsApi(session)
94
+
95
+ project = lookup_project(args.name, api_instance)
96
+
97
+ d = project.to_dict()
98
+ if args.json:
99
+ render.print_json(d)
100
+ else:
101
+ print(render.format_object_as_yaml(d))
102
+
103
+
104
+ def lookup_project(name: str, api: aiolirest.ProjectsApi) -> Project:
105
+ for p in api.projects_get():
106
+ if p.name == name:
107
+ return p
108
+ raise NotFoundException(f"Project {name} not found")
109
+
110
+
111
+ main_cmd = Cmd(
112
+ "projects p|roject",
113
+ None,
114
+ "manage projects",
115
+ [
116
+ Cmd(
117
+ "list ls",
118
+ list_projects,
119
+ "list projects",
120
+ [
121
+ Group(
122
+ Arg("--csv", action="store_true", help="print as CSV"),
123
+ Arg("--json", action="store_true", help="print as JSON"),
124
+ Arg("--yaml", action="store_true", help="print as YAML"),
125
+ ),
126
+ ],
127
+ is_default=True,
128
+ ),
129
+ Cmd(
130
+ "create",
131
+ create_project,
132
+ "create a project",
133
+ [
134
+ Arg(
135
+ "name",
136
+ help="The name of the project. Must begin with a letter, but may "
137
+ "contain letters, numbers, and hyphen",
138
+ ),
139
+ Arg("--description", help="The description of the project"),
140
+ Arg("--owner", help="The owner of the project"),
141
+ ],
142
+ ),
143
+ Cmd(
144
+ "update",
145
+ update_project,
146
+ "modify a project",
147
+ [
148
+ Arg("projectname", help="The name of the project"),
149
+ Arg(
150
+ "--name",
151
+ help="The new name of the project. Must begin with a letter, but may "
152
+ "contain letters, numbers, and hyphen",
153
+ ),
154
+ Arg("--description", help="The new description of the project"),
155
+ Arg("--owner", help="The owner of the project"),
156
+ ],
157
+ ),
158
+ Cmd(
159
+ "delete",
160
+ delete_project,
161
+ "delete a project",
162
+ [
163
+ Arg("name", help="The name of the project"),
164
+ ],
165
+ ),
166
+ Cmd(
167
+ "show",
168
+ show_project,
169
+ "show a project",
170
+ [
171
+ Arg("name", help="The name of the project"),
172
+ Group(
173
+ Arg("--yaml", action="store_true", help="print as YAML", default=True),
174
+ Arg("--json", action="store_true", help="print as JSON"),
175
+ ),
176
+ ],
177
+ ),
178
+ ],
179
+ )
180
+
181
+ args_description = [main_cmd] # type: List[Any]
@@ -26,6 +26,111 @@ class TestCli:
26
26
  actual = os.popen("aioli --version").read().strip()
27
27
  assert actual != bad_version
28
28
 
29
+ def test_project_list(self, setup_login: None) -> None:
30
+ # Validating table headers, expect to see the default project
31
+ expected = (
32
+ " Name | Description | Owner\n"
33
+ "---------+---------------------+---------\n"
34
+ " default | The default project | admin\n"
35
+ )
36
+ actual = subprocess.check_output(["aioli", "project", "list"]).decode("utf-8")
37
+ assert actual == expected
38
+
39
+ def test_project_create(self, setup_login: None) -> None:
40
+ # Create a project and test for expected values
41
+ assert (
42
+ os.system(
43
+ "aioli project create proj-2 " "--description 'the test project' " "--owner admin"
44
+ )
45
+ == 0
46
+ )
47
+ expected = "proj-2 | the test project | admin"
48
+ actual = subprocess.check_output(["aioli", "project", "list"]).decode("utf-8")
49
+ assert (actual.find(expected)) > 0
50
+
51
+ def test_project_list_csv(self, setup_login: None) -> None:
52
+ csv_output = subprocess.check_output(["aioli", "project", "list", "--csv"]).decode("utf-8")
53
+ temp_file: str = "/tmp/test-cli-p.csv"
54
+ with open(temp_file, "w") as file:
55
+ file.write(csv_output)
56
+ with open(temp_file, newline="") as file:
57
+ reader = csv.DictReader(file)
58
+ row1 = reader.__next__()
59
+ assert row1["Name"] == "default", "Expected default"
60
+ assert row1["Description"] == "The default project", "Expected The default project"
61
+ assert row1["Owner"] == "admin", "Expected admin"
62
+ row2 = reader.__next__()
63
+ assert row2["Name"] == "proj-2", "Expected proj-2"
64
+ assert row2["Description"] == "the test project", "Expected the test project"
65
+ assert row2["Owner"] == "admin", "Expected admin"
66
+
67
+ # fmt: off
68
+ def test_project_list_json_yaml(self, setup_login: None) -> None:
69
+ expected = (
70
+ '[\n' # noqa: Q000
71
+ ' {\n' # noqa: Q000
72
+ ' "description": "the test project",\n'
73
+ ' "name": "proj-2",\n'
74
+ ' "owner": "admin"\n'
75
+ ' },\n' # noqa: Q000
76
+ ' {\n' # noqa: Q000
77
+ ' "description": "The default project",\n'
78
+ ' "name": "default",\n'
79
+ ' "owner": "admin"\n'
80
+ ' }\n' # noqa: Q000
81
+ ']\n' # noqa: Q000
82
+ )
83
+ actual = subprocess.check_output(
84
+ ["aioli", "project", "list", "--json"]).decode("utf-8")
85
+ assert actual == expected
86
+
87
+ expected_obj = json.loads(expected)
88
+ actual_obj = yaml.safe_load(
89
+ subprocess.check_output(["aioli", "project", "list", "--yaml"]).decode("utf-8"))
90
+
91
+ assert actual_obj == expected_obj
92
+
93
+ # fmt: on
94
+
95
+ def test_project_update(self, setup_login: None) -> None:
96
+ # Update project and test for expected values
97
+ assert (
98
+ os.system(
99
+ "aioli project update proj-2 --name proj-3 "
100
+ "--description 'the updated test project' "
101
+ "--owner admin"
102
+ )
103
+ == 0
104
+ )
105
+ actual = subprocess.check_output(["aioli", "project", "list"]).decode("utf-8")
106
+ expected = "proj-3 | the updated test project | admin"
107
+ assert (actual.find(expected)) > 0
108
+
109
+ def test_project_delete(self, setup_login: None) -> None:
110
+ # Delete project and test for expected values
111
+ assert os.system("aioli project delete proj-3") == 0
112
+ actual = subprocess.check_output(["aioli", "project", "list"]).decode("utf-8")
113
+ expected = "proj-3"
114
+ assert (actual.find(expected)) < 0 # Expect to be not found
115
+
116
+ def test_project_show(self, setup_login: None) -> None:
117
+ # Show project and test for expected values
118
+ expected = "description: The default project\nname: default\nowner: admin"
119
+ result = subprocess.check_output(["aioli", "project", "show", "default"]).decode("utf-8")
120
+ result_list = result.split("\n")
121
+ filtered_result = ""
122
+
123
+ # Filter out modifiedAt and id fields as they vary for each test run
124
+ for line in result_list:
125
+ if "modifiedAt" in line:
126
+ continue
127
+ if "id" in line:
128
+ continue
129
+ filtered_result = filtered_result + "\n" + line
130
+
131
+ actual = filtered_result.strip()
132
+ assert actual == expected
133
+
29
134
  def test_registry_list(self, setup_login: None) -> None:
30
135
  # Validating table headers, there are no entries yet
31
136
  assert os.system("aioli registry list") == 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioli-sdk
3
- Version: 1.3.0.dev15
3
+ Version: 1.3.0.dev17
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
@@ -11,6 +11,7 @@ aioli/cli/cli.py
11
11
  aioli/cli/deployment.py
12
12
  aioli/cli/errors.py
13
13
  aioli/cli/model.py
14
+ aioli/cli/project.py
14
15
  aioli/cli/registry.py
15
16
  aioli/cli/render.py
16
17
  aioli/cli/role.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.3.0-dev15
10
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
9
9
  Contact: community@determined-ai
10
10
  Generated by OpenAPI Generator (https://openapi-generator.tech)
11
11
 
@@ -868,7 +868,7 @@ class UsersApi:
868
868
  ) -> User:
869
869
  """Update user properties.
870
870
 
871
- Update a user's properties. Provide a body that contains one or more of the properties: - `username` - `displayName` - `password` - `active`
871
+ Update a user's properties. Provide a body that contains one or more of the properties: - `username` - `displayName` - `password` - `active` - `defaultProject`
872
872
 
873
873
  :param id: User ID (required)
874
874
  :type id: str
@@ -943,7 +943,7 @@ class UsersApi:
943
943
  ) -> ApiResponse[User]:
944
944
  """Update user properties.
945
945
 
946
- Update a user's properties. Provide a body that contains one or more of the properties: - `username` - `displayName` - `password` - `active`
946
+ Update a user's properties. Provide a body that contains one or more of the properties: - `username` - `displayName` - `password` - `active` - `defaultProject`
947
947
 
948
948
  :param id: User ID (required)
949
949
  :type id: str
@@ -1018,7 +1018,7 @@ class UsersApi:
1018
1018
  ) -> RESTResponseType:
1019
1019
  """Update user properties.
1020
1020
 
1021
- Update a user's properties. Provide a body that contains one or more of the properties: - `username` - `displayName` - `password` - `active`
1021
+ Update a user's properties. Provide a body that contains one or more of the properties: - `username` - `displayName` - `password` - `active` - `defaultProject`
1022
1022
 
1023
1023
  :param id: User ID (required)
1024
1024
  :type id: str
@@ -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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
9
9
  Contact: community@determined-ai
10
10
  Generated by OpenAPI Generator (https://openapi-generator.tech)
11
11
 
@@ -389,7 +389,7 @@ conf = aiolirest.Configuration(
389
389
  return "Python SDK Debug Report:\n"\
390
390
  "OS: {env}\n"\
391
391
  "Python Version: {pyversion}\n"\
392
- "Version of the API: 1.3.0-dev15\n"\
392
+ "Version of the API: 1.3.0-dev17\n"\
393
393
  "SDK Package Version: 1.0.0".\
394
394
  format(env=sys.platform, pyversion=sys.version)
395
395
 
@@ -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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
9
9
  Contact: community@determined-ai
10
10
  Generated by OpenAPI Generator (https://openapi-generator.tech)
11
11
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  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.
8
8
 
9
- The version of the OpenAPI document: 1.3.0-dev15
9
+ The version of the OpenAPI document: 1.3.0-dev17
10
10
  Contact: community@determined-ai
11
11
  Generated by OpenAPI Generator (https://openapi-generator.tech)
12
12
 
@@ -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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
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.3.0-dev15
8
+ The version of the OpenAPI document: 1.3.0-dev17
9
9
  Contact: community@determined-ai
10
10
  Generated by OpenAPI Generator (https://openapi-generator.tech)
11
11