Skip to content

Commit f9ab372

Browse files
committed
feat: add changed_at to Workspace and modify list of Workspace
Signed-off-by: Youngjin Jo <[email protected]>
1 parent b2b2b8f commit f9ab372

File tree

4 files changed

+61
-14
lines changed

4 files changed

+61
-14
lines changed

src/spaceone/identity/manager/workspace_manager.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import Tuple
2+
from typing import Dict, List, Tuple
33

44
from mongoengine import QuerySet
55
from spaceone.core import cache
@@ -92,5 +92,20 @@ def filter_workspaces(self, **conditions) -> QuerySet:
9292
def list_workspaces(self, query: dict) -> Tuple[QuerySet, int]:
9393
return self.workspace_model.query(**query)
9494

95+
def list_workspace_group_workspaces(
96+
self, workspace_group_id: str, domain_id: str
97+
) -> Tuple[List[Dict[str, str]], int]:
98+
workspace_vos = self.filter_workspaces(
99+
workspace_group_id=workspace_group_id,
100+
domain_id=domain_id,
101+
)
102+
103+
workspace_group_workspaces = [
104+
workspace_vo.to_dict() for workspace_vo in workspace_vos
105+
]
106+
total_count = len(workspace_group_workspaces)
107+
108+
return workspace_group_workspaces, total_count
109+
95110
def stat_workspaces(self, query: dict) -> dict:
96111
return self.workspace_model.stat(**query)

src/spaceone/identity/model/workspace/database.py

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Workspace(MongoModel):
2929
deleted_at = DateTimeField(default=None, null=True)
3030
last_synced_at = DateTimeField(default=None, null=True)
3131
dormant_updated_at = DateTimeField(default=None, null=True)
32+
changed_at = DateTimeField(default=None, null=True)
3233

3334
meta = {
3435
"updatable_fields": [
@@ -47,6 +48,7 @@ class Workspace(MongoModel):
4748
"deleted_at",
4849
"last_synced_at",
4950
"dormant_updated_at",
51+
"changed_at",
5052
],
5153
"minimal_fields": [
5254
"workspace_id",

src/spaceone/identity/model/workspace/response.py

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class WorkspaceResponse(BaseModel):
2828
created_at: Union[datetime, None] = None
2929
last_synced_at: Union[datetime, None] = None
3030
dormant_updated_at: Union[datetime, None] = None
31+
changed_at: Union[datetime, None] = None
3132

3233
def dict(self, *args, **kwargs):
3334
data = super().dict(*args, **kwargs)
@@ -36,6 +37,7 @@ def dict(self, *args, **kwargs):
3637
data["dormant_updated_at"] = utils.datetime_to_iso8601(
3738
data.get("dormant_updated_at")
3839
)
40+
data["changed_at"] = utils.datetime_to_iso8601(data.get("changed_at"))
3941
return data
4042

4143

src/spaceone/identity/service/workspace_service.py

+41-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
from datetime import datetime
23
from typing import Dict, List, Union
34

45
from spaceone.core.error import *
@@ -11,12 +12,9 @@
1112
from spaceone.identity.manager.project_manager import ProjectManager
1213
from spaceone.identity.manager.resource_manager import ResourceManager
1314
from spaceone.identity.manager.role_binding_manager import RoleBindingManager
14-
from spaceone.identity.manager.service_account_manager import \
15-
ServiceAccountManager
16-
from spaceone.identity.manager.trusted_account_manager import \
17-
TrustedAccountManager
18-
from spaceone.identity.manager.workspace_group_manager import \
19-
WorkspaceGroupManager
15+
from spaceone.identity.manager.service_account_manager import ServiceAccountManager
16+
from spaceone.identity.manager.trusted_account_manager import TrustedAccountManager
17+
from spaceone.identity.manager.workspace_group_manager import WorkspaceGroupManager
2018
from spaceone.identity.manager.workspace_manager import WorkspaceManager
2119
from spaceone.identity.model import Workspace
2220
from spaceone.identity.model.workspace.request import *
@@ -125,7 +123,9 @@ def change_workspace_group(
125123
workspace_group_vo = self.workspace_group_mgr.get_workspace_group(
126124
old_workspace_group_id, domain_id
127125
)
128-
self._remove_workspace_from_group(old_workspace_group_id, domain_id)
126+
self._remove_workspace_from_group(
127+
workspace_id, old_workspace_group_id, domain_id
128+
)
129129

130130
if is_updatable:
131131
workspace_vo = self.workspace_mgr.update_workspace_by_vo(
@@ -141,9 +141,11 @@ def change_workspace_group(
141141
workspace_vos = self.workspace_mgr.filter_workspaces(
142142
workspace_group_id=old_workspace_group_id, domain_id=domain_id
143143
)
144-
self.workspace_group_mgr.update_workspace_group_by_vo(
145-
{"workspace_count": len(workspace_vos)}, workspace_group_vo
146-
)
144+
145+
if workspace_vos:
146+
self.workspace_group_mgr.update_workspace_group_by_vo(
147+
{"workspace_count": len(workspace_vos)}, workspace_group_vo
148+
)
147149

148150
return WorkspaceResponse(**workspace_vo.to_dict())
149151

@@ -299,9 +301,20 @@ def list(
299301
"""
300302

301303
query = params.query or {}
302-
workspace_vos, total_count = self.workspace_mgr.list_workspaces(query)
304+
workspace_group_id = params.workspace_group_id
305+
306+
if not workspace_group_id:
307+
workspace_vos, total_count = self.workspace_mgr.list_workspaces(query)
308+
309+
workspaces_info = [workspace_vo.to_dict() for workspace_vo in workspace_vos]
310+
else:
311+
workspaces_info, total_count = (
312+
self.workspace_mgr.list_workspace_group_workspaces(
313+
params.workspace_group_id,
314+
params.domain_id,
315+
)
316+
)
303317

304-
workspaces_info = [workspace_vo.to_dict() for workspace_vo in workspace_vos]
305318
return WorkspacesResponse(results=workspaces_info, total_count=total_count)
306319

307320
@transaction(permission="identity:Workspace.read", role_types=["DOMAIN_ADMIN"])
@@ -431,13 +444,28 @@ def _add_workspace_to_group(
431444
domain_id,
432445
)
433446

447+
if is_updatable:
448+
workspace_vo.changed_at = datetime.utcnow()
449+
self.workspace_mgr.update_workspace_by_vo(
450+
{"changed_at": workspace_vo.changed_at}, workspace_vo
451+
)
452+
434453
return is_updatable
435454

436455
def _remove_workspace_from_group(
437-
self, old_workspace_group_id: str, domain_id: str
456+
self, workspace_id: str, old_workspace_group_id: str, domain_id: str
438457
) -> None:
439458
self._delete_role_bindings(old_workspace_group_id, domain_id)
440459

460+
if old_workspace_group_id:
461+
workspace_vo = self.workspace_mgr.get_workspace(
462+
workspace_id=workspace_id, domain_id=domain_id
463+
)
464+
workspace_vo.changed_at = datetime.utcnow()
465+
self.workspace_mgr.update_workspace_by_vo(
466+
{"changed_at": workspace_vo.changed_at}, workspace_vo
467+
)
468+
441469
@staticmethod
442470
def _delete_role_bindings(existing_workspace_group_id: str, domain_id: str):
443471
rb_mgr = RoleBindingManager()

0 commit comments

Comments
 (0)