Skip to content

Commit 664ace4

Browse files
authored
Merge pull request #200 from ImMin5/feature-cost-router
Modify logic for manual sync duplicated job
2 parents fb7f571 + 1f0f3a2 commit 664ace4

File tree

3 files changed

+181
-56
lines changed

3 files changed

+181
-56
lines changed

src/spaceone/cost_analysis/interface/grpc/data_source.py

+73-26
Original file line numberDiff line numberDiff line change
@@ -7,78 +7,125 @@
77

88

99
class DataSource(BaseAPI, data_source_pb2_grpc.DataSourceServicer):
10-
1110
pb2 = data_source_pb2
1211
pb2_grpc = data_source_pb2_grpc
1312

1413
def register(self, request, context):
1514
params, metadata = self.parse_request(request, context)
1615

17-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
18-
return self.locator.get_info('DataSourceInfo', data_source_service.register(params))
16+
with self.locator.get_service(
17+
"DataSourceService", metadata
18+
) as data_source_service:
19+
return self.locator.get_info(
20+
"DataSourceInfo", data_source_service.register(params)
21+
)
1922

2023
def update(self, request, context):
2124
params, metadata = self.parse_request(request, context)
2225

23-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
24-
return self.locator.get_info('DataSourceInfo', data_source_service.update(params))
26+
with self.locator.get_service(
27+
"DataSourceService", metadata
28+
) as data_source_service:
29+
return self.locator.get_info(
30+
"DataSourceInfo", data_source_service.update(params)
31+
)
32+
33+
def update_secret_data(self, request, context):
34+
params, metadata = self.parse_request(request, context)
35+
36+
with self.locator.get_service(
37+
"DataSourceService", metadata
38+
) as data_source_service:
39+
return self.locator.get_info(
40+
"DataSourceInfo", data_source_service.update_secret_data(params)
41+
)
2542

2643
def update_plugin(self, request, context):
2744
params, metadata = self.parse_request(request, context)
2845

29-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
30-
return self.locator.get_info('DataSourceInfo', data_source_service.update_plugin(params))
46+
with self.locator.get_service(
47+
"DataSourceService", metadata
48+
) as data_source_service:
49+
return self.locator.get_info(
50+
"DataSourceInfo", data_source_service.update_plugin(params)
51+
)
3152

3253
def verify_plugin(self, request, context):
3354
params, metadata = self.parse_request(request, context)
3455

35-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
56+
with self.locator.get_service(
57+
"DataSourceService", metadata
58+
) as data_source_service:
3659
data_source_service.verify_plugin(params)
37-
return self.locator.get_info('EmptyInfo')
60+
return self.locator.get_info("EmptyInfo")
3861

3962
def enable(self, request, context):
4063
params, metadata = self.parse_request(request, context)
4164

42-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
43-
return self.locator.get_info('DataSourceInfo', data_source_service.enable(params))
65+
with self.locator.get_service(
66+
"DataSourceService", metadata
67+
) as data_source_service:
68+
return self.locator.get_info(
69+
"DataSourceInfo", data_source_service.enable(params)
70+
)
4471

4572
def disable(self, request, context):
4673
params, metadata = self.parse_request(request, context)
4774

48-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
49-
return self.locator.get_info('DataSourceInfo', data_source_service.disable(params))
75+
with self.locator.get_service(
76+
"DataSourceService", metadata
77+
) as data_source_service:
78+
return self.locator.get_info(
79+
"DataSourceInfo", data_source_service.disable(params)
80+
)
5081

5182
def deregister(self, request, context):
5283
params, metadata = self.parse_request(request, context)
5384

54-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
85+
with self.locator.get_service(
86+
"DataSourceService", metadata
87+
) as data_source_service:
5588
data_source_service.deregister(params)
56-
return self.locator.get_info('EmptyInfo')
89+
return self.locator.get_info("EmptyInfo")
5790

5891
def sync(self, request, context):
5992
params, metadata = self.parse_request(request, context)
6093

61-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
62-
return self.locator.get_info('JobInfo', data_source_service.sync(params))
94+
with self.locator.get_service(
95+
"DataSourceService", metadata
96+
) as data_source_service:
97+
return self.locator.get_info("JobInfo", data_source_service.sync(params))
6398

6499
def get(self, request, context):
65100
params, metadata = self.parse_request(request, context)
66101

67-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
68-
return self.locator.get_info('DataSourceInfo', data_source_service.get(params))
102+
with self.locator.get_service(
103+
"DataSourceService", metadata
104+
) as data_source_service:
105+
return self.locator.get_info(
106+
"DataSourceInfo", data_source_service.get(params)
107+
)
69108

70109
def list(self, request, context):
71110
params, metadata = self.parse_request(request, context)
72111

73-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
112+
with self.locator.get_service(
113+
"DataSourceService", metadata
114+
) as data_source_service:
74115
data_source_vos, total_count = data_source_service.list(params)
75-
return self.locator.get_info('DataSourcesInfo',
76-
data_source_vos,
77-
total_count,
78-
minimal=self.get_minimal(params))
116+
return self.locator.get_info(
117+
"DataSourcesInfo",
118+
data_source_vos,
119+
total_count,
120+
minimal=self.get_minimal(params),
121+
)
79122

80123
def stat(self, request, context):
81124
params, metadata = self.parse_request(request, context)
82125

83-
with self.locator.get_service('DataSourceService', metadata) as data_source_service:
84-
return self.locator.get_info('StatisticsInfo', data_source_service.stat(params))
126+
with self.locator.get_service(
127+
"DataSourceService", metadata
128+
) as data_source_service:
129+
return self.locator.get_info(
130+
"StatisticsInfo", data_source_service.stat(params)
131+
)

src/spaceone/cost_analysis/manager/secret_manager.py

+39-20
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,53 @@ def __init__(self, *args, **kwargs):
2020

2121
def create_secret(
2222
self,
23-
secret_data: dict,
24-
resource_group: str,
25-
schema_id: str,
26-
workspace_id: str,
27-
):
23+
params: dict,
24+
domain_id: str = None,
25+
workspace_id: str = None,
26+
) -> dict:
27+
"""
28+
Args:
29+
params (dict): {
30+
'data': 'dict',
31+
'resource_group': 'str',
32+
'schema_id': 'str',
33+
'workspace_id': 'str',
34+
},
35+
'workspace_id' : 'str',
36+
'domain_id' : 'str'
37+
38+
Returns:
39+
secret_info (dict)
40+
"""
41+
2842
def _rollback(secret_id: str):
2943
_LOGGER.info(f"[create_secret._rollback] Delete secret : {secret_id}")
30-
self.delete_secret(secret_id)
31-
32-
params = {
33-
"name": utils.generate_id("secret-cost-data-source"),
34-
"resource_group": resource_group,
35-
"data": secret_data,
36-
"schema_id": schema_id,
37-
"workspace_id": workspace_id,
38-
}
44+
self.delete_secret(secret_id, domain_id)
3945

40-
response = self.secret_connector.dispatch("Secret.create", params)
46+
params.update({"name": utils.generate_id("secret-cost-data-source")})
47+
if self.token_type == "SYSTEM_TOKEN":
48+
response = self.secret_connector.dispatch(
49+
"Secret.create",
50+
params,
51+
x_domain_id=domain_id,
52+
x_workspace_id=workspace_id,
53+
)
54+
else:
55+
response = self.secret_connector.dispatch("Secret.create", params)
4156

4257
_LOGGER.debug(f"[_create_secret] {response}")
43-
secret_id = response["secret_id"]
4458

45-
self.transaction.add_rollback(_rollback, secret_id)
59+
self.transaction.add_rollback(_rollback, response["secret_id"])
4660

47-
return secret_id
61+
return response
4862

49-
def delete_secret(self, secret_id: str):
50-
self.secret_connector.dispatch("Secret.delete", {"secret_id": secret_id})
63+
def delete_secret(self, secret_id: str, domain_id: str = None):
64+
if self.token_type == "SYSTEM_TOKEN":
65+
self.secret_connector.dispatch(
66+
"Secret.delete", {"secret_id": secret_id}, x_domain_id=domain_id
67+
)
68+
else:
69+
self.secret_connector.dispatch("Secret.delete", {"secret_id": secret_id})
5170

5271
def list_secrets(self, query: dict, domain_id: str = None) -> dict:
5372
params = {"query": query}

src/spaceone/cost_analysis/service/data_source_service.py

+69-10
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,16 @@ def register(self, params):
108108
self._verify_plugin(endpoint, plugin_info, domain_id)
109109

110110
secret_mgr: SecretManager = self.locator.get_manager("SecretManager")
111-
secret_id = secret_mgr.create_secret(
112-
secret_data,
113-
resource_group,
114-
plugin_info.get("schema_id"),
115-
params["workspace_id"],
116-
)
117111

118-
params["plugin_info"]["secret_id"] = secret_id
112+
create_secret_params = {
113+
"data": secret_data,
114+
"resource_group": resource_group,
115+
"schema_id": plugin_info.get("schema_id"),
116+
"workspace_id": params["workspace_id"],
117+
}
118+
secret_info = secret_mgr.create_secret(create_secret_params, domain_id)
119+
120+
params["plugin_info"]["secret_id"] = secret_info["secret_id"]
119121
del params["plugin_info"]["secret_data"]
120122

121123
else:
@@ -187,6 +189,65 @@ def update(self, params):
187189

188190
return self.data_source_mgr.update_data_source_by_vo(params, data_source_vo)
189191

192+
@transaction(
193+
permission="cost-analysis:DataSource.write",
194+
role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER"],
195+
)
196+
@check_required(["data_source_id", "secret_schema_id", "secret_data", "domain_id"])
197+
def update_secret_data(self, params: dict) -> DataSource:
198+
"""Update secret data of data source
199+
Args:
200+
params (dict): {
201+
'data_source_id': 'str', # required
202+
'secret_schema_id': 'str', # required
203+
'secret_data': 'dict', # required
204+
'workspace_id': 'str', # injected from auth
205+
'domain_id': 'str' # injected from auth
206+
}
207+
Returns:
208+
data_source_vo (object)
209+
"""
210+
211+
secret_data = params["secret_data"]
212+
secret_schema_id = params["secret_schema_id"]
213+
data_source_id = params["data_source_id"]
214+
workspace_id = params.get("workspace_id")
215+
domain_id = params["domain_id"]
216+
217+
data_source_vo: DataSource = self.data_source_mgr.get_data_source(
218+
data_source_id=data_source_id,
219+
domain_id=domain_id,
220+
workspace_id=workspace_id,
221+
)
222+
223+
if data_source_vo.secret_type == "MANUAL" and secret_data:
224+
secret_mgr: SecretManager = self.locator.get_manager("SecretManager")
225+
# TODO : validate schema
226+
227+
# Delete old secret
228+
if secret_id := data_source_vo.plugin_info.secret_id:
229+
secret_mgr.delete_secret(secret_id, domain_id)
230+
231+
# Create new secret
232+
create_secret_params = {
233+
"schema_id": secret_schema_id,
234+
"data": secret_data,
235+
"resource_group": data_source_vo.resource_group,
236+
"workspace_id": data_source_vo.workspace_id,
237+
}
238+
239+
secret_info = secret_mgr.create_secret(create_secret_params, domain_id)
240+
plugin_info = data_source_vo.plugin_info.to_dict()
241+
plugin_info.update(
242+
{"secret_id": secret_info["secret_id"], "schema_id": secret_schema_id}
243+
)
244+
245+
self.data_source_mgr.update_data_source_by_vo(
246+
{"plugin_info": plugin_info}, data_source_vo
247+
)
248+
249+
return data_source_vo
250+
190251
@transaction(
191252
permission="cost-analysis:DataSource.write",
192253
role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER"],
@@ -374,8 +435,6 @@ def deregister(self, params):
374435
data_source_id, domain_id, workspace_id
375436
)
376437

377-
workspace_id = data_source_vo.workspace_id
378-
379438
if cascade_delete_cost:
380439
self.cost_mgr.delete_cost_with_datasource(domain_id, data_source_id)
381440
self.budget_usage_mgr.update_budget_usage(domain_id, data_source_id)
@@ -387,7 +446,7 @@ def deregister(self, params):
387446

388447
if secret_id:
389448
secret_mgr: SecretManager = self.locator.get_manager("SecretManager")
390-
secret_mgr.delete_secret(secret_id)
449+
secret_mgr.delete_secret(secret_id, domain_id)
391450

392451
self.data_source_mgr.deregister_data_source_by_vo(data_source_vo)
393452

0 commit comments

Comments
 (0)