in critter/stack.py [0:0]
def parse_args(self, args):
parser = argparse.ArgumentParser(description=f"critter {__version__} - AWS Config Rule Integration TesTER")
parser.add_argument(
"template",
metavar="TEMPLATE",
help="CloudFormation template(s) to test already deployed Config rule",
)
parser.add_argument(
"--log-level",
dest="log_level",
help="Specify log level - 'debug' will include boto3 debug logs",
default="info",
choices=["debug", "info", "warning"],
)
# TODO: this might make more sense in a test stack output
parser.add_argument(
self.TRIGGER_RULE_EVALUATION_ARG,
help=(
"Trigger Config rule evaluation after CloudFormation stack deployment. Useful for "
"periodic evaluation rules. Also ensures the rule evaluation occured after stack deployment."
),
dest="trigger_rule_evaluation",
action="store_true",
)
parser.set_defaults(trigger_rule_evaluation=False)
# TODO: --stack-name-prefix argument
parser.add_argument(
"--stack-name",
metavar="STACK-NAME",
help="CloudFormation stack name (default is generated from TEMPLATE file name)",
)
parser.add_argument(
"--stack-tags",
metavar='\'[{"Key": "TagKey", "Value": "TagValue"}, ...]\'',
type=json.loads,
default="[]",
help="Tags to associate with the CloudFormation stack formatted as a JSON string",
)
parser.add_argument(
"--capabilities",
default=[],
metavar="CAPABILITY",
nargs="+",
help="CloudFormation capabilities needed to deploy the stack (i.e. CAPABILITY_IAM, CAPABILITY_NAMED_IAM)",
)
parser.add_argument(
self.DELETE_STACK_ARG,
help=(
"Test outcome that should trigger CloudFormation stack delete "
f"(default: {self.DELETE_STACK_DEFAULT})"
),
default=self.DELETE_STACK_DEFAULT,
choices=self.DELETE_STACK_CHOICES,
)
parsed_args = parser.parse_args(args)
logger.setLevel(parsed_args.log_level.upper())
self.template_file = parsed_args.template
template_filename = os.path.splitext(os.path.basename(self.template_file))[0]
with open(self.template_file) as f:
self.template_body = f.read()
if parsed_args.stack_name:
self.stack_name = parsed_args.stack_name
else:
self.stack_name = "Critter-" + template_filename.replace("_", "-")
if parsed_args.delete_stack not in self.DELETE_STACK_CHOICES:
raise Exception(
f"Error - delete_stack must be one of {self.DELETE_STACK_CHOICES}, "
f"received '{parsed_args.delete_stack}'"
)
self.delete_stack = parsed_args.delete_stack
if parsed_args.stack_tags:
self.stack_tags = parsed_args.stack_tags
else:
self.stack_tags = [
{"Key": "ConfigRuleTesting", "Value": "True"},
{"Key": "Critter", "Value": "True"},
]
self.cfn_capabilities = parsed_args.capabilities
# TODO: default trigger_rule_evaluation to True if rule detected as periodic evaluation only
# or if stack already exists
self.trigger_rule_evaluation = parsed_args.trigger_rule_evaluation