diff --git a/swh/core/db/db_utils.py b/swh/core/db/db_utils.py --- a/swh/core/db/db_utils.py +++ b/swh/core/db/db_utils.py @@ -548,7 +548,9 @@ return True, current_db_version, dbflavor -def initialize_database_for_module(modname: str, version: int, **kwargs): +def initialize_database_for_module( + modname: str, version: int, flavor: Optional[str] = None, **kwargs +): """Helper function to initialize and populate a database for the given module This aims at helping the usage of pytest_postgresql for swh.core.db based datastores. @@ -564,7 +566,7 @@ """ conninfo = psycopg2.connect(**kwargs).dsn init_admin_extensions(modname, conninfo) - populate_database_for_package(modname, conninfo) + populate_database_for_package(modname, conninfo, flavor) try: swh_set_db_version(conninfo, version) except psycopg2.errors.UniqueViolation: diff --git a/swh/core/db/tests/data/cli/sql/15-flavor.sql b/swh/core/db/tests/data/cli/sql/15-flavor.sql new file mode 100644 --- /dev/null +++ b/swh/core/db/tests/data/cli/sql/15-flavor.sql @@ -0,0 +1,22 @@ +-- database flavor +create type database_flavor as enum ( + 'default', + 'flavorA', + 'flavorB' +); +comment on type database_flavor is 'Flavor of the current database'; + +create table dbflavor ( + flavor database_flavor, + single_row char(1) primary key default 'x', + check (single_row = 'x') +); +comment on table dbflavor is 'Database flavor storage'; +comment on column dbflavor.flavor is 'Database flavor currently deployed'; +comment on column dbflavor.single_row is 'Bogus column to force the table to have a single row'; + +create or replace function swh_get_dbflavor() returns database_flavor language sql stable as $$ + select coalesce((select flavor from dbflavor), 'default'); +$$; + +comment on function swh_get_dbflavor is 'Get the flavor of the database currently deployed'; diff --git a/swh/core/db/tests/data/cli_new/sql/15-flavor.sql b/swh/core/db/tests/data/cli_new/sql/15-flavor.sql new file mode 100644 --- /dev/null +++ b/swh/core/db/tests/data/cli_new/sql/15-flavor.sql @@ -0,0 +1,22 @@ +-- database flavor +create type database_flavor as enum ( + 'default', + 'flavorA', + 'flavorB' +); +comment on type database_flavor is 'Flavor of the current database'; + +create table dbflavor ( + flavor database_flavor, + single_row char(1) primary key default 'x', + check (single_row = 'x') +); +comment on table dbflavor is 'Database flavor storage'; +comment on column dbflavor.flavor is 'Database flavor currently deployed'; +comment on column dbflavor.single_row is 'Bogus column to force the table to have a single row'; + +create or replace function swh_get_dbflavor() returns database_flavor language sql stable as $$ + select coalesce((select flavor from dbflavor), 'default'); +$$; + +comment on function swh_get_dbflavor is 'Get the flavor of the database currently deployed'; diff --git a/swh/core/db/tests/test_cli.py b/swh/core/db/tests/test_cli.py --- a/swh/core/db/tests/test_cli.py +++ b/swh/core/db/tests/test_cli.py @@ -356,4 +356,6 @@ assert actual_db_version == expected_version assert result.exit_code == 0, f"Unexpected output: {result.output}" - assert f"initialized at version {expected_version}" in result.output + assert ( + f"initialized (flavor default) at version {expected_version}" in result.output + ) diff --git a/swh/core/db/tests/test_db_utils.py b/swh/core/db/tests/test_db_utils.py --- a/swh/core/db/tests/test_db_utils.py +++ b/swh/core/db/tests/test_db_utils.py @@ -30,6 +30,7 @@ assert files assert [f.name for f in files] == [ "0-superuser-init.sql", + "15-flavor.sql", "30-schema.sql", "40-funcs.sql", "50-data.sql", @@ -64,7 +65,7 @@ assert dbmodule == module assert dbversion == 10 - assert dbflavor is None + assert dbflavor == "default" # check also the swh_db_versions() function versions = swh_db_versions(conninfo) assert len(versions) == 1 @@ -89,7 +90,7 @@ dbmodule, dbversion, dbflavor = get_database_info(conninfo) assert dbmodule == module assert dbversion == 14 - assert dbflavor is None + assert dbflavor == "default" versions = swh_db_versions(conninfo) assert len(versions) == 5 @@ -183,3 +184,25 @@ # an upgrade should fail due to missing stored version with pytest.raises(ValueError): swh_db_upgrade(conninfo, module) + + +@pytest.mark.parametrize("module", ["test.cli", "test.cli_new"]) +@pytest.mark.parametrize("flavor", [None, "default", "flavorA", "flavorB"]) +def test_db_utils_flavor(cli_runner, postgresql, mock_import_swhmodule, module, flavor): + """Check populate_database_for_package handle db flavor properly""" + conninfo = craft_conninfo(postgresql) + result = cli_runner.invoke(swhdb, ["init-admin", module, "--dbname", conninfo]) + assert result.exit_code == 0, f"Unexpected output: {result.output}" + cmd = ["init", module, "--dbname", conninfo] + if flavor: + cmd.extend(["--flavor", flavor]) + result = cli_runner.invoke(swhdb, cmd) + assert result.exit_code == 0, f"Unexpected output: {result.output}" + + # check the swh_db_module() function + assert swh_db_module(conninfo) == module + + # the dbversion and dbmodule tables exists and are populated + dbmodule, _dbversion, dbflavor = get_database_info(conninfo) + assert dbmodule == module + assert dbflavor == (flavor or "default")