Skip to content

Commit 728b8c9

Browse files
Merge pull request #319 from jinyoungmoonDEV/master
add: add schedule field to DataSource
2 parents bf3294a + 459bf06 commit 728b8c9

File tree

8 files changed

+100
-129
lines changed

8 files changed

+100
-129
lines changed

src/spaceone/cost_analysis/info/data_source_info.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,28 @@ def PluginInfo(vo):
3737
return None
3838

3939

40+
def ScheduleInfo(vo):
41+
if vo:
42+
info = {
43+
"state": vo.state,
44+
"hour": vo.hour,
45+
}
46+
47+
return data_source_pb2.Schedule(**info)
48+
else:
49+
return None
50+
51+
4052
def DataSourceInfo(data_source_vo: DataSource, minimal=False):
4153
info = {
4254
"data_source_id": data_source_vo.data_source_id,
4355
"workspace_id": data_source_vo.workspace_id,
4456
"name": data_source_vo.name,
45-
"state": data_source_vo.state,
4657
"data_source_type": data_source_vo.data_source_type,
4758
"secret_type": data_source_vo.secret_type,
4859
"provider": data_source_vo.provider,
4960
"resource_group": data_source_vo.resource_group,
61+
"schedule": ScheduleInfo(data_source_vo.schedule),
5062
}
5163

5264
if not minimal:

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

-20
Original file line numberDiff line numberDiff line change
@@ -63,26 +63,6 @@ def verify_plugin(self, request, context):
6363
data_source_service.verify_plugin(params)
6464
return self.locator.get_info("EmptyInfo")
6565

66-
def enable(self, request, context):
67-
params, metadata = self.parse_request(request, context)
68-
69-
with self.locator.get_service(
70-
"DataSourceService", metadata
71-
) as data_source_service:
72-
return self.locator.get_info(
73-
"DataSourceInfo", data_source_service.enable(params)
74-
)
75-
76-
def disable(self, request, context):
77-
params, metadata = self.parse_request(request, context)
78-
79-
with self.locator.get_service(
80-
"DataSourceService", metadata
81-
) as data_source_service:
82-
return self.locator.get_info(
83-
"DataSourceInfo", data_source_service.disable(params)
84-
)
85-
8666
def deregister(self, request, context):
8767
params, metadata = self.parse_request(request, context)
8868

src/spaceone/cost_analysis/interface/task/v1/data_source_sync_scheduler.py

+18-28
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ def _init_config(self):
2020
self._token = config.get_global("TOKEN")
2121
if self._token is None:
2222
raise ERROR_CONFIGURATION(key="TOKEN")
23-
self._data_source_sync_hour = config.get_global("DATA_SOURCE_SYNC_HOUR", 16)
2423
self._cost_report_sync_hour = config.get_global("COST_REPORT_RUN_HOUR", 0)
2524

2625
def create_task(self) -> list:
@@ -30,34 +29,25 @@ def create_task(self) -> list:
3029
return tasks
3130

3231
def _create_data_source_sync_task(self):
33-
if datetime.utcnow().hour == self._data_source_sync_hour:
34-
stp = {
35-
"name": "data_source_sync_schedule",
36-
"version": "v1",
37-
"executionEngine": "BaseWorker",
38-
"stages": [
39-
{
40-
"locator": "SERVICE",
41-
"name": "JobService",
42-
"metadata": {"token": self._token},
43-
"method": "create_jobs_by_data_source",
44-
"params": {"params": {}},
45-
}
46-
],
47-
}
32+
stp = {
33+
"name": "data_source_sync_schedule",
34+
"version": "v1",
35+
"executionEngine": "BaseWorker",
36+
"stages": [
37+
{
38+
"locator": "SERVICE",
39+
"name": "JobService",
40+
"metadata": {"token": self._token},
41+
"method": "create_jobs_by_data_source",
42+
"params": {"params": {"sync_hour": datetime.utcnow().hour}},
43+
}
44+
],
45+
}
4846

49-
print(
50-
f"{utils.datetime_to_iso8601(datetime.utcnow())} [INFO] [create_task] create_jobs_by_data_source => START"
51-
)
52-
return [stp]
53-
else:
54-
print(
55-
f"{utils.datetime_to_iso8601(datetime.utcnow())} [INFO] [create_task] create_jobs_by_data_source => SKIP"
56-
)
57-
print(
58-
f"{utils.datetime_to_iso8601(datetime.utcnow())} [INFO] [create_task] data_source_sync_time: {self._data_source_sync_hour} hour (UTC)"
59-
)
60-
return []
47+
print(
48+
f"{utils.datetime_to_iso8601(datetime.utcnow())} [INFO] [create_task] create_jobs_by_data_source => START"
49+
)
50+
return [stp]
6151

6252
# todo: split scheduler
6353
def _create_cost_report_run_task(self):

src/spaceone/cost_analysis/model/data_source/request.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ class Plugin(BaseModel):
2525
upgrade_mode: Union[str, None] = None
2626

2727

28+
class Schedule(BaseModel):
29+
state: str
30+
hour: Union[int, None] = None
31+
32+
2833
class DataSourceRegisterRequest(BaseModel):
2934
name: str
3035
data_source_type: DataSourceType
@@ -33,6 +38,7 @@ class DataSourceRegisterRequest(BaseModel):
3338
secret_filter: Union[dict, None] = None
3439
template: Union[dict, None] = None
3540
plugin_info: Union[Plugin, None] = None
41+
schedule: Schedule
3642
tags: Union[dict, None] = None
3743
resource_group: Union[ResourceGroup, None] = None
3844
workspace_id: Union[str, None] = None
@@ -55,7 +61,6 @@ class DataSourceSearchQueryRequest(BaseModel):
5561
query: Union[dict, None] = None
5662
data_source_id: Union[str, None] = None
5763
name: Union[str, None] = None
58-
state: Union[State, None] = None
5964
data_source_type: Union[DataSourceType, None] = None
6065
provider: Union[str, None] = None
6166
connected_workspace_id: Union[str, None] = None

src/spaceone/cost_analysis/model/data_source/response.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from spaceone.core import utils
66

77
from spaceone.cost_analysis.model.data_source.request import (
8-
State,
98
DataSourceType,
109
SecretType,
1110
ResourceGroup,
@@ -20,13 +19,13 @@
2019
class DataSourceResponse(BaseModel):
2120
data_source_id: Union[str, None] = None
2221
name: Union[str, None] = None
23-
state: Union[State, None] = None
2422
data_source_type: Union[DataSourceType, None] = None
2523
permissions: Union[dict, None] = None
2624
provider: Union[str, None] = None
2725
secret_type: Union[SecretType, None] = None
2826
secret_filter: Union[dict, None] = None
2927
plugin_info: Union[dict, None] = None
28+
schedule: Union[dict, None] = None
3029
template: Union[dict, None] = None
3130
tags: Union[dict, None] = None
3231
cost_tag_keys: Union[list, None] = None

src/spaceone/cost_analysis/model/data_source_model.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,19 @@ def to_dict(self):
3030
return dict(self.to_mongo())
3131

3232

33-
class DataSource(MongoModel):
34-
data_source_id = StringField(max_length=40, generate_id="ds", unique=True)
35-
name = StringField(max_length=255, unique_with="domain_id")
33+
class Schedule(EmbeddedDocument):
3634
state = StringField(
3735
max_length=20, default="ENABLED", choices=("ENABLED", "DISABLED")
3836
)
37+
hour = IntField(min_value=0, max_length=23, null=True)
38+
39+
def to_dict(self):
40+
return dict(self.to_mongo())
41+
42+
43+
class DataSource(MongoModel):
44+
data_source_id = StringField(max_length=40, generate_id="ds", unique=True)
45+
name = StringField(max_length=255, unique_with="domain_id")
3946
data_source_type = StringField(max_length=20, choices=("LOCAL", "EXTERNAL"))
4047
secret_type = StringField(
4148
max_length=32,
@@ -46,6 +53,7 @@ class DataSource(MongoModel):
4653
permissions = DictField(default=None, null=True)
4754
provider = StringField(max_length=40, default=None, null=True)
4855
plugin_info = EmbeddedDocumentField(PluginInfo, default=None, null=True)
56+
schedule = EmbeddedDocumentField(Schedule)
4957
template = DictField(default={})
5058
tags = DictField(default={})
5159
cost_tag_keys = ListField(StringField())
@@ -65,11 +73,11 @@ class DataSource(MongoModel):
6573
meta = {
6674
"updatable_fields": [
6775
"name",
68-
"state",
6976
"permissions",
7077
"plugin_info",
7178
"secret_filter",
7279
"template",
80+
"schedule",
7381
"tags",
7482
"updated_at",
7583
"last_synchronized_at",
@@ -83,14 +91,13 @@ class DataSource(MongoModel):
8391
"data_source_id",
8492
"workspace_id",
8593
"name",
86-
"state",
8794
"data_source_type",
8895
"secret_type",
8996
"provider",
97+
"schedule",
9098
],
9199
"ordering": ["name"],
92100
"indexes": [
93-
"state",
94101
"data_source_type",
95102
"provider",
96103
"resource_group",

src/spaceone/cost_analysis/service/data_source_service.py

+26-60
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import Tuple, Union
44

55
from mongoengine import QuerySet
6+
from spaceone.core import config
67
from spaceone.core.service import *
78
from spaceone.cost_analysis.error import *
89
from spaceone.cost_analysis.model.data_source.request import *
@@ -61,7 +62,8 @@ def register(
6162
'secret_filter': 'dict',
6263
'template': 'dict',
6364
'plugin_info': 'dict',
64-
'tags': 'dict',
65+
'schedule;: 'dict', # required
66+
'tags': 'dict', # required
6567
'resource_group': 'str # required
6668
'workspace_id': 'str'
6769
'domain_id': 'str' # injected from auth
@@ -85,6 +87,16 @@ def register(
8587
else:
8688
params["workspace_id"] = "*"
8789

90+
if not params.get("schedule"):
91+
schedule = {
92+
"state" : "ENABLED",
93+
"hour": config.get_global("DATA_SOURCE_SYNC_HOUR", 16),
94+
}
95+
96+
params["schedule"] = schedule
97+
else:
98+
self._check_schedule(params["schedule"])
99+
88100
if data_source_type == "EXTERNAL":
89101
params["template"] = None
90102

@@ -194,6 +206,7 @@ def update(self, params):
194206
'name': 'str',
195207
'secret_filter': 'dict',
196208
'template': 'dict',
209+
'schedule': 'dict',
197210
'tags': 'dict'
198211
'domain_id': 'str' # injected from auth
199212
}
@@ -207,6 +220,9 @@ def update(self, params):
207220
data_source_id, domain_id
208221
)
209222

223+
if schedule := params.get("schedule"):
224+
self._check_schedule(schedule)
225+
210226
if "secret_filter" in params:
211227
if data_source_vo.secret_type == "USE_SERVICE_ACCOUNT_SECRET":
212228
self.validate_secret_filter(
@@ -431,62 +447,6 @@ def update_plugin(self, params):
431447

432448
return data_source_vo
433449

434-
@transaction(
435-
permission="cost-analysis:DataSource.write",
436-
role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER"],
437-
)
438-
@check_required(["data_source_id", "domain_id"])
439-
def enable(self, params):
440-
"""Enable data source
441-
442-
Args:
443-
params (dict): {
444-
'data_source_id': 'str', # required
445-
'domain_id': 'str' # injected from auth
446-
}
447-
448-
Returns:
449-
data_source_vo (object)
450-
"""
451-
452-
data_source_id = params["data_source_id"]
453-
domain_id = params["domain_id"]
454-
data_source_vo: DataSource = self.data_source_mgr.get_data_source(
455-
data_source_id, domain_id
456-
)
457-
458-
return self.data_source_mgr.update_data_source_by_vo(
459-
{"state": "ENABLED"}, data_source_vo
460-
)
461-
462-
@transaction(
463-
permission="cost-analysis:DataSource.write",
464-
role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER"],
465-
)
466-
@check_required(["data_source_id", "domain_id"])
467-
def disable(self, params):
468-
"""Disable data source
469-
470-
Args:
471-
params (dict): {
472-
'data_source_id': 'str', # required
473-
'domain_id': 'str' # injected from auth
474-
}
475-
476-
Returns:
477-
data_source_vo (object)
478-
"""
479-
480-
data_source_id = params["data_source_id"]
481-
domain_id = params["domain_id"]
482-
data_source_vo: DataSource = self.data_source_mgr.get_data_source(
483-
data_source_id, domain_id
484-
)
485-
486-
return self.data_source_mgr.update_data_source_by_vo(
487-
{"state": "DISABLED"}, data_source_vo
488-
)
489-
490450
@transaction(
491451
permission="cost-analysis:DataSource.write",
492452
role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER"],
@@ -570,7 +530,7 @@ def sync(self, params):
570530
data_source_id, domain_id, workspace_id
571531
)
572532

573-
if data_source_vo.state == "DISABLED":
533+
if data_source_vo.schedule.state == "DISABLED":
574534
raise ERROR_DATA_SOURCE_STATE(data_source_id=data_source_id)
575535

576536
if data_source_vo.data_source_type == "LOCAL":
@@ -625,7 +585,6 @@ def get(self, params: DataSourceGetRequest) -> Union[DataSourceResponse, dict]:
625585
[
626586
"data_source_id",
627587
"name",
628-
"state",
629588
"data_source_type",
630589
"provider",
631590
"workspace_id",
@@ -645,7 +604,6 @@ def list(
645604
'query': 'dict (spaceone.api.core.v1.Query)'
646605
'data_source_id': 'str',
647606
'name': 'str',
648-
'state': 'str',
649607
'data_source_type': 'str',
650608
'provider': 'str',
651609
'connected_workspace_id': str,
@@ -969,6 +927,14 @@ def _filter_cost_data_keys_with_permissions_by_data_source_vo(
969927
data_source_vo.cost_data_keys = cost_data_keys
970928
return data_source_vo
971929

930+
@staticmethod
931+
def _check_schedule(schedule: dict) -> None:
932+
if schedule.get("state", "ENABLED") == "ENABLED":
933+
if not schedule.get("hour"):
934+
raise ERROR_INVALID_PARAMETER(
935+
key="schedule.hour", reason="Need to set an hour when the state is ENABLED."
936+
)
937+
972938
@staticmethod
973939
def _check_only_fields_for_permissions(query: dict) -> None:
974940
only_fields = query.get("only", [])

0 commit comments

Comments
 (0)