From 8ef9eafc6013ad3f9455e2e96e0e8ec04c26f717 Mon Sep 17 00:00:00 2001 From: Christophe Monniez Date: Fri, 11 Jan 2019 16:57:21 +0100 Subject: [PATCH] [IMP] runbot: get the logdb uri from a config parameter When a build is created, the --log-db command line argument is built using the same db and credentials that the one used by the runbot. With this commit, this argument is built based on a postgress connect URI given as ir.config_parameter in the settings. A dedicated role must be created beforehand on the runbot postgresql server, accordingly to the given URI. Also, care should be taken to give minimal privileges to this user only granting "update" on the table ir_logging_id_seq and "insert,select,udpate" on the table ir_logging. --- runbot/models/build.py | 5 +++-- runbot/models/res_config_settings.py | 6 +++++- runbot/tests/test_build.py | 15 +++++++++++++++ runbot/views/res_config_settings_views.xml | 4 ++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/runbot/models/build.py b/runbot/models/build.py index 64abf0f0..b05e9256 100644 --- a/runbot/models/build.py +++ b/runbot/models/build.py @@ -679,9 +679,10 @@ class runbot_build(models.Model): if grep(build._server("tools/config.py"), "no-netrpc"): cmd.append("--no-netrpc") if grep(build._server("tools/config.py"), "log-db"): + logdb_uri = self.env['ir.config_parameter'].get_param('runbot.runbot_logdb_uri') logdb = self.env.cr.dbname - if config['db_host'] and grep(build._server('sql_db.py'), 'allow_uri'): - logdb = 'postgres://{cfg[db_user]}:{cfg[db_password]}@{cfg[db_host]}/{db}'.format(cfg=config, db=self.env.cr.dbname) + if logdb_uri and grep(build._server('sql_db.py'), 'allow_uri'): + logdb = '%s' % logdb_uri cmd += ["--log-db=%s" % logdb] if grep(build._server('tools/config.py'), 'log-db-level'): cmd += ["--log-db-level", '25'] diff --git a/runbot/models/res_config_settings.py b/runbot/models/res_config_settings.py index 6f47624c..b1ef50a2 100644 --- a/runbot/models/res_config_settings.py +++ b/runbot/models/res_config_settings.py @@ -13,6 +13,7 @@ class ResConfigSettings(models.TransientModel): runbot_starting_port = fields.Integer('Starting port for running builds') runbot_domain = fields.Char('Runbot domain') runbot_max_age = fields.Integer('Max branch age (in days)') + runbot_logdb_uri = fields.Char('Runbot URI for build logs') @api.model def get_values(self): @@ -23,7 +24,9 @@ class ResConfigSettings(models.TransientModel): runbot_timeout=int(get_param('runbot.runbot_timeout', default=1800)), runbot_starting_port=int(get_param('runbot.runbot_starting_port', default=2000)), runbot_domain=get_param('runbot.runbot_domain', default=common.fqdn()), - runbot_max_age=int(get_param('runbot.runbot_max_age', default=30))) + runbot_max_age=int(get_param('runbot.runbot_max_age', default=30)), + runbot_logdb_uri=get_param('runbot.runbot_logdb_uri', default=False), + ) return res @api.multi @@ -36,3 +39,4 @@ class ResConfigSettings(models.TransientModel): set_param("runbot.runbot_starting_port", self.runbot_starting_port) set_param("runbot.runbot_domain", self.runbot_domain) set_param("runbot.runbot_max_age", self.runbot_max_age) + set_param("runbot.runbot_logdb_uri", self.runbot_logdb_uri) diff --git a/runbot/tests/test_build.py b/runbot/tests/test_build.py index 2a12f221..b13f9bea 100644 --- a/runbot/tests/test_build.py +++ b/runbot/tests/test_build.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from unittest.mock import patch +from odoo.tools.config import configmanager from odoo.tests import common class Test_Build(common.TransactionCase): @@ -43,6 +44,20 @@ class Test_Build(common.TransactionCase): build._get_domain() self.assertEqual(build.domain, 'runbot99.example.org:1234') + @patch('odoo.addons.runbot.models.build.os.mkdir') + @patch('odoo.addons.runbot.models.build.grep') + def test_build_cmd_log_db(self, mock_grep, mock_mkdir): + """ test that the logdb connection URI is taken from the .odoorc file """ + uri = 'postgres://someone:pass@somewhere.com/db' + self.env['ir.config_parameter'].sudo().set_param("runbot.runbot_logdb_uri", uri) + build = self.Build.create({ + 'branch_id': self.branch.id, + 'name': 'd0d0caca0000ffffffffffffffffffffffffffff', + 'port': '1234', + }) + cmd = build._cmd()[0] + self.assertIn('--log-db=%s' % uri, cmd) + def test_pr_is_duplicate(self): """ test PR is a duplicate of a dev branch build """ dup_repo = self.Repo.create({ diff --git a/runbot/views/res_config_settings_views.xml b/runbot/views/res_config_settings_views.xml index 728947da..3076e01b 100644 --- a/runbot/views/res_config_settings_views.xml +++ b/runbot/views/res_config_settings_views.xml @@ -42,6 +42,10 @@