Beispiel #1
0
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),
    )
Beispiel #2
0
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 _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),
    )
Beispiel #4
0
 def __init__(self, osutils=None):
     # type: (Optional[OSUtils]) -> None
     self._mtime_cache = {}  # type: Dict[str, float]
     self._shutdown_event = threading.Event()
     self._thread = None  # type: Optional[threading.Thread]
     if osutils is None:
         osutils = OSUtils()
     self._osutils = osutils
Beispiel #5
0
 def __init__(self, osutils=None, import_string=None):
     # type: (Optional[OSUtils], OptStr) -> None
     if osutils is None:
         osutils = OSUtils()
     self._osutils = osutils
     if import_string is None:
         import_string = pip_import_string()
     self._import_string = import_string
Beispiel #6
0
 def __init__(self, osutils=None, dependency_builder=None):
     # type: (Optional[OSUtils], Optional[DependencyBuilder]) -> None
     if osutils is None:
         osutils = OSUtils()
     self._osutils = osutils
     if dependency_builder is None:
         dependency_builder = DependencyBuilder(self._osutils)
     self._dependency_builder = dependency_builder
Beispiel #7
0
def local_app(tmpdir):
    temp_dir_path = str(tmpdir)
    OSUtils().copytree(PROJECT_DIR, temp_dir_path)
    old_dir = os.getcwd()
    try:
        os.chdir(temp_dir_path)
        yield temp_dir_path
    finally:
        os.chdir(old_dir)
Beispiel #8
0
 def __init__(self, directory, filename, osutils=None):
     # type: (str, str, Optional[OSUtils]) -> None
     self.dist_type = 'wheel' if filename.endswith('.whl') else 'sdist'
     self._directory = directory
     self.filename = filename
     if osutils is None:
         osutils = OSUtils()
     self._osutils = osutils
     self._name, self._version = self._calculate_name_and_version()
Beispiel #9
0
def create_deletion_deployer(client, ui):
    # type: (TypedAWSClient, UI) -> Deployer
    return Deployer(
        application_builder=ApplicationGraphBuilder(),
        deps_builder=DependencyBuilder(),
        build_stage=BuildStage(steps=[]),
        plan_stage=NoopPlanner(),
        sweeper=UnreferencedResourcePlanner(),
        executor=Executor(client, ui),
        recorder=ResultsRecorder(osutils=OSUtils()),
    )
Beispiel #10
0
def smoke_test_app(tmpdir_factory):
    # We can't use the monkeypatch fixture here because this is a module scope
    # fixture and monkeypatch is a function scoped fixture.
    os.environ['APP_NAME'] = RANDOM_APP_NAME
    tmpdir = str(tmpdir_factory.mktemp(RANDOM_APP_NAME))
    OSUtils().copytree(PROJECT_DIR, tmpdir)
    _inject_app_name(tmpdir)
    application = _deploy_app(tmpdir)
    yield application
    _delete_app(application, tmpdir)
    os.environ.pop('APP_NAME')
def getting_started_prompt():
    # type: () -> Dict[str, Any]
    print(WELCOME_PROMPT)
    projects = list_available_projects(TEMPLATES_DIR, OSUtils())
    questions = [
        inquirer.Text('project_name', message='Enter the project name'),
        inquirer.List('project_type',
                      message='Select your project type',
                      choices=[(p.description, p.key) for p in projects])
    ]
    answers = inquirer.prompt(questions)
    return answers
Beispiel #12
0
def create_default_deployer(session, prompter=None):
    # type: (botocore.session.Session, NoPrompt) -> Deployer
    if prompter is None:
        prompter = NoPrompt()
    aws_client = TypedAWSClient(session)
    api_gateway_deploy = APIGatewayDeployer(aws_client)

    osutils = OSUtils()
    packager = LambdaDeploymentPackager(osutils=osutils)
    lambda_deploy = LambdaDeployer(
        aws_client, packager, prompter, osutils,
        ApplicationPolicyHandler(osutils, AppPolicyGenerator(osutils)))
    return Deployer(api_gateway_deploy, lambda_deploy)
Beispiel #13
0
def create_app_packager(config):
    # type: (Config) -> AppPackager
    osutils = OSUtils()
    # 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}', {}),
            PreconfiguredPolicyGenerator(
                config,
                ApplicationPolicyHandler(osutils,
                                         AppPolicyGenerator(osutils)))),
        LambdaDeploymentPackager())
Beispiel #14
0
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_new_project_skeleton(project_name, project_type='legacy'):
    # type: (str, Optional[str]) -> None
    osutils = OSUtils()
    all_projects = list_available_projects(TEMPLATES_DIR, osutils)
    project = [p for p in all_projects if p.key == project_type][0]
    template_kwargs = {
        'app_name': project_name,
        'chalice_version': chalice_version,
    }
    project_creator = ProjectCreator(osutils)
    project_creator.create_new_project(
        os.path.join(TEMPLATES_DIR, project.dirname),
        project_name,
        template_kwargs=template_kwargs,
    )
Beispiel #16
0
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)
Beispiel #17
0
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)
Beispiel #18
0
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),
    )
Beispiel #19
0
 def test_can_build_private_rest_api_custom_policy(self, tmpdir,
                                                   sample_app):
     config = self.create_config(sample_app,
                                 app_name='rest-api-app',
                                 api_gateway_policy_file='foo.json',
                                 api_gateway_endpoint_type='PRIVATE',
                                 project_dir=str(tmpdir))
     tmpdir.mkdir('.chalice').join('foo.json').write(
         serialize_to_json({
             'Version': '2012-10-17',
             'Statement': []
         }))
     application_builder = ApplicationGraphBuilder()
     build_stage = BuildStage(
         steps=[PolicyGenerator(osutils=OSUtils(), policy_gen=None)])
     application = application_builder.build(config, stage_name='dev')
     build_stage.execute(config, application.resources)
     rest_api = application.resources[0]
     assert rest_api.policy.document == {
         'Version': '2012-10-17',
         'Statement': []
     }
Beispiel #20
0
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,
    )
Beispiel #21
0
 def _make_appdir_and_dependency_builder(self, reqs, tmpdir, runner):
     appdir = str(_create_app_structure(tmpdir))
     self._write_requirements_txt(reqs, appdir)
     builder = DependencyBuilder(OSUtils(), runner)
     return appdir, builder
Beispiel #22
0
def osutils():
    return OSUtils()
Beispiel #23
0
 def __init__(self, source_code_path, *args, **kwargs):
     self.source_code_path = source_code_path
     self._osutils = OSUtils()
     self._ui = MutedUI()
Beispiel #24
0
def basic_app(tmpdir):
    tmpdir = str(tmpdir.mkdir('basicapp'))
    OSUtils().copytree(BASIC_APP, tmpdir)
    return tmpdir
Beispiel #25
0
 def __init__(self, pip, osutils=None):
     # type: (SubprocessPip, Optional[OSUtils]) -> None
     if osutils is None:
         osutils = OSUtils()
     self._wrapped_pip = pip
     self._osutils = osutils
Beispiel #26
0
 def __init__(self, osutils=None):
     # type: (Optional[OSUtils]) -> None
     if osutils is None:
         osutils = OSUtils()
     self._osutils = osutils
Beispiel #27
0
parser.add_argument("--wheels-dir", default="vendor.in")
args = parser.parse_args()

if args.build_wheels:
    if platform.system() != "Linux":
        parser.exit(f"{parser.prog}: Expected to run on a Linux system.")
    shutil.rmtree(args.wheels_dir)
    subprocess.call(
        ["git", "checkout", "--",
         os.path.join(args.wheels_dir, ".keep")])
    for wheel_identifier in args.build_wheels:
        build_wheel(wheel_identifier, args.wheels_dir)
    print(f'Please run "git add {args.wheels_dir}" and commit the result.')
else:
    with TemporaryDirectory() as td:
        python_version = f"python{sys.version_info.major}.{sys.version_info.minor}"
        abi = LambdaDeploymentPackager._RUNTIME_TO_ABI[python_version]
        compat_wheels, missing_wheels = DependencyBuilder(
            OSUtils())._download_dependencies(abi, td, args.pip_reqs)
        need_wheels = [
            w for w in missing_wheels
            if not os.path.exists(os.path.join(args.wheels_dir, w.identifier))
        ]
        if need_wheels:
            msg = 'Missing wheels: {}. Please run "{}" in a Linux VM'
            parser.exit(
                msg.format(
                    ", ".join(wheel.identifier for wheel in need_wheels),
                    " ".join(sys.argv + ["--build-wheels"] +
                             [w.identifier for w in missing_wheels])))
Beispiel #28
0
def smoke_test_app(tmpdir_factory):
    tmpdir = str(tmpdir_factory.mktemp('smoketestapp'))
    OSUtils().copytree(PROJECT_DIR, tmpdir)
    application = _deploy_app(tmpdir)
    yield application
    _delete_app(application)