Skip to content

Commit 819791b

Browse files
authored
Merge pull request #73 from PrivateAIM/hub-0.8.15
Update to Hub 0.8.15
2 parents 9dba6ee + 0db3ec0 commit 819791b

File tree

8 files changed

+68
-270
lines changed

8 files changed

+68
-270
lines changed

.env.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ PYTEST_ADMIN_PASSWORD=start123
77
PYTEST_DEFAULT_MASTER_IMAGE=python/base
88
PYTEST_ASYNC_MAX_RETRIES=5
99
PYTEST_ASYNC_RETRY_DELAY_MILLIS=500
10-
PYTEST_HUB_VERSION=0.8.13
10+
PYTEST_HUB_VERSION=0.8.15

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,5 @@ core_client.delete_node(my_node)
103103
assert core_client.get_node(my_node.id) is None
104104
```
105105

106-
Note that creation, update and deletion isn't available for all resources. Check out the
107-
[documentation](https://privateaim.github.io/hub-python-client/) which methods are available for each resource.
106+
Note that not all method types are implemented for each resource. Check out the
107+
[documentation](https://privateaim.github.io/hub-python-client/) which methods are available.

docs/user_guide.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,14 @@ the singular or plural form of a specific resource name following the
8181

8282
.. note::
8383

84-
Every resource model has an ``id`` attribute. If you commit a resource instance as an ``id`` to either a *get*,
85-
*update* or *delete* method, the client will automatically use the ``id`` attribute of the given resource.
84+
Every resource model (except logging resources) has an ``id`` attribute. If you commit a resource instance as an
85+
``id`` to either a *get*, *update* or *delete* method, the client will automatically use the ``id`` attribute of the
86+
given resource.
8687

8788
.. warning::
8889

89-
Creation, deletion or update methods are not implemented for all resources since there is no endpoint on the Hub in
90-
some cases. Please check the :doc:`API of the clients <clients_api>` to see which methods exist.
90+
Not all methods are implemented for each resource since there is no endpoint on the Hub in some cases. Please check
91+
the :doc:`API of the clients <clients_api>` to see which methods exist.
9192

9293

9394
Overview of implemented resources
@@ -110,7 +111,6 @@ Overview of implemented resources
110111
* nodes
111112
* master image groups
112113
* master images
113-
* master image event logs
114114
* projects
115115
* project nodes
116116
* analyses

flame_hub/_auth_client.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ class CreateUser(BaseModel):
4848
name_locked: bool
4949
first_name: str | None
5050
last_name: str | None
51-
password: str | None
5251

5352

5453
class User(BaseModel):
@@ -465,7 +464,6 @@ def create_user(
465464
name_locked: bool = True,
466465
first_name: str = None,
467466
last_name: str = None,
468-
password: str = None,
469467
) -> User:
470468
return self._create_resource(
471469
User,
@@ -477,7 +475,6 @@ def create_user(
477475
name_locked=name_locked,
478476
first_name=first_name,
479477
last_name=last_name,
480-
password=password,
481478
),
482479
"users",
483480
)
@@ -498,7 +495,6 @@ def update_user(
498495
name_locked: bool | UNSET_T = UNSET,
499496
first_name: str | None | UNSET_T = UNSET,
500497
last_name: str | None | UNSET_T = UNSET,
501-
password: str | None | UNSET_T = UNSET,
502498
) -> User:
503499
return self._update_resource(
504500
User,
@@ -510,7 +506,6 @@ def update_user(
510506
name_locked=name_locked,
511507
first_name=first_name,
512508
last_name=last_name,
513-
password=password,
514509
),
515510
"users",
516511
user_id,

flame_hub/_core_client.py

Lines changed: 41 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
IsOptionalField,
2020
IsIncludable,
2121
get_includable_names,
22+
build_filter_params,
2223
)
2324
from flame_hub._exceptions import new_hub_api_error_from_response
2425
from flame_hub._defaults import DEFAULT_CORE_BASE_URL
@@ -155,18 +156,6 @@ class MasterImage(BaseModel):
155156
updated_at: datetime
156157

157158

158-
class MasterImageEventLog(BaseModel):
159-
id: uuid.UUID
160-
name: str
161-
data: dict | None = None # Hub resource does not have a "data" key if there is no data.
162-
expiring: bool
163-
expires_at: datetime
164-
master_image_id: uuid.UUID | None
165-
master_image: t.Annotated[MasterImage | None, IsIncludable] = None
166-
created_at: datetime
167-
updated_at: datetime
168-
169-
170159
class CreateProject(BaseModel):
171160
description: str | None
172161
master_image_id: t.Annotated[uuid.UUID | None, Field(), WrapValidator(uuid_validator)]
@@ -216,6 +205,16 @@ class UpdateProjectNode(BaseModel):
216205
approval_status: ProjectNodeApprovalStatus | None | UNSET_T = UNSET
217206

218207

208+
LogLevel = t.Literal["emerg", "alert", "crit", "error", "warn", "notice", "info", "debug"]
209+
210+
211+
class Log(BaseModel):
212+
time: str | int
213+
message: str | None
214+
level: LogLevel
215+
labels: dict[str, str | None]
216+
217+
219218
AnalysisBuildStatus = t.Literal["starting", "started", "stopping", "stopped", "finished", "failed"]
220219
AnalysisRunStatus = t.Literal["starting", "started", "running", "stopping", "stopped", "finished", "failed"]
221220

@@ -267,23 +266,6 @@ class UpdateAnalysis(BaseModel):
267266
]
268267

269268

270-
class AnalysisLog(BaseModel):
271-
id: uuid.UUID
272-
component: str | None
273-
command: str | None
274-
event: str | None
275-
error: bool
276-
error_code: str | None
277-
status: str | None
278-
status_message: str | None
279-
meta: str | None
280-
created_at: datetime
281-
updated_at: datetime
282-
analysis_id: uuid.UUID
283-
analysis: t.Annotated[Analysis, IsIncludable] = None
284-
realm_id: uuid.UUID
285-
286-
287269
class CreateAnalysisNode(BaseModel):
288270
analysis_id: t.Annotated[uuid.UUID, Field(), WrapValidator(uuid_validator)]
289271
node_id: t.Annotated[uuid.UUID, Field(), WrapValidator(uuid_validator)]
@@ -298,7 +280,6 @@ class AnalysisNode(CreateAnalysisNode):
298280
approval_status: AnalysisNodeApprovalStatus | None
299281
run_status: AnalysisNodeRunStatus | None
300282
comment: str | None
301-
index: int
302283
artifact_tag: str | None
303284
artifact_digest: str | None
304285
created_at: datetime
@@ -318,27 +299,10 @@ class UpdateAnalysisNode(BaseModel):
318299
class CreateAnalysisNodeLog(BaseModel):
319300
analysis_id: t.Annotated[uuid.UUID, Field(), WrapValidator(uuid_validator)]
320301
node_id: uuid.UUID
321-
error: bool
322-
error_code: str | None
302+
code: str | None
323303
status: str
324-
status_message: str | None
325-
326-
327-
class AnalysisNodeLog(CreateAnalysisNodeLog):
328-
id: uuid.UUID
329-
created_at: datetime
330-
updated_at: datetime
331-
analysis: t.Annotated[Analysis, IsIncludable] = None
332-
node: t.Annotated[Node, IsIncludable] = None
333-
analysis_realm_id: uuid.UUID
334-
node_realm_id: uuid.UUID
335-
336-
337-
class UpdateAnalysisNodeLog(BaseModel):
338-
error: bool | UNSET_T = UNSET
339-
error_code: str | None | UNSET_T = UNSET
340-
status: str | UNSET_T = UNSET
341-
status_message: str | None | UNSET_T = UNSET
304+
message: str | None
305+
level: LogLevel
342306

343307

344308
AnalysisBucketType = t.Literal["CODE", "RESULT", "TEMP"]
@@ -477,27 +441,6 @@ def get_master_image(
477441
def find_master_images(self, **params: te.Unpack[FindAllKwargs]) -> list[MasterImage]:
478442
return self._find_all_resources(MasterImage, "master-images", **params)
479443

480-
def get_master_image_event_log(
481-
self, master_image_event_log_id: MasterImageEventLog | uuid.UUID | str, **params: te.Unpack[GetKwargs]
482-
) -> MasterImageEventLog | None:
483-
return self._get_single_resource(
484-
MasterImageEventLog,
485-
"master-image-event-logs",
486-
master_image_event_log_id,
487-
include=get_includable_names(MasterImageEventLog),
488-
**params,
489-
)
490-
491-
def get_master_image_event_logs(self, **params: te.Unpack[GetKwargs]) -> list[MasterImageEventLog]:
492-
return self._get_all_resources(
493-
MasterImageEventLog, "master-image-event-logs", include=get_includable_names(MasterImageEventLog), **params
494-
)
495-
496-
def find_master_image_event_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[MasterImageEventLog]:
497-
return self._find_all_resources(
498-
MasterImageEventLog, "master-image-event-logs", include=get_includable_names(MasterImageEventLog), **params
499-
)
500-
501444
def get_projects(self, **params: te.Unpack[GetKwargs]) -> list[Project]:
502445
return self._get_all_resources(Project, "projects", include=get_includable_names(Project), **params)
503446

@@ -697,62 +640,37 @@ def create_analysis_node_log(
697640
self,
698641
analysis_id: Analysis | uuid.UUID | str,
699642
node_id: Node | uuid.UUID | str,
700-
error: bool,
701-
error_code: str = None,
702-
status: str = "",
703-
status_message: str = None,
704-
) -> AnalysisNodeLog:
643+
level: LogLevel,
644+
status: str,
645+
code: str = None,
646+
message: str = None,
647+
) -> Log:
705648
return self._create_resource(
706-
AnalysisNodeLog,
649+
Log,
707650
CreateAnalysisNodeLog(
708651
analysis_id=obtain_uuid_from(analysis_id),
709652
node_id=obtain_uuid_from(node_id),
710-
error=error,
711-
error_code=error_code,
653+
code=code,
712654
status=status,
713-
status_message=status_message,
655+
message=message,
656+
level=level,
714657
),
715658
"analysis-node-logs",
716659
)
717660

718-
def get_analysis_node_log(
719-
self, analysis_node_log_id: AnalysisNodeLog | uuid.UUID | str, **params: te.Unpack[GetKwargs]
720-
) -> AnalysisNodeLog | None:
721-
return self._get_single_resource(
722-
AnalysisNodeLog,
723-
"analysis-node-logs",
724-
analysis_node_log_id,
725-
include=get_includable_names(AnalysisNodeLog),
726-
**params,
727-
)
728-
729-
def delete_analysis_node_log(self, analysis_node_log_id: AnalysisNodeLog | uuid.UUID | str):
730-
self._delete_resource("analysis-node-logs", analysis_node_log_id)
731-
732-
def get_analysis_node_logs(self, **params: te.Unpack[GetKwargs]) -> list[AnalysisNodeLog]:
733-
return self._get_all_resources(
734-
AnalysisNodeLog, "analysis-node-logs", include=get_includable_names(AnalysisNodeLog), **params
661+
def delete_analysis_node_logs(self, analysis_id: Analysis | uuid.UUID | str, node_id: Node | uuid.UUID | str):
662+
r = self._client.delete(
663+
"/analysis-node-logs",
664+
params=build_filter_params(
665+
{"analysis_id": str(obtain_uuid_from(analysis_id)), "node_id": str(obtain_uuid_from(node_id))}
666+
),
735667
)
736668

737-
def find_analysis_node_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[AnalysisNodeLog]:
738-
return self._find_all_resources(
739-
AnalysisNodeLog, "analysis-node-logs", include=get_includable_names(AnalysisNodeLog), **params
740-
)
669+
if r.status_code != httpx.codes.ACCEPTED.value:
670+
raise new_hub_api_error_from_response(r)
741671

742-
def update_analysis_node_log(
743-
self,
744-
analysis_node_log_id: AnalysisNodeLog | uuid.UUID | str,
745-
error: bool | UNSET_T = UNSET,
746-
error_code: str | None | UNSET_T = UNSET,
747-
status: str | UNSET_T = UNSET,
748-
status_message: str | None | UNSET_T = UNSET,
749-
) -> AnalysisNodeLog:
750-
return self._update_resource(
751-
AnalysisNodeLog,
752-
UpdateAnalysisNodeLog(error=error, error_code=error_code, status=status, status_message=status_message),
753-
"analysis-node-logs",
754-
analysis_node_log_id,
755-
)
672+
def find_analysis_node_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[Log]:
673+
return self._find_all_resources(Log, "analysis-node-logs", **params)
756674

757675
def get_analysis_buckets(self, **params: te.Unpack[GetKwargs]) -> list[AnalysisBucket]:
758676
return self._get_all_resources(
@@ -939,22 +857,14 @@ def find_registry_projects(self, **params: te.Unpack[FindAllKwargs]) -> list[Reg
939857
**params,
940858
)
941859

942-
def get_analysis_log(
943-
self, analysis_log_id: AnalysisLog | uuid.UUID | str, **params: te.Unpack[GetKwargs]
944-
) -> AnalysisLog | None:
945-
return self._get_single_resource(
946-
AnalysisLog, "analysis-logs", analysis_log_id, include=get_includable_names(AnalysisLog), **params
860+
def delete_analysis_logs(self, analysis_id: Analysis | uuid.UUID | str):
861+
r = self._client.delete(
862+
"/analysis-logs",
863+
params=build_filter_params({"analysis_id": str(obtain_uuid_from(analysis_id))}),
947864
)
948865

949-
def delete_analysis_log(self, analysis_log_id: AnalysisLog | uuid.UUID | str):
950-
self._delete_resource("analysis-logs", analysis_log_id)
951-
952-
def get_analysis_logs(self, **params: te.Unpack[GetKwargs]) -> list[AnalysisLog]:
953-
return self._get_all_resources(
954-
AnalysisLog, "analysis-logs", include=get_includable_names(AnalysisLog), **params
955-
)
866+
if r.status_code != httpx.codes.ACCEPTED.value:
867+
raise new_hub_api_error_from_response(r)
956868

957-
def find_analysis_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[AnalysisLog]:
958-
return self._find_all_resources(
959-
AnalysisLog, "analysis-logs", include=get_includable_names(AnalysisLog), **params
960-
)
869+
def find_analysis_logs(self, **params: te.Unpack[FindAllKwargs]) -> list[Log]:
870+
return self._find_all_resources(Log, "analysis-logs", **params)

flame_hub/models.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
"AnalysisNode",
2424
"UpdateAnalysisNode",
2525
"CreateAnalysisNodeLog",
26-
"AnalysisNodeLog",
27-
"UpdateAnalysisNodeLog",
26+
"Log",
2827
"AnalysisBucketType",
2928
"AnalysisBucket",
3029
"CreateAnalysisBucketFile",
@@ -36,7 +35,6 @@
3635
"CreateRegistryProject",
3736
"RegistryProject",
3837
"UpdateRegistryProject",
39-
"MasterImageEventLog",
4038
"CreateBucket",
4139
"BucketFile",
4240
"Bucket",
@@ -70,7 +68,6 @@
7068
"IsIncludable",
7169
"ResourceListMeta",
7270
"ResourceList",
73-
"AnalysisLog",
7471
"AccessToken",
7572
"RefreshToken",
7673
]
@@ -100,8 +97,7 @@
10097
AnalysisNode,
10198
UpdateAnalysisNode,
10299
CreateAnalysisNodeLog,
103-
AnalysisNodeLog,
104-
UpdateAnalysisNodeLog,
100+
Log,
105101
AnalysisBucketType,
106102
AnalysisBucket,
107103
CreateAnalysisBucketFile,
@@ -113,8 +109,6 @@
113109
CreateRegistryProject,
114110
RegistryProject,
115111
UpdateRegistryProject,
116-
MasterImageEventLog,
117-
AnalysisLog,
118112
)
119113
from ._storage_client import CreateBucket, Bucket, BucketFile
120114
from ._base_client import UNSET, IsOptionalField, IsIncludable, ResourceListMeta, ResourceList

flame_hub/types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"AnalysisNodeApprovalStatus",
1919
"AnalysisNodeRunStatus",
2020
"AnalysisBucketType",
21+
"LogLevel",
2122
"UploadFile",
2223
"UuidIdentifiable",
2324
"ResourceT",
@@ -49,5 +50,6 @@
4950
AnalysisNodeApprovalStatus,
5051
AnalysisNodeRunStatus,
5152
AnalysisBucketType,
53+
LogLevel,
5254
)
5355
from ._storage_client import UploadFile

0 commit comments

Comments
 (0)