diff --git a/src/cloudforet/cost_analysis/info/cost_info.py b/src/cloudforet/cost_analysis/info/cost_info.py index 881f164..c9319ab 100644 --- a/src/cloudforet/cost_analysis/info/cost_info.py +++ b/src/cloudforet/cost_analysis/info/cost_info.py @@ -26,6 +26,9 @@ def CostInfo(cost_data): "additional_info": change_struct_type(cost_data["additional_info"]) if "additional_info" in cost_data else None, + "data": change_struct_type(cost_data["data"]) + if "data" in cost_data + else None, "billed_date": cost_data["billed_date"], } diff --git a/src/cloudforet/cost_analysis/manager/cost_manager.py b/src/cloudforet/cost_analysis/manager/cost_manager.py index 9f63f3b..1a96037 100644 --- a/src/cloudforet/cost_analysis/manager/cost_manager.py +++ b/src/cloudforet/cost_analysis/manager/cost_manager.py @@ -96,6 +96,7 @@ def _make_cost_data(self, results): "resource": result.get("resource", ""), "billed_date": result["billed_date"], "additional_info": result.get("additional_info", {}), + "data": self._convert_data_values(result.get("data", {})), "tags": result.get("tags", {}), } @@ -129,17 +130,13 @@ def _change_result_by_field_mapper(self, result): result[origin_field] = result[actual_field] del result[actual_field] - if origin_field == "additional_info": - additional_info = {} - for ( - origin_additional_field, - actual_additional_field, - ) in actual_field.items(): - additional_info[origin_additional_field] = result[ - actual_additional_field - ] - del result[actual_additional_field] - result[origin_field] = additional_info + if origin_field in ("additional_info", "data"): + mapped_dict = {} + for mapped_key, csv_column in actual_field.items(): + if csv_column in result: + mapped_dict[mapped_key] = result[csv_column] + del result[csv_column] + result[origin_field] = mapped_dict return result @@ -221,6 +218,16 @@ def _check_required_fields(result): if field not in result: raise ERROR_REQUIRED_PARAMETER(key=field) + @staticmethod + def _convert_data_values(raw_data): + converted = {} + for key, value in raw_data.items(): + try: + converted[key] = float(value) if value else 0.0 + except (ValueError, TypeError): + converted[key] = value + return converted + def _set_type_mapper(self, result): # Not Implemented if "additional_info" in self.type_mapper: diff --git a/src/cloudforet/cost_analysis/model/cost_model.py b/src/cloudforet/cost_analysis/model/cost_model.py index 9b24470..17faa9b 100644 --- a/src/cloudforet/cost_analysis/model/cost_model.py +++ b/src/cloudforet/cost_analysis/model/cost_model.py @@ -15,4 +15,5 @@ class Cost(Model): resource = StringType() billed_date = StringType(required=True, max_length=7) additional_info = DictType(StringType, default={}) + data = DictType(StringType, default={}) tags = DictType(StringType, default={})