From 0cbf98c0204f0e90e1f6d22110eb80ee87dae0e0 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 8 Feb 2021 21:05:06 +0100 Subject: [PATCH] consolidate warm and db-check into single admin command --- nominatim/cli.py | 44 ++------------------------------ nominatim/clicmd/__init__.py | 1 + nominatim/clicmd/admin.py | 49 ++++++++++++++++++++++++++++++++++++ test/python/test_cli.py | 16 ++++++++++-- 4 files changed, 66 insertions(+), 44 deletions(-) create mode 100644 nominatim/clicmd/admin.py diff --git a/nominatim/cli.py b/nominatim/cli.py index 0bca03a3..845b1451 100644 --- a/nominatim/cli.py +++ b/nominatim/cli.py @@ -265,45 +265,6 @@ class UpdateAddData: return run_legacy_script(*params, nominatim_env=args) -class AdminCheckDatabase: - """\ - Check that the database is complete and operational. - """ - - @staticmethod - def add_args(parser): - pass # No options - - @staticmethod - def run(args): - return run_legacy_script('check_import_finished.php', nominatim_env=args) - - -class AdminWarm: - """\ - Warm database caches for search and reverse queries. - """ - - @staticmethod - def add_args(parser): - group = parser.add_argument_group('Target arguments') - group.add_argument('--search-only', action='store_const', dest='target', - const='search', - help="Only pre-warm tables for search queries") - group.add_argument('--reverse-only', action='store_const', dest='target', - const='reverse', - help="Only pre-warm tables for reverse queries") - - @staticmethod - def run(args): - params = ['warm.php'] - if args.target == 'reverse': - params.append('--reverse-only') - if args.target == 'search': - params.append('--search-only') - return run_legacy_script(*params, nominatim_env=args) - - class QueryExport: """\ Export addresses as CSV file from the database. @@ -393,15 +354,14 @@ def nominatim(**kwargs): parser.add_subcommand('freeze', SetupFreeze) parser.add_subcommand('replication', clicmd.UpdateReplication) - parser.add_subcommand('check-database', AdminCheckDatabase) - parser.add_subcommand('warm', AdminWarm) - parser.add_subcommand('special-phrases', SetupSpecialPhrases) parser.add_subcommand('add-data', UpdateAddData) parser.add_subcommand('index', clicmd.UpdateIndex) parser.add_subcommand('refresh', clicmd.UpdateRefresh) + parser.add_subcommand('admin', clicmd.AdminFuncs) + parser.add_subcommand('export', QueryExport) parser.add_subcommand('serve', AdminServe) diff --git a/nominatim/clicmd/__init__.py b/nominatim/clicmd/__init__.py index b7dfa47f..9a686df2 100644 --- a/nominatim/clicmd/__init__.py +++ b/nominatim/clicmd/__init__.py @@ -6,3 +6,4 @@ from .replication import UpdateReplication from .api import APISearch, APIReverse, APILookup, APIDetails, APIStatus from .index import UpdateIndex from .refresh import UpdateRefresh +from .admin import AdminFuncs diff --git a/nominatim/clicmd/admin.py b/nominatim/clicmd/admin.py new file mode 100644 index 00000000..040b9232 --- /dev/null +++ b/nominatim/clicmd/admin.py @@ -0,0 +1,49 @@ +""" +Implementation of the 'admin' subcommand. +""" +from ..tools.exec_utils import run_legacy_script + +# Do not repeat documentation of subcommand classes. +# pylint: disable=C0111 +# Using non-top-level imports to avoid eventually unused imports. +# pylint: disable=E0012,C0415 + +class AdminFuncs: + """\ + Analyse and maintain the database. + """ + + @staticmethod + def add_args(parser): + group = parser.add_argument_group('Admin task arguments') + group.add_argument('--warm', action='store_true', + help='Warm database caches for search and reverse queries.') + group.add_argument('--check-database', action='store_true', + help='Check that the database is complete and operational.') + group = parser.add_argument_group('Arguments for cache warming') + group.add_argument('--search-only', action='store_const', dest='target', + const='search', + help="Only pre-warm tables for search queries") + group.add_argument('--reverse-only', action='store_const', dest='target', + const='reverse', + help="Only pre-warm tables for reverse queries") + + @staticmethod + def run(args): + if args.warm: + AdminFuncs._warm(args) + + if args.check_database: + run_legacy_script('check_import_finished.php', nominatim_env=args) + + return 0 + + + @staticmethod + def _warm(args): + params = ['warm.php'] + if args.target == 'reverse': + params.append('--reverse-only') + if args.target == 'search': + params.append('--search-only') + return run_legacy_script(*params, nominatim_env=args) diff --git a/test/python/test_cli.py b/test/python/test_cli.py index 983b792b..9b39f580 100644 --- a/test/python/test_cli.py +++ b/test/python/test_cli.py @@ -13,6 +13,7 @@ import time import nominatim.cli import nominatim.clicmd.api import nominatim.clicmd.refresh +import nominatim.clicmd.admin import nominatim.indexer.indexer import nominatim.tools.refresh import nominatim.tools.replication @@ -63,8 +64,6 @@ def test_cli_help(capsys): (('special-phrases',), 'specialphrases'), (('add-data', '--tiger-data', 'tiger'), 'setup'), (('add-data', '--file', 'foo.osm'), 'update'), - (('check-database',), 'check_import_finished'), - (('warm',), 'warm'), (('export',), 'export') ]) def test_legacy_commands_simple(mock_run_legacy, command, script): @@ -74,6 +73,19 @@ def test_legacy_commands_simple(mock_run_legacy, command, script): assert mock_run_legacy.last_args[0] == script + '.php' +@pytest.mark.parametrize("params", [('--warm', ), + ('--warm', '--reverse-only'), + ('--warm', '--search-only'), + ('--check-database', )]) +def test_admin_command_legacy(monkeypatch, params): + mock_run_legacy = MockParamCapture() + monkeypatch.setattr(nominatim.clicmd.admin, 'run_legacy_script', mock_run_legacy) + + assert 0 == call_nominatim('admin', *params) + + assert mock_run_legacy.called == 1 + + @pytest.mark.parametrize("name,oid", [('file', 'foo.osm'), ('diff', 'foo.osc'), ('node', 12), ('way', 8), ('relation', 32)]) def test_add_data_command(mock_run_legacy, name, oid): -- 2.45.1