diff --git a/placement/conf/database.py b/placement/conf/database.py index 47843b0d2..fb5b38efc 100644 --- a/placement/conf/database.py +++ b/placement/conf/database.py @@ -93,6 +93,10 @@ placement_db_opts = [ help=''), cfg.IntOpt('pool_timeout', help=''), + cfg.BoolOpt('sync_on_startup', + default=False, + help='If True, database schema migrations will be attempted when the' + ' web service starts.'), ] # noqa diff --git a/placement/db_api.py b/placement/db_api.py index 0f39da1c3..eb5fce403 100644 --- a/placement/db_api.py +++ b/placement/db_api.py @@ -21,7 +21,10 @@ placement_context_manager = enginefacade.transaction_context() def _get_db_conf(conf_group): - return dict(conf_group.items()) + conf_dict = dict(conf_group.items()) + # Remove the 'sync_on_startup' conf setting, enginefacade does not use it. + del conf_dict['sync_on_startup'] + return conf_dict @run_once("TransactionFactory already started, not reconfiguring.", diff --git a/placement/deploy.py b/placement/deploy.py index 40d3e7c8f..490f6fd95 100644 --- a/placement/deploy.py +++ b/placement/deploy.py @@ -16,6 +16,7 @@ import oslo_middleware from oslo_middleware import cors from placement import auth +from placement.db.sqlalchemy import migration from placement import db_api from placement import fault_wrap from placement import handler @@ -91,10 +92,12 @@ def deploy(conf): return application -def update_database(): +def update_database(conf): """Do any database updates required at process boot time, such as updating the traits table. """ + if conf.placement_database.sync_on_startup: + migration.upgrade('head') ctx = db_api.DbContext() resource_provider.ensure_trait_sync(ctx) resource_provider.ensure_resource_classes_sync(ctx) @@ -117,5 +120,5 @@ def loadapp(config, project_name=NAME): backwards compatibility """ application = deploy(config) - update_database() + update_database(config) return application diff --git a/placement/tests/fixtures.py b/placement/tests/fixtures.py index c5236439b..4638acd0a 100644 --- a/placement/tests/fixtures.py +++ b/placement/tests/fixtures.py @@ -70,7 +70,7 @@ class Database(test_fixtures.GeneratesSchema, test_fixtures.AdHocDbFixture): self.cleanup() # Sync traits and resource classes. - deploy.update_database() + deploy.update_database(self.conf_fixture.conf) def cleanup(self): resource_provider._TRAITS_SYNCED = False diff --git a/releasenotes/notes/db-auto-sync-e418f3f181958c7c.yaml b/releasenotes/notes/db-auto-sync-e418f3f181958c7c.yaml new file mode 100644 index 000000000..cb60520ef --- /dev/null +++ b/releasenotes/notes/db-auto-sync-e418f3f181958c7c.yaml @@ -0,0 +1,10 @@ +--- +features: + - | + A configuration setting ``[placement_database]/sync_on_startup`` is added + which, if set to ``True``, will cause database schema migrations to be + called when the placement web application is started. This avoids the need + to call ``placement-manage db sync`` separately. + + To preserve backwards compatbility and avoid unexpected changes, the + default of the setting is ``False``.