10
10
from spaceone .identity .manager .agent_manager import AgentManager
11
11
from spaceone .identity .manager .app_manager import AppManager
12
12
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
13
15
from spaceone .identity .model import App , ServiceAccount
14
16
from spaceone .identity .model .app .response import AppResponse
15
17
from spaceone .identity .model .service_account .request import *
@@ -36,7 +38,10 @@ def __init__(self, *args, **kwargs):
36
38
self .service_account_mgr = ServiceAccountManager ()
37
39
self .app_mgr = AppManager ()
38
40
self .agent_mgr = AgentManager ()
41
+ self .project_mgr = ProjectManager ()
39
42
self .resource_mgr = ResourceManager ()
43
+ self .rb_mgr = RoleBindingManager ()
44
+ self .user_mgr = UserManager ()
40
45
41
46
@transaction (
42
47
permission = "identity:ServiceAccount.write" ,
@@ -73,8 +78,7 @@ def create(
73
78
)
74
79
75
80
# Check project
76
- project_mgr = ProjectManager ()
77
- project_mgr .get_project (
81
+ self .project_mgr .get_project (
78
82
params .project_id , params .domain_id , params .workspace_id
79
83
)
80
84
@@ -96,6 +100,29 @@ def create(
96
100
params .trusted_account_id = None
97
101
secret_type = "SECRET"
98
102
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
+
99
126
service_account_vo = self .service_account_mgr .create_service_account (
100
127
params .dict ()
101
128
)
@@ -185,6 +212,26 @@ def update(
185
212
params .data ,
186
213
)
187
214
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
188
235
if (
189
236
service_account_vo .secret_id
190
237
and params .project_id
0 commit comments