Skip to content

Commit

Permalink
Optionally migrate database at service startup
Browse files Browse the repository at this point in the history
In some use cases, notably testing, it can be handy to do database
migrations when the web service starts up. This changes adds that
functionality, controlled by a [placement_database]/sync_on_startup
option that defaults to False.

When True, `migration.upgrade('head')` will be called before the
placement application is made available to the wsgi server. Alembic
protects us against concurrency issues and prevents re-doing already
done migrations.

This means that it is possible, with the help of oslo.config>=6.7.0
to do something like this:

    OS_PLACEMENT_DATABASE__CONNECTION=sqlite:// \
    OS_PLACEMENT_DATABASE__SYNC_ON_STARTUP=True \
    OS_API__AUTH_STRATEGY=noauth2 \
    .tox/py36/bin/placement-api

and have a ready to go placement api using an in-RAM sql database.

A reno is added.

Change-Id: Ie43a69be8b75250d9deca6a911eda7b722ef8648
  • Loading branch information
cdent authored and Eric Fried committed Feb 25, 2019
1 parent 8723768 commit da36ad1
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 4 deletions.
4 changes: 4 additions & 0 deletions placement/conf/database.py
Expand Up @@ -93,6 +93,10 @@ def get_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


Expand Down
5 changes: 4 additions & 1 deletion placement/db_api.py
Expand Up @@ -21,7 +21,10 @@


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.",
Expand Down
7 changes: 5 additions & 2 deletions placement/deploy.py
Expand Up @@ -16,6 +16,7 @@
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
Expand Down Expand Up @@ -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)
Expand All @@ -117,5 +120,5 @@ def loadapp(config, project_name=NAME):
backwards compatibility
"""
application = deploy(config)
update_database()
update_database(config)
return application
2 changes: 1 addition & 1 deletion placement/tests/fixtures.py
Expand Up @@ -70,7 +70,7 @@ def generate_schema_create_all(self, engine):
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
Expand Down
10 changes: 10 additions & 0 deletions 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``.

0 comments on commit da36ad1

Please sign in to comment.