samcli/local/common/runtime_template.py (157 lines of code) (raw):

""" All-in-one metadata about runtimes """ import itertools import os import pathlib import re from typing import List _init_path = str(pathlib.Path(os.path.dirname(__file__)).parent.parent) _templates = os.path.join(_init_path, "lib", "init", "templates") _lambda_images_templates = os.path.join(_init_path, "lib", "init", "image_templates") # Note(TheSriram): The ordering of the runtimes list per language is based on the latest to oldest. RUNTIME_DEP_TEMPLATE_MAPPING = { "python": [ { "runtimes": ["python3.13", "python3.12", "python3.11", "python3.10", "python3.9", "python3.8"], "dependency_manager": "pip", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-python"), "build": True, } ], "ruby": [ { "runtimes": ["ruby3.4", "ruby3.3", "ruby3.2"], "dependency_manager": "bundler", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-ruby"), "build": True, } ], "nodejs": [ { "runtimes": ["nodejs22.x", "nodejs20.x", "nodejs18.x", "nodejs16.x"], "dependency_manager": "npm", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-nodejs"), "build": True, } ], "dotnet": [ { "runtimes": ["dotnet8", "dotnet6"], "dependency_manager": "cli-package", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-dotnet"), "build": True, } ], "go": [ { "runtimes": ["go1.x"], "dependency_manager": "mod", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-golang"), "build": False, } ], "java": [ { "runtimes": ["java11", "java8.al2", "java17", "java21"], "dependency_manager": "maven", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-java-maven"), "build": True, }, { "runtimes": ["java11", "java8.al2", "java17", "java21"], "dependency_manager": "gradle", "init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-java-gradle"), "build": True, }, ], } def get_local_manifest_path(): return pathlib.Path(_init_path, "lib", "init", "local_manifest.json") def get_local_lambda_images_location(mapping, runtime): dir_name = os.path.basename(mapping["init_location"]) if dir_name.endswith("-lambda-image"): return os.path.join(_lambda_images_templates, runtime, dir_name) return os.path.join(_lambda_images_templates, runtime, dir_name + "-lambda-image") SUPPORTED_DEP_MANAGERS: List[str] = sorted( list( set( { c.get("dependency_manager") # type: ignore for c in list(itertools.chain(*(RUNTIME_DEP_TEMPLATE_MAPPING.values()))) if c.get("dependency_manager") } ) ) ) # When adding new Lambda runtimes, please update SAM_RUNTIME_TO_SCHEMAS_CODE_LANG_MAPPING # Runtimes are ordered in alphabetical fashion with reverse version order (latest versions first) INIT_RUNTIMES = [ # dotnet runtimes in descending order "dotnet8", "dotnet6", # go runtimes in descending order "go1.x", # java runtimes in descending order "java21", "java17", "java11", "java8.al2", # nodejs runtimes in descending order "nodejs22.x", "nodejs20.x", "nodejs18.x", "nodejs16.x", # custom runtime in descending order "provided.al2023", "provided.al2", "provided", # python runtimes in descending order "python3.13", "python3.12", "python3.11", "python3.10", "python3.9", "python3.8", # ruby runtimes in descending order "ruby3.4", "ruby3.3", "ruby3.2", ] LAMBDA_IMAGES_RUNTIMES_MAP = { "dotnet8": "amazon/dotnet8-base", "dotnet6": "amazon/dotnet6-base", "go1.x": "amazon/go1.x-base", "go (provided.al2)": "amazon/go-provided.al2-base", "go (provided.al2023)": "amazon/go-provided.al2023-base", "java21": "amazon/java21-base", "java17": "amazon/java17-base", "java11": "amazon/java11-base", "java8.al2": "amazon/java8.al2-base", "nodejs22.x": "amazon/nodejs22.x-base", "nodejs20.x": "amazon/nodejs20.x-base", "nodejs18.x": "amazon/nodejs18.x-base", "nodejs16.x": "amazon/nodejs16.x-base", "python3.13": "amazon/python3.13-base", "python3.12": "amazon/python3.12-base", "python3.11": "amazon/python3.11-base", "python3.10": "amazon/python3.10-base", "python3.9": "amazon/python3.9-base", "python3.8": "amazon/python3.8-base", "ruby3.4": "amazon/ruby3.4-base", "ruby3.3": "amazon/ruby3.3-base", "ruby3.2": "amazon/ruby3.2-base", } LAMBDA_IMAGES_RUNTIMES: List = sorted(list(set(LAMBDA_IMAGES_RUNTIMES_MAP.values()))) # Schemas Code lang is a MINIMUM supported version # - this is why later Lambda runtimes can be mapped to earlier Schemas Code Languages # event schema registry supports only java8, python3.6, dotnet6, and Go1 for code binding SAM_RUNTIME_TO_SCHEMAS_CODE_LANG_MAPPING = { "java8.al2": "Java8", "java11": "Java8", "java17": "Java8", "java21": "Java8", "python3.8": "Python36", "python3.9": "Python36", "python3.10": "Python36", "python3.11": "Python36", "python3.12": "Python36", "python3.13": "Python36", "dotnet6": "dotnet6", "dotnet8": "dotnet6", "go1.x": "Go1", "provided.al2": "Go1", } PROVIDED_RUNTIMES = ["provided.al2023", "provided.al2", "provided"] def is_custom_runtime(runtime): """ validated if a runtime is custom or not Parameters ---------- runtime : str runtime to be Returns ------- _type_ _description_ """ if not runtime: return False provided_runtime = get_provided_runtime_from_custom_runtime(runtime) return runtime in PROVIDED_RUNTIMES or bool(provided_runtime in PROVIDED_RUNTIMES) def get_provided_runtime_from_custom_runtime(runtime): """ Gets the base lambda runtime for which a custom runtime is based on Example: rust (provided.al2) --> provided.al2 java11 --> None Parameters ---------- runtime : str Custom runtime or Lambda runtime Returns ------- str returns the base lambda runtime for which a custom runtime is based on """ base_runtime_list = re.findall(r"\(([^()]+)\)", runtime) return base_runtime_list[0] if base_runtime_list else None