def test_retrieve_binaries_data(self):
        features.register(DockerFeature())
        load_registered_features()
        action = actions.get(
            'docker:display-info')  # type:DockerDisplayInfoAction

        assert [] == action._retrieve_binaries_data(Dotty({}))
        assert [] == action._retrieve_binaries_data(Dotty({'toto': 'toto'}))
        assert [] == action._retrieve_binaries_data(
            Dotty({'labels': {
                'toto': '123'
            }}))
        assert ['npm-simple'] == action._retrieve_binaries_data(
            Dotty({
                'labels': {
                    'ddb.emit.docker:binary[npm-simple](name)': 'npm-simple',
                    'ddb.emit.docker:binary[npm-simple](workdir)': '/app'
                }
            }))
        assert ['npm', 'npm-simple'] == sorted(
            action._retrieve_binaries_data(
                Dotty({
                    'labels': {
                        'ddb.emit.docker:binary[npm](name)': 'npm',
                        'ddb.emit.docker:binary[npm-simple](name)':
                        'npm-simple',
                        'ddb.emit.docker:binary[npm-simple](workdir)': '/app'
                    }
                })))
Exemple #2
0
    def test_from_mysql_fixuid_removed(self, project_loader):
        project_loader("from-mysql-fixuid-removed")
        register_default_caches()

        features.register(FixuidFeature())
        load_registered_features()
        register_actions_in_event_bus(True)

        with open('docker-compose.yml', 'r') as config_file:
            config = yaml.load(config_file, yaml.SafeLoader)

        events.docker.docker_compose_config(config)

        with open(os.path.join("docker", "Dockerfile.expected"), "r") as f:
            expected = f.read()
        with open(os.path.join("docker", "Dockerfile"), "r") as f:
            content = f.read()
        assert content == expected

        assert os.path.exists(os.path.join("docker", "fixuid.tar.gz"))

        os.remove(os.path.join("docker", "fixuid.yml"))
        events.file.deleted(os.path.join("docker", "fixuid.yml"))

        with open(os.path.join("docker", "Dockerfile.removed.expected"),
                  "r") as f:
            expected = f.read()
        with open(os.path.join("docker", "Dockerfile"), "r") as f:
            content = f.read()
        assert content == expected

        assert not os.path.exists(os.path.join("docker", "fixuid.tar.gz"))
    def test_execute_extra_services(self, capsys: CaptureFixture,
                                    project_loader):
        project_loader("extra-services")

        features.register(DockerFeature())
        features.register(TraefikFeature())
        load_registered_features()
        config.args.type = None
        action = actions.get(
            'docker:display-info')  # type:DockerDisplayInfoAction
        action.execute()

        capture = capsys.readouterr()
        assert capture.out
        assert not capture.err
        assert ('\n'.join([
            '+-------------------------+', '| web                     |',
            '+-------------------------+', '| https://web.domain.tld/ |',
            '+-------------------------+', '',
            '+-----------------------------------------------+',
            '| foo (extra)                                   |',
            '+-----------------------------------------------+',
            '| https://sub.test --> http://192.168.99.1:8080 |',
            '+-----------------------------------------------+', '\n'
        ])) == capture.out
Exemple #4
0
    def test_update_files_with_submodule(self, project_loader):
        project_loader("with_submodules")
        features.register(CoreFeature())
        features.register(GitFeature())

        load_registered_features()

        path_main = config.path.project_home
        path_submodule = os.path.join(path_main, 'submodule')

        submodule = Repo.init(path_submodule)
        submodule.create_remote(
            'origin', 'https://github.com/inetum-orleans/docker-devbox-ddb')
        submodule.git.add('.')
        submodule.git.update_index('.gitignore', chmod='+x')
        submodule.git.commit('-m "Initial commit"')

        repo = Repo.init(path_main)
        repo.git.add('.')
        repo.create_submodule('a-sub-module', 'submodule', no_checkout=True)
        repo.git.update_index('.gitignore', chmod='+x')
        repo.git.commit('-m "Initial commit"')

        action = FixFilePermissionsAction()
        action.execute()

        assert os.access(os.path.join(config.path.project_home, '.gitignore'),
                         os.X_OK)
        assert os.access(
            os.path.join(config.path.project_home, 'submodule', '.gitignore'),
            os.X_OK)
        assert not os.access(
            os.path.join(config.path.project_home, '.gitmodules'), os.X_OK)
Exemple #5
0
    def test_fixuid(self, project_loader, project):
        project_loader(project)
        register_default_caches()

        features.register(FixuidFeature())
        load_registered_features()

        with open('docker-compose.yml', 'r') as config_file:
            config = yaml.load(config_file, yaml.SafeLoader)

        action = FixuidDockerComposeAction()
        action.execute(docker_compose_config=config)

        with open(os.path.join("docker", "Dockerfile.expected"), "r") as f:
            expected = f.read()
        with open(os.path.join("docker", "Dockerfile"), "r") as f:
            content = f.read()
        assert content == expected

        if project in ["from-php-missing-configuration"]:
            assert not os.path.exists(os.path.join("docker", "fixuid.tar.gz"))
        else:
            assert os.path.exists(os.path.join("docker", "fixuid.tar.gz"))

        if "scratch" not in project:
            client = docker.from_env()
            image = client.images.build(path="docker")
            assert image
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(TraefikFeature())
        load_registered_features()

        assert config.data.get('traefik.disabled') is True
Exemple #7
0
    def test_autofix_eol(self, project_loader):
        project_loader("autofix_eol")

        history = (
            PropertyMigration("docker.compose.network_name",
                              "jsonnet.docker.compose.network_name",
                              since="v1.6.0"),
            PropertyMigration("docker.port_prefix",
                              "jsonnet.docker.expose.port_prefix",
                              since="v1.6.0"),
        )

        migrations.set_history(history)

        features.register(FileFeature())
        features.register(JinjaFeature())
        load_registered_features()
        register_actions_in_event_bus(True)

        action = FileWalkAction()
        action.initialize()
        action.execute()

        with open('docker-compose.properties', 'r') as f:
            rendered = f.read()

        with open('docker-compose.expected.properties', 'r') as f:
            expected = f.read()

        assert rendered == expected
    def test_copy_ca_certificates(self, project_loader):
        project_loader("copy-ca-certificates")

        features.register(CopyFeature())
        load_registered_features()

        action = CopyAction()
        action.execute()

        assert os.path.exists(
            os.path.join('.docker', 'service1', 'ca-certs', 'some-cert.crt'))
        assert not os.path.exists(
            os.path.join('.docker', 'service1', 'ca-certs',
                         'another-cert.crt'))

        assert os.path.exists(
            os.path.join('.docker', 'service2', 'ca-certs', 'some-cert.crt'))
        assert not os.path.exists(
            os.path.join('.docker', 'service2', 'ca-certs',
                         'another-cert.crt'))

        assert not os.path.exists(
            os.path.join('.docker', '.not-a-service', 'ca-certs',
                         'some-cert.crt'))
        assert not os.path.exists(
            os.path.join('.docker', '.not-a-service', 'ca-certs',
                         'another-cert.crt'))
Exemple #9
0
    def test_empty_configuration_without_core(self, project_loader):
        project_loader("empty")

        with pytest.raises(FeatureConfigurationError):
            features.register(SymlinksFeature())
            load_registered_features()
            register_actions_in_event_bus(True)
Exemple #10
0
    def test_existing_does_nothing(self, project_loader,
                                   module_scoped_container_getter):
        project_loader("existing")

        features.register(CoreFeature())
        features.register(CertsFeature())
        load_registered_features()

        setup_cfssl(module_scoped_container_getter)

        assert os.path.exists(os.path.join(".certs", "testing.test.crt"))
        assert os.path.exists(os.path.join(".certs", "testing.test.key"))

        with open(os.path.join(".certs", "testing.test.crt")) as crt_file:
            crt = crt_file.read()

        with open(os.path.join(".certs", "testing.test.key")) as key_file:
            key = key_file.read()

        generate_action = GenerateCertAction()
        generate_action.execute(domain="testing.test")

        with open(os.path.join(".certs", "testing.test.crt")) as crt_file:
            assert crt == crt_file.read()

        with open(os.path.join(".certs", "testing.test.key")) as key_file:
            assert key == key_file.read()

        remove_action = RemoveCertAction()
        remove_action.execute(domain="testing.test")

        assert not os.path.exists(os.path.join(".certs", "testing.test.crt"))
        assert not os.path.exists(os.path.join(".certs", "testing.test.key"))
Exemple #11
0
    def test_empty_project_with_core(self, project_loader,
                                     module_scoped_container_getter):
        project_loader("empty")

        features.register(CoreFeature())
        features.register(CertsFeature())
        load_registered_features()

        setup_cfssl(module_scoped_container_getter)

        generate_action = GenerateCertAction()
        generate_action.execute(domain="testing.test")

        assert os.path.exists(os.path.join(".certs", "testing.test.crt"))
        assert os.path.exists(os.path.join(".certs", "testing.test.key"))

        with open(os.path.join(".certs", "testing.test.crt")) as crt_file:
            assert 'CERTIFICATE' in crt_file.read()

        with open(os.path.join(".certs", "testing.test.key")) as key_file:
            assert 'PRIVATE KEY' in key_file.read()

        remove_action = RemoveCertAction()
        remove_action.execute(domain="testing.test")
        assert not os.path.exists(os.path.join(".certs", "testing.test.crt"))
        assert not os.path.exists(os.path.join(".certs", "testing.test.key"))
Exemple #12
0
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(FixuidFeature())
        load_registered_features()

        action = FixuidDockerComposeAction()
        action.execute(docker_compose_config={})
Exemple #13
0
    def test_named_user_group_windows(self, project_loader):
        project_loader("empty")

        features.register(JsonnetFeature())
        load_registered_features()

        assert config.data.get('jsonnet.docker.user.name_to_uid') == {}
        assert config.data.get('jsonnet.docker.user.group_to_gid') == {}
    def test_empty_project(self, project_loader):
        project_loader("empty")

        features.register(CookiecutterFeature())
        load_registered_features()

        action = CookiecutterAction()
        action.execute()
    def test_empty_project_without_core(self, project_loader,
                                        mocker: MockerFixture):
        mocker.patch('ddb.feature.version.is_git_repository',
                     is_git_repository)

        project_loader("no_repo")

        features.register(VersionFeature())
        load_registered_features()
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(DockerFeature())
        load_registered_features()

        action = actions.get('docker:emit-docker-compose-config'
                             )  # type:EmitDockerComposeConfigAction
        action.execute()
Exemple #17
0
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(RunFeature())
        features.register(ShellFeature())
        load_registered_features()
        register_actions_in_event_bus(True)

        action = RunAction()
        action.execute()
    def test_copy_no_dispatch(self, project_loader):
        project_loader("copy-no-dispatch")

        features.register(CopyFeature())
        load_registered_features()
        register_default_caches()

        action = CopyAction()
        action.execute()
        assert os.path.exists(os.path.join('.', 'some-cert.crt'))
    def test_stage_env(self, project_loader):
        project_loader("stage-env")

        gitignore_feature = GitignoreFeature()

        features.register(CoreFeature())
        features.register(gitignore_feature)
        load_registered_features()

        assert gitignore_feature.disabled
Exemple #20
0
def test_update_files_disabled(project_loader):
    project_loader("disabled")
    features.register(CoreFeature())
    features.register(GitFeature())

    load_registered_features()

    config.data['git.fix_file_permissions'] = False

    action = FixFilePermissionsAction()
    assert action.disabled is True
Exemple #21
0
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(SmartcdFeature())
        load_registered_features()

        action = WindowsProjectActivate()
        action.execute()

        assert not os.path.exists("ddb_activate.bat")
        assert not os.path.exists("ddb_deactivate.bat")
    def test_binary_options(self, project_loader):
        project_loader("binary-options")

        features.register(DockerFeature())
        load_registered_features()
        register_actions_in_event_bus(True)

        action = actions.get('docker:emit-docker-compose-config'
                             )  # type:EmitDockerComposeConfigAction
        action.execute()

        assert len(list(binaries.all())) == 3
        assert binaries.has("npm-simple")
        assert binaries.has("npm-conditions")
        assert binaries.has("mysql")

        npm_simple_set = binaries.get("npm-simple")
        assert len(npm_simple_set) == 1
        npm_simple = list(npm_simple_set)[0]
        assert npm_simple.command() == (
            ''.join(effective_command("docker-compose")) +
            " run --rm --workdir=/app/. --label traefik.enable=false node"
        ).split()
        assert npm_simple.command("serve") == (
            ''.join(effective_command("docker-compose")) +
            ' run --rm --workdir=/app/. --label traefik.enable=false node'
        ).split()
        assert npm_simple.command("run serve") == (
            ''.join(effective_command("docker-compose")) +
            ' run --rm --workdir=/app/. --label traefik.enable=false node'
        ).split()

        npm_conditions_set = binaries.get("npm-conditions")
        assert len(npm_conditions_set) == 1
        npm_conditions = list(npm_conditions_set)[0]
        assert npm_conditions.command() == (
            ''.join(effective_command("docker-compose")) +
            " run --rm --workdir=/app/. --label traefik.enable=false node"
        ).split()
        assert npm_conditions.command("serve") == (
            ''.join(effective_command("docker-compose")) +
            ' run --rm --workdir=/app/. --label traefik.enable=false node'
        ).split()
        assert npm_conditions.command("run serve") == (
            ''.join(effective_command("docker-compose")) +
            ' run --rm --workdir=/app/. node').split()

        mysql_set = binaries.get("mysql")
        assert len(mysql_set) == 1
        mysql = list(mysql_set)[0]
        assert mysql.command() == (
            ''.join(effective_command("docker-compose")) +
            ' run --rm --workdir=/app/. db mysql -hdb -uproject-management-tool -pproject-management-tool'
        ).split()
    def test_github_django(self, project_loader):
        project_loader("github-django")

        features.register(CookiecutterFeature())
        load_registered_features()

        action = CookiecutterAction()
        action.execute()

        assert os.path.isdir('my_awesome_project')
        assert os.path.isfile(os.path.join('my_awesome_project', 'setup.cfg'))
    def test_empty_skip_outside_additions(self, project_loader):
        project_loader("empty")

        features.register(CoreFeature())
        features.register(GitignoreFeature())
        load_registered_features()

        action = UpdateGitignoreAction()
        action.execute(target="../outside/to-ignore.yml")

        assert not os.path.exists('.gitignore')
Exemple #25
0
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(FileFeature())
        features.register(JsonnetFeature())
        load_registered_features()
        register_actions_in_event_bus(True)

        action = FileWalkAction()
        action.initialize()
        action.execute()
    def test_empty_project_without_core(self, project_loader):
        project_loader("empty")

        features.register(GitignoreFeature())
        load_registered_features()

        action = UpdateGitignoreAction()
        action.execute(target="./to-ignore.yml")
        action.execute(target="./to-ignore-2.yml")

        assert os.path.exists('.gitignore')
        assert expect_gitignore('.gitignore', '/to-ignore.yml',
                                '/to-ignore-2.yml')
    def test_extra_services(self, project_loader):
        project_loader("extra-services")

        features.register(CoreFeature())
        features.register(TraefikFeature())
        features.register(DockerFeature())
        features.register(JsonnetFeature())
        load_registered_features()

        install_action = TraefikExtraServicesAction()
        install_action.initialize()
        install_action.execute()

        files = {
            "api": {
                "generated": "sub.project.test.extra-service.api.toml",
                "expected": "sub.project.test.extra-service.api.expected.toml"
            },
            "rule": {
                "generated": "rule.project.test.extra-service.web.toml",
                "expected":
                "rule.project.test.extra-service.web.expected.toml",
                "replaces": {
                    "{{ip}}": config.data.get('docker.debug.host')
                }
            },
            "secured": {
                "generated":
                "secured.project.test.extra-service.redirect.toml",
                "expected":
                "secured.project.test.extra-service.redirect.expected.toml"
            },
            "secured_path_prefix": {
                "generated":
                "secured.project.test.extra-service.path_prefix.toml",
                "expected":
                "secured.project.test.extra-service.path_prefix.expected.toml"
            },
            "secured_path_prefix_with_redirect": {
                "generated":
                "secured.project.test.extra-service.path_prefix_with_redirect.toml",
                "expected":
                "secured.project.test.extra-service.path_prefix_with_redirect.expected.toml"
            }
        }

        for file in files:
            generated = os.path.join(
                config.data['traefik']['config_directory'],
                files.get(file).get('generated'))
            assert os.path.exists(generated)
            expected = Path(
                os.path.join(config.data['traefik']['config_directory'],
                             files.get(file).get('expected'))).read_text()
            if files.get(file).get('replaces'):
                for replace in files.get(file).get('replaces'):
                    expected = expected.replace(
                        replace,
                        files.get(file).get('replaces').get(replace))
            assert expected == Path(generated).read_text()
    def test_retrieve_environment_data(self):
        features.register(DockerFeature())
        load_registered_features()
        action = actions.get(
            'docker:display-info')  # type:DockerDisplayInfoAction

        assert {} == action._retrieve_environment_data(Dotty({}))
        assert {} == action._retrieve_environment_data(Dotty({'toto': 'toto'}))
        assert {
            'AZERTY': '123'
        } == action._retrieve_environment_data(
            Dotty({'environment': {
                'AZERTY': '123'
            }}))
    def test_binary_workdir(self, project_loader):
        project_loader("binary-workdir")

        features.register(DockerFeature())
        load_registered_features()
        register_actions_in_event_bus(True)

        action = actions.get('docker:emit-docker-compose-config'
                             )  # type:EmitDockerComposeConfigAction
        action.execute()

        assert len(list(binaries.all())) == 2
        assert binaries.has("npm")
        assert binaries.has("node")
Exemple #30
0
    def test_run_activate_deactivate_project(self, capsys: CaptureFixture,
                                             project_loader):
        project_loader("project")

        features.register(CoreFeature())
        features.register(ShellFeature())
        load_registered_features()

        action = ActivateAction(self.build_shell_integration())
        action.execute()

        capture = capsys.readouterr()
        assert capture.out
        assert not capture.err

        filepath = re.match(self.filepath_regex, capture.out).group(1)
        with open(filepath, 'r', encoding='utf-8') as file:
            script = file.read()

        export_match = re.findall(self.export_regex, script, re.MULTILINE)
        env = dict(export_match)

        system_path = env.get('PATH', '')
        first = system_path.split(os.pathsep)[0]

        assert first == os.path.normpath(os.path.join(os.getcwd(), "./bin")) \
               or first == os.path.normpath(os.path.join(os.getcwd(), "./.bin"))

        os.environ.update(env)

        deactivate_action = DeactivateAction(self.build_shell_integration())
        deactivate_action.execute()

        capture = capsys.readouterr()
        assert capture.out
        assert not capture.err

        filepath = re.match(self.filepath_regex, capture.out).group(1)
        with open(filepath, 'r', encoding='utf-8') as file:
            script = file.read()

        export_match = re.findall(self.export_regex, script, re.MULTILINE)
        env = dict(export_match)

        system_path = env.get('PATH', '').split(os.pathsep)
        first = system_path[0]

        assert first != os.path.normpath(os.path.join(os.getcwd(), "./bin")) or \
               first != os.path.normpath(os.path.join(os.getcwd(), "./.bin"))