Skip to content

Commit db95d25

Browse files
authored
Merge pull request #437 from ImMin5/master
Add service account mgr id field at ServiceAccount
2 parents 296be52 + b078533 commit db95d25

File tree

6 files changed

+75
-3
lines changed

6 files changed

+75
-3
lines changed

src/spaceone/identity/error/custom.py

+4
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,7 @@ class ERROR_WORKSPACE_EXIST_IN_WORKSPACE_GROUP(ERROR_INVALID_ARGUMENT):
3333
class ERROR_USER_EXIST_IN_WORKSPACE_GROUP(ERROR_INVALID_ARGUMENT):
3434
_message = """User exists in Workspace Group. (user_id = {user_id}, workspace_group_id = {workspace_group_id})
3535
Remove the user from the workspace group before deleting the workspace group."""
36+
37+
38+
class ERROR_SERVICE_ACCOUNT_MANAGER_REGISTERED(ERROR_INVALID_ARGUMENT):
39+
_message = "Not allowed to delete because of registered service account manager. (service_account_id = {service_account_id})"

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

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class ServiceAccount(MongoModel):
1818
reference_id = StringField(max_length=255, default=None, null=True)
1919
is_managed = BooleanField(default=False)
2020
cost_info = DictField(default=None)
21+
service_account_mgr_id = StringField(max_length=40, null=True, default=None)
2122
secret_schema_id = StringField(max_length=40)
2223
secret_id = StringField(max_length=40)
2324
trusted_account_id = StringField(max_length=40, null=True, default=None)
@@ -50,6 +51,7 @@ class ServiceAccount(MongoModel):
5051
"state",
5152
"provider",
5253
"is_managed",
54+
"service_account_mgr_id",
5355
"trusted_account_id",
5456
"project_id",
5557
"workspace_id",

src/spaceone/identity/model/service_account/request.py

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ServiceAccountCreateRequest(BaseModel):
2424
secret_schema_id: Union[str, None] = None
2525
secret_data: Union[dict, None] = None
2626
tags: Union[dict, None] = None
27+
service_account_mgr_id: Union[str, None] = None
2728
trusted_account_id: Union[str, None] = None
2829
project_id: str
2930
workspace_id: str
@@ -35,6 +36,7 @@ class ServiceAccountUpdateRequest(BaseModel):
3536
name: Union[str, None] = None
3637
data: Union[dict, None] = None
3738
tags: Union[dict, None] = None
39+
service_account_mgr_id: Union[str, None] = None
3840
project_id: Union[str, None] = None
3941
workspace_id: str
4042
domain_id: str

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

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class ServiceAccountResponse(BaseModel):
1616
tags: Union[dict, None] = None
1717
reference_id: Union[str, None] = None
1818
is_managed: Union[bool, None] = None
19+
service_account_mgr_id: Union[str, None] = None
1920
secret_schema_id: Union[str, None] = None
2021
secret_id: Union[str, None] = None
2122
trusted_account_id: Union[str, None] = None

src/spaceone/identity/service/role_binding_service.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
from spaceone.core.service import *
55
from spaceone.core.service.utils import *
66

7-
from spaceone.identity.error import ERROR_NOT_ALLOWED_TO_DELETE_ROLE_BINDING
7+
from spaceone.identity.error import (
8+
ERROR_NOT_ALLOWED_TO_DELETE_ROLE_BINDING,
9+
ERROR_SERVICE_ACCOUNT_MANAGER_REGISTERED,
10+
)
811
from spaceone.identity.error.error_role import *
912
from spaceone.identity.manager.role_binding_manager import RoleBindingManager
1013
from spaceone.identity.manager.role_manager import RoleManager
14+
from spaceone.identity.manager.service_account_manager import ServiceAccountManager
1115
from spaceone.identity.manager.user_manager import UserManager
1216
from spaceone.identity.manager.workspace_manager import WorkspaceManager
1317
from spaceone.identity.model.role_binding.request import *
@@ -225,6 +229,18 @@ def delete(self, params: RoleBindingDeleteRequest) -> None:
225229
params.role_binding_id, params.domain_id, params.workspace_id
226230
)
227231

232+
if rb_vo.resource_group == "WORKSPACE":
233+
service_account_mgr = ServiceAccountManager()
234+
service_account_vos = service_account_mgr.filter_service_accounts(
235+
domain_id=params.domain_id,
236+
workspace_id=rb_vo.workspace_id,
237+
service_account_mgr_id=rb_vo.user_id,
238+
)
239+
if service_account_vos.count() > 0:
240+
raise ERROR_SERVICE_ACCOUNT_MANAGER_REGISTERED(
241+
service_account_id=service_account_vos[0].service_account_id
242+
)
243+
228244
if rb_vo.workspace_group_id:
229245
raise ERROR_NOT_ALLOWED_TO_DELETE_ROLE_BINDING(
230246
workspace_group_id=rb_vo.workspace_group_id,

src/spaceone/identity/service/service_account_service.py

+49-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from spaceone.identity.manager.agent_manager import AgentManager
1111
from spaceone.identity.manager.app_manager import AppManager
1212
from spaceone.identity.manager.client_secret_manager import ClientSecretManager
13+
from spaceone.identity.manager.role_binding_manager import RoleBindingManager
14+
from spaceone.identity.manager.user_manager import UserManager
1315
from spaceone.identity.model import App, ServiceAccount
1416
from spaceone.identity.model.app.response import AppResponse
1517
from spaceone.identity.model.service_account.request import *
@@ -36,7 +38,10 @@ def __init__(self, *args, **kwargs):
3638
self.service_account_mgr = ServiceAccountManager()
3739
self.app_mgr = AppManager()
3840
self.agent_mgr = AgentManager()
41+
self.project_mgr = ProjectManager()
3942
self.resource_mgr = ResourceManager()
43+
self.rb_mgr = RoleBindingManager()
44+
self.user_mgr = UserManager()
4045

4146
@transaction(
4247
permission="identity:ServiceAccount.write",
@@ -73,8 +78,7 @@ def create(
7378
)
7479

7580
# Check project
76-
project_mgr = ProjectManager()
77-
project_mgr.get_project(
81+
self.project_mgr.get_project(
7882
params.project_id, params.domain_id, params.workspace_id
7983
)
8084

@@ -96,6 +100,29 @@ def create(
96100
params.trusted_account_id = None
97101
secret_type = "SECRET"
98102

103+
if user_id := params.service_account_mgr_id:
104+
# check user_id is valid
105+
self.user_mgr.get_user(user_id=user_id, domain_id=params.domain_id)
106+
107+
rb_vos = self.rb_mgr.filter_role_bindings(
108+
user_id=user_id,
109+
workspace_id=params.workspace_id,
110+
domain_id=params.domain_id,
111+
)
112+
if rb_vos.count() == 0:
113+
raise ERROR_NOT_FOUND(key="service_account_mgr_id", value=user_id)
114+
115+
if rb_vos.count() > 0:
116+
project_vo = self.project_mgr.get_project(
117+
params.project_id, params.domain_id, params.workspace_id
118+
)
119+
120+
if project_vo.project_type == "PRIVATE":
121+
project_users = project_vo.users or []
122+
users = list(set(project_users + [params.service_account_mgr_id]))
123+
add_member_params = {"users": users}
124+
self.project_mgr.update_project_by_vo(add_member_params, project_vo)
125+
99126
service_account_vo = self.service_account_mgr.create_service_account(
100127
params.dict()
101128
)
@@ -185,6 +212,26 @@ def update(
185212
params.data,
186213
)
187214

215+
# check service_account_mgr_id is valid in changed project
216+
if (
217+
params.project_id
218+
and service_account_vo.service_account_mgr_id
219+
and service_account_vo.project_id != params.project_id
220+
):
221+
project_vo = self.project_mgr.get_project(
222+
project_id=params.project_id,
223+
domain_id=params.domain_id,
224+
workspace_id=params.workspace_id,
225+
user_projects=params.user_projects,
226+
)
227+
228+
if (
229+
project_vo.project_type == "PRIVATE"
230+
and service_account_vo.service_account_mgr_id not in project_vo.users
231+
):
232+
params.service_account_mgr_id = None
233+
234+
# change secret's project_id
188235
if (
189236
service_account_vo.secret_id
190237
and params.project_id

0 commit comments

Comments
 (0)