Skip to content
Snippets Groups Projects
Commit 4554c7b603b7 authored by Vincent Hatakeyama's avatar Vincent Hatakeyama
Browse files

:sparkles: improvements on rednerd :construction:

parent 0b3e52d2278f
No related branches found
No related tags found
1 merge request!16Start a rednerd server alongside odoo
...@@ -2,6 +2,12 @@ ...@@ -2,6 +2,12 @@
History History
======= =======
16.7.0
------
Add command to run a redner for a project, from docker_dev_start or directly with docker_redner.
16.6.0 16.6.0
------ ------
......
...@@ -234,9 +234,12 @@ ...@@ -234,9 +234,12 @@
_logger.warning("Unexpected odoo_type: %s", self.odoo_type) _logger.warning("Unexpected odoo_type: %s", self.odoo_type)
read_expanded("postgresql_version", "9.6") read_expanded("postgresql_version", "9.6")
self.start_py3o = section.get("start_py3o", "no") in ("yes", "true") self.start_py3o = section.get("start_py3o", "no") in ("yes", "true")
self.start_rednerd = section.get("start_rednerd", "no") in ("yes", "true") self.start_rednerd = section.get("start_rednerd", "no") in (
self.rednerd_version = section.get("rednerd_version", "latest") "yes",
self.rednerd_repository = section.get("rednerd_repository", None) "true",
)
read_expanded("rednerd_version", "latest")
read_expanded("rednerd_repository", None)
class Singleton(type): class Singleton(type):
...@@ -271,19 +274,3 @@ ...@@ -271,19 +274,3 @@
return_code = main(sys.argv[1:]) return_code = main(sys.argv[1:])
if return_code: if return_code:
exit(return_code) exit(return_code)
self.postgresql_version = config_parser.get(
section, "postgresql_version", fallback="9.6"
)
self.start_py3o = config_parser.get(
section, "start_py3o", fallback="no"
) in ("yes", "true")
self.start_rednerd = config_parser.get(
section, "start_rednerd", fallback="no"
) in ("yes", "true")
self.rednerd_version = config_parser.get(
section, "rednerd_version", fallback="latest"
)
self.rednerd_repository = config_parser.get(
section, "rednerd_repository", fallback=None
)
...@@ -74,7 +74,6 @@ ...@@ -74,7 +74,6 @@
:param user: User to execute command as. :param user: User to execute command as.
:param interactive: True if the container needs to be interactive :param interactive: True if the container needs to be interactive
""" """
import ipdb;ipdb.set_trace()
if interactive: if interactive:
dockerpty.exec_command(cls.client.api, container.id, command) dockerpty.exec_command(cls.client.api, container.id, command)
# it would be nice to return the exec command return code, but # it would be nice to return the exec command return code, but
......
...@@ -25,4 +25,5 @@ ...@@ -25,4 +25,5 @@
POSTGRES_PASSWORD = "this-could-be-anything" POSTGRES_PASSWORD = "this-could-be-anything"
PSQL = "psql" PSQL = "psql"
"""Command to use to run psql in the docker container."""
SH = "SH" SH = "SH"
...@@ -28,4 +29,5 @@ ...@@ -28,4 +29,5 @@
SH = "SH" SH = "SH"
"""Command to use to run sh in the docker container."""
def docker_run_postgresql( def docker_run_postgresql(
......
#!/usr/bin/env python3
# vim: set shiftwidth=4 softtabstop=4: # vim: set shiftwidth=4 softtabstop=4:
...@@ -1,6 +2,5 @@ ...@@ -1,6 +2,5 @@
# vim: set shiftwidth=4 softtabstop=4: # vim: set shiftwidth=4 softtabstop=4:
""" """Run a rednerd docker with volume based on project name.
Rednerd API (0.1.0)
Documentation: http://127.0.0.1:12345/docs Documentation: http://127.0.0.1:12345/docs
""" """
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
import logging import logging
import os import os
import sys import sys
import tempfile
import time import time
import docker import docker
...@@ -21,7 +22,7 @@ ...@@ -21,7 +22,7 @@
__version__ = "1.0.0" __version__ = "1.0.0"
__date__ = "2021-01-14" __date__ = "2021-01-14"
__updated__ = "2021-01-14" __updated__ = "2021-02-26"
MIGRATE = "migrate" MIGRATE = "migrate"
ADMIN_PASSWORD = "admin-password" ADMIN_PASSWORD = "admin-password"
...@@ -43,7 +44,7 @@ ...@@ -43,7 +44,7 @@
docker_client, docker_client,
project_name, project_name,
repository, repository,
attach=True, attach: bool = True,
stop_at_exist=True, stop_at_exit: bool = True,
redner_config=dict(), redner_config=dict(),
redner_port=None, redner_port=None,
...@@ -48,3 +49,4 @@ ...@@ -48,3 +49,4 @@
redner_config=dict(), redner_config=dict(),
redner_port=None, redner_port=None,
redner_socket=None,
version="latest", version="latest",
...@@ -50,2 +52,3 @@ ...@@ -50,2 +52,3 @@
version="latest", version="latest",
command: str = None,
): ):
...@@ -51,7 +54,11 @@ ...@@ -51,7 +54,11 @@
): ):
"""
:param redner_port: Port to use, uses socket if no port is provided
:param redner_socket: Indicate socket to use (path outside the container)
"""
super(DockerRednerd, self).__init__() super(DockerRednerd, self).__init__()
self.name = "rednerd_{}".format(project_name) self.name = "rednerd_{}".format(project_name)
self.repository = repository self.repository = repository
self.version = version self.version = version
self.attach = attach self.attach = attach
self.base_image = "{}:{}".format(self.repository, self.version) self.base_image = "{}:{}".format(self.repository, self.version)
...@@ -52,9 +59,9 @@ ...@@ -52,9 +59,9 @@
super(DockerRednerd, self).__init__() super(DockerRednerd, self).__init__()
self.name = "rednerd_{}".format(project_name) self.name = "rednerd_{}".format(project_name)
self.repository = repository self.repository = repository
self.version = version self.version = version
self.attach = attach self.attach = attach
self.base_image = "{}:{}".format(self.repository, self.version) self.base_image = "{}:{}".format(self.repository, self.version)
self.stop_at_exist = stop_at_exist self.stop_at_exit = stop_at_exit
self.docker_cli = docker_client self.docker_cli = docker_client
self.redner_config = redner_config self.redner_config = redner_config
...@@ -59,9 +66,18 @@ ...@@ -59,9 +66,18 @@
self.docker_cli = docker_client self.docker_cli = docker_client
self.redner_config = redner_config self.redner_config = redner_config
self.redner_port = redner_port or None if redner_port is not None:
self.redner_port = redner_port
else:
# create a socket
if redner_socket is None:
self.redner_socket = tempfile.TemporaryDirectory(
prefix="odoo_scripts_rednerd_socket-"
).name
if redner_socket is not None:
self.redner_socket = redner_socket
# Retrieve the container if it already exist # Retrieve the container if it already exist
try: try:
self.container = self.docker_cli.containers.get(self.name) self.container = self.docker_cli.containers.get(self.name)
except docker.errors.NotFound: except docker.errors.NotFound:
self.container = None self.container = None
...@@ -62,11 +78,12 @@ ...@@ -62,11 +78,12 @@
# Retrieve the container if it already exist # Retrieve the container if it already exist
try: try:
self.container = self.docker_cli.containers.get(self.name) self.container = self.docker_cli.containers.get(self.name)
except docker.errors.NotFound: except docker.errors.NotFound:
self.container = None self.container = None
self.command = command
def start(self): def start(self):
"""Start rednerd container""" """Start rednerd container"""
self.pull_image() self.pull_image()
if self.container is not None: if self.container is not None:
...@@ -68,9 +85,10 @@ ...@@ -68,9 +85,10 @@
def start(self): def start(self):
"""Start rednerd container""" """Start rednerd container"""
self.pull_image() self.pull_image()
if self.container is not None: if self.container is not None:
_logger.debug("%s Container already exist", self.name) _logger.debug("Container %s already exist", self.name)
# TODO why stop rednerd? maybe because port is different.
# stop and remove # stop and remove
self.stop_and_remove() self.stop_and_remove()
# call run() with detach=True # call run() with detach=True
...@@ -74,6 +92,6 @@ ...@@ -74,6 +92,6 @@
# stop and remove # stop and remove
self.stop_and_remove() self.stop_and_remove()
# call run() with detach=True # call run() with detach=True
self.container = self.docker_cli.containers.create( create_param = dict(
image=self.base_image, image=self.base_image,
name=self.name, name=self.name,
...@@ -78,4 +96,4 @@ ...@@ -78,4 +96,4 @@
image=self.base_image, image=self.base_image,
name=self.name, name=self.name,
ports={"80/tcp": self.redner_port}, ports=dict(),
environment=self.redner_config, environment=self.redner_config,
...@@ -81,2 +99,4 @@ ...@@ -81,2 +99,4 @@
environment=self.redner_config, environment=self.redner_config,
volumes=dict(),
command=[self.command, "--token-secret", self.name],
) )
...@@ -82,3 +102,17 @@ ...@@ -82,3 +102,17 @@
) )
_logger.info("Starting %s container", self.name) if hasattr(self, "redner_port"):
create_param["ports"]["80/tcp"] = self.redner_port
_logger.info("Using port %d", self.redner_port)
if hasattr(self, "redner_socket"):
socket_path = "/run/rednerd.socket"
create_param["volumes"][self.redner_socket, "rednerd.socket"] = {
"bind": socket_path,
"mode": "rw",
}
create_param["command"].extend(["--socket-path", socket_path])
# TODO missing directory cleanup
_logger.info("Using socket %s", self.redner_socket)
self.container = self.docker_cli.containers.create(**create_param)
_logger.info("Starting container %s", self.name)
_logger.debug(create_param)
self.container.start() self.container.start()
...@@ -84,7 +118,5 @@ ...@@ -84,7 +118,5 @@
self.container.start() self.container.start()
if self.attach:
self.logs()
# give rednerd the time to start up # give rednerd the time to start up
# wait with self.container.wait() # wait with self.container.wait()
# self.container.wait() # self.container.wait()
...@@ -87,7 +119,7 @@ ...@@ -87,7 +119,7 @@
# give rednerd the time to start up # give rednerd the time to start up
# wait with self.container.wait() # wait with self.container.wait()
# self.container.wait() # self.container.wait()
if self.stop_at_exist: if self.stop_at_exit:
atexit.register(self.stop_and_remove) atexit.register(self.stop_and_remove)
...@@ -92,5 +124,8 @@ ...@@ -92,5 +124,8 @@
atexit.register(self.stop_and_remove) atexit.register(self.stop_and_remove)
if self.attach:
self.logs()
time.sleep(5) time.sleep(5)
return True return True
...@@ -105,8 +140,9 @@ ...@@ -105,8 +140,9 @@
def logs(self): def logs(self):
"""Display container logs""" """Display container logs"""
for l in self.container.logs(stream=True): for log in self.container.logs(stream=True):
_logger.info(l) # log has an unwanted extra \n at the end
_logger.info(log.decode("UTF-8")[:-1])
def stop(self): def stop(self):
""" """
...@@ -174,7 +210,7 @@ ...@@ -174,7 +210,7 @@
program_license = """%s program_license = """%s
Created by Oury Balde on %s. Created by Oury Balde on %s.
Copyright 2020 XCG Consulting. All rights reserved. Copyright 2021 XCG Consulting. All rights reserved.
Licensed under the MIT License Licensed under the MIT License
...@@ -210,4 +246,5 @@ ...@@ -210,4 +246,5 @@
default=REDNER_ADMIN_PASSWORD, default=REDNER_ADMIN_PASSWORD,
) )
parser.add_argument( parser.add_argument(
"-p",
"--port", "--port",
...@@ -213,8 +250,14 @@ ...@@ -213,8 +250,14 @@
"--port", "--port",
help="Redner port to use [default: %(default)s]", help="Redner port to use, use a socket if empty [default: %(default)s]",
default=8080, default=None,
type=int,
)
parser.add_argument(
"--socket",
help="Specify Redner socket to use [default: %(default)s]",
default=None,
) )
parser.add_argument( parser.add_argument(
"-c", "-c",
"--command", "--command",
help="Command to run. If specified the command will not be interactive" help="Command to run. If specified the command will not be interactive"
...@@ -216,7 +259,7 @@ ...@@ -216,7 +259,7 @@
) )
parser.add_argument( parser.add_argument(
"-c", "-c",
"--command", "--command",
help="Command to run. If specified the command will not be interactive" help="Command to run. If specified the command will not be interactive"
", otherwise it will be interactive.", ", otherwise it will be interactive. [default: %(default)s]",
metavar="command", metavar="command",
...@@ -222,5 +265,5 @@ ...@@ -222,5 +265,5 @@
metavar="command", metavar="command",
default=None, default="serve",
) )
return parser return parser
...@@ -256,9 +299,9 @@ ...@@ -256,9 +299,9 @@
redner_config=env, redner_config=env,
redner_port=port, redner_port=port,
version=rednerd_version, version=rednerd_version,
stop_at_exist=False, command=command,
) )
# TODO: # TODO:
# create a user "need an admin password" # create a user "need an admin password"
# synchronize templates # synchronize templates
...@@ -260,8 +303,9 @@ ...@@ -260,8 +303,9 @@
) )
# TODO: # TODO:
# create a user "need an admin password" # create a user "need an admin password"
# synchronize templates # synchronize templates
# TODO display ir.config_parameter to set
docker_rednerd.start() docker_rednerd.start()
...@@ -265,5 +309,7 @@ ...@@ -265,5 +309,7 @@
docker_rednerd.start() docker_rednerd.start()
return 0
if __name__ == "__main__": if __name__ == "__main__":
...@@ -268,6 +314,9 @@ ...@@ -268,6 +314,9 @@
if __name__ == "__main__": if __name__ == "__main__":
main(sys.argv[1:]) return_code = main(sys.argv[1:])
# return_code = main(sys.argv[1:]) if return_code:
# if return_code: exit(return_code)
# exit(return_code)
# TODO:
# - bind /CONTAINER_ALREADY_STARTED_PLACEHOLDER somehow
# - bind pg database somehow
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment