diff --git a/src/spaceone/cost_analysis/manager/budget_usage_manager.py b/src/spaceone/cost_analysis/manager/budget_usage_manager.py index 42b3f5d2..d120f18f 100644 --- a/src/spaceone/cost_analysis/manager/budget_usage_manager.py +++ b/src/spaceone/cost_analysis/manager/budget_usage_manager.py @@ -46,9 +46,10 @@ def create_budget_usages(self, budget_vo: Budget): "currency": budget_vo.currency, "provider_filter": budget_vo.provider_filter.to_dict(), "budget": budget_vo, - "project_id": budget_vo.project_id, - "project_group_id": budget_vo.project_group_id, + "resource_group": budget_vo.resource_group, "data_source_id": budget_vo.data_source_id, + "project_id": budget_vo.project_id, + "workspace_id": budget_vo.workspace_id, "domain_id": budget_vo.domain_id, } @@ -65,9 +66,10 @@ def create_budget_usages(self, budget_vo: Budget): "currency": budget_vo.currency, "provider_filter": budget_vo.provider_filter.to_dict(), "budget": budget_vo, - "project_id": budget_vo.project_id, - "project_group_id": budget_vo.project_group_id, + "resource_group": budget_vo.resource_group, "data_source_id": budget_vo.data_source_id, + "project_id": budget_vo.project_id, + "workspace_id": budget_vo.workspace_id, "domain_id": budget_vo.domain_id, } diff --git a/src/spaceone/cost_analysis/manager/data_source_manager.py b/src/spaceone/cost_analysis/manager/data_source_manager.py index 676d2b43..5ed8e246 100644 --- a/src/spaceone/cost_analysis/manager/data_source_manager.py +++ b/src/spaceone/cost_analysis/manager/data_source_manager.py @@ -50,8 +50,8 @@ def deregister_data_source(self, data_source_id, domain_id): def deregister_data_source_by_vo(data_source_vo): data_source_vo.delete() - def get_data_source(self, data_source_id, domain_id, workspace_id=None): - conditions = {"data_source_id": data_source_id, "domain_id": domain_id} + def get_data_source(self, data_source_id: str, workspace_id=None): + conditions = {"data_source_id": data_source_id} if workspace_id: conditions["workspace_id"] = workspace_id diff --git a/src/spaceone/cost_analysis/manager/data_source_plugin_manager.py b/src/spaceone/cost_analysis/manager/data_source_plugin_manager.py index c8a22381..1737c552 100644 --- a/src/spaceone/cost_analysis/manager/data_source_plugin_manager.py +++ b/src/spaceone/cost_analysis/manager/data_source_plugin_manager.py @@ -2,102 +2,147 @@ from spaceone.core.manager import BaseManager from spaceone.cost_analysis.manager.plugin_manager import PluginManager -from spaceone.cost_analysis.manager.data_source_rule_manager import DataSourceRuleManager -from spaceone.cost_analysis.service.data_source_rule_service import DataSourceRuleService -from spaceone.cost_analysis.connector.datasource_plugin_connector import DataSourcePluginConnector +from spaceone.cost_analysis.manager.data_source_rule_manager import ( + DataSourceRuleManager, +) +from spaceone.cost_analysis.service.data_source_rule_service import ( + DataSourceRuleService, +) +from spaceone.cost_analysis.connector.datasource_plugin_connector import ( + DataSourcePluginConnector, +) from spaceone.cost_analysis.model.data_source_model import DataSource _LOGGER = logging.getLogger(__name__) class DataSourcePluginManager(BaseManager): - def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.dsp_connector: DataSourcePluginConnector = self.locator.get_connector('DataSourcePluginConnector') + self.dsp_connector: DataSourcePluginConnector = self.locator.get_connector( + "DataSourcePluginConnector" + ) def initialize(self, endpoint): - _LOGGER.debug(f'[initialize] data source plugin endpoint: {endpoint}') + _LOGGER.debug(f"[initialize] data source plugin endpoint: {endpoint}") self.dsp_connector.initialize(endpoint) def init_plugin(self, options, domain_id): plugin_info = self.dsp_connector.init(options, domain_id) - _LOGGER.debug(f'[plugin_info] {plugin_info}') - plugin_metadata = plugin_info.get('metadata', {}) + _LOGGER.debug(f"[plugin_info] {plugin_info}") + plugin_metadata = plugin_info.get("metadata", {}) return plugin_metadata def verify_plugin(self, options, secret_data, schema, domain_id): self.dsp_connector.verify(options, secret_data, schema, domain_id) - def get_tasks(self, options, secret_id, secret_data, schema, start, last_synchronized_at, domain_id): - response = self.dsp_connector.get_tasks(options, secret_data, schema, domain_id, start, last_synchronized_at) - tasks = response.get('tasks', []) + def get_tasks( + self, + options, + secret_id, + secret_data, + schema, + start, + last_synchronized_at, + domain_id, + ): + response = self.dsp_connector.get_tasks( + options, secret_data, schema, domain_id, start, last_synchronized_at + ) + tasks = response.get("tasks", []) for task in tasks: - task.update({ - 'secret_id': secret_id, - 'schema': schema - }) + task.update({"secret_id": secret_id, "schema": schema}) - return tasks, response.get('changed', []) + return tasks, response.get("changed", []) def get_cost_data(self, options, secret_data, schema, task_options, domain_id): - return self.dsp_connector.get_cost_data(options, secret_data, schema, task_options, domain_id) + return self.dsp_connector.get_cost_data( + options, secret_data, schema, task_options, domain_id + ) def get_data_source_plugin_endpoint_by_vo(self, data_source_vo: DataSource): plugin_info = data_source_vo.plugin_info.to_dict() - endpoint, updated_version = self.get_data_source_plugin_endpoint(plugin_info, data_source_vo.domain_id) + endpoint, updated_version = self.get_data_source_plugin_endpoint( + plugin_info, data_source_vo.domain_id + ) if updated_version: _LOGGER.debug( - f'[get_data_source_plugin_endpoint_by_vo] upgrade plugin version: {plugin_info["version"]} -> {updated_version}') - self.upgrade_data_source_plugin_version(data_source_vo, endpoint, updated_version) + f'[get_data_source_plugin_endpoint_by_vo] upgrade plugin version: {plugin_info["version"]} -> {updated_version}' + ) + self.upgrade_data_source_plugin_version( + data_source_vo, endpoint, updated_version + ) return endpoint def get_data_source_plugin_endpoint(self, plugin_info, domain_id): - plugin_mgr: PluginManager = self.locator.get_manager('PluginManager') + plugin_mgr: PluginManager = self.locator.get_manager("PluginManager") return plugin_mgr.get_plugin_endpoint(plugin_info, domain_id) - def upgrade_data_source_plugin_version(self, data_source_vo: DataSource, endpoint, updated_version): + def upgrade_data_source_plugin_version( + self, data_source_vo: DataSource, endpoint, updated_version + ): plugin_info = data_source_vo.plugin_info.to_dict() + resource_group = data_source_vo.resource_group data_source_id = data_source_vo.data_source_id + workspace_id = data_source_vo.workspace_id domain_id = data_source_vo.domain_id self.initialize(endpoint) - plugin_options = plugin_info.get('options', {}) + plugin_options = plugin_info.get("options", {}) plugin_metadata = self.init_plugin(plugin_options, domain_id) - plugin_info['version'] = updated_version - plugin_info['metadata'] = plugin_metadata - data_source_vo.update({'plugin_info': plugin_info}) + plugin_info["version"] = updated_version + plugin_info["metadata"] = plugin_metadata + data_source_vo.update({"plugin_info": plugin_info}) self.delete_data_source_rules(data_source_id, domain_id) - self.create_data_source_rules_by_metadata(plugin_metadata, data_source_id, domain_id) + self.create_data_source_rules_by_metadata( + plugin_metadata, resource_group, data_source_id, workspace_id, domain_id + ) def delete_data_source_rules(self, data_source_id, domain_id): - _LOGGER.debug(f'[_delete_data_source_rules] delete all data source rules: {data_source_id}') - data_source_rule_mgr: DataSourceRuleManager = self.locator.get_manager('DataSourceRuleManager') - old_data_source_rule_vos = data_source_rule_mgr.filter_data_source_rules(data_source_id=data_source_id, - rule_type='MANAGED', - domain_id=domain_id) + _LOGGER.debug( + f"[_delete_data_source_rules] delete all data source rules: {data_source_id}" + ) + data_source_rule_mgr: DataSourceRuleManager = self.locator.get_manager( + "DataSourceRuleManager" + ) + old_data_source_rule_vos = data_source_rule_mgr.filter_data_source_rules( + data_source_id=data_source_id, rule_type="MANAGED", domain_id=domain_id + ) old_data_source_rule_vos.delete() - def create_data_source_rules_by_metadata(self, metadata, data_source_id, domain_id): - data_source_rules = metadata.get('data_source_rules', []) + def create_data_source_rules_by_metadata( + self, + metadata: dict, + resource_group: str, + data_source_id: str, + workspace_id, + domain_id: str, + ): + data_source_rules = metadata.get("data_source_rules", []) if len(data_source_rules) > 0: - _LOGGER.debug(f'[_create_data_source_rules_by_metadata] create data source rules: {data_source_id} / ' - f'rule count = {len(data_source_rules)}') + _LOGGER.debug( + f"[_create_data_source_rules_by_metadata] create data source rules: {data_source_id} / " + f"rule count = {len(data_source_rules)}" + ) - data_source_rule_svc: DataSourceRuleService = self.locator.get_service('DataSourceRuleService', metadata) + data_source_rule_svc: DataSourceRuleService = self.locator.get_service( + "DataSourceRuleService", metadata + ) for data_source_rule_params in data_source_rules: - data_source_rule_params['data_source_id'] = data_source_id - data_source_rule_params['domain_id'] = domain_id - data_source_rule_params['rule_type'] = 'MANAGED' + data_source_rule_params["resource_group"] = resource_group + data_source_rule_params["data_source_id"] = data_source_id + data_source_rule_params["workspace_id"] = workspace_id + data_source_rule_params["domain_id"] = domain_id + data_source_rule_params["rule_type"] = "MANAGED" data_source_rule_svc.create_data_source_rule(data_source_rule_params) diff --git a/src/spaceone/cost_analysis/service/budget_service.py b/src/spaceone/cost_analysis/service/budget_service.py index e9ac20ba..b206f29f 100644 --- a/src/spaceone/cost_analysis/service/budget_service.py +++ b/src/spaceone/cost_analysis/service/budget_service.py @@ -36,7 +36,6 @@ def __init__(self, *args, **kwargs): "start", "end", "resource_group", - "workspace_id", "domain_id", ] ) @@ -45,17 +44,17 @@ def create(self, params): Args: params (dict): { - 'data_source_id': 'str', + 'data_source_id': 'str', # required 'name': 'str', 'limit': 'float', 'planned_limits': 'list', - 'time_unit': 'str', - 'start': 'str', - 'end': 'str', + 'time_unit': 'str', # required + 'start': 'str', # required + 'end': 'str', # required 'provider_filter': 'dict', 'notifications': 'list', 'tags': 'dict', - 'resource_group': 'str', + 'resource_group': 'str', # required 'project_id': 'str', 'workspace_id': 'str', # injected from auth 'domain_id': 'str' # injected from auth @@ -81,7 +80,10 @@ def create(self, params): # self._check_target(project_id, project_group_id, domain_id) self._check_time_period(start, end) - if resource_group == "PROJECT": + if resource_group == "WORKSPACE": + params["project_id"] = "*" + + else: identity_mgr: IdentityManager = self.locator.get_manager("IdentityManager") identity_mgr.get_project(project_id) @@ -95,9 +97,7 @@ def create(self, params): data_source_mgr: DataSourceManager = self.locator.get_manager( "DataSourceManager" ) - data_source_vo: DataSource = data_source_mgr.get_data_source( - data_source_id, domain_id - ) + data_source_vo: DataSource = data_source_mgr.get_data_source(data_source_id) data_source_metadata = data_source_vo.plugin_info.metadata params["currency"] = data_source_metadata.get("currency", "USD") @@ -177,7 +177,9 @@ def update(self, params): ) budget_vo: Budget = self.budget_mgr.get_budget( - budget_id, workspace_id, domain_id + budget_id, + domain_id, + workspace_id, ) # Check limit and Planned Limits @@ -223,7 +225,7 @@ def set_notification(self, params): notifications = params.get("notifications", []) budget_vo: Budget = self.budget_mgr.get_budget( - budget_id, workspace_id, domain_id + budget_id, domain_id, workspace_id ) # Check Notifications @@ -242,9 +244,9 @@ def delete(self, params): Args: params (dict): { - 'budget_id': 'str', - 'workspace_id': 'str', - 'domain_id': 'str' + 'budget_id': 'str', # required + 'workspace_id': 'str', # injected from auth (optional) + 'domain_id': 'str' # injected from auth } Returns: @@ -259,7 +261,6 @@ def delete(self, params): permission="cost-analysis:Budget.read", role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER", "WORKSPACE_MEMBER"], ) - @change_value_by_rule("APPEND", "workspace_id", "*") @check_required(["budget_id", "domain_id"]) def get(self, params): """Get budget @@ -286,6 +287,7 @@ def get(self, params): role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER", "WORKSPACE_MEMBER"], ) @check_required(["domain_id"]) + @change_value_by_rule("APPEND", "workspace_id", "*") @append_query_filter( [ "budget_id", @@ -307,11 +309,10 @@ def list(self, params): 'budget_id': 'str', 'name': 'str', 'time_unit': 'str', - 'project_group_id': 'str', + 'data_source_id': 'str', 'project_id': 'str', 'workspace_id': 'str', 'domain_id': 'str', - 'data_source_id': 'str', } Returns: @@ -326,6 +327,7 @@ def list(self, params): permission="cost-analysis:Budget.read", role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER", "WORKSPACE_MEMBER"], ) + @change_value_by_rule("APPEND", "workspace_id", "*") @check_required(["query", "domain_id"]) @append_query_filter(["domain_id"]) @append_keyword_filter(["budget_id", "name"]) diff --git a/src/spaceone/cost_analysis/service/budget_usage_service.py b/src/spaceone/cost_analysis/service/budget_usage_service.py index bdc76446..06d134d5 100644 --- a/src/spaceone/cost_analysis/service/budget_usage_service.py +++ b/src/spaceone/cost_analysis/service/budget_usage_service.py @@ -12,6 +12,8 @@ @mutation_handler @event_handler class BudgetUsageService(BaseService): + resource = "BudgetUsage" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.budget_usage_mgr: BudgetUsageManager = self.locator.get_manager( diff --git a/src/spaceone/cost_analysis/service/cost_query_set_service.py b/src/spaceone/cost_analysis/service/cost_query_set_service.py index 7abc04bc..063c5e4e 100644 --- a/src/spaceone/cost_analysis/service/cost_query_set_service.py +++ b/src/spaceone/cost_analysis/service/cost_query_set_service.py @@ -12,6 +12,8 @@ @mutation_handler @event_handler class CostQuerySetService(BaseService): + resource = "CostQuerySet" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.cost_query_set_mgr: CostQuerySetManager = self.locator.get_manager( diff --git a/src/spaceone/cost_analysis/service/cost_service.py b/src/spaceone/cost_analysis/service/cost_service.py index 9d8c66a1..6009380b 100644 --- a/src/spaceone/cost_analysis/service/cost_service.py +++ b/src/spaceone/cost_analysis/service/cost_service.py @@ -15,6 +15,8 @@ @mutation_handler @event_handler class CostService(BaseService): + resource = "Cost" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.cost_mgr: CostManager = self.locator.get_manager("CostManager") diff --git a/src/spaceone/cost_analysis/service/data_source_rule_service.py b/src/spaceone/cost_analysis/service/data_source_rule_service.py index 74764ca1..a3bdf6cf 100644 --- a/src/spaceone/cost_analysis/service/data_source_rule_service.py +++ b/src/spaceone/cost_analysis/service/data_source_rule_service.py @@ -31,6 +31,8 @@ @mutation_handler @event_handler class DataSourceRuleService(BaseService): + resource = "DataSourceRule" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.data_source_rule_mgr: DataSourceRuleManager = self.locator.get_manager( diff --git a/src/spaceone/cost_analysis/service/data_source_service.py b/src/spaceone/cost_analysis/service/data_source_service.py index cf39e9ca..aad40ed8 100644 --- a/src/spaceone/cost_analysis/service/data_source_service.py +++ b/src/spaceone/cost_analysis/service/data_source_service.py @@ -22,6 +22,8 @@ @mutation_handler @event_handler class DataSourceService(BaseService): + resource = "DataSource" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.data_source_mgr = DataSourceManager() @@ -130,11 +132,13 @@ def register(self, params): data_source_vo: DataSource = self.data_source_mgr.register_data_source(params) if data_source_type == "EXTERNAL": + resource_group = data_source_vo.resource_group + workspace_id = data_source_vo.workspace_id data_source_id = data_source_vo.data_source_id metadata = data_source_vo.plugin_info.metadata self.ds_plugin_mgr.create_data_source_rules_by_metadata( - metadata, data_source_id, domain_id + metadata, resource_group, data_source_id, workspace_id, domain_id ) return data_source_vo @@ -276,9 +280,11 @@ def update_plugin(self, params): params, data_source_vo ) + resource_group = data_source_vo.resource_group + workspace_id = data_source_vo.workspace_id self.ds_plugin_mgr.delete_data_source_rules(data_source_id, domain_id) self.ds_plugin_mgr.create_data_source_rules_by_metadata( - plugin_metadata, data_source_id, domain_id + plugin_metadata, resource_group, data_source_id, workspace_id, domain_id ) return data_source_vo @@ -582,8 +588,8 @@ def _validate_plugin_info(plugin_info, secret_type): raise ERROR_REQUIRED_PARAMETER(key="plugin_info.plugin_id") if ( - plugin_info.get("upgrade_mode", "AUTO") == "MANUAL" - and "version" not in plugin_info + plugin_info.get("upgrade_mode", "AUTO") == "MANUAL" + and "version" not in plugin_info ): raise ERROR_REQUIRED_PARAMETER(key="plugin_info.version") diff --git a/src/spaceone/cost_analysis/service/job_service.py b/src/spaceone/cost_analysis/service/job_service.py index 05412320..7eb1ed81 100644 --- a/src/spaceone/cost_analysis/service/job_service.py +++ b/src/spaceone/cost_analysis/service/job_service.py @@ -72,9 +72,9 @@ def cancel(self, params): Args: params (dict): { - 'job_id': 'str', - 'workspace_id': 'str', - 'domain_id': 'str' + 'job_id': 'str', # required + 'workspace_id': 'str', # injected from auth + 'domain_id': 'str' # injected from auth } Returns: @@ -85,7 +85,7 @@ def cancel(self, params): workspace_id = params["workspace_id"] domain_id = params["domain_id"] - job_vo = self.job_mgr.get_job(job_id, domain_id) + job_vo = self.job_mgr.get_job(job_id, domain_id, workspace_id) if job_vo.status != "IN_PROGRESS": raise ERROR_JOB_STATE(job_state=job_vo.status) @@ -96,16 +96,15 @@ def cancel(self, params): permission="cost-analysis:Job.read", role_types=["DOMAIN_ADMIN", "WORKSPACE_OWNER", "WORKSPACE_MEMBER"], ) - @change_value_by_rule("APPEND", "workspace_id", "*") @check_required(["job_id", "domain_id"]) def get(self, params): """Get job Args: params (dict): { - 'job_id': 'str', - 'domain_id': 'str', - 'only': 'list + 'job_id': 'str', # required + 'workspace_id': 'str', # injected from auth + 'domain_id': 'str', # injected from auth } Returns: @@ -131,12 +130,12 @@ def list(self, params): Args: params (dict): { - 'job_id': 'str', + 'query': 'dict (spaceone.api.core.v1.Query)' 'status': 'str', 'data_source_id': 'str', - 'workspace_id': 'str', - 'domain_id': 'str', - 'query': 'dict (spaceone.api.core.v1.Query)' + 'job_id': 'str', + 'workspace_id': 'list', + 'domain_id': 'str', # injected from auth } Returns: @@ -159,9 +158,9 @@ def stat(self, params): """ Args: params (dict): { - 'domain_id': 'str', - 'workspace_id': 'str, 'query': 'dict (spaceone.api.core.v1.StatisticsQuery)' + 'workspace_id': 'list, + 'domain_id': 'str', } Returns: diff --git a/src/spaceone/cost_analysis/service/job_task_service.py b/src/spaceone/cost_analysis/service/job_task_service.py index 88461667..eacdc228 100644 --- a/src/spaceone/cost_analysis/service/job_task_service.py +++ b/src/spaceone/cost_analysis/service/job_task_service.py @@ -11,6 +11,8 @@ @mutation_handler @event_handler class JobTaskService(BaseService): + resource = "JobTask" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.job_task_mgr: JobTaskManager = self.locator.get_manager("JobTaskManager")