cid-cmd 4.2.4__tar.gz → 4.2.6__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.
Files changed (125) hide show
  1. {cid_cmd-4.2.4/cid_cmd.egg-info → cid_cmd-4.2.6}/PKG-INFO +1 -1
  2. cid_cmd-4.2.6/cid/_version.py +2 -0
  3. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/common.py +3 -9
  4. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/__init__.py +3 -1
  5. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/dataset.py +66 -10
  6. {cid_cmd-4.2.4 → cid_cmd-4.2.6/cid_cmd.egg-info}/PKG-INFO +1 -1
  7. cid_cmd-4.2.4/cid/_version.py +0 -2
  8. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/LICENSE +0 -0
  9. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/MANIFEST.in +0 -0
  10. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/README.md +0 -0
  11. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/__init__.py +0 -0
  12. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/base.py +0 -0
  13. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/__init__.py +0 -0
  14. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/__init__.py +0 -0
  15. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/cid/compute.json +0 -0
  16. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/cid/ec2_running_cost.json +0 -0
  17. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/cid/s3_view.json +0 -0
  18. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/cid/summary_view.json +0 -0
  19. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/co/dataset.json +0 -0
  20. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/cudos/hourly_view.json +0 -0
  21. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/cudos/resource_view.json +0 -0
  22. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/kpi/kpi_ebs_snap.json +0 -0
  23. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/kpi/kpi_ebs_storage_all.json +0 -0
  24. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/kpi/kpi_instance_all.json +0 -0
  25. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/kpi/kpi_s3_storage_all.json +0 -0
  26. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/kpi/kpi_tracker.json +0 -0
  27. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/shared/customer_all.json +0 -0
  28. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/tao/dataset.json +0 -0
  29. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/trends/daily_anomaly_detection.json +0 -0
  30. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/trends/monthly_anomaly_detection.json +0 -0
  31. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/datasets/trends/monthly_bill_by_account.json +0 -0
  32. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/permissions/dashboard_permissions.json +0 -0
  33. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/permissions/dashboard_permissions_namespace.json +0 -0
  34. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/permissions/data_set_permissions.json +0 -0
  35. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/permissions/data_source_permissions.json +0 -0
  36. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/permissions/folder_permissions.json +0 -0
  37. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cid/compute_savings_plan_eligible_spend.sql +0 -0
  38. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cid/ec2_running_cost.sql +0 -0
  39. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cid/ri_sp_mapping.sql +0 -0
  40. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cid/s3.sql +0 -0
  41. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cid/summary_view.sql +0 -0
  42. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/all_options.sql +0 -0
  43. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/auto_scale.json +0 -0
  44. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/auto_scale_options.sql +0 -0
  45. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/ebs_volume.json +0 -0
  46. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/ebs_volume_options.sql +0 -0
  47. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/ec2_instance.json +0 -0
  48. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/ec2_instance_options.sql +0 -0
  49. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/ecs_service.json +0 -0
  50. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/ecs_service_options.sql +0 -0
  51. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/idle.json +0 -0
  52. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/idle_options.sql +0 -0
  53. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/lambda.json +0 -0
  54. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/lambda_options.sql +0 -0
  55. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/license.json +0 -0
  56. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/license_options.sql +0 -0
  57. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/rds_database.json +0 -0
  58. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/rds_instance_options.sql +0 -0
  59. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/co/rds_storage_options.sql +0 -0
  60. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cudos/hourly_view.sql +0 -0
  61. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/cudos/resource_view.sql +0 -0
  62. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/kpi/first_kpi_instance_mapping_view.sql +0 -0
  63. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/kpi/kpi_ebs_snap_view.sql +0 -0
  64. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/kpi/kpi_ebs_storage_view.sql +0 -0
  65. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/kpi/kpi_instance_all_view.sql +0 -0
  66. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/kpi/kpi_s3_storage_view.sql +0 -0
  67. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/kpi/last_kpi_tracker_view.sql +0 -0
  68. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/account_map.sql +0 -0
  69. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/account_map_cur2.sql +0 -0
  70. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/account_map_dummy.sql +0 -0
  71. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/aws_accounts.sql +0 -0
  72. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/aws_regions.sql +0 -0
  73. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/aws_service_category_map.sql +0 -0
  74. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/business_units_map.sql +0 -0
  75. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/cur.yaml +0 -0
  76. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/customer_all_unlimited.sql +0 -0
  77. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/payer_account_name_map.sql +0 -0
  78. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/shared/ta_descriptions.sql +0 -0
  79. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/tao/glue_table.json +0 -0
  80. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/tao/ta_org_view.sql +0 -0
  81. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/trends/daily_anomaly_detection.sql +0 -0
  82. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/trends/monthly_anomaly_detection.sql +0 -0
  83. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/queries/trends/monthly_bill_by_account.sql +0 -0
  84. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/builtin/core/data/resources.yaml +0 -0
  85. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/cli.py +0 -0
  86. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/commands/__init__.py +0 -0
  87. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/commands/command_base.py +0 -0
  88. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/commands/init_qs.py +0 -0
  89. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/exceptions.py +0 -0
  90. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/export.py +0 -0
  91. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/__init__.py +0 -0
  92. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/account_map.py +0 -0
  93. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/athena.py +0 -0
  94. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/cloudformation.py +0 -0
  95. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/csv2view.py +0 -0
  96. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/cur.py +0 -0
  97. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/cur_proxy.py +0 -0
  98. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/diff.py +0 -0
  99. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/glue.py +0 -0
  100. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/iam.py +0 -0
  101. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/organizations.py +0 -0
  102. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/parameter_store.py +0 -0
  103. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/dashboard.py +0 -0
  104. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/dashboard_patching.py +0 -0
  105. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/datasource.py +0 -0
  106. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/definition.py +0 -0
  107. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/resource.py +0 -0
  108. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/template.py +0 -0
  109. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/quicksight/version.py +0 -0
  110. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/randtime.py +0 -0
  111. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/s3.py +0 -0
  112. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/helpers/timezone.py +0 -0
  113. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/logger.py +0 -0
  114. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/plugin.py +0 -0
  115. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/test/python/test_csv2view.py +0 -0
  116. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/test/python/test_isolated_parameters.py +0 -0
  117. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/test/python/test_merge.py +0 -0
  118. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid/utils.py +0 -0
  119. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid_cmd.egg-info/SOURCES.txt +0 -0
  120. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid_cmd.egg-info/dependency_links.txt +0 -0
  121. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid_cmd.egg-info/entry_points.txt +0 -0
  122. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid_cmd.egg-info/requires.txt +0 -0
  123. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/cid_cmd.egg-info/top_level.txt +0 -0
  124. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/pyproject.toml +0 -0
  125. {cid_cmd-4.2.4 → cid_cmd-4.2.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cid-cmd
3
- Version: 4.2.4
3
+ Version: 4.2.6
4
4
  Summary: Cloud Intelligence Dashboards deployment helper tool
5
5
  Home-page: https://github.com/aws-samples/aws-cudos-framework-deployment
6
6
  Author: AWS CUDOS Team
@@ -0,0 +1,2 @@
1
+ __version__ = '4.2.6'
2
+
@@ -1668,17 +1668,11 @@ class Cid():
1668
1668
  update_dataset = True
1669
1669
  break
1670
1670
 
1671
- identical = False # check if dataset needs an update
1672
- if isinstance(found_dataset, Dataset):
1673
- identical = True
1674
- for key in 'PhysicalTableMap LogicalTableMap OutputColumns ImportMode DataSetUsageConfiguration RowLevelPermissionDataSet FieldFolders RowLevelPermissionTagConfiguration DatasetParameters'.split():
1675
- if found_dataset.raw.get(key) != compiled_dataset.get(key):
1676
- logger.trace(f'not identical {key} {found_dataset.raw.get(key)} != {compiled_dataset.get(key)}')
1677
- identical = False
1678
- logger.trace(f'identical to existing = {identical}')
1671
+ identical = Dataset.datasets_are_identical(found_dataset, compiled_dataset) # check if dataset needs an update
1679
1672
 
1680
1673
  if update_dataset and not identical:
1681
- self.qs.update_dataset(compiled_dataset)
1674
+ merged_dataset = Dataset.merge_datasets(compiled_dataset, found_dataset)
1675
+ self.qs.update_dataset(merged_dataset)
1682
1676
  if compiled_dataset.get("ImportMode") == "SPICE":
1683
1677
  dataset_id = compiled_dataset.get('DataSetId')
1684
1678
  schedules_definitions = []
@@ -261,7 +261,9 @@ class QuickSight(CidBase):
261
261
  return True
262
262
  except self.client.exceptions.AccessDeniedException as exc:
263
263
  logger.debug(f'Cannot tag {arn} (AccessDenied).')
264
- return False
264
+ except self.client.exceptions.ClientError as exc:
265
+ logger.debug(f'Cannot tag {arn} ({exc}).')
266
+ return False
265
267
 
266
268
 
267
269
  def get_tags(self, arn):
@@ -8,6 +8,12 @@ from cid.helpers.quicksight.resource import CidQsResource
8
8
 
9
9
  logger = logging.getLogger(__name__)
10
10
 
11
+ DATASET_PROPERTIES = [
12
+ 'AwsAccountId', 'DataSetId', 'Name', 'PhysicalTableMap', 'LogicalTableMap', 'ImportMode', 'ColumnGroups',
13
+ 'RowLevelPermissionDataSet', 'RowLevelPermissionTagConfiguration', 'FieldFolders', 'ColumnLevelPermissionRules',
14
+ 'DataSetUsageConfiguration', 'DatasetParameters', 'PerformanceConfiguration'
15
+ ]
16
+
11
17
 
12
18
  class Dataset(CidQsResource):
13
19
 
@@ -107,7 +113,15 @@ class Dataset(CidQsResource):
107
113
  # take the first one and let's hope it is fine
108
114
  root_lt = next(iter(dataset['LogicalTableMap'].values()))
109
115
 
110
- projected_cols = next( # get the first DataTrasform with ProjectOperation
116
+ renames = {}
117
+ for lt in dataset['LogicalTableMap'].values():
118
+ for dt in lt.get('DataTransforms', []):
119
+ if "RenameColumnOperation" in dt:
120
+ key = lt['Source'].get('PhysicalTableId', '') + '.' + dt["RenameColumnOperation"]['ColumnName']
121
+ renames[key] = dt["RenameColumnOperation"]['NewColumnName']
122
+ logger.trace(f'renames = {renames}')
123
+
124
+ projected_cols = next( # get the first DataTransform with ProjectOperation
111
125
  ds['ProjectOperation']["ProjectedColumns"]
112
126
  for ds in root_lt['DataTransforms']
113
127
  if 'ProjectOperation' in ds
@@ -115,7 +129,7 @@ class Dataset(CidQsResource):
115
129
 
116
130
  # Update each PhysicalTableMap with all columns from athena views
117
131
  all_columns = []
118
- for pt in dataset['PhysicalTableMap'].values():
132
+ for pt_id, pt in dataset['PhysicalTableMap'].items():
119
133
  table_name = pt['RelationalTable']['Name']
120
134
  database = pt['RelationalTable']['Schema']
121
135
  columns = _get_athena_columns(table_name, database)
@@ -137,15 +151,20 @@ class Dataset(CidQsResource):
137
151
  if col['Name'].lower() not in dataset_columns_names
138
152
  ] # BTW what if col is there but another type?
139
153
 
140
- for col in new_columns: # alter names for columns that already exist
141
- if col['Name'].lower() in projected_cols:
142
- col['Name'] = f"{col['Name']}[{table_name}]" # What if it is alrady there?
154
+ # FIXME: need to add RenameColumnOperation! col['Name'] => f"{col['Name']}[{table_name}]"
155
+ 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)
156
+ new_columns = [col for col in new_columns if col['Name'] not in all_columns] # avoid adding 2nd time
143
157
 
144
158
  logger.trace(f'dataset_columns_to_keep = {dataset_columns_to_keep}')
145
159
  if new_columns:
146
- logger.trace(f'new_columns = {new_columns}')
160
+ logger.trace(f'new_columns = {new_columns} from {pt_id}')
147
161
  pt['RelationalTable']['InputColumns'] = dataset_columns_to_keep + new_columns
148
- all_columns += [col['Name'] for col in pt['RelationalTable']['InputColumns']]
162
+
163
+ for col in new_columns:
164
+ col_name = col['Name']
165
+ if f'{pt_id}.{col_name}' in renames:
166
+ col_name = renames[f'{pt_id}.{col_name}']
167
+ all_columns.append(col_name)
149
168
 
150
169
  # Add all needed calc fields
151
170
  existing_create_columns = [dt.get("CreateColumnsOperation", {}).get('Columns', [None])[0] for dt in root_lt.get('DataTransforms', []) if dt.get("CreateColumnsOperation")]
@@ -172,12 +191,12 @@ class Dataset(CidQsResource):
172
191
  # Add all new cols to projected columns
173
192
  for col in set(all_columns):
174
193
  if col.lower() not in [c.lower() for c in projected_cols]:
194
+ logger.trace(f'adding {col}')
175
195
  projected_cols.append(col)
176
196
 
177
197
  # filter out all columns that cannot be used for dataset creation
178
- 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(', ')}
198
+ update_ = {key: value for key, value in dataset.items() if key in DATASET_PROPERTIES}
179
199
  logger.trace(f'update_ = {update_}')
180
-
181
200
  return update_
182
201
 
183
202
 
@@ -217,4 +236,41 @@ class Dataset(CidQsResource):
217
236
  for alias, join in join_clauses.items():
218
237
  if isinstance(data['Data'].get(alias), dict) :
219
238
  data['Data'][alias]['clause'] = join
220
- return (yaml.safe_dump(data))
239
+ return (yaml.safe_dump(data))
240
+
241
+ @staticmethod
242
+ def datasets_are_identical(dataset1, dataset2):
243
+ ''' Compare 2 datasets and returns True if no difference found
244
+ '''
245
+ if (not dataset1 and not dataset2):
246
+ return True
247
+ identical = False
248
+ if (dataset1 and not dataset2) or (not dataset1 and dataset2):
249
+ return identical
250
+ dataset1 = dataset1 if isinstance(dataset1, Dataset) else Dataset(dataset1)
251
+ dataset2 = dataset2 if isinstance(dataset2, Dataset) else Dataset(dataset2)
252
+ identical = True
253
+ for key in DATASET_PROPERTIES:
254
+ if key in ['AwsAccountId', 'DataSetId']:
255
+ continue
256
+ if dataset1.raw.get(key) != dataset2.raw.get(key):
257
+ logger.trace(f'not identical {key} {dataset1.raw.get(key)} != {dataset2.raw.get(key)}')
258
+ identical = False
259
+ logger.trace(f'identical to existing = {identical}')
260
+ return identical
261
+
262
+ @staticmethod
263
+ def merge_datasets(dataset1, dataset2):
264
+ ''' merge high level 2 datasets. Not a deep merge.
265
+ '''
266
+ if not dataset2:
267
+ return dataset1
268
+ if not dataset1:
269
+ return dataset2
270
+ dataset1 = dataset1 if isinstance(dataset1, Dataset) else Dataset(dataset1)
271
+ dataset2 = dataset2 if isinstance(dataset2, Dataset) else Dataset(dataset2)
272
+ result = {}
273
+ for key in DATASET_PROPERTIES:
274
+ if dataset1.raw.get(key) or dataset2.raw.get(key):
275
+ result[key] = dataset1.raw.get(key) or dataset2.raw.get(key)
276
+ return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cid-cmd
3
- Version: 4.2.4
3
+ Version: 4.2.6
4
4
  Summary: Cloud Intelligence Dashboards deployment helper tool
5
5
  Home-page: https://github.com/aws-samples/aws-cudos-framework-deployment
6
6
  Author: AWS CUDOS Team
@@ -1,2 +0,0 @@
1
- __version__ = '4.2.4'
2
-
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