samtranslator/plugins/globals/globals_plugin.py (26 lines of code) (raw):
from typing import Any, Dict
from samtranslator.metrics.method_decorator import cw_timer
from samtranslator.model.exceptions import InvalidResourceAttributeTypeException
from samtranslator.plugins.globals.globals import Globals, InvalidGlobalsSectionException
from samtranslator.public.exceptions import InvalidDocumentException
from samtranslator.public.plugins import BasePlugin
from samtranslator.public.sdk.template import SamTemplate
_API_RESOURCE = "AWS::Serverless::Api"
class GlobalsPlugin(BasePlugin):
"""
Plugin to process Globals section of a SAM template before the template is translated to CloudFormation.
"""
@cw_timer(prefix="Plugin-Globals")
def on_before_transform_template(self, template_dict: Dict[str, Any]) -> None:
"""
Hook method that runs before a template gets transformed. In this method, we parse and process Globals section
from the template (if present).
:param dict template_dict: SAM template as a dictionary
"""
try:
global_section = Globals(template_dict)
except InvalidGlobalsSectionException as ex:
raise InvalidDocumentException([ex]) from ex
# For each resource in template, try and merge with Globals if necessary
template = SamTemplate(template_dict)
for logicalId, resource in template.iterate():
try:
resource.properties = global_section.merge(
str(resource.type), resource.properties, logicalId, resource.ignore_globals
)
except InvalidResourceAttributeTypeException as ex:
raise InvalidDocumentException([ex]) from ex
template.set(logicalId, resource)
# Remove the Globals section from template if necessary
Globals.del_section(template_dict)
# If there was a global openApiVersion flag, check and convert swagger
# to the right version
Globals.fix_openapi_definitions(template_dict)