Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/planemo/database/postgres_docker.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
| author | shellac |
|---|---|
| date | Sat, 02 May 2020 07:14:21 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:26e78fe6e8c4 |
|---|---|
| 1 """Module describes a :class:`DatabaseSource` for managed, dockerized postgres databases.""" | |
| 2 import time | |
| 3 | |
| 4 from galaxy.tool_util.deps import ( | |
| 5 docker_util, | |
| 6 dockerfiles, | |
| 7 ) | |
| 8 from galaxy.tool_util.deps.commands import execute | |
| 9 from galaxy.util import unicodify | |
| 10 | |
| 11 from .interface import DatabaseSource | |
| 12 from .postgres import _CommandBuilder, ExecutesPostgresSqlMixin | |
| 13 | |
| 14 DEFAULT_CONTAINER_NAME = "planemopostgres" | |
| 15 DEFAULT_POSTGRES_PASSWORD = "mysecretpassword" | |
| 16 DEFAULT_POSTGRES_PORT_EXPOSE = 15432 | |
| 17 | |
| 18 | |
| 19 def docker_ps(args, **kwds): | |
| 20 return docker_util.command_list("ps", args, **kwds) | |
| 21 | |
| 22 | |
| 23 def docker_exec(name, commands=[], **kwds): | |
| 24 return docker_util.command_list("exec", [name] + commands, **kwds) | |
| 25 | |
| 26 | |
| 27 def is_running_container(name=DEFAULT_CONTAINER_NAME, **kwds): | |
| 28 ps_command = docker_ps(["--format", "{{.Names}}"], **kwds) | |
| 29 running_containers = unicodify(execute(ps_command)) | |
| 30 containers = running_containers.splitlines() | |
| 31 return name in containers | |
| 32 | |
| 33 | |
| 34 def start_postgres_docker(name=DEFAULT_CONTAINER_NAME, password=DEFAULT_POSTGRES_PASSWORD, port=DEFAULT_POSTGRES_PORT_EXPOSE, **kwds): | |
| 35 run_command = docker_util.command_list( | |
| 36 "run", | |
| 37 ["-p", "%d:5432" % port, "--name", name, "-e", "POSTGRES_PASSWORD=%s" % password, "--rm", "-d", "postgres"], | |
| 38 **kwds | |
| 39 ) | |
| 40 execute(run_command) | |
| 41 | |
| 42 | |
| 43 def stop_postgres_docker(name=DEFAULT_CONTAINER_NAME, **kwds): | |
| 44 stop_command = docker_util.command_list( | |
| 45 "stop", | |
| 46 [name], | |
| 47 **kwds | |
| 48 ) | |
| 49 execute(stop_command) | |
| 50 | |
| 51 | |
| 52 class DockerPostgresDatabaseSource(ExecutesPostgresSqlMixin, DatabaseSource): | |
| 53 """Postgres database running inside a Docker container.""" | |
| 54 | |
| 55 def __init__(self, **kwds): | |
| 56 """Construct a postgres database source from planemo configuration.""" | |
| 57 self.psql_path = 'psql' | |
| 58 self.database_user = 'postgres' | |
| 59 self.database_password = DEFAULT_POSTGRES_PASSWORD | |
| 60 self.database_host = 'localhost' # TODO: Make docker host | |
| 61 self.database_port = DEFAULT_POSTGRES_PORT_EXPOSE | |
| 62 self._kwds = kwds | |
| 63 self._docker_host_kwds = dockerfiles.docker_host_args(**kwds) | |
| 64 if not is_running_container(**self._docker_host_kwds): | |
| 65 start_postgres_docker(**self._docker_host_kwds) | |
| 66 # Hack to give docker a bit of time to boot up and allow psql to start. | |
| 67 time.sleep(30) | |
| 68 | |
| 69 def sqlalchemy_url(self, identifier): | |
| 70 """Return URL or form postgresql://username:password@localhost/mydatabase.""" | |
| 71 return "postgresql://%s:%s@%s:%d/%s" % ( | |
| 72 self.database_user, | |
| 73 self.database_password, | |
| 74 self.database_host, | |
| 75 self.database_port, | |
| 76 identifier | |
| 77 ) | |
| 78 | |
| 79 def _psql_command_builder(self, *args): | |
| 80 base_command = docker_exec(DEFAULT_CONTAINER_NAME, [self.psql_path], **self._docker_host_kwds) | |
| 81 command_builder = _CommandBuilder(*base_command) | |
| 82 # Print only tuples so output is easier to parse | |
| 83 command_builder.append_command("--tuples-only") | |
| 84 command_builder.append_command("--username", self.database_user) | |
| 85 command_builder.append_command("-P", "pager=off") | |
| 86 command_builder.extend_command(args) | |
| 87 return command_builder | |
| 88 | |
| 89 | |
| 90 __all__ = ( | |
| 91 'DockerPostgresDatabaseSource', | |
| 92 ) |
