in src/helper.py [0:0]
def scan_for_stage(dynamodb_item_stage, cp_stages):
"""This will compare the DynamoDB Stage Item against all CodePipeline Stages
Args:
dynamodb_item_stage (dict): Security / governance rule policy to scan against
cp_stages (list): AWS CodePipeline Stages to be scanned
Returns:
:obj: Returns scan results
"""
logger.info("Executing Stage Scan")
dyn_item_actions = dynamodb_item_stage.get('Actions')
dyn_item_actions_results = {}
logger.debug(f"dynamodb_item_stage:{dynamodb_item_stage}")
logger.debug(f"cp_stages:{cp_stages}")
logger.debug(f"dyn_item_actions:{dyn_item_actions}")
# Parse each stage in the CodePipeline Template
for cp_stage in cp_stages:
if cp_stage and (cp_stage["Name"] == dynamodb_item_stage.get("Name")):
logger.info("Found Matching Stage Name, Checking Action Configuration")
# Parse each action in the CodePipeline Template
for cp_action in cp_stage['Actions']:
# If DynamoDB doesn't have actions but Stage matched, PASS
if not dyn_item_actions:
logger.info("DynamoDB Item has no actions")
return True
else:
# Check each DynamoDB Action against the CodePipeline Actions, since we could have multiple actions
# in the DynamoDB item we are setting the results of each action within a dictionary
# (example {'Scan-CodePipeline': True, 'Update-CodePipeline': False}) if values are False, FAIL
for dyn_item_action in dyn_item_actions:
logger.info(f"dyn_item_action:{dyn_item_action}")
logger.info(f"cp_action:{cp_action}")
if dyn_item_action.get('Configuration', {}).items() <= cp_action['Configuration'].items() \
and dyn_item_action.get('ActionTypeId', {}).items() <= cp_action['ActionTypeId'].items() \
and dyn_item_action.get('Name', {}) == cp_action['Name']:
dyn_item_actions_results.update({dyn_item_action['Name']: True})
else:
if not dyn_item_actions_results.get(dyn_item_action['Name'], False):
dyn_item_actions_results.update({dyn_item_action['Name']: False})
logger.debug(dyn_item_actions_results)
if [_v for _k, _v in dyn_item_actions_results.items() if _v is False]:
return False
else:
return True
return False