diff env/lib/python3.7/site-packages/planemo/database/postgres_docker.py @ 2:6af9afd405e9 draft

"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author shellac
date Thu, 14 May 2020 14:56:58 -0400
parents 26e78fe6e8c4
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/planemo/database/postgres_docker.py	Thu May 14 14:56:58 2020 -0400
@@ -0,0 +1,92 @@
+"""Module describes a :class:`DatabaseSource` for managed, dockerized postgres databases."""
+import time
+
+from galaxy.tool_util.deps import (
+    docker_util,
+    dockerfiles,
+)
+from galaxy.tool_util.deps.commands import execute
+from galaxy.util import unicodify
+
+from .interface import DatabaseSource
+from .postgres import _CommandBuilder, ExecutesPostgresSqlMixin
+
+DEFAULT_CONTAINER_NAME = "planemopostgres"
+DEFAULT_POSTGRES_PASSWORD = "mysecretpassword"
+DEFAULT_POSTGRES_PORT_EXPOSE = 15432
+
+
+def docker_ps(args, **kwds):
+    return docker_util.command_list("ps", args, **kwds)
+
+
+def docker_exec(name, commands=[], **kwds):
+    return docker_util.command_list("exec", [name] + commands, **kwds)
+
+
+def is_running_container(name=DEFAULT_CONTAINER_NAME, **kwds):
+    ps_command = docker_ps(["--format", "{{.Names}}"], **kwds)
+    running_containers = unicodify(execute(ps_command))
+    containers = running_containers.splitlines()
+    return name in containers
+
+
+def start_postgres_docker(name=DEFAULT_CONTAINER_NAME, password=DEFAULT_POSTGRES_PASSWORD, port=DEFAULT_POSTGRES_PORT_EXPOSE, **kwds):
+    run_command = docker_util.command_list(
+        "run",
+        ["-p", "%d:5432" % port, "--name", name, "-e", "POSTGRES_PASSWORD=%s" % password, "--rm", "-d", "postgres"],
+        **kwds
+    )
+    execute(run_command)
+
+
+def stop_postgres_docker(name=DEFAULT_CONTAINER_NAME, **kwds):
+    stop_command = docker_util.command_list(
+        "stop",
+        [name],
+        **kwds
+    )
+    execute(stop_command)
+
+
+class DockerPostgresDatabaseSource(ExecutesPostgresSqlMixin, DatabaseSource):
+    """Postgres database running inside a Docker container."""
+
+    def __init__(self, **kwds):
+        """Construct a postgres database source from planemo configuration."""
+        self.psql_path = 'psql'
+        self.database_user = 'postgres'
+        self.database_password = DEFAULT_POSTGRES_PASSWORD
+        self.database_host = 'localhost'  # TODO: Make docker host
+        self.database_port = DEFAULT_POSTGRES_PORT_EXPOSE
+        self._kwds = kwds
+        self._docker_host_kwds = dockerfiles.docker_host_args(**kwds)
+        if not is_running_container(**self._docker_host_kwds):
+            start_postgres_docker(**self._docker_host_kwds)
+            # Hack to give docker a bit of time to boot up and allow psql to start.
+            time.sleep(30)
+
+    def sqlalchemy_url(self, identifier):
+        """Return URL or form postgresql://username:password@localhost/mydatabase."""
+        return "postgresql://%s:%s@%s:%d/%s" % (
+            self.database_user,
+            self.database_password,
+            self.database_host,
+            self.database_port,
+            identifier
+        )
+
+    def _psql_command_builder(self, *args):
+        base_command = docker_exec(DEFAULT_CONTAINER_NAME, [self.psql_path], **self._docker_host_kwds)
+        command_builder = _CommandBuilder(*base_command)
+        # Print only tuples so output is easier to parse
+        command_builder.append_command("--tuples-only")
+        command_builder.append_command("--username", self.database_user)
+        command_builder.append_command("-P", "pager=off")
+        command_builder.extend_command(args)
+        return command_builder
+
+
+__all__ = (
+    'DockerPostgresDatabaseSource',
+)