Split up storage into each service

This commit is contained in:
Endre Karlson 2013-04-25 13:59:20 -07:00
parent 2b605025c1
commit 486a78ef64
23 changed files with 83 additions and 73 deletions

View File

@ -45,6 +45,7 @@ class SQLAlchemyEngine(StorageEngine):
return Connection() return Connection()
class Connection(Connection, api.HelpersMixin): class Connection(Connection, api.HelpersMixin):
def __init__(self): def __init__(self):
self.setup('biller:sqlalchemy') self.setup('biller:sqlalchemy')

View File

@ -2,7 +2,7 @@ import functools
from oslo.config import cfg from oslo.config import cfg
from billingstack.openstack.common import log as logging from billingstack.openstack.common import log as logging
from billingstack.openstack.common.rpc import service as rpc_service from billingstack.openstack.common.rpc import service as rpc_service
from billingstack import storage from billingstack.central import storage
cfg.CONF.import_opt('central_topic', 'billingstack.central.rpcapi') cfg.CONF.import_opt('central_topic', 'billingstack.central.rpcapi')

View File

@ -0,0 +1,57 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Copied: Moniker
from oslo.config import cfg
from billingstack.openstack.common import log as logging
from billingstack.storage import base
LOG = logging.getLogger(__name__)
class StorageEngine(base.StorageEngine):
__plugin_type__ = 'central'
__plugin_ns__ = 'billingstack.central.storage'
class Connection(base.Connection):
pass
def get_engine(engine_name):
"""
Return the engine class from the provided engine name
"""
return StorageEngine.get_plugin(engine_name, invoke_on_load=True)
def get_connection():
engine = get_engine(cfg.CONF['service:central'].storage_driver)
return engine.get_connection()
def setup_schema():
""" Create the DB - Used for testing purposes """
LOG.debug("Setting up Schema")
connection = get_connection()
connection.setup_schema()
def teardown_schema():
""" Reset the DB to default - Used for testing purposes """
LOG.debug("Tearing down Schema")
connection = get_connection()
connection.teardown_schema()

View File

@ -19,16 +19,17 @@ from billingstack import utils as common_utils
from billingstack.sqlalchemy import utils as db_utils, api from billingstack.sqlalchemy import utils as db_utils, api
from billingstack.sqlalchemy.session import SQLOPTS from billingstack.sqlalchemy.session import SQLOPTS
from billingstack.storage import base from billingstack.storage import base
from billingstack.storage.impl_sqlalchemy import models from billingstack.central.storage import Connection, StorageEngine
from billingstack.central.storage.impl_sqlalchemy import models
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
cfg.CONF.register_group(cfg.OptGroup( cfg.CONF.register_group(cfg.OptGroup(
name='storage:sqlalchemy', title="Configuration for SQLAlchemy Storage" name='central:sqlalchemy', title="Configuration for SQLAlchemy Storage"
)) ))
cfg.CONF.register_opts(SQLOPTS, group='storage:sqlalchemy') cfg.CONF.register_opts(SQLOPTS, group='central:sqlalchemy')
def filter_merchant_by_join(query, cls, criterion): def filter_merchant_by_join(query, cls, criterion):
@ -41,14 +42,14 @@ def filter_merchant_by_join(query, cls, criterion):
return query return query
class SQLAlchemyStorage(base.StorageEngine): class SQLAlchemyEngine(StorageEngine):
__plugin_name__ = 'sqlalchemy' __plugin_name__ = 'sqlalchemy'
def get_connection(self): def get_connection(self):
return Connection(self.name) return Connection(self.name)
class Connection(base.Connection, api.HelpersMixin): class Connection(Connection, api.HelpersMixin):
""" """
SQLAlchemy connection SQLAlchemy connection
""" """

View File

@ -22,7 +22,7 @@ from logging.config import fileConfig
from alembic import context from alembic import context
from sqlalchemy import create_engine, pool from sqlalchemy import create_engine, pool
from billingstack.storage.impl_sqlalchemy.models import ModelBase from billingstack.central.storage.impl_sqlalchemy.models import ModelBase
# this is the Alembic Config object, which provides # this is the Alembic Config object, which provides
@ -50,7 +50,7 @@ def run_migrations_offline():
script output. script output.
""" """
context.configure(url=billingstack_config['storage:sqlalchemy'] context.configure(url=billingstack_config['central:sqlalchemy']
.database_connection) .database_connection)
with context.begin_transaction(): with context.begin_transaction():
@ -65,7 +65,7 @@ def run_migrations_online():
""" """
engine = create_engine( engine = create_engine(
billingstack_config['storage:sqlalchemy'].database_connection, billingstack_config['central:sqlalchemy'].database_connection,
poolclass=pool.NullPool) poolclass=pool.NullPool)
connection = engine.connect() connection = engine.connect()

View File

@ -33,7 +33,7 @@ _db_opts = [
] ]
CONF = cfg.ConfigOpts() CONF = cfg.ConfigOpts()
CONF.register_opts(_db_opts, 'storage:sqlalchemy') CONF.register_opts(_db_opts, 'central:sqlalchemy')
def do_alembic_command(config, cmd, *args, **kwargs): def do_alembic_command(config, cmd, *args, **kwargs):
@ -116,7 +116,7 @@ def main():
) )
config.set_main_option( config.set_main_option(
'script_location', 'script_location',
'billingstack.storage.impl_sqlalchemy.migration:alembic_migrations') 'billingstack.central.storage.impl_sqlalchemy.migration:alembic_migrations')
# attach the Quantum conf to the Alembic conf # attach the Quantum conf to the Alembic conf
config.billingstack_config = CONF config.billingstack_config = CONF

View File

@ -30,7 +30,7 @@ cfg.CONF.import_opt(
cfg.CONF.import_opt( cfg.CONF.import_opt(
'database_connection', 'database_connection',
'billingstack.storage.impl_sqlalchemy', 'billingstack.storage.impl_sqlalchemy',
group='storage:sqlalchemy') group='central:sqlalchemy')
class DatabaseCommand(Command): class DatabaseCommand(Command):

View File

@ -1,47 +0,0 @@
# Copyright 2012 Managed I.T.
#
# Author: Kiall Mac Innes <kiall@managedit.ie>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Copied: Moniker
from oslo.config import cfg
from billingstack.openstack.common import log as logging
from billingstack.storage.base import StorageEngine
LOG = logging.getLogger(__name__)
def get_engine(engine_name):
"""
Return the engine class from the provided engine name
"""
return StorageEngine.get_plugin(engine_name, invoke_on_load=True)
def get_connection():
engine = get_engine(cfg.CONF['service:central'].storage_driver)
return engine.get_connection()
def setup_schema():
""" Create the DB - Used for testing purposes """
LOG.debug("Setting up Schema")
connection = get_connection()
connection.setup_schema()
def teardown_schema():
""" Reset the DB to default - Used for testing purposes """
LOG.debug("Tearing down Schema")
connection = get_connection()
connection.teardown_schema()

View File

@ -20,8 +20,6 @@ from billingstack.plugin import Plugin
class StorageEngine(Plugin): class StorageEngine(Plugin):
""" Base class for storage engines """ """ Base class for storage engines """
__plugin_ns__ = 'billingstack.storage'
__plugin_type__ = 'storage' __plugin_type__ = 'storage'
def get_connection(self): def get_connection(self):

View File

@ -6,7 +6,7 @@ from oslo.config import cfg
# from billingstack.openstack.common import policy # from billingstack.openstack.common import policy
from billingstack import exceptions from billingstack import exceptions
from billingstack import samples from billingstack import samples
from billingstack import storage from billingstack.central import storage
from billingstack.api import service as api_service from billingstack.api import service as api_service
from billingstack.central import service as central_service from billingstack.central import service as central_service
from billingstack.openstack.common.context import RequestContext, \ from billingstack.openstack.common.context import RequestContext, \
@ -16,8 +16,8 @@ from billingstack.openstack.common.context import RequestContext, \
cfg.CONF.import_opt('storage_driver', 'billingstack.central', cfg.CONF.import_opt('storage_driver', 'billingstack.central',
group='service:central') group='service:central')
cfg.CONF.import_opt('database_connection', cfg.CONF.import_opt('database_connection',
'billingstack.storage.impl_sqlalchemy', 'billingstack.central.storage.impl_sqlalchemy',
group='storage:sqlalchemy') group='central:sqlalchemy')
class AssertMixin(object): class AssertMixin(object):
@ -107,7 +107,7 @@ class TestCase(BaseTestCase):
self.config( self.config(
database_connection='sqlite://', database_connection='sqlite://',
group='storage:sqlalchemy' group='central:sqlalchemy'
) )
self.samples = samples.get_samples() self.samples = samples.get_samples()

View File

@ -14,7 +14,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from billingstack.openstack.common import log as logging from billingstack.openstack.common import log as logging
from billingstack.storage.impl_sqlalchemy import models from billingstack.central.storage.impl_sqlalchemy import models
from billingstack.tests.base import TestCase from billingstack.tests.base import TestCase

View File

@ -26,5 +26,5 @@ class SqlalchemyStorageTest(StorageDriverTestCase):
def setUp(self): def setUp(self):
self.config(database_connection='sqlite://', self.config(database_connection='sqlite://',
group='storage:sqlalchemy') group='central:sqlalchemy')
super(SqlalchemyStorageTest, self).setUp() super(SqlalchemyStorageTest, self).setUp()

View File

@ -36,7 +36,7 @@ allowed_rpc_exception_modules = billingstack.exceptions, billingstack.openstack.
#----------------------- #-----------------------
# SQLAlchemy Storage # SQLAlchemy Storage
#----------------------- #-----------------------
[storage:sqlalchemy] [central:sqlalchemy]
# Database connection string - to configure options for a given implementation # Database connection string - to configure options for a given implementation
# like sqlalchemy or other see below # like sqlalchemy or other see below
#database_connection = mysql://billingstack:billingstack@localhost:3306/billingstack #database_connection = mysql://billingstack:billingstack@localhost:3306/billingstack

View File

@ -57,8 +57,8 @@ setup(
], ],
cmdclass=common_setup.get_cmdclass(), cmdclass=common_setup.get_cmdclass(),
entry_points=textwrap.dedent(""" entry_points=textwrap.dedent("""
[billingstack.storage] [billingstack.central.storage]
sqlalchemy = billingstack.storage.impl_sqlalchemy:SQLAlchemyStorage sqlalchemy = billingstack.central.storage.impl_sqlalchemy:SQLAlchemyEngine
[billingstack.biller.storage] [billingstack.biller.storage]
sqlalchemy = billingstack.biller.storage.impl_sqlalchemy:SQLAlchemyEngine sqlalchemy = billingstack.biller.storage.impl_sqlalchemy:SQLAlchemyEngine

View File

@ -18,7 +18,7 @@ cfg.CONF.import_opt('state_path', 'billingstack.paths')
cfg.CONF.import_opt( cfg.CONF.import_opt(
'database_connection', 'database_connection',
'billingstack.storage.impl_sqlalchemy', 'billingstack.storage.impl_sqlalchemy',
group='storage:sqlalchemy') group='central:sqlalchemy')
SAMPLES = get_samples() SAMPLES = get_samples()

View File

@ -21,8 +21,8 @@ cfg.CONF.import_opt('state_path', 'billingstack.paths')
cfg.CONF.import_opt('database_connection', cfg.CONF.import_opt('database_connection',
'billingstack.storage.impl_sqlalchemy', 'billingstack.central.storage.impl_sqlalchemy',
group='storage:sqlalchemy') group='central:sqlalchemy')
if __name__ == '__main__': if __name__ == '__main__':
service.prepare_service(sys.argv) service.prepare_service(sys.argv)