Skip to content

Commit

Permalink
Issue #5 using convention EvaluateCloudFormationTemplateByOPA
Browse files Browse the repository at this point in the history
  • Loading branch information
cschneider-vertical-relevance committed May 3, 2022
1 parent 76b3d52 commit 943968d
Show file tree
Hide file tree
Showing 2 changed files with 151 additions and 111 deletions.
187 changes: 88 additions & 99 deletions stacks/control_broker_stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ def deploy_inner_sfn_lambdas(self):

self.lambda_input_type_cloudformation_pac_framework_opa = aws_lambda.Function(
self,
"InputTypeCloudFormationPaCFrameworkOPAPythonSubprocess",
"EvaluateCloudFormationTemplateByOPAPythonSubprocess",
runtime=aws_lambda.Runtime.PYTHON_3_9,
handler="lambda_function.lambda_handler",
timeout=Duration.seconds(60),
Expand Down Expand Up @@ -382,22 +382,8 @@ def deploy_inner_sfn(self):
),
definition_string=json.dumps(
{
"StartAt": "ParseInput",
"StartAt": "PaCEvaluationRouter",
"States": {
"ParseInput": {
"Type": "Pass",
"Next": "PaCEvaluationRouter",
"Parameters": {
"JsonInput": {
"Bucket.$": "$.ControlBrokerConsumerInputs.Bucket",
"Key.$": "$.ControlBrokerConsumerInputKey",
},
"OuterEvalEngineSfnExecutionId.$": "$.OuterEvalEngineSfnExecutionId",
"ConsumerMetadata.$":"$.ControlBrokerConsumerInputs.ConsumerMetadata",
"ControlBrokerConsumerInputs.$":"$.ControlBrokerConsumerInputs",
},
"ResultPath": "$",
},
"PaCEvaluationRouter": {
"Type": "Task",
"Next": "ChoicePaCEvaluationRouting",
Expand All @@ -413,99 +399,102 @@ def deploy_inner_sfn(self):
},
"ChoicePaCEvaluationRouting": {
"Type": "Choice",
"Default": "PaCEvaluationRouterDeterminedNoValidRoute",
"Default": "NoValidRoute",
"Choices": [
{
"Variable": "$.PaCEvaluationRouter.Routing",
"StringEquals": "InputTypeCloudFormationPaCFrameworkOPA",
"Next": "InputTypeCloudFormationPaCFrameworkOPA",
"StringEquals": "EvaluateCloudFormationTemplateByOPA",
"Next": "EvaluateCloudFormationTemplateByOPA",
}
],
},
"PaCEvaluationRouterDeterminedNoValidRoute": {
"NoValidRoute": {
"Type": "Fail",
},
"InputTypeCloudFormationPaCFrameworkOPA": {
"Type": "Task",
"Next": "GatherInfractions",
"ResultPath": "$.InputTypeCloudFormationPaCFrameworkOPA",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": self.lambda_input_type_cloudformation_pac_framework_opa.function_name,
"Payload": {
"JsonInput.$": "$.JsonInput",
"OpaPolicies": {
"Bucket": self.bucket_opa_policies.bucket_name
},
},
},
"ResultSelector": {
"Results.$": "$.Payload.InputTypeCloudFormationPaCFrameworkOPAResults"
},
},
"GatherInfractions": {
"Type": "Task",
"Next": "ChoiceInfractionsExist",
"ResultPath": "$.GatherInfractions",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": self.lambda_gather_infractions.function_name,
"Payload.$": "$.InputTypeCloudFormationPaCFrameworkOPA.Results",
},
"ResultSelector": {
"Infractions.$": "$.Payload.Infractions"
},
},
"ChoiceInfractionsExist": {
"Type": "Choice",
"Default": "ForEachInfraction",
"Choices": [
{
"Variable": "$.GatherInfractions.Infractions[0]",
"IsPresent": False,
"Next": "NoInfractions",
}
],
},
"NoInfractions": {
"EvaluateCloudFormationTemplateByOPA": {
"Type": "Succeed",
},
"ForEachInfraction": {
"Type": "Map",
"Next": "InfractionsExist",
"ResultPath": "$.ForEachInfraction",
"ItemsPath": "$.GatherInfractions.Infractions",
"Parameters": {
"Infraction.$": "$$.Map.Item.Value",
"JsonInput.$": "$.JsonInput",
"OuterEvalEngineSfnExecutionId.$": "$.OuterEvalEngineSfnExecutionId",
"ConsumerMetadata.$": "$.ConsumerMetadata",
},
"Iterator": {
"StartAt": "HandleInfraction",
"States": {
"HandleInfraction": {
"Type": "Task",
"End": True,
"ResultPath": "$.HandleInfraction",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": self.lambda_handle_infraction.function_name,
"Payload": {
"Infraction.$": "$.Infraction",
"JsonInput.$": "$.JsonInput",
"OuterEvalEngineSfnExecutionId.$": "$.OuterEvalEngineSfnExecutionId",
"ConsumerMetadata.$": "$.ConsumerMetadata",
}
},
"ResultSelector": {"Payload.$": "$.Payload"},
},
},
},
},
"InfractionsExist": {
"Type": "Fail",
},
# "EvaluateCloudFormationTemplateByOPA": {
# "Type": "Task",
# "Next": "GatherInfractions",
# "ResultPath": "$.EvaluateCloudFormationTemplateByOPA",
# "Resource": "arn:aws:states:::lambda:invoke",
# "Parameters": {
# "FunctionName": self.lambda_input_type_cloudformation_pac_framework_opa.function_name,
# "Payload": {
# "JsonInput.$": "$.JsonInput",
# "OpaPolicies": {
# "Bucket": self.bucket_opa_policies.bucket_name
# },
# },
# },
# "ResultSelector": {
# "Results.$": "$.Payload.EvaluateCloudFormationTemplateByOPAResults"
# },
# },
# "GatherInfractions": {
# "Type": "Task",
# "Next": "ChoiceInfractionsExist",
# "ResultPath": "$.GatherInfractions",
# "Resource": "arn:aws:states:::lambda:invoke",
# "Parameters": {
# "FunctionName": self.lambda_gather_infractions.function_name,
# "Payload.$": "$.EvaluateCloudFormationTemplateByOPA.Results",
# },
# "ResultSelector": {
# "Infractions.$": "$.Payload.Infractions"
# },
# },
# "ChoiceInfractionsExist": {
# "Type": "Choice",
# "Default": "ForEachInfraction",
# "Choices": [
# {
# "Variable": "$.GatherInfractions.Infractions[0]",
# "IsPresent": False,
# "Next": "NoInfractions",
# }
# ],
# },
# "NoInfractions": {
# "Type": "Succeed",
# },
# "ForEachInfraction": {
# "Type": "Map",
# "Next": "InfractionsExist",
# "ResultPath": "$.ForEachInfraction",
# "ItemsPath": "$.GatherInfractions.Infractions",
# "Parameters": {
# "Infraction.$": "$$.Map.Item.Value",
# "JsonInput.$": "$.JsonInput",
# "OuterEvalEngineSfnExecutionId.$": "$.OuterEvalEngineSfnExecutionId",
# "ConsumerMetadata.$": "$.ConsumerMetadata",
# },
# "Iterator": {
# "StartAt": "HandleInfraction",
# "States": {
# "HandleInfraction": {
# "Type": "Task",
# "End": True,
# "ResultPath": "$.HandleInfraction",
# "Resource": "arn:aws:states:::lambda:invoke",
# "Parameters": {
# "FunctionName": self.lambda_handle_infraction.function_name,
# "Payload": {
# "Infraction.$": "$.Infraction",
# "JsonInput.$": "$.JsonInput",
# "OuterEvalEngineSfnExecutionId.$": "$.OuterEvalEngineSfnExecutionId",
# "ConsumerMetadata.$": "$.ConsumerMetadata",
# }
# },
# "ResultSelector": {"Payload.$": "$.Payload"},
# },
# },
# },
# },
# "InfractionsExist": {
# "Type": "Fail",
# },
},
}
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,88 @@
import os
import re

class PacEvaluationRouter():
def __init__(
self,
input_type
event:dict,
):
self.input_type = input_type
self.event = event

def get_pac_bucket(self,*,input_type):
pac_bucket = os.environ['PaCBucketRouting'][input_type]

return {
"Bucket": pac_bucket
}

def get_modified_input_s3_path(self,*,input_conversion_object):

if not input_conversion_object:

modified_input_s3_path = {
# pass-through original input unmodified
"Bucket":self.event['ControlBrokerConsumerInputs']['Bucket'],
"Key":self.event['ControlBrokerConsumerInputKey']
}

return modified_input_s3_path

def get_invoking_sfn_next_state(self,*,RoutingConfig):

return f'Evaluate{RoutingConfig["InputType"]}By{RoutingConfig["PaCFramework"]}'

def format_routing_decision(self,RoutingConfig):

routing_decision = {
"InvokingSfnNextState" : self.get_invoking_sfn_next_state(
RoutingConfig = RoutingConfig
),
"PaC": self.get_pac_bucket(
input_type = RoutingConfig['InputType']
),
"ModifiedInput": self.get_modified_input_s3_path(
input_conversion_object = RoutingConfig['InputConversionObject']
)
}

return routing_decision

def get_routing_decision(self):

control_broker_consumer_inputs = self.event['ControlBrokerConsumerInputs']

control_broker_consumer_input_key = self.event['ControlBrokerConsumerInputKey']

input_type = control_broker_consumer_inputs['InputType']

routing_decision_matrix = {
"CloudFormationTemplate":"InputTypeCloudFormationPaCFrameworkOPA"
"CloudFormationTemplate": {
"InputType": "CloudFormationTemplate",
"PaCFramework": "OPA",
"InputConversionObject":None
},
# "ConfigEvent": {}
}

routing_decision = self.format_routing_decision(routing_decision_matrix[input_type])

return routing_decision_matrix[self.input_type]
return routing_decision


def lambda_handler(event, context):

print(event)

control_broker_consumer_inputs = event['ControlBrokerConsumerInputs']

print(f"control_broker_consumer_inputs:\n{control_broker_consumer_inputs}")

input_type = control_broker_consumer_inputs['InputType']

p = PacEvaluationRouter(
input_type = input_type
event = event,
)

routing_decision = p.get_routing_decision()

routing = {
"Routing": routing_decision
"Routing": routing_decision,
}

print(f"routing:\n{routing}")

return routing

0 comments on commit 943968d

Please sign in to comment.