refactoring using github.com/rackerlabs/finding_dory manager concepts and base drivers
This commit is contained in:
parent
009b98f5bf
commit
6cd19a6b4f
|
@ -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)
|
||||
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
from cdn.provider.fastly import driver
|
||||
|
||||
# Hoist classes into package namespace
|
||||
CDNProvider = driver.CDNProvider
|
||||
Driver = driver.CDNProvider
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
from cdn.provider.mock import driver
|
||||
|
||||
# Hoist classes into package namespace
|
||||
CDNProvider = driver.CDNProvider
|
||||
Driver = driver.CDNProvider
|
||||
|
|
|
@ -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)
|
|
@ -3,4 +3,4 @@
|
|||
from cdn.storage.cassandra import driver
|
||||
|
||||
# Hoist classes into package namespace
|
||||
StorageDriver = driver.StorageDriver
|
||||
Driver = driver.StorageDriver
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
from cdn.storage.mockdb import driver
|
||||
|
||||
# Hoist classes into package namespace
|
||||
StorageDriver = driver.StorageDriver
|
||||
Driver = driver.StorageDriver
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
from cdn.storage.mongodb import driver
|
||||
|
||||
# Hoist classes into package namespace
|
||||
StorageDriver = driver.StorageDriver
|
||||
Driver = driver.StorageDriver
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
from cdn.transport.falcon import driver
|
||||
|
||||
# Hoist into package namespace
|
||||
TransportDriver = driver.TransportDriver
|
||||
Driver = driver.TransportDriver
|
||||
|
|
|
@ -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,
|
||||
|
|
15
setup.cfg
15
setup.cfg
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue