Exemple #1
0
def test_packages(faker: Faker) -> None:
    assert Packages.get_bin_version("invalid") is None

    v = Packages.get_bin_version("git")
    assert v is not None
    # Something like 2.25.1
    assert len(str(Version(v)).split(".")) == 3

    # Check docker client version
    v = Packages.get_bin_version("docker")
    assert v is not None
    # Something like 19.03.8 or 18.06.0-ce
    assert len(str(Version(v)).split(".")) >= 3

    # Check docker engine version
    v = Packages.get_bin_version(
        "docker", option=["version", "--format", "'{{.Server.Version}}'"]
    )
    assert v is not None
    assert len(str(Version(v)).split(".")) >= 3

    with pytest.raises(SystemExit):
        Packages.check_program("invalid")

    v = Packages.check_program("docker")
    assert v is not None

    with pytest.raises(SystemExit):
        Packages.check_program("docker", min_version="99999.99")

    with pytest.raises(SystemExit):
        Packages.check_program("docker", max_version="0.0")

    v = Packages.check_program("docker", min_version="0.0")
    assert v is not None

    v = Packages.check_program("docker", max_version="99999.99")
    assert v is not None

    v = Packages.check_program("docker", min_version="0.0", max_version="99999.99")
    assert v is not None

    v = Packages.check_program(
        "docker",
        min_version="0.0",
        max_version="99999.99",
        min_recommended_version="99999.99",
    )
    assert v is not None

    assert Packages.get_installation_path("invalid") is None
    assert Packages.get_installation_path("rapydo") is not None
    assert Packages.get_installation_path("pip") is None

    assert Packages.convert_bin_to_win32("test") == "test"
    assert Packages.convert_bin_to_win32("compose") == "compose"
    assert Packages.convert_bin_to_win32("buildx") == "buildx"
    assert Packages.convert_bin_to_win32("git") == "git"
    rand_str = faker.pystr()
    assert Packages.convert_bin_to_win32(rand_str) == rand_str
    assert Packages.convert_bin_to_win32("docker") == "docker.exe"
Exemple #2
0
    def make_env(self) -> None:

        try:
            COMPOSE_ENVIRONMENT_FILE.unlink()
        except FileNotFoundError:
            pass

        Application.env = Configuration.specs.get("variables",
                                                  {}).get("env", {})

        Application.env["PROJECT_DOMAIN"] = Configuration.hostname
        Application.env["COMPOSE_PROJECT_NAME"] = Configuration.project

        Application.env["DATA_DIR"] = str(DATA_DIR.resolve())
        Application.env["SUBMODULE_DIR"] = str(SUBMODULES_DIR.resolve())
        Application.env["PROJECT_DIR"] = str(
            PROJECT_DIR.joinpath(Configuration.project).resolve())

        if self.extended_project_path is None:
            Application.env["BASE_PROJECT_DIR"] = Application.env[
                "PROJECT_DIR"]
        else:
            Application.env["BASE_PROJECT_DIR"] = str(
                self.extended_project_path.resolve())

        if self.extended_project is None:
            Application.env["EXTENDED_PROJECT"] = EXTENDED_PROJECT_DISABLED
            Application.env["BASE_PROJECT"] = Application.env[
                "COMPOSE_PROJECT_NAME"]
        else:
            Application.env["EXTENDED_PROJECT"] = str(self.extended_project)
            Application.env["BASE_PROJECT"] = Application.env[
                "EXTENDED_PROJECT"]

        Application.env["RAPYDO_VERSION"] = __version__
        Application.env["BUILD"] = git.get_last_commit(
            Application.gits["main"])
        Application.env["PROJECT_VERSION"] = Configuration.version
        Application.env["CURRENT_UID"] = str(self.current_uid)
        Application.env["CURRENT_GID"] = str(self.current_gid)
        Application.env["PROJECT_TITLE"] = (Configuration.project_title
                                            or "Unknown title")
        Application.env["PROJECT_DESCRIPTION"] = (
            Configuration.project_description or "Unknown description")
        Application.env[
            "PROJECT_KEYWORDS"] = Configuration.project_keywords or ""

        roles_dict = Configuration.specs.get("variables", {}).get("roles", {})
        roles = ",".join([
            k for k, v in roles_dict.items()
            if v != "disabled" and k != "default"
        ])
        Application.env["AUTH_ROLES"] = f",{roles},"

        if Configuration.testing and not Configuration.production:
            Application.env["APP_MODE"] = "test"
            Application.env["PYTHONMALLOC"] = "debug"
            Application.env["PYTHONASYNCIODEBUG"] = "1"
            Application.env["PYTHONFAULTHANDLER"] = "1"

        Application.env[
            "CELERYBEAT_SCHEDULER"] = services.get_celerybeat_scheduler(
                Application.env)

        if Configuration.load_frontend:
            if Configuration.frontend == ANGULAR:
                Application.env["ACTIVATE_ANGULAR"] = "1"

        services.check_rabbit_password(
            Application.env.get("RABBITMQ_PASSWORD"))
        services.check_redis_password(Application.env.get("REDIS_PASSWORD"))

        for e in Application.env:
            env_value = os.environ.get(e)
            if env_value is None:
                continue
            Application.env[e] = env_value

        Application.env.update(Configuration.environment)

        if Configuration.swarm_mode:

            if not Application.env.get("SWARM_MANAGER_ADDRESS"):
                Application.env["SWARM_MANAGER_ADDRESS"] = system.get_local_ip(
                    Configuration.production)

            if not Application.env.get("REGISTRY_HOST"):
                Application.env["REGISTRY_HOST"] = Application.env[
                    "SWARM_MANAGER_ADDRESS"]

            # is None ensure empty string as a valid address
            # if Application.env.get("SYSLOG_ADDRESS") is None:
            #     manager_addr = Application.env["SWARM_MANAGER_ADDRESS"]
            #     Application.env["SYSLOG_ADDRESS"] = f"tcp://{manager_addr}:514"

        if Configuration.FORCE_COMPOSE_ENGINE or not Configuration.swarm_mode:
            DEPLOY_ENGINE = "compose"
        else:
            DEPLOY_ENGINE = "swarm"

        Application.env["DEPLOY_ENGINE"] = DEPLOY_ENGINE

        # Unfortunately this will only work after the creation of the network
        # i.e. will be fallen back to 127.0.0.1 the first time
        try:
            DOCKER_SUBNET = docker.network.inspect(
                f"{Configuration.project}_{DEPLOY_ENGINE}_default"
            ).ipam.config[0]["Subnet"]
        # The first execution will fail and fallen back to localhost
        except DockerException:
            DOCKER_SUBNET = "127.0.0.1"
        Application.env["DOCKER_SUBNET"] = DOCKER_SUBNET

        FAIL2BAN_IPTABLES = "legacy"
        if str(Application.env["ACTIVATE_FAIL2BAN"]) == "1":
            iptables_version = Packages.get_bin_version("iptables",
                                                        clean_output=False)
            nf_tables = iptables_version and "nf_tables" in iptables_version
            if nf_tables:
                FAIL2BAN_IPTABLES = "nf_tables"
        Application.env["FAIL2BAN_IPTABLES"] = FAIL2BAN_IPTABLES

        configuration.validate_env(Application.env)
        log.info("Environment configuration is valid")

        with open(COMPOSE_ENVIRONMENT_FILE, "w+") as whandle:
            for key, value in sorted(Application.env.items()):

                if value is None:
                    value = ""
                else:
                    value = str(value)
                if " " in value:
                    value = f"'{value}'"

                whandle.write(f"{key}={value}\n")