Skip to content

Commit 9a08e7e

Browse files
committed
Validate capacity provider in create_function
1 parent cf2a876 commit 9a08e7e

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

localstack-core/localstack/services/lambda_/provider.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@
254254

255255
LOG = logging.getLogger(__name__)
256256

257+
CAPACITY_PROVIDER_ARN_NAME = "arn:aws[a-zA-Z-]*:lambda:(eusc-)?[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\d{1}:\\d{12}:capacity-provider:[a-zA-Z0-9-_]+"
257258
LAMBDA_DEFAULT_TIMEOUT = 3
258259
LAMBDA_DEFAULT_MEMORY_SIZE = 128
259260

@@ -852,6 +853,30 @@ def _validate_layers(self, new_layers: list[str], region: str, account_id: str):
852853
)
853854
visited_layers[layer_arn] = layer_version_arn
854855

856+
def _validate_capacity_provider(
857+
self, capacity_provider_config: CapacityProviderConfig, context: RequestContext
858+
):
859+
if not capacity_provider_config.get("LambdaManagedInstancesCapacityProviderConfig"):
860+
raise ValidationException(
861+
"1 validation error detected: Value null at 'capacityProviderConfig.lambdaManagedInstancesCapacityProviderConfig' failed to satisfy constraint: Member must not be null"
862+
)
863+
864+
capacity_provider_arn = capacity_provider_config.get(
865+
"LambdaManagedInstancesCapacityProviderConfig", {}
866+
).get("CapacityProviderArn")
867+
if not capacity_provider_arn:
868+
raise ValidationException(
869+
"1 validation error detected: Value null at 'capacityProviderConfig.lambdaManagedInstancesCapacityProviderConfig.capacityProviderArn' failed to satisfy constraint: Member must not be null"
870+
)
871+
872+
if not re.match(CAPACITY_PROVIDER_ARN_NAME, capacity_provider_arn):
873+
raise ValidationException(
874+
f"1 validation error detected: Value '{capacity_provider_arn}' at 'capacityProviderConfig.lambdaManagedInstancesCapacityProviderConfig.capacityProviderArn' failed to satisfy constraint: Member must satisfy regular expression pattern: {CAPACITY_PROVIDER_ARN_NAME}"
875+
)
876+
877+
capacity_provider_name = capacity_provider_arn.split(":")[-1]
878+
self.get_capacity_provider(context, capacity_provider_name)
879+
855880
@staticmethod
856881
def map_layers(new_layers: list[str]) -> list[LayerVersion]:
857882
layers = []
@@ -1028,11 +1053,12 @@ def create_function(
10281053
# Runtime management controls are not available when providing a custom image
10291054
runtime_version_config = None
10301055

1031-
# TODO: validations and figure out in which order
10321056
capacity_provider_config = None
10331057
memory_size = request.get("MemorySize", LAMBDA_DEFAULT_MEMORY_SIZE)
10341058
if "CapacityProviderConfig" in request:
10351059
capacity_provider_config = request["CapacityProviderConfig"]
1060+
self._validate_capacity_provider(capacity_provider_config, context)
1061+
10361062
default_config = CapacityProviderConfig(
10371063
LambdaManagedInstancesCapacityProviderConfig=LambdaManagedInstancesCapacityProviderConfig(
10381064
ExecutionEnvironmentMemoryGiBPerVCpu=2.0,

0 commit comments

Comments
 (0)