def _get_integration_function_name(self, method_config): """ Tries to parse the Lambda Function name from the Integration defined in the method configuration. Integration configuration is defined under the special "x-amazon-apigateway-integration" key. We care only about Lambda integrations, which are of type aws_proxy, and ignore the rest. Integration URI is complex and hard to parse. Hence we do our best to extract function name out of integration URI. If not possible, we return None. Parameters ---------- method_config : dict Dictionary containing the method configuration which might contain integration settings Returns ------- string or None Lambda function name, if possible. None, if not. """ if not isinstance(method_config, dict) or self._INTEGRATION_KEY not in method_config: return None integration = method_config[self._INTEGRATION_KEY] if integration \ and isinstance(integration, dict) \ and integration.get("type") == IntegrationType.aws_proxy.value: # Integration must be "aws_proxy" otherwise we don't care about it return LambdaUri.get_function_name(integration.get("uri"))
def _get_route_function_name(resources, integration_target): """ Look for the APIGateway integration resource based on the input integration_target, then try to parse the lambda function from the the integration resource properties. It also gets the Payload format version from the API Gateway integration resource. Parameters ---------- resources : dict dictionary of all resources. integration_target : str the path of the HTTP Gateway integration resource Returns ------- string or None, string or None Lambda function name, if possible. None, if not. Payload format version, if possible. None, if not """ integration_id = integration_target.split("/")[1].strip() integration_resource = resources.get(integration_id, {}) resource_type = integration_resource.get("Type") if resource_type == CfnApiProvider.APIGATEWAY_V2_INTEGRATION: properties = integration_resource.get("Properties", {}) integration_uri = properties.get("IntegrationUri") payload_format_version = properties.get("PayloadFormatVersion") if integration_uri and isinstance(integration_uri, str): return LambdaUri.get_function_name( integration_uri), payload_format_version return None, None
def _get_integration_function_name(self, method_config): """ Tries to parse the Lambda Function name from the Integration defined in the method configuration. Integration configuration is defined under the special "x-amazon-apigateway-integration" key. We care only about Lambda integrations, which are of type aws_proxy, and ignore the rest. Integration URI is complex and hard to parse. Hence we do our best to extract function name out of integration URI. If not possible, we return None. Parameters ---------- method_config : dict Dictionary containing the method configuration which might contain integration settings Returns ------- string or None Lambda function name, if possible. None, if not. """ if not isinstance(method_config, dict) or self._INTEGRATION_KEY not in method_config: return None integration = method_config[self._INTEGRATION_KEY] if integration and isinstance(integration, dict) and integration.get( "type") == IntegrationType.aws_proxy.value: # Integration must be "aws_proxy" otherwise we don't care about it return LambdaUri.get_function_name(integration.get("uri")) return None
def _extract_cfn_gateway_v2_api( self, stack_path: str, logical_id: str, api_resource: Dict, collector: ApiCollector, cwd: Optional[str] = None, ) -> None: """ Extract APIs from AWS::ApiGatewayV2::Api resource by reading and parsing Swagger documents. The result is added to the collector. If the Swagger documents is not available, it can add a catch-all route based on the target function. Parameters ---------- stack_path : str Path of the stack the resource is located logical_id : str Logical ID of the resource api_resource : dict Resource definition, including its properties collector : ApiCollector Instance of the API collector that where we will save the API information cwd : Optional[str] An optional string to override the current working directory """ properties = api_resource.get("Properties", {}) body = properties.get("Body") body_s3_location = properties.get("BodyS3Location") cors = self.extract_cors_http(properties.get("CorsConfiguration")) target = properties.get("Target") route_key = properties.get("RouteKey") protocol_type = properties.get("ProtocolType") if not body and not body_s3_location: LOG.debug( "Swagger document not found in Body and BodyS3Location for resource '%s'.", logical_id) if cors: collector.cors = cors if target and protocol_type == CfnApiProvider.HTTP_API_PROTOCOL_TYPE: method, path = self._parse_route_key(route_key) routes = Route( methods=[method], path=path, function_name=LambdaUri.get_function_name(target), event_type=Route.HTTP, stack_path=stack_path, ) collector.add_routes(logical_id, [routes]) return CfnBaseApiProvider.extract_swagger_route(stack_path, logical_id, body, body_s3_location, None, collector, cwd, Route.HTTP)
def _get_integration_function_name(integration): """ Tries to parse the Lambda Function name from the Integration defined in the method configuration. Integration configuration. We care only about Lambda integrations, which are of type aws_proxy, and ignore the rest. Integration URI is complex and hard to parse. Hence we do our best to extract function name out of integration URI. If not possible, we return None. Parameters ---------- method_config : dict Dictionary containing the method configuration which might contain integration settings Returns ------- string or None Lambda function name, if possible. None, if not. """ if integration and isinstance(integration, dict): # Integration must be "aws_proxy" otherwise we don't care about it return LambdaUri.get_function_name(integration.get("Uri"))
def _get_integration_function_name(self, method_config): """ Tries to parse the Lambda Function name from the Integration defined in the method configuration. Integration configuration is defined under the special "x-amazon-apigateway-integration" key. We care only about Lambda integrations, which are of type aws_proxy, and ignore the rest. Integration URI is complex and hard to parse. Hence we do our best to extract function name out of integration URI. If not possible, we return None. Parameters ---------- method_config : dict Dictionary containing the method configuration which might contain integration settings Returns ------- string or None Lambda function name, if possible. None, if not. """ integration = self._get_integration(method_config) if integration is None: return None return LambdaUri.get_function_name(integration.get("uri"))
def _get_integration_function_name(integration: Dict) -> Optional[str]: """ Tries to parse the Lambda Function name from the Integration defined in the method configuration. Integration configuration. We care only about Lambda integrations, which are of type aws_proxy, and ignore the rest. Integration URI is complex and hard to parse. Hence we do our best to extract function name out of integration URI. If not possible, we return None. Parameters ---------- integration : Dict the integration defined in the method configuration Returns ------- string or None Lambda function name, if possible. None, if not. """ if integration and isinstance(integration, dict): # Integration must be "aws_proxy" otherwise we don't care about it uri: str = cast(str, integration.get("Uri")) return LambdaUri.get_function_name(uri) return None
def test_get_function_name_success(self, test_case_name, uri): result = LambdaUri.get_function_name(uri) self.assertEqual(result, self.FUNCTION_NAME)
def test_get_function_name_failure(self, test_case_name, uri): result = LambdaUri.get_function_name(uri) self.assertIsNone(result, "Must fail to get function name when " + test_case_name)
def test_get_function_name_success(self, test_case_name, uri): result = LambdaUri.get_function_name(uri) self.assertEquals(result, self.FUNCTION_NAME)