Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add local module support to the cloudformation package command #9124

Draft
wants to merge 24 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,5 @@ doc/source/tutorial/services.rst

# Pyenv
.python-version
.env

34 changes: 31 additions & 3 deletions awscli/customizations/cloudformation/artifact_exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@
from awscli.customizations.cloudformation import exceptions
from awscli.customizations.cloudformation.yamlhelper import yaml_dump, \
yaml_parse
from awscli.customizations.cloudformation import modules
import jmespath


LOG = logging.getLogger(__name__)

MODULES = "Modules"
RESOURCES = "Resources"

def is_path_value_valid(path):
return isinstance(path, str)
Expand Down Expand Up @@ -591,8 +594,8 @@ def __init__(self, template_path, parent_dir, uploader,
raise ValueError("parent_dir parameter must be "
"an absolute path to a folder {0}"
.format(parent_dir))

abs_template_path = make_abs_path(parent_dir, template_path)
self.module_parent_path = abs_template_path
template_dir = os.path.dirname(abs_template_path)

with open(abs_template_path, "r") as handle:
Expand Down Expand Up @@ -651,14 +654,39 @@ def export(self):
:return: The template with references to artifacts that have been
exported to s3.
"""

# Process modules
try:
self.template_dict = modules.process_module_section(
self.template_dict,
self.template_dir,
self.module_parent_path)
except Exception as e:
msg=f"Failed to process Modules section: {e}"
LOG.exception(msg)
raise exceptions.InvalidModuleError(msg=msg)

self.template_dict = self.export_metadata(self.template_dict)

if "Resources" not in self.template_dict:
if RESOURCES not in self.template_dict:
return self.template_dict

# Process modules that are specified as Resources, not in Modules
try:
self.template_dict = modules.process_resources_section(
self.template_dict,
self.template_dir,
self.module_parent_path,
None)
except Exception as e:
msg=f"Failed to process modules in Resources: {e}"
LOG.exception(msg)
raise exceptions.InvalidModuleError(msg=msg)


self.template_dict = self.export_global_artifacts(self.template_dict)

self.export_resources(self.template_dict["Resources"])
self.export_resources(self.template_dict[RESOURCES])

return self.template_dict

Expand Down
6 changes: 6 additions & 0 deletions awscli/customizations/cloudformation/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,9 @@ class DeployBucketRequiredError(CloudFormationCommandError):

class InvalidForEachIntrinsicFunctionError(CloudFormationCommandError):
fmt = 'The value of {resource_id} has an invalid "Fn::ForEach::" format: Must be a list of three entries'

class InvalidModulePathError(CloudFormationCommandError):
fmt = 'The value of {source} is not a valid path to a local file'

class InvalidModuleError(CloudFormationCommandError):
fmt = 'Invalid module: {msg}'
Loading
Loading