def create_default_deployer(session, config, ui): # type: (Session, Config, UI) -> Deployer client = TypedAWSClient(session) osutils = OSUtils() pip_runner = PipRunner(pip=SubprocessPip(osutils=osutils), osutils=osutils) dependency_builder = PipDependencyBuilder(osutils=osutils, pip_runner=pip_runner) return Deployer( application_builder=ApplicationGraphBuilder(), deps_builder=DependencyBuilder(), build_stage=BuildStage(steps=[ InjectDefaults(), DeploymentPackager(packager=LambdaDeploymentPackager( osutils=osutils, dependency_builder=dependency_builder, ui=UI(), ), ), PolicyGenerator(policy_gen=AppPolicyGenerator(osutils=osutils), ), SwaggerBuilder(swagger_generator=TemplatedSwaggerGenerator(), ) ], ), plan_stage=PlanStage( osutils=osutils, remote_state=RemoteState( client, config.deployed_resources(config.chalice_stage)), ), sweeper=UnreferencedResourcePlanner(), executor=Executor(client, ui), recorder=ResultsRecorder(osutils=osutils), )
def _delete_app(application, temp_dirname): factory = CLIFactory(temp_dirname) config = factory.create_config_obj(chalice_stage_name='dev', autogen_policy=True) session = factory.create_botocore_session() d = factory.create_deletion_deployer(session, UI()) _deploy_with_retries(d, config)
def test_can_create_default_deployer(): session = botocore.session.get_session() deployer = create_default_deployer(session, Config.create( project_dir='.', chalice_stage='dev', ), UI()) assert isinstance(deployer, Deployer)
def create_lambda_invoke_handler(self, name, stage): # type: (str, str) -> LambdaInvokeHandler config = self.create_config_obj(stage) deployed = config.deployed_resources(stage) try: resource = deployed.resource_values(name) arn = resource['lambda_arn'] except (KeyError, ValueError): raise NoSuchFunctionError(name) function_scoped_config = config.scope(stage, name) # The session for max retries needs to be set to 0 for invoking a # lambda function because in the case of a timeout or other retriable # error the underlying client will call the function again. session = self.create_botocore_session( read_timeout=function_scoped_config.lambda_timeout, max_retries=0, ) client = TypedAWSClient(session) invoker = LambdaInvoker(arn, client) handler = LambdaInvokeHandler( invoker, LambdaResponseFormatter(), UI(), ) return handler
def test_can_create_plan_only_deployer(clifactory): session = clifactory.create_botocore_session() config = clifactory.create_config_obj(chalice_stage_name='dev') deployer = clifactory.create_plan_only_deployer(session=session, config=config, ui=UI()) assert isinstance(deployer, Deployer)
def _create_deployer( session, # type: Session config, # type: Config ui, # type: UI executor_cls, # type: Type[BaseExecutor] recorder_cls, # type: Type[ResultsRecorder] ): # type: (...) -> Deployer client = TypedAWSClient(session) osutils = OSUtils() return Deployer( application_builder=ApplicationGraphBuilder(), deps_builder=DependencyBuilder(), build_stage=create_build_stage( osutils, UI(), TemplatedSwaggerGenerator(), ), plan_stage=PlanStage( osutils=osutils, remote_state=RemoteState( client, config.deployed_resources(config.chalice_stage)), ), sweeper=ResourceSweeper(), executor=executor_cls(client, ui), recorder=recorder_cls(osutils=osutils), )
def create_app_packager(config, package_format='cloudformation', merge_template=None): # type: (Config, str, Optional[str]) -> AppPackager osutils = OSUtils() ui = UI() application_builder = ApplicationGraphBuilder() deps_builder = DependencyBuilder() post_processors = [] # type: List[TemplatePostProcessor] generator = None # type: Union[None, TemplateGenerator] if package_format == 'cloudformation': build_stage = create_build_stage(osutils, ui, CFNSwaggerGenerator()) post_processors.extend([ SAMCodeLocationPostProcessor(osutils=osutils), TemplateMergePostProcessor(osutils=osutils, merger=TemplateDeepMerger(), merge_template=merge_template) ]) generator = SAMTemplateGenerator(config) else: build_stage = create_build_stage(osutils, ui, TerraformSwaggerGenerator()) generator = TerraformGenerator(config) post_processors.append( TerraformCodeLocationPostProcessor(osutils=osutils)) resource_builder = ResourceBuilder(application_builder, deps_builder, build_stage) return AppPackager(generator, resource_builder, CompositePostProcessor(post_processors), osutils)
def test_can_create_deployer_with_layer_builds(): session = botocore.session.get_session() deployer = create_default_deployer(session, Config.create( project_dir='.', chalice_stage='dev', automatic_layer=True, ), UI()) assert isinstance(deployer, Deployer)
def delete(ctx, profile, stage): # type: (click.Context, str, str) -> None factory = ctx.obj['factory'] # type: CLIFactory factory.profile = profile config = factory.create_config_obj(chalice_stage_name=stage) session = factory.create_botocore_session() d = factory.create_deletion_deployer(session=session, ui=UI()) d.deploy(config, chalice_stage_name=stage)
def delete(ctx, profile, stage): # type: (click.Context, str, str) -> None factory = ctx.obj['factory'] # type: CLIFactory factory.profile = profile config = factory.create_config_obj(chalice_stage_name=stage) session = factory.create_botocore_session() d = factory.create_default_deployer(session=session, ui=UI()) d.delete(config, chalice_stage_name=stage) remove_stage_from_deployed_values(stage, os.path.join( config.project_dir, '.chalice', 'deployed.json'))
def deploy(ctx, autogen_policy, profile, api_gateway_stage, stage): # type: (click.Context, Optional[bool], str, str, str) -> None factory = ctx.obj['factory'] # type: CLIFactory factory.profile = profile config = factory.create_config_obj( chalice_stage_name=stage, autogen_policy=autogen_policy, api_gateway_stage=api_gateway_stage, ) session = factory.create_botocore_session() d = factory.create_default_deployer(session=session, ui=UI()) deployed_values = d.deploy(config, chalice_stage_name=stage) record_deployed_values(deployed_values, os.path.join( config.project_dir, '.chalice', 'deployed.json'))
def appgraph(ctx, autogen_policy, profile, api_gateway_stage, stage): # type: (click.Context, Optional[bool], str, str, str) -> None """Generate and display the application graph.""" factory = ctx.obj['factory'] # type: CLIFactory factory.profile = profile config = factory.create_config_obj( chalice_stage_name=stage, autogen_policy=autogen_policy, api_gateway_stage=api_gateway_stage, ) graph_build = ApplicationGraphBuilder() graph = graph_build.build(config, stage) ui = UI() GraphPrettyPrint(ui).display_graph(graph)
def create_app_packager(config): # type: (Config) -> AppPackager osutils = OSUtils() ui = UI() application_builder = ApplicationGraphBuilder() deps_builder = DependencyBuilder() build_stage = create_build_stage(osutils, ui, CFNSwaggerGenerator()) resource_builder = ResourceBuilder(application_builder, deps_builder, build_stage) return AppPackager( SAMTemplateGenerator(), resource_builder, TemplatePostProcessor(osutils=osutils), osutils, )
def create_app_packager( config, package_format='cloudformation', template_format='json', merge_template=None): # type: (Config, str, str, Optional[str]) -> AppPackager osutils = OSUtils() ui = UI() application_builder = ApplicationGraphBuilder() deps_builder = DependencyBuilder() post_processors = [] # type: List[TemplatePostProcessor] generator = None # type: Union[None, TemplateGenerator] template_serializer = cast(TemplateSerializer, JSONTemplateSerializer()) if package_format == 'cloudformation': build_stage = create_build_stage( osutils, ui, CFNSwaggerGenerator()) use_yaml_serializer = template_format == 'yaml' if merge_template is not None and \ YAMLTemplateSerializer.is_yaml_template(merge_template): # Automatically switch the serializer to yaml if they specify # a yaml template to merge, regardless of what template format # they specify. use_yaml_serializer = True if use_yaml_serializer: template_serializer = YAMLTemplateSerializer() post_processors.extend([ SAMCodeLocationPostProcessor(osutils=osutils), TemplateMergePostProcessor( osutils=osutils, merger=TemplateDeepMerger(), template_serializer=template_serializer, merge_template=merge_template)]) generator = SAMTemplateGenerator(config) else: build_stage = create_build_stage( osutils, ui, TerraformSwaggerGenerator()) generator = TerraformGenerator(config) post_processors.append( TerraformCodeLocationPostProcessor(osutils=osutils)) resource_builder = ResourceBuilder( application_builder, deps_builder, build_stage) return AppPackager( generator, resource_builder, CompositePostProcessor(post_processors), template_serializer, osutils)
def _deploy_app(temp_dirname): factory = CLIFactory(temp_dirname) config = factory.create_config_obj(chalice_stage_name='dev', autogen_policy=True) session = factory.create_botocore_session() d = factory.create_default_deployer(session, config, UI()) region = session.get_config_variable('region') deployed = _deploy_with_retries(d, config) application = SmokeTestApplication( region=region, deployed_values=deployed, stage_name='dev', app_name=RANDOM_APP_NAME, app_dir=temp_dirname, ) return application
def create_default_deployer(session, ui=None): # type: (botocore.session.Session, UI) -> Deployer if ui is None: ui = UI() aws_client = TypedAWSClient(session) api_gateway_deploy = APIGatewayDeployer(aws_client, ui) osutils = OSUtils() dependency_builder = DependencyBuilder(osutils) packager = LambdaDeploymentPackager(osutils=osutils, dependency_builder=dependency_builder, ui=ui) lambda_deploy = LambdaDeployer( aws_client, packager, ui, osutils, ApplicationPolicyHandler(osutils, AppPolicyGenerator(osutils))) return Deployer(api_gateway_deploy, lambda_deploy, ui)
def deploy(ctx, autogen_policy, profile, api_gateway_stage, stage, connection_timeout): # type: (click.Context, Optional[bool], str, str, str, int) -> None factory = ctx.obj['factory'] # type: CLIFactory factory.profile = profile config = factory.create_config_obj( chalice_stage_name=stage, autogen_policy=autogen_policy, api_gateway_stage=api_gateway_stage, ) session = factory.create_botocore_session( connection_timeout=connection_timeout) ui = UI() d = factory.create_default_deployer(session=session, config=config, ui=ui) deployed_values = d.deploy(config, chalice_stage_name=stage) reporter = factory.create_deployment_reporter(ui=ui) reporter.display_report(deployed_values)
def create_app_packager(config): # type: (Config) -> AppPackager osutils = OSUtils() ui = UI() # The config object does not handle a default value # for autogen'ing a policy so we need to handle this here. return AppPackager( # We're add place holder values that will be filled in once the # lambda function is deployed. SAMTemplateGenerator( CFNSwaggerGenerator('{region}', {}), ApplicationPolicyHandler(osutils, AppPolicyGenerator(osutils))), LambdaDeploymentPackager( osutils=osutils, dependency_builder=DependencyBuilder(osutils), ui=ui, ))
def create_default_deployer(session, config, ui): # type: (Session, Config, UI) -> Deployer client = TypedAWSClient(session) osutils = OSUtils() return Deployer( application_builder=ApplicationGraphBuilder(), deps_builder=DependencyBuilder(), build_stage=create_build_stage( osutils, UI(), TemplatedSwaggerGenerator(), ), plan_stage=PlanStage( osutils=osutils, remote_state=RemoteState( client, config.deployed_resources(config.chalice_stage)), ), sweeper=ResourceSweeper(), executor=Executor(client, ui), recorder=ResultsRecorder(osutils=osutils), )
def plan(ctx, autogen_policy, profile, api_gateway_stage, stage): # type: (click.Context, Optional[bool], str, str, str) -> None """Generate and display deployment plan. This command will calculate and pretty print the deployment plan without actually executing the plan. It's primarily used to better understand the chalice deployment process. """ factory = ctx.obj['factory'] # type: CLIFactory factory.profile = profile config = factory.create_config_obj( chalice_stage_name=stage, autogen_policy=autogen_policy, api_gateway_stage=api_gateway_stage, ) session = factory.create_botocore_session() ui = UI() d = factory.create_plan_only_deployer( session=session, config=config, ui=ui) d.deploy(config, chalice_stage_name=stage)
def generate_models(ctx, stage): # type: (click.Context, str) -> None """Generate a model from Chalice routes. Currently only supports generating Swagger 2.0 models. """ factory = ctx.obj['factory'] # type: CLIFactory config = factory.create_config_obj(stage) if not config.chalice_app.routes: click.echo('No REST API found to generate model from.') raise click.Abort() swagger_generator = TemplatedSwaggerGenerator() model = swagger_generator.generate_swagger(config.chalice_app, ) ui = UI() ui.write(json.dumps(model, indent=4, cls=PlanEncoder)) ui.write('\n')
def create_app_packager(config, merge_template=None): # type: (Config, Optional[str]) -> AppPackager osutils = OSUtils() ui = UI() application_builder = ApplicationGraphBuilder() deps_builder = DependencyBuilder() build_stage = create_build_stage(osutils, ui, CFNSwaggerGenerator()) resource_builder = ResourceBuilder(application_builder, deps_builder, build_stage) processors = [ ReplaceCodeLocationPostProcessor(osutils=osutils), TemplateMergePostProcessor( osutils=osutils, merger=TemplateDeepMerger(), merge_template=merge_template, ), ] return AppPackager( SAMTemplateGenerator(), resource_builder, CompositePostProcessor(processors), osutils, )
def test_can_create_deletion_deployer(clifactory): session = clifactory.create_botocore_session() deployer = clifactory.create_deletion_deployer(session, UI()) assert isinstance(deployer, Deployer)
def test_can_create_deletion_deployer(): session = botocore.session.get_session() deployer = create_deletion_deployer(TypedAWSClient(session), UI()) assert isinstance(deployer, Deployer)
def test_can_create_deployment_reporter(clifactory): ui = UI() reporter = clifactory.create_deployment_reporter(ui=ui) assert isinstance(reporter, DeploymentReporter)