Merge pull request #3238 from mtmail/check-database-for-version-match

admin --check-database also checks database vs nominatim version
This commit is contained in:
Sarah Hoffmann
2024-01-07 15:24:00 +01:00
committed by GitHub
2 changed files with 57 additions and 3 deletions

View File

@@ -13,9 +13,11 @@ from textwrap import dedent
from nominatim.config import Configuration from nominatim.config import Configuration
from nominatim.db.connection import connect, Connection from nominatim.db.connection import connect, Connection
from nominatim.db import properties
from nominatim.errors import UsageError from nominatim.errors import UsageError
from nominatim.tokenizer import factory as tokenizer_factory from nominatim.tokenizer import factory as tokenizer_factory
from nominatim.tools import freeze from nominatim.tools import freeze
from nominatim.version import NOMINATIM_VERSION, parse_version
CHECKLIST = [] CHECKLIST = []
@@ -146,11 +148,52 @@ def check_connection(conn: Any, config: Configuration) -> CheckResult:
return CheckState.OK return CheckState.OK
@_check(hint="""\
Database version ({db_version}) doesn't match Nominatim version ({nom_version})
Hints:
* Are you connecting to the correct database?
{instruction}
Check the Migration chapter of the Administration Guide.
Project directory: {config.project_dir}
Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}
""")
def check_database_version(conn: Connection, config: Configuration) -> CheckResult:
""" Checking database_version matches Nominatim software version
"""
if conn.table_exists('nominatim_properties'):
db_version_str = properties.get_property(conn, 'database_version')
else:
db_version_str = None
if db_version_str is not None:
db_version = parse_version(db_version_str)
if db_version == NOMINATIM_VERSION:
return CheckState.OK
instruction = (
'Run migrations: nominatim admin --migrate'
if db_version < NOMINATIM_VERSION
else 'You need to upgrade the Nominatim software.'
)
else:
instruction = ''
return CheckState.FATAL, dict(db_version=db_version_str,
nom_version=NOMINATIM_VERSION,
instruction=instruction,
config=config)
@_check(hint="""\ @_check(hint="""\
placex table not found placex table not found
Hints: Hints:
* Are you connecting to the right database? * Are you connecting to the correct database?
* Did the import process finish without errors? * Did the import process finish without errors?
Project directory: {config.project_dir} Project directory: {config.project_dir}

View File

@@ -10,6 +10,7 @@ Tests for database integrity checks.
import pytest import pytest
from nominatim.tools import check_database as chkdb from nominatim.tools import check_database as chkdb
import nominatim.version
def test_check_database_unknown_db(def_config, monkeypatch): def test_check_database_unknown_db(def_config, monkeypatch):
monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'pgsql:dbname=fjgkhughwgh2423gsags') monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'pgsql:dbname=fjgkhughwgh2423gsags')
@@ -20,15 +21,25 @@ def test_check_database_fatal_test(def_config, temp_db):
assert chkdb.check_database(def_config) == 1 assert chkdb.check_database(def_config) == 1
def test_check_conection_good(temp_db_conn, def_config): def test_check_connection_good(temp_db_conn, def_config):
assert chkdb.check_connection(temp_db_conn, def_config) == chkdb.CheckState.OK assert chkdb.check_connection(temp_db_conn, def_config) == chkdb.CheckState.OK
def test_check_conection_bad(def_config): def test_check_connection_bad(def_config):
badconn = chkdb._BadConnection('Error') badconn = chkdb._BadConnection('Error')
assert chkdb.check_connection(badconn, def_config) == chkdb.CheckState.FATAL assert chkdb.check_connection(badconn, def_config) == chkdb.CheckState.FATAL
def test_check_database_version_good(property_table, temp_db_conn, def_config):
property_table.set('database_version',
'{0[0]}.{0[1]}.{0[2]}-{0[3]}'.format(nominatim.version.NOMINATIM_VERSION))
assert chkdb.check_database_version(temp_db_conn, def_config) == chkdb.CheckState.OK
def test_check_database_version_bad(property_table, temp_db_conn, def_config):
property_table.set('database_version', '3.9.9-9')
assert chkdb.check_database_version(temp_db_conn, def_config) == chkdb.CheckState.FATAL
def test_check_placex_table_good(table_factory, temp_db_conn, def_config): def test_check_placex_table_good(table_factory, temp_db_conn, def_config):
table_factory('placex') table_factory('placex')
assert chkdb.check_placex_table(temp_db_conn, def_config) == chkdb.CheckState.OK assert chkdb.check_placex_table(temp_db_conn, def_config) == chkdb.CheckState.OK