in chalice/deploy/planner.py [0:0]
def _plan_restapi(self, resource):
# type: (models.RestAPI) -> Sequence[InstructionMsg]
function = resource.lambda_function
function_name = function.function_name
varname = '%s_lambda_arn' % function.resource_name
lambda_arn_var = Variable(varname)
# There's a set of shared instructions that are needed
# in both the update as well as the initial create case.
# That's what this shared_plan_premable is for.
shared_plan_preamble = self._arn_parse_instructions(lambda_arn_var) + [
models.JPSearch('dns_suffix',
input_var='parsed_lambda_arn',
output_var='dns_suffix'),
# The swagger doc uses the 'api_handler_lambda_arn'
# var name so we need to make sure we populate this variable
# before importing the rest API.
models.CopyVariable(from_var=varname,
to_var='api_handler_lambda_arn'),
] # type: List[InstructionMsg]
# There's also a set of instructions that are needed
# at the end of deploying a rest API that apply to both
# the update and create case.
shared_plan_patch_ops = [{
'op': 'replace',
'path': '/minimumCompressionSize',
'value': resource.minimum_compression}
] # type: List[Dict]
shared_plan_epilogue = [
models.APICall(
method_name='update_rest_api',
params={
'rest_api_id': Variable('rest_api_id'),
'patch_operations': shared_plan_patch_ops
}
),
models.APICall(
method_name='add_permission_for_apigateway',
params={'function_name': function_name,
'region_name': Variable('region_name'),
'account_id': Variable('account_id'),
'rest_api_id': Variable('rest_api_id')},
),
models.APICall(
method_name='deploy_rest_api',
params={'rest_api_id': Variable('rest_api_id'),
'xray': resource.xray,
'api_gateway_stage': resource.api_gateway_stage},
),
models.StoreValue(
name='rest_api_url',
value=StringFormat(
'https://{rest_api_id}.execute-api.{region_name}'
'.{dns_suffix}/%s/' % resource.api_gateway_stage,
['rest_api_id', 'region_name', 'dns_suffix'],
),
),
models.RecordResourceVariable(
resource_type='rest_api',
resource_name=resource.resource_name,
name='rest_api_url',
variable_name='rest_api_url',
),
] # type: List[InstructionMsg]
for auth in resource.authorizers:
shared_plan_epilogue.append(
models.APICall(
method_name='add_permission_for_apigateway',
params={'function_name': auth.function_name,
'region_name': Variable('region_name'),
'account_id': Variable('account_id'),
'rest_api_id': Variable('rest_api_id')},
)
)
if not self._remote_state.resource_exists(resource):
plan = shared_plan_preamble + [
(models.APICall(
method_name='import_rest_api',
params={'swagger_document': resource.swagger_doc,
'endpoint_type': resource.endpoint_type},
output_var='rest_api_id',
), "Creating Rest API\n"),
models.RecordResourceVariable(
resource_type='rest_api',
resource_name=resource.resource_name,
name='rest_api_id',
variable_name='rest_api_id',
),
]
else:
deployed = self._remote_state.resource_deployed_values(resource)
shared_plan_epilogue.insert(
0,
models.APICall(
method_name='get_rest_api',
params={'rest_api_id': Variable('rest_api_id')},
output_var='rest_api')
)
shared_plan_patch_ops.append({
'op': 'replace',
'path': StringFormat(
'/endpointConfiguration/types/%s' % (
'{rest_api[endpointConfiguration][types][0]}'),
['rest_api']),
'value': resource.endpoint_type}
)
plan = shared_plan_preamble + [
models.StoreValue(
name='rest_api_id',
value=deployed['rest_api_id']),
models.RecordResourceVariable(
resource_type='rest_api',
resource_name=resource.resource_name,
name='rest_api_id',
variable_name='rest_api_id',
),
(models.APICall(
method_name='update_api_from_swagger',
params={
'rest_api_id': Variable('rest_api_id'),
'swagger_document': resource.swagger_doc,
},
), "Updating rest API\n"),
]
plan.extend(shared_plan_epilogue)
if resource.domain_name:
custom_domain_plan = self._add_custom_domain_plan(
resource.domain_name, resource.endpoint_type
)
plan += custom_domain_plan
return plan