cid-cmd 4.2.3__tar.gz → 4.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cid_cmd-4.2.3/cid_cmd.egg-info → cid_cmd-4.2.5}/PKG-INFO +1 -1
- cid_cmd-4.2.5/cid/_version.py +2 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/kpi/kpi_tracker.json +6 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/idle.json +1 -1
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/idle_options.sql +1 -1
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/kpi/last_kpi_tracker_view.sql +2 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/common.py +1 -3
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/athena.py +10 -8
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/cur.py +7 -3
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/__init__.py +2 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/dataset.py +52 -35
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/utils.py +3 -2
- {cid_cmd-4.2.3 → cid_cmd-4.2.5/cid_cmd.egg-info}/PKG-INFO +1 -1
- cid_cmd-4.2.3/cid/_version.py +0 -2
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/LICENSE +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/MANIFEST.in +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/README.md +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/__init__.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/base.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/__init__.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/__init__.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/cid/compute.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/cid/ec2_running_cost.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/cid/s3_view.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/cid/summary_view.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/co/dataset.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/cudos/hourly_view.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/cudos/resource_view.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/kpi/kpi_ebs_snap.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/kpi/kpi_ebs_storage_all.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/kpi/kpi_instance_all.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/kpi/kpi_s3_storage_all.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/shared/customer_all.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/tao/dataset.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/trends/daily_anomaly_detection.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/trends/monthly_anomaly_detection.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/trends/monthly_bill_by_account.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/dashboard_permissions.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/dashboard_permissions_namespace.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/data_set_permissions.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/data_source_permissions.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/folder_permissions.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cid/compute_savings_plan_eligible_spend.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cid/ec2_running_cost.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cid/ri_sp_mapping.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cid/s3.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cid/summary_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/all_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/auto_scale.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/auto_scale_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/ebs_volume.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/ebs_volume_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/ec2_instance.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/ec2_instance_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/ecs_service.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/ecs_service_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/lambda.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/lambda_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/license.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/license_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/rds_database.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/rds_instance_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/co/rds_storage_options.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cudos/hourly_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/cudos/resource_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/kpi/first_kpi_instance_mapping_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/kpi/kpi_ebs_snap_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/kpi/kpi_ebs_storage_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/kpi/kpi_instance_all_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/kpi/kpi_s3_storage_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/account_map.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/account_map_cur2.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/account_map_dummy.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/aws_accounts.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/aws_regions.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/aws_service_category_map.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/business_units_map.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/cur.yaml +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/customer_all_unlimited.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/payer_account_name_map.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/ta_descriptions.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/tao/glue_table.json +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/tao/ta_org_view.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/trends/daily_anomaly_detection.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/trends/monthly_anomaly_detection.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/trends/monthly_bill_by_account.sql +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/resources.yaml +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/cli.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/commands/__init__.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/commands/command_base.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/commands/init_qs.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/exceptions.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/export.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/__init__.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/account_map.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/cloudformation.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/csv2view.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/cur_proxy.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/diff.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/glue.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/iam.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/organizations.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/parameter_store.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/dashboard.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/dashboard_patching.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/datasource.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/definition.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/resource.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/template.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/quicksight/version.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/randtime.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/s3.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/helpers/timezone.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/logger.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/plugin.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/test/python/test_csv2view.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/test/python/test_isolated_parameters.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/test/python/test_merge.py +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid_cmd.egg-info/SOURCES.txt +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid_cmd.egg-info/dependency_links.txt +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid_cmd.egg-info/entry_points.txt +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid_cmd.egg-info/requires.txt +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid_cmd.egg-info/top_level.txt +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/pyproject.toml +0 -0
- {cid_cmd-4.2.3 → cid_cmd-4.2.5}/setup.cfg +0 -0
|
@@ -48,6 +48,11 @@
|
|
|
48
48
|
"Type": "DECIMAL",
|
|
49
49
|
"SubType": "FLOAT"
|
|
50
50
|
},
|
|
51
|
+
{
|
|
52
|
+
"Name": "ec2_usage_cost",
|
|
53
|
+
"Type": "DECIMAL",
|
|
54
|
+
"SubType": "FLOAT"
|
|
55
|
+
},
|
|
51
56
|
{
|
|
52
57
|
"Name": "ec2_spot_cost",
|
|
53
58
|
"Type": "DECIMAL",
|
|
@@ -397,6 +402,7 @@
|
|
|
397
402
|
"linked_account_id",
|
|
398
403
|
"spend_all_cost",
|
|
399
404
|
"ec2_all_cost",
|
|
405
|
+
"ec2_usage_cost",
|
|
400
406
|
"ec2_spot_cost",
|
|
401
407
|
"ec2_spot_potential_savings",
|
|
402
408
|
"ec2_previous_generation_cost",
|
|
@@ -23,7 +23,7 @@ CREATE OR REPLACE VIEW compute_optimizer_idle_options AS
|
|
|
23
23
|
utilizationmetricsnetworkinbytespersecondmaximum, ';',
|
|
24
24
|
utilizationmetricsdatabaseconnectionsmaximum, ';',
|
|
25
25
|
utilizationmetricsebsvolumereadiopsmaximum, ';',
|
|
26
|
-
|
|
26
|
+
utilizationmetricsebsvolumewriteiopsmaximum, ';',
|
|
27
27
|
utilizationmetricsvolumereadopspersecondmaximum, ';',
|
|
28
28
|
utilizationmetricsvolumewriteopspersecondmaximum
|
|
29
29
|
) utilizationmetrics
|
|
@@ -6,6 +6,7 @@ SELECT DISTINCT
|
|
|
6
6
|
, spend_all.spend_all_cost
|
|
7
7
|
, spend_all.tags_json
|
|
8
8
|
, instance_all.ec2_all_cost
|
|
9
|
+
, instance_all.ec2_usage_cost
|
|
9
10
|
, instance_all.ec2_spot_cost
|
|
10
11
|
, instance_all.ec2_spot_potential_savings
|
|
11
12
|
, instance_all.ec2_previous_generation_cost
|
|
@@ -94,6 +95,7 @@ LEFT JOIN (
|
|
|
94
95
|
, linked_account_id
|
|
95
96
|
, tags_json
|
|
96
97
|
, "sum"("ec2_all_cost") "ec2_all_cost"
|
|
98
|
+
, "sum"("ec2_usage_cost") "ec2_usage_cost"
|
|
97
99
|
, "sum"("ec2_spot_cost") "ec2_spot_cost"
|
|
98
100
|
, "sum"("ec2_spot_potential_savings") "ec2_spot_potential_savings"
|
|
99
101
|
, "sum"("ec2_previous_generation_cost") "ec2_previous_generation_cost"
|
|
@@ -409,9 +409,7 @@ class Cid():
|
|
|
409
409
|
res_list = self.athena.query(query)
|
|
410
410
|
except (self.athena.client.exceptions.ClientError, CidError, CidCritical) as exc:
|
|
411
411
|
raise CidCritical(f'Failed fetching parameter {prefix}{key}: {exc}.') from exc
|
|
412
|
-
|
|
413
|
-
raise CidCritical(f'Failed fetching parameter {prefix}{key}, {value}. Athena returns empty results. {value.get("error")}')
|
|
414
|
-
options = ['-'.join(res) for res in res_list]
|
|
412
|
+
options = ['-'.join(res) for res in (res_list or [])]
|
|
415
413
|
params[key] = self.generic_tags_json(
|
|
416
414
|
param_name=key,
|
|
417
415
|
options=options,
|
|
@@ -282,16 +282,18 @@ class Athena(CidBase):
|
|
|
282
282
|
logger.debug(f'WorkGroups: {result.get("WorkGroups")}')
|
|
283
283
|
return result.get('WorkGroups')
|
|
284
284
|
|
|
285
|
-
def get_table_metadata(self, table_name: str, database_name: str=None) -> dict:
|
|
286
|
-
table_metadata =
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
'DatabaseName': database_name or self.DatabaseName,
|
|
290
|
-
'TableName': table_name
|
|
291
|
-
}
|
|
285
|
+
def get_table_metadata(self, table_name: str, database_name: str=None, no_cache: bool=False) -> dict:
|
|
286
|
+
table_metadata = None
|
|
287
|
+
if not no_cache:
|
|
288
|
+
table_metadata = self._metadata.get(table_name)
|
|
292
289
|
if not table_metadata:
|
|
290
|
+
params = {
|
|
291
|
+
'CatalogName': self.CatalogName,
|
|
292
|
+
'DatabaseName': database_name or self.DatabaseName,
|
|
293
|
+
'TableName': table_name,
|
|
294
|
+
}
|
|
293
295
|
table_metadata = self.client.get_table_metadata(**params).get('TableMetadata')
|
|
294
|
-
self._metadata
|
|
296
|
+
self._metadata[table_name] = table_metadata
|
|
295
297
|
|
|
296
298
|
return table_metadata
|
|
297
299
|
|
|
@@ -184,8 +184,10 @@ class AbstractCUR(CidBase):
|
|
|
184
184
|
return self._tag_and_cost_category
|
|
185
185
|
|
|
186
186
|
self._tag_and_cost_category = []
|
|
187
|
-
number_of_rows_scanned =
|
|
188
|
-
for tag_type in [
|
|
187
|
+
number_of_rows_scanned = 500000 # empiric value
|
|
188
|
+
for tag_type in ['resource_tags', 'cost_category']:
|
|
189
|
+
if tag_type not in self.fields:
|
|
190
|
+
logging.debug(f'skipping {tag_type} scan')
|
|
189
191
|
cid_print(f'Scanning {tag_type} in {self.table_name}.')
|
|
190
192
|
try:
|
|
191
193
|
res = self.athena.query(
|
|
@@ -211,7 +213,9 @@ class AbstractCUR(CidBase):
|
|
|
211
213
|
cid_print(f' <BOLD>{tag_type:<{max_width}} | Distinct Values <END> ')
|
|
212
214
|
for line in res:
|
|
213
215
|
if int(line[1]) > 10:
|
|
214
|
-
|
|
216
|
+
name = line[0]
|
|
217
|
+
name = name.replace('user_', '')
|
|
218
|
+
cid_print(f' <BOLD>{name:<{max_width}}<END> | {line[1]} ')
|
|
215
219
|
self._tag_and_cost_category += sorted([f"{tag_type}['{line[0]}']" for line in res])
|
|
216
220
|
except (self.athena.client.exceptions.ClientError, CidCritical, ValueError) as exc:
|
|
217
221
|
logger.error(f'Failed to read {tag_type} from {self.table_name}: "{exc}". Will continue without.')
|
|
@@ -1205,6 +1205,8 @@ class QuickSight(CidBase):
|
|
|
1205
1205
|
schedule["RefreshType"] = schedule.get("RefreshType", "FULL_REFRESH")
|
|
1206
1206
|
if "providedBy" in schedule:
|
|
1207
1207
|
del schedule["providedBy"]
|
|
1208
|
+
if "source" in schedule:
|
|
1209
|
+
del schedule["source"]
|
|
1208
1210
|
|
|
1209
1211
|
if not existing_schedule:
|
|
1210
1212
|
# Avoid adding a new schedule when customer already has put a schedule manually as this can lead to additional charges.
|
|
@@ -68,33 +68,12 @@ class Dataset(CidQsResource):
|
|
|
68
68
|
'''
|
|
69
69
|
def _get_athena_columns(table, database=None):
|
|
70
70
|
'''returns athena columns'''
|
|
71
|
+
metadata = athena.get_table_metadata(table, database_name=database, no_cache=True)
|
|
71
72
|
return [
|
|
72
|
-
|
|
73
|
-
for
|
|
74
|
-
f'SHOW COLUMNS FROM {table}',
|
|
75
|
-
include_header=True, database=database
|
|
76
|
-
)
|
|
73
|
+
(col['Name'], col['Type'])
|
|
74
|
+
for col in metadata.get('Columns', [])
|
|
77
75
|
]
|
|
78
76
|
|
|
79
|
-
def _replace_columns(existing_columns, new_columns):
|
|
80
|
-
'''replace columns but keep the order, ignore case changes
|
|
81
|
-
assert _replace_columns(
|
|
82
|
-
[{'Name': 'a'}, {'Name': 'B'}, {'Name': 'c'}],
|
|
83
|
-
[{'Name': 'A'}, {'Name': 'b'}, {'Name': 'd'}]) \
|
|
84
|
-
== [{'Name': 'a'}, {'Name': 'B'}, {'Name': 'd'}]
|
|
85
|
-
Different types will be replaced
|
|
86
|
-
'''
|
|
87
|
-
existing_columns = [
|
|
88
|
-
existing_col
|
|
89
|
-
for existing_col in existing_columns
|
|
90
|
-
if str(existing_col).lower() in [str(c).lower() for c in new_columns]
|
|
91
|
-
] # filter out old
|
|
92
|
-
for col in new_columns: # add new
|
|
93
|
-
if col['Name'].lower() not in [c['Name'].lower() for c in existing_columns]:
|
|
94
|
-
existing_columns.append(col)
|
|
95
|
-
#REFACTOR: what if col is there but another type?
|
|
96
|
-
return existing_columns
|
|
97
|
-
|
|
98
77
|
def _athena_to_qs_type(col, athena_type):
|
|
99
78
|
'''map athena type to QS type
|
|
100
79
|
The following data types are supported in SPICE: Date, Decimal-fixed, Decimal-float, Integer, and String.
|
|
@@ -125,23 +104,61 @@ class Dataset(CidQsResource):
|
|
|
125
104
|
root_lt = dataset['LogicalTableMap'][lt]
|
|
126
105
|
break
|
|
127
106
|
else:
|
|
128
|
-
|
|
129
|
-
|
|
107
|
+
# take the first one and let's hope it is fine
|
|
108
|
+
root_lt = next(iter(dataset['LogicalTableMap'].values()))
|
|
109
|
+
|
|
110
|
+
renames = {}
|
|
111
|
+
for lt in dataset['LogicalTableMap'].values():
|
|
112
|
+
for dt in lt.get('DataTransforms', []):
|
|
113
|
+
if "RenameColumnOperation" in dt:
|
|
114
|
+
key = lt['Source'].get('PhysicalTableId', '') + '.' + dt["RenameColumnOperation"]['ColumnName']
|
|
115
|
+
renames[key] = dt["RenameColumnOperation"]['NewColumnName']
|
|
116
|
+
logger.trace(f'renames = {renames}')
|
|
117
|
+
|
|
118
|
+
projected_cols = next( # get the first DataTransform with ProjectOperation
|
|
119
|
+
ds['ProjectOperation']["ProjectedColumns"]
|
|
120
|
+
for ds in root_lt['DataTransforms']
|
|
121
|
+
if 'ProjectOperation' in ds
|
|
122
|
+
)
|
|
130
123
|
|
|
131
124
|
# Update each PhysicalTableMap with all columns from athena views
|
|
132
125
|
all_columns = []
|
|
133
|
-
for pt in dataset['PhysicalTableMap'].
|
|
126
|
+
for pt_id, pt in dataset['PhysicalTableMap'].items():
|
|
134
127
|
table_name = pt['RelationalTable']['Name']
|
|
135
128
|
database = pt['RelationalTable']['Schema']
|
|
136
129
|
columns = _get_athena_columns(table_name, database)
|
|
137
130
|
logger.trace(f'columns = {columns}')
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
131
|
+
athena_columns = [
|
|
132
|
+
_athena_to_qs_type(name, athena_type.lower())
|
|
133
|
+
for name, athena_type in columns
|
|
134
|
+
]
|
|
135
|
+
logger.trace(f'athena_columns = {columns}')
|
|
136
|
+
athena_columns_names = [c['Name'].lower() for c in athena_columns]
|
|
137
|
+
dataset_columns = pt['RelationalTable']['InputColumns']
|
|
138
|
+
dataset_columns_names = [col['Name'].lower() for col in dataset_columns]
|
|
139
|
+
dataset_columns_to_keep = [
|
|
140
|
+
col for col in dataset_columns
|
|
141
|
+
if col['Name'].lower() in athena_columns_names
|
|
142
|
+
]
|
|
143
|
+
new_columns = [
|
|
144
|
+
col for col in athena_columns
|
|
145
|
+
if col['Name'].lower() not in dataset_columns_names
|
|
146
|
+
] # BTW what if col is there but another type?
|
|
147
|
+
|
|
148
|
+
# FIXME: need to add RenameColumnOperation! col['Name'] => f"{col['Name']}[{table_name}]"
|
|
149
|
+
new_columns = [col for col in new_columns if col['Name'].lower() not in projected_cols] # avoid things that are already there (probably need to take renames into account)
|
|
150
|
+
new_columns = [col for col in new_columns if col['Name'] not in all_columns] # avoid adding 2nd time
|
|
151
|
+
|
|
152
|
+
logger.trace(f'dataset_columns_to_keep = {dataset_columns_to_keep}')
|
|
153
|
+
if new_columns:
|
|
154
|
+
logger.trace(f'new_columns = {new_columns} from {pt_id}')
|
|
155
|
+
pt['RelationalTable']['InputColumns'] = dataset_columns_to_keep + new_columns
|
|
156
|
+
|
|
157
|
+
for col in new_columns:
|
|
158
|
+
col_name = col['Name']
|
|
159
|
+
if f'{pt_id}.{col_name}' in renames:
|
|
160
|
+
col_name = renames[f'{pt_id}.{col_name}']
|
|
161
|
+
all_columns.append(col_name)
|
|
145
162
|
|
|
146
163
|
# Add all needed calc fields
|
|
147
164
|
existing_create_columns = [dt.get("CreateColumnsOperation", {}).get('Columns', [None])[0] for dt in root_lt.get('DataTransforms', []) if dt.get("CreateColumnsOperation")]
|
|
@@ -168,12 +185,12 @@ class Dataset(CidQsResource):
|
|
|
168
185
|
# Add all new cols to projected columns
|
|
169
186
|
for col in set(all_columns):
|
|
170
187
|
if col.lower() not in [c.lower() for c in projected_cols]:
|
|
188
|
+
logger.trace(f'adding {col}')
|
|
171
189
|
projected_cols.append(col)
|
|
172
190
|
|
|
173
191
|
# filter out all columns that cannot be used for dataset creation
|
|
174
192
|
update_ = {key: value for key, value in dataset.items() if key in 'DataSetId, Name, PhysicalTableMap, LogicalTableMap, ImportMode, ColumnGroups, FieldFolders, RowLevelPermissionDataSet, RowLevelPermissionTagConfiguration, ColumnLevelPermissionRules, DataSetUsageConfiguration, DatasetParameters'.split(', ')}
|
|
175
193
|
logger.trace(f'update_ = {update_}')
|
|
176
|
-
|
|
177
194
|
return update_
|
|
178
195
|
|
|
179
196
|
|
|
@@ -190,7 +190,7 @@ def set_defaults(data: dict) -> None:
|
|
|
190
190
|
if data:
|
|
191
191
|
defaults.update(data)
|
|
192
192
|
|
|
193
|
-
def get_defaults() ->
|
|
193
|
+
def get_defaults() -> dict:
|
|
194
194
|
global defaults
|
|
195
195
|
return dict(defaults)
|
|
196
196
|
|
|
@@ -250,7 +250,7 @@ def get_parameter(param_name, message, choices=None, default=None, none_as_disab
|
|
|
250
250
|
param_name = param_name.replace('_', '-')
|
|
251
251
|
|
|
252
252
|
# override defaults from code with outside defaults
|
|
253
|
-
if param_name in
|
|
253
|
+
if param_name in get_defaults():
|
|
254
254
|
default = defaults.get(param_name)
|
|
255
255
|
if multi and isinstance(default, str):
|
|
256
256
|
default = split_respecting_quotes(default)
|
|
@@ -276,6 +276,7 @@ def get_parameter(param_name, message, choices=None, default=None, none_as_disab
|
|
|
276
276
|
if multi:
|
|
277
277
|
default = default or []
|
|
278
278
|
default = default if isinstance(default, list) else [default]
|
|
279
|
+
default = [c for c in defaults if c in choices]
|
|
279
280
|
if not isatty():
|
|
280
281
|
result = default
|
|
281
282
|
else:
|
cid_cmd-4.2.3/cid/_version.py
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/trends/daily_anomaly_detection.json
RENAMED
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/trends/monthly_anomaly_detection.json
RENAMED
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/datasets/trends/monthly_bill_by_account.json
RENAMED
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/dashboard_permissions.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/permissions/data_source_permissions.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/aws_service_category_map.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/customer_all_unlimited.sql
RENAMED
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/shared/payer_account_name_map.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/trends/daily_anomaly_detection.sql
RENAMED
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/trends/monthly_anomaly_detection.sql
RENAMED
|
File without changes
|
{cid_cmd-4.2.3 → cid_cmd-4.2.5}/cid/builtin/core/data/queries/trends/monthly_bill_by_account.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|