Skip to content

Commit 8228e48

Browse files
authored
respect parameter context (#1242)
1 parent f1300c4 commit 8228e48

File tree

6 files changed

+56
-18
lines changed

6 files changed

+56
-18
lines changed

cfn-templates/cid-cfn.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# https://github.com/aws-samples/aws-cudos-framework-deployment/blob/main/cfn-templates/cid-cfn.yml
22
AWSTemplateFormatVersion: '2010-09-09'
3-
Description: Deployment of Cloud Intelligence Dashboards v4.2.6 - AWS Solution SO9011
3+
Description: Deployment of Cloud Intelligence Dashboards v4.2.7 - AWS Solution SO9011
44
Metadata:
55
AWS::CloudFormation::Interface:
66
ParameterGroups:
@@ -2075,7 +2075,7 @@ Resources:
20752075
SourceBucket: !Ref ReferenceAssetsBucket
20762076
DestinationBucket: !Ref LocalAssetsBucket
20772077
Keys:
2078-
- 'cid-resource-lambda-layer/cid-4.2.6.zip' #replace version here if needed
2078+
- 'cid-resource-lambda-layer/cid-4.2.7.zip' #replace version here if needed
20792079

20802080
CidResourceLambdaLayer:
20812081
Type: AWS::Lambda::LayerVersion
@@ -2090,7 +2090,7 @@ Resources:
20902090
- LambdaLayerBucketPrefixIsManaged
20912091
- !FindInMap [RegionMap, !Ref 'AWS::Region', BucketName]
20922092
- !Sub '${LambdaLayerBucketPrefix}-${AWS::Region}' # Region added for backward compatibility
2093-
S3Key: 'cid-resource-lambda-layer/cid-4.2.6.zip' #replace version here if needed
2093+
S3Key: 'cid-resource-lambda-layer/cid-4.2.7.zip' #replace version here if needed
20942094
CompatibleRuntimes:
20952095
- python3.10
20962096
- python3.11

cid/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
__version__ = '4.2.6'
1+
__version__ = '4.2.7'
22

cid/common.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ def track(self, action, dashboard_id):
287287
if not method:
288288
logger.debug(f"This will not fail the deployment. Logging action {action} is not supported. This issue will be ignored")
289289
return
290-
endpoint = 'https://cid.workshops.aws.dev/adoption-tracking' # AWS Managed
290+
endpoint = 'https://okakvoavfg.execute-api.eu-west-1.amazonaws.com/' # AWS Managed
291291
if os.environ.get('AWS_DEPLOYMENT_TYPE'):
292292
deployment_type = os.environ.get('AWS_DEPLOYMENT_TYPE')
293293
elif os.environ.get('AWS_EXECUTION_ENV', '').startswith('AWS_Lambda'):
@@ -476,17 +476,16 @@ def load_default_parameters(self):
476476
set_defaults(defaults)
477477

478478
def dump_default_parameters(self):
479-
480479
stop_list = ['profile-name', 'region', 'aws-access-key-id', 'aws-secret-access-key', 'aws-session-token', 'athena-database', 'athena-workgroup']
481-
current_defaults = self.parameters_controller.load_parameters(
482-
context=get_parameters().get('dashboard-id')
483-
)
484-
current_defaults = current_defaults | get_parameters()
480+
current_defaults = get_parameters()
485481
for key in list(current_defaults.keys()):
486482
if key in stop_list:
487483
del current_defaults[key]
488484
logger.trace(f'dumping parameters {current_defaults}')
489-
self.parameters_controller.dump_parameters(current_defaults, context=get_parameters().get('dashboard-id'))
485+
self.parameters_controller.dump_parameters(
486+
current_defaults,
487+
context=get_parameters().get('dashboard-id')
488+
)
490489

491490

492491
def ensure_subscription(self):

cid/helpers/parameter_store.py

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
1+
import logging
2+
from datetime import datetime
3+
14
from cid.exceptions import CidCritical
25

6+
logger = logging.getLogger(__name__)
7+
38
class AthenaStore():
49
def __init__(self, athena, view_name='cid_parameters'):
510
self.athena = athena
611
self.view_name = view_name
712

813
def dump(self, data):
9-
''' load from athena
14+
''' dump data to athena
1015
'''
11-
# FIXME: make it multi view
12-
self.athena.query(self._generate_view_query(data, self.view_name))
16+
try:
17+
# FIXME: make it multi view
18+
self.athena.query(self._generate_view_query(data, self.view_name))
19+
except (CidCritical, Exception) as exc:
20+
logger.debug(f'failed to save parameters store: {exc}')
1321

1422
def load(self):
1523
''' load from athena
@@ -44,8 +52,37 @@ def _generate_view_query(self, data, name):
4452
class ParametersController(AthenaStore):
4553
def load_parameters(self, context):
4654
data = self.load()
47-
return { line.get('parameter'):line.get('value') for line in data}
55+
context_parameters = {}
56+
any_parameters = {}
57+
# get any context and then override with specific context
58+
for line in sorted(data, key=lambda x: x.get('date', '')): # latest should override
59+
any_parameters[line.get('parameter')] = line.get('value')
60+
if line.get('context') == str(context):
61+
context_parameters[line.get('parameter')] = line.get('value')
62+
return any_parameters | context_parameters
4863

4964
def dump_parameters(self, params, context=None):
50-
data = [{'parameter': key, 'value': ','.join(val) if isinstance(val, list) else val, 'context': str(context) } for key, val in params.items()]
65+
data = self.load()
66+
logger.trace(f'loaded parameters {data}')
67+
params = dict(params)
68+
date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
69+
70+
#Update parameters if they are present already
71+
for line in data:
72+
for key, val in list(params.items()):
73+
if line.get('context') == str(context) and line.get('parameter') == key:
74+
line['value'] = val
75+
line['date'] = date
76+
del params[key]
77+
78+
#add parameters that are new
79+
for key, val in list(params.items()):
80+
data.append({
81+
'parameter': key,
82+
'value': ','.join([str(v) for v in val]) if isinstance(val, list) else str(val),
83+
'context': str(context),
84+
'date': date
85+
})
86+
87+
logger.trace(f'dumping parameters {data}')
5188
self.dump(data)

cid/helpers/quicksight/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,7 @@ def describe_dashboard_definition(self, dashboard_id: str, refresh: bool = False
735735
'AwsAccountId': self.account_id,
736736
'DashboardId': dashboard_id
737737
}
738+
logger.debug(f'describe_dashboard_definition({dashboard_id})')
738739
result = self.client.describe_dashboard_definition(**parameters)
739740
self._definitions.update({f'{self.account_id}:{self.identityRegion}:{dashboard_id}': CidQsDefinition(result.get('Definition'))})
740741
logger.debug(result)
@@ -1289,6 +1290,7 @@ def create_dashboard(self, definition: dict) -> Dashboard:
12891290
'DashboardId': definition.get('dashboardId'),
12901291
'VersionNumber': created_version
12911292
}
1293+
logger.debug(f"describe_dashboard { definition.get('dashboardId')}")
12921294
dashboard = self.describe_dashboard(poll=True, **describe_parameters)
12931295
logger.debug('dashboard={dashboard}')
12941296
self.set_tags(dashboard.arn, cid_version_tag=dashboard.cid_version) # try to update version tag
@@ -1306,7 +1308,7 @@ def _build_params_for_create_update_dash(self, definition: dict) -> Dict:
13061308
definition: cid dashboard definition. NOT QS DEFINITION.
13071309
returns: what we need tof create or update API
13081310
"""
1309-
1311+
cid_print('Preparing dashboard definition')
13101312
create_parameters = {
13111313
'AwsAccountId': self.account_id,
13121314
'DashboardId': definition.get('dashboardId'),

cid/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def get_parameter(param_name, message, choices=None, default=None, none_as_disab
276276
if multi:
277277
default = default or []
278278
default = default if isinstance(default, list) else [default]
279-
default = [c for c in defaults if c in choices]
279+
default = [c for c in default if c in choices]
280280
if not isatty():
281281
result = default
282282
else:

0 commit comments

Comments
 (0)