refactoring using github.com/rackerlabs/finding_dory manager concepts and base drivers

This commit is contained in:
amitgandhinz 2014-07-18 14:28:34 -04:00
parent 009b98f5bf
commit 6cd19a6b4f
19 changed files with 68 additions and 277 deletions

View File

@ -25,8 +25,10 @@ LOG = log.getLogger(__name__)
_DRIVER_OPTIONS = [
cfg.StrOpt('transport', default='falcon',
help='Transport driver to use'),
cfg.StrOpt('manager', default='default',
help='Manager driver to use'),
cfg.StrOpt('storage', default='mockdb',
help='Storage driver to use'),
help='Storage driver to use')
]
_DRIVER_GROUP = 'drivers'
@ -72,7 +74,7 @@ class Bootstrap(object):
storage_type = 'cdn.storage'
storage_name = self.driver_conf.storage
args = [self.conf, self.provider]
args = [self.conf]
try:
mgr = driver.DriverManager(namespace=storage_type,
@ -83,6 +85,25 @@ class Bootstrap(object):
except RuntimeError as exc:
LOG.exception(exc)
@decorators.lazy_property(write=False)
def manager(self):
LOG.debug((u'Loading manager driver'))
# create the driver manager to load the appropriate drivers
manager_type = 'cdn.manager'
manager_name = self.driver_conf.manager
args = [self.conf, self.storage, self.provider]
try:
mgr = driver.DriverManager(namespace=manager_type,
name=manager_name,
invoke_on_load=True,
invoke_args=args)
return mgr.driver
except RuntimeError as exc:
LOG.exception(exc)
@decorators.lazy_property(write=False)
def transport(self):
LOG.debug("loading transport")
@ -91,7 +112,7 @@ class Bootstrap(object):
transport_type = 'cdn.transport'
transport_name = self.driver_conf.transport
args = [self.conf, self.storage]
args = [self.conf, self.manager]
LOG.debug((u'Loading transport driver: %s'), transport_name)

View File

@ -3,4 +3,4 @@
from cdn.provider.fastly import driver
# Hoist classes into package namespace
CDNProvider = driver.CDNProvider
Driver = driver.CDNProvider

View File

@ -3,4 +3,4 @@
from cdn.provider.mock import driver
# Hoist classes into package namespace
CDNProvider = driver.CDNProvider
Driver = driver.CDNProvider

View File

@ -1,149 +0,0 @@
# Copyright (c) 2014 Rackspace, Inc.
#
# 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.
import abc
import six
from oslo.config import cfg
_LIMITS_OPTIONS = [
cfg.IntOpt('default_services_paging', default=10,
help='Default services pagination size')
]
_LIMITS_GROUP = 'limits:storage'
@six.add_metaclass(abc.ABCMeta)
class DriverBase(object):
"""Base class for both data and control plane drivers
:param conf: Configuration containing options for this driver.
:type conf: `oslo.config.ConfigOpts`
"""
def __init__(self, conf, providers):
self.conf = conf
self.providers = providers
def providers(self):
return self.providers
@six.add_metaclass(abc.ABCMeta)
class StorageDriverBase(DriverBase):
"""Interface definition for storage drivers.
Data plane storage drivers are responsible for implementing the
core functionality of the system.
Connection information and driver-specific options are
loaded from the config file.
:param conf: Configuration containing options for this driver.
:type conf: `oslo.config.ConfigOpts`
"""
def __init__(self, conf, providers):
super(StorageDriverBase, self).__init__(conf, providers)
self.conf.register_opts(_LIMITS_OPTIONS, group=_LIMITS_GROUP)
self.limits_conf = self.conf[_LIMITS_GROUP]
@abc.abstractmethod
def is_alive(self):
"""Check whether the storage is ready."""
raise NotImplementedError
@abc.abstractproperty
def service_controller(self):
"""Returns the driver's hostname controller."""
raise NotImplementedError
class ControllerBase(object):
"""Top-level class for controllers.
:param driver: Instance of the driver
instantiating this controller.
"""
def __init__(self, driver):
self.driver = driver
@six.add_metaclass(abc.ABCMeta)
class ServicesBase(ControllerBase):
"""This class is responsible for managing Services
"""
__metaclass__ = abc.ABCMeta
def __init__(self, driver):
super(ServicesBase, self).__init__(driver)
self.wrapper = ProviderWrapper()
@abc.abstractmethod
def list(self, project_id):
raise NotImplementedError
@abc.abstractmethod
def create(self, project_id, service_name, service_json):
if (self.driver.providers is not None):
return self.driver.providers.map(
self.wrapper.create,
service_name,
service_json)
else:
return None
@abc.abstractmethod
def update(self, project_id, service_name, service_json):
if (self.driver.providers is not None):
return self.driver.providers.map(
self.wrapper.update,
service_name,
service_json)
else:
return None
@abc.abstractmethod
def delete(self, project_id, service_name):
if (self.driver.providers is not None):
return self.driver.providers.map(
self.wrapper.delete,
service_name)
else:
return None
@abc.abstractmethod
def get(self):
raise NotImplementedError
class ProviderWrapper(object):
def create(self, ext, service_name, service_json):
return ext.obj.service_controller.create(service_name, service_json)
def update(self, ext, service_name):
return ext.obj.service_controller.update(service_name)
def delete(self, ext, service_name):
return ext.obj.service_controller.delete(service_name)

View File

@ -3,4 +3,4 @@
from cdn.storage.cassandra import driver
# Hoist classes into package namespace
StorageDriver = driver.StorageDriver
Driver = driver.StorageDriver

View File

@ -19,7 +19,7 @@ from cassandra.cluster import Cluster
from cdn.common import decorators
from cdn.openstack.common import log as logging
from cdn import storage
from cdn.storage import base
from cdn.storage.cassandra import controllers
from oslo.config import cfg
@ -42,10 +42,10 @@ def _connection(conf):
return session
class StorageDriver(storage.StorageDriverBase):
class CassandraStorageDriver(base.Driver):
def __init__(self, conf, providers):
super(StorageDriver, self).__init__(conf, providers)
def __init__(self, conf):
super(CassandraStorageDriver, self).__init__(conf)
self.conf.register_opts(CASSANDRA_OPTIONS,
group=CASSANDRA_GROUP)

View File

@ -84,7 +84,7 @@ CQL_UPDATE_RESTRICTIONS = '''
'''
class ServicesController(base.ServicesBase):
class ServicesController(base.ServicesController):
@property
def session(self):
@ -140,23 +140,13 @@ class ServicesController(base.ServicesBase):
self.session.execute(CQL_CREATE_SERVICE, args)
# create at providers
providers = super(ServicesController, self).create(
project_id, service_name, service)
return providers
def update(self, project_id, service_name, service_json):
# update configuration in storage
# determine what changed.
# update those columns provided only.
# update at providers
return super(ServicesController, self).update(project_id,
service_name,
service_json)
pass
def delete(self, project_id, service_name):
# delete local configuration from storage
@ -165,6 +155,3 @@ class ServicesController(base.ServicesBase):
'service_name': service_name
}
self.session.execute(CQL_DELETE_SERVICE, args)
# delete from providers
return super(ServicesController, self).delete(project_id, service_name)

View File

@ -3,4 +3,4 @@
from cdn.storage.mockdb import driver
# Hoist classes into package namespace
StorageDriver = driver.StorageDriver
Driver = driver.StorageDriver

View File

@ -17,7 +17,7 @@
from cdn.common import decorators
from cdn.openstack.common import log as logging
from cdn import storage
from cdn.storage import base
from cdn.storage.mockdb import controllers
from oslo.config import cfg
@ -36,10 +36,10 @@ def _connection():
return None
class StorageDriver(storage.StorageDriverBase):
class StorageDriver(base.Driver):
def __init__(self, conf, providers):
super(StorageDriver, self).__init__(conf, providers)
def __init__(self, conf):
super(StorageDriver, self).__init__(conf)
self.conf.register_opts(MOCKDB_OPTIONS,
group=MOCKDB_GROUP)

View File

@ -16,7 +16,7 @@
from cdn.storage import base
class ServicesController(base.ServicesBase):
class ServicesController(base.ServicesController):
def __init__(self, *args, **kwargs):
super(ServicesController, self).__init__(*args, **kwargs)

View File

@ -3,4 +3,4 @@
from cdn.storage.mongodb import driver
# Hoist classes into package namespace
StorageDriver = driver.StorageDriver
Driver = driver.StorageDriver

View File

@ -20,7 +20,7 @@ import pymongo.errors
from cdn.common import decorators
from cdn.openstack.common import log as logging
from cdn import storage
from cdn.storage import base
from cdn.storage.mongodb import controllers
from oslo.config import cfg
@ -63,10 +63,10 @@ def _connection(conf):
return MongoClient(conf.uri)
class StorageDriver(storage.StorageDriverBase):
class StorageDriver(base.Driver):
def __init__(self, conf, providers):
super(StorageDriver, self).__init__(conf, providers)
def __init__(self, conf):
super(StorageDriver, self).__init__(conf)
self.conf.register_opts(MONGODB_OPTIONS,
group=MONGODB_GROUP)

View File

@ -17,95 +17,25 @@
from cdn.storage import base
class ServicesController(base.ServicesBase):
class ServicesController(base.ServicesController):
def list(self, project_id):
services = {
"links": [
{
"rel": "next",
"href": "/v1.0/services?marker=www.test.com&limit=20"
}
],
"services": [
{
"domains": [
{
"domain": "www.mywebsite.com"
}
],
"origins": [
{
"origin": "mywebsite.com",
"port": 80,
"ssl": False
}
],
"caching": [
{"name": "default", "ttl": 3600},
{
"name": "home",
"ttl": 17200,
"rules": [
{"name": "index",
"request_url": "/index.htm"}
]
},
{
"name": "images",
"ttl": 12800,
"rules": [
{"name": "images", "request_url": "*.png"}
]
}
],
"restrictions": [
{
"name": "website only",
"rules": [
{
"name": "mywebsite.com",
"http_host": "www.mywebsite.com"
}
]
}
],
"links": [
{
"href": "/v1.0/services/mywebsite",
"rel": "self"
}
]
}
]
}
services = {}
return services
def get(self, project_id):
def get(self, project_id, service_name):
# get the requested service from storage
print "get service"
pass
def create(self, project_id, service_name, service_json):
# create the service in storage
service = service_json
# create at providers
return super(ServicesController, self).create(project_id,
service_name,
service)
pass
def update(self, project_id, service_name, service_json):
# update configuration in storage
# update at providers
return super(ServicesController, self).update(project_id,
service_name,
service_json)
pass
def delete(self, project_id, service_name):
# delete local configuration from storage
# delete from providers
return super(ServicesController, self).delete(project_id, service_name)
pass

View File

@ -25,9 +25,9 @@ class DriverBase(object):
:type conf: oslo.config.cfg.CONF
"""
def __init__(self, conf, storage):
def __init__(self, conf, manager):
self._conf = conf
self._storage = storage
self._manager = manager
@abc.abstractmethod
def listen():

View File

@ -3,4 +3,4 @@
from cdn.transport.falcon import driver
# Hoist into package namespace
TransportDriver = driver.TransportDriver
Driver = driver.TransportDriver

View File

@ -44,8 +44,8 @@ LOG = logging.getLogger(__name__)
@six.add_metaclass(abc.ABCMeta)
class TransportDriver(transport.DriverBase):
def __init__(self, conf, storage):
super(TransportDriver, self).__init__(conf, storage)
def __init__(self, conf, manager):
super(TransportDriver, self).__init__(conf, manager)
self._conf.register_opts(_WSGI_OPTIONS, group=_WSGI_GROUP)
self._wsgi_conf = self._conf[_WSGI_GROUP]
@ -62,7 +62,7 @@ class TransportDriver(transport.DriverBase):
prefix = version_path + project_id
# init the controllers
service_controller = self._storage.service_controller
service_controller = self._manager.service_controller
# setup the routes
self.app.add_route(prefix,

View File

@ -27,16 +27,19 @@ console_scripts =
cdn-server = cdn.cmd.server:run
cdn.transport =
falcon = cdn.transport.falcon.driver:TransportDriver
falcon = cdn.transport.falcon:Driver
cdn.manager =
default = cdn.manager.default:Driver
cdn.storage =
mongodb = cdn.storage.mongodb.driver:StorageDriver
cassandra = cdn.storage.cassandra.driver:StorageDriver
mockdb = cdn.storage.mockdb.driver:StorageDriver
mongodb = cdn.storage.mongodb:Driver
cassandra = cdn.storage.cassandra:Driver
mockdb = cdn.storage.mockdb:Driver
cdn.provider =
fastly = cdn.provider.fastly.driver:CDNProvider
mock = cdn.provider.mock.driver:CDNProvider
fastly = cdn.provider.fastly:Driver
mock = cdn.provider.mock:Driver
[nosetests]
where=tests

View File

@ -17,8 +17,7 @@ testtools>=0.9.32
requests>=1.1
# API Tests
git+https://github.com/stackforge/opencafe.git#egg=opencafe
jsonschema
# git+https://github.com/stackforge/opencafe.git#egg=opencafe
# Test runner
nose

View File

@ -16,7 +16,7 @@ setenv = VIRTUAL_ENV={envdir}
NOSE_OPENSTACK_STDOUT=1
deps = -r{toxinidir}/requirements/requirements.txt
-r{toxinidir}/tests/test-requirements.txt
commands = nosetests {posargs}
commands = nosetests {posargs} -e api
[tox:jenkins]
downloadcache = ~/cache/pip