blueprint: add Docstrings to all things, part2 and part3

Change-Id: Iaf0210a59882a3705ef975b2a2d0b902388e336c

Conflicts:
	poppy/storage/cassandra/flavors.py

Change-Id: I5b5b151470fe4e6e72fa260b2bfab8319bea2e9a
This commit is contained in:
Miguel Quintero 2014-11-10 02:04:15 -05:00
parent 53016bda58
commit 181a0216ec
37 changed files with 585 additions and 26 deletions

View File

@ -64,6 +64,8 @@ class Bootstrap(object):
@decorators.lazy_property(write=False)
def dns(self):
"""DNS."""
LOG.debug((u'Loading DNS driver'))
# create the driver manager to load the appropriate drivers
@ -83,6 +85,11 @@ class Bootstrap(object):
@decorators.lazy_property(write=False)
def provider(self):
"""provider.
:returns mgr
"""
LOG.debug((u'Loading provider extension(s)'))
# create the driver manager to load the appropriate drivers
@ -98,6 +105,11 @@ class Bootstrap(object):
@decorators.lazy_property(write=False)
def storage(self):
"""storage.
:returns mgr driver
"""
LOG.debug((u'Loading storage driver'))
# create the driver manager to load the appropriate drivers
@ -117,6 +129,10 @@ class Bootstrap(object):
@decorators.lazy_property(write=False)
def manager(self):
"""manager.
:returns mgr driver
"""
LOG.debug((u'Loading manager driver'))
# create the driver manager to load the appropriate drivers
@ -136,6 +152,10 @@ class Bootstrap(object):
@decorators.lazy_property(write=False)
def transport(self):
"""transport.
:returns mgr driver
"""
LOG.debug("loading transport")
# create the driver manager to load the appropriate drivers

View File

@ -32,7 +32,11 @@ _ALL_ALLOWED = _UNRESERVED + _DELIMITERS
def _create_char_encoder(allowed_chars):
"""create_char_encoder.
:param allowed_chars: characters to encode
:returns __getitem__: hash of encoded characters
"""
lookup = {}
for code_point in range(256):
@ -50,6 +54,11 @@ def _create_char_encoder(allowed_chars):
def _create_str_encoder(is_value):
"""create_str_encoder.
:param is_value: boolean
:returns encoder: encoder
"""
allowed_chars = _UNRESERVED if is_value else _ALL_ALLOWED
encode_char = _create_char_encoder(allowed_chars)

View File

@ -39,7 +39,10 @@ class DNSDriverBase(object):
@abc.abstractmethod
def is_alive(self):
"""Check whether the dns provider is ready."""
"""Check whether the dns provider is ready.
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractproperty
@ -48,5 +51,8 @@ class DNSDriverBase(object):
@abc.abstractproperty
def service_controller(self):
"""Returns the driver's hostname controller."""
"""Returns the driver's hostname controller.
:raises NotImplementedError
"""
raise NotImplementedError

View File

@ -23,5 +23,7 @@ from poppy.dns.base import controller
@six.add_metaclass(abc.ABCMeta)
class ServicesControllerBase(controller.DNSControllerBase):
"""Services Controller Base class."""
def __init__(self, driver):
super(ServicesControllerBase, self).__init__(driver)

View File

@ -21,6 +21,7 @@ from poppy.manager.default import controllers
class DefaultManagerDriver(base.Driver):
"""Default Manager Driver."""
def __init__(self, conf, storage, providers, dns):
super(DefaultManagerDriver, self).__init__(

View File

@ -18,17 +18,33 @@ from poppy.manager import base
class DefaultFlavorsController(base.FlavorsController):
"""Default Flavors Controller."""
def __init__(self, manager):
super(DefaultFlavorsController, self).__init__(manager)
def list(self):
"""list.
:return list
"""
return self.storage.list()
def get(self, flavor_id):
"""get.
":param flavor_id
:return flavor id
"""
return self.storage.get(flavor_id)
def add(self, new_flavor):
"""add.
:param new_flavor
:return new flavor
:raise LookupError
"""
# is this a valid flavor?
provider_list = self.driver.conf[bootstrap._DRIVER_GROUP].providers
@ -42,4 +58,9 @@ class DefaultFlavorsController(base.FlavorsController):
return self.storage.add(new_flavor)
def delete(self, flavor_id):
"""delete.
:param flavor_id
:return flavor_id
"""
return self.storage.delete(flavor_id)

View File

@ -17,11 +17,16 @@ from poppy.manager.base import health
class DefaultHealthController(health.HealthControllerBase):
"""Default Health Controller."""
def __init__(self, manager):
super(DefaultHealthController, self).__init__(manager)
def health(self):
"""health.
:returns is_alive, health_map
"""
health_map = {}
is_alive = True

View File

@ -37,10 +37,16 @@ JSON_HOME = {
class DefaultHomeController(base.HomeController):
"""Default Home Controller."""
def __init__(self, manager):
super(DefaultHomeController, self).__init__(manager)
self.JSON_HOME = JSON_HOME
def get(self):
"""get.
:return json home
"""
return self.JSON_HOME

View File

@ -21,6 +21,7 @@ from poppy.manager.default.service_async_workers import delete_service_worker
class DefaultServicesController(base.ServicesController):
"""Default Services Controller."""
def __init__(self, manager):
super(DefaultServicesController, self).__init__(manager)
@ -29,12 +30,31 @@ class DefaultServicesController(base.ServicesController):
self.flavor_controller = self._driver.storage.flavors_controller
def list(self, project_id, marker=None, limit=None):
"""list.
:param project_id
:param marker
:param limit
:return list
"""
return self.storage_controller.list(project_id, marker, limit)
def get(self, project_id, service_name):
"""get.
:param project_id
:param service_name
:return controller
"""
return self.storage_controller.get(project_id, service_name)
def create(self, project_id, service_obj):
"""create.
:param project_id
:param service_obj
:raises LoookupError, ValueError
"""
try:
flavor = self.flavor_controller.get(service_obj.flavor_ref)
# raise a lookup error if the flavor is not found
@ -68,6 +88,12 @@ class DefaultServicesController(base.ServicesController):
return
def update(self, project_id, service_name, service_obj):
"""update.
:param project_id
:param service_name
:param service_obj
"""
self.storage_controller.update(
project_id,
service_name,
@ -83,6 +109,12 @@ class DefaultServicesController(base.ServicesController):
service_obj)
def delete(self, project_id, service_name):
"""delete.
:param project_id
:param service_name
:raises LookupError
"""
try:
provider_details = self.storage_controller.get_provider_details(
project_id,

View File

@ -15,6 +15,7 @@
class Flavor(object):
"""Flavor Class."""
def __init__(self,
flavor_id, providers=[]):
@ -24,14 +25,23 @@ class Flavor(object):
@property
def flavor_id(self):
"""Get flavor id.
:returns flavor id
"""
return self._flavor_id
@property
def providers(self):
"""Get providers
:returns providers
"""
return self._providers
class Provider(object):
"""Provider Class."""
def __init__(self,
provider_id,
@ -41,8 +51,16 @@ class Provider(object):
@property
def provider_id(self):
"""Get provider id.
:returns provider id
"""
return self._provider_id
@property
def provider_url(self):
"""Get provider url.
:returns provider url
"""
return self._provider_url

View File

@ -17,19 +17,34 @@ from poppy.model import common
class CachingRule(common.DictSerializableModel):
"""CachingRule
:param DictSerializableModel:
"""
def __init__(self, name, ttl):
self._name = name
self._ttl = ttl
@property
def name(self):
"""name.
:returns name
"""
return self._name
@property
def ttl(self):
"""ttl.
:returns ttl
"""
return self._ttl
@property
def rules(self):
"""rules.
:returns rules
"""
return self._rules

View File

@ -23,10 +23,15 @@ class Domain(common.DictSerializableModel):
@property
def domain(self):
"""domain.
:returns domain
"""
return self._domain
@domain.setter
def domain(self, value):
"""domain setter."""
self._domain = value
@classmethod
@ -34,6 +39,9 @@ class Domain(common.DictSerializableModel):
"""Construct a model instance from a dictionary.
This serves as a 2nd constructor
:param dict_obj: dictionary object
:returns o
"""
o = cls("unnamed")
o.domain = dict_obj.get("domain", "unnamed")

View File

@ -17,6 +17,7 @@ from poppy.model import common
class Origin(common.DictSerializableModel):
"""Origin."""
def __init__(self, origin, port=80, ssl=False):
self._origin = origin
@ -26,34 +27,51 @@ class Origin(common.DictSerializableModel):
@property
def origin(self):
"""origin."""
return self._origin
@origin.setter
def origin(self, value):
"""origin setter."""
self._origin = value
@property
def port(self):
"""port.
:returns port
"""
return self._port
@port.setter
def port(self, value):
"""port setter."""
self._port = value
@property
def ssl(self):
"""self.
:returns ssl
"""
return self._ssl
@ssl.setter
def ssl(self, value):
"""ssl setter."""
self._ssl = value
@property
def rules(self):
"""rules.
:returns rules
"""
return self._rules
@rules.setter
def rules(self, value):
"""rules setter."""
# TODO(tonytan4ever) this field should by typed too
self._rules = value
@ -62,7 +80,11 @@ class Origin(common.DictSerializableModel):
"""Construct a model instance from a dictionary.
This serves as a 2nd constructor
:param dict_obj: dictionary object
:returns o
"""
o = cls("unnamed")
o.origin = dict_obj.get("origin", "unnamed")
o.port = dict_obj.get("port", 80)

View File

@ -23,7 +23,7 @@ VALID_STATUSES = [
class ProviderDetail(object):
'''ProviderDetail object for each provider.'''
"""ProviderDetail object for each provider."""
def __init__(self, provider_service_id=None, access_urls=[],
status=u"deploy_in_progress", name=None, error_info=None):
@ -36,6 +36,7 @@ class ProviderDetail(object):
@property
def provider_service_id(self):
"""provider_service_id."""
return self._provider_service_id
@provider_service_id.setter

View File

@ -17,6 +17,7 @@ from poppy.model import common
class Restriction(common.DictSerializableModel):
"""Restriction."""
def __init__(self, name):
self._name = name
@ -24,8 +25,16 @@ class Restriction(common.DictSerializableModel):
@property
def name(self):
"""name.
:returns name
"""
return self._name
@property
def rules(self):
"""rules.
:returns rules
"""
return self._rules

View File

@ -17,6 +17,7 @@ from poppy.model import common
class Rule(common.DictSerializableModel):
"""Rule."""
def __init__(self, name):
self._name = name
@ -27,10 +28,12 @@ class Rule(common.DictSerializableModel):
@property
def name(self):
"""name."""
return self._name
@property
def http_host(self):
"""http_host."""
return self._http_host
@http_host.setter

View File

@ -20,6 +20,7 @@ VALID_STATUSES = [u'create_in_progress', u'deployed', u'delete_in_progress']
class Service(common.DictSerializableModel):
"""Service Class."""
def __init__(self,
name,
@ -39,6 +40,7 @@ class Service(common.DictSerializableModel):
@property
def name(self):
"""Get or set name."""
return self._name
@name.setter
@ -47,6 +49,7 @@ class Service(common.DictSerializableModel):
@property
def domains(self):
"""Get or set domains."""
return self._domains
@domains.setter
@ -55,6 +58,7 @@ class Service(common.DictSerializableModel):
@property
def origins(self):
"""Get or set origins."""
return self._origins
@origins.setter
@ -63,6 +67,7 @@ class Service(common.DictSerializableModel):
@property
def flavor_ref(self):
"""Get or set flavor ref."""
return self._flavor_ref
@flavor_ref.setter
@ -71,6 +76,7 @@ class Service(common.DictSerializableModel):
@property
def caching(self):
"""Get or set caching."""
return self._caching
@caching.setter
@ -79,6 +85,7 @@ class Service(common.DictSerializableModel):
@property
def restrictions(self):
"""Get or set restrictions."""
return self._restrictions
@restrictions.setter
@ -89,6 +96,10 @@ class Service(common.DictSerializableModel):
@property
def status(self):
"""Get or set status.
:returns boolean
"""
# derived fiedls of service status:
# service will be in creating during service creation
# if any of the provider services are still in 'deploy_in_progress'
@ -125,6 +136,7 @@ class Service(common.DictSerializableModel):
@property
def provider_details(self):
"""Get or set provider details."""
return self._provider_details
@provider_details.setter

View File

@ -37,14 +37,24 @@ class ProviderDriverBase(object):
@abc.abstractmethod
def is_alive(self):
"""Check whether the storage is ready."""
"""Check whether the storage is ready.
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractproperty
def provider_name(self):
"""provider name.
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractproperty
def service_controller(self):
"""Returns the driver's hostname controller."""
"""Returns the driver's hostname controller.
:raises NotImplementedError
"""
raise NotImplementedError

View File

@ -21,10 +21,18 @@ LOG = log.getLogger(__name__)
class Responder(object):
"""Responder Class."""
def __init__(self, provider_type):
self.provider = provider_type
def failed(self, msg):
"""failed.
:param msg
:returns provider msg{msg, error details}
"""
# Add this log information for easing debug
LOG.info(
'Error happened during provider operation. message: %(message)s,'
@ -42,6 +50,13 @@ class Responder(object):
}
def created(self, provider_service_id, links, **extras):
"""failed.
:param provider_service_id
:param links
:param **extras
:returns provider msg{id, links}
"""
provider_response = {
'id': provider_service_id,
'links': links
@ -52,6 +67,11 @@ class Responder(object):
}
def updated(self, provider_service_id):
"""updated.
:param provider_service_id
:returns provider msg{provider service id}
"""
# TODO(tonytan4ever): May need to add link information as return
return {
self.provider: {
@ -60,6 +80,11 @@ class Responder(object):
}
def deleted(self, provider_service_id):
"""deleted.
:param provider_service_id
:returns provider msg{provider service id}
"""
return {
self.provider: {
'id': provider_service_id
@ -67,6 +92,12 @@ class Responder(object):
}
def purged(self, provider_service_id, purge_urls):
"""purged.
:param provider_service_id
:param purge_urls
:returns provider msg{provider service id, purge urls}
"""
provider_response = {
'id': provider_service_id,
'purge_urls': purge_urls
@ -76,6 +107,13 @@ class Responder(object):
}
def get(self, domain_list, origin_list, cache_list):
"""get.
:param domain_list
:param origin_list
:param cache_list
:returns provider msg{domain, origins, caching}
"""
return {
self.provider: {
'domains': domain_list,

View File

@ -23,6 +23,7 @@ from poppy.provider.base import responder
@six.add_metaclass(abc.ABCMeta)
class ServicesControllerBase(controller.ProviderControllerBase):
"""Services Controller Base."""
def __init__(self, driver):
super(ServicesControllerBase, self).__init__(driver)
@ -31,23 +32,48 @@ class ServicesControllerBase(controller.ProviderControllerBase):
@abc.abstractmethod
def update(self, provider_service_id, service_json):
"""update.
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def create(self, service_name, service_json):
"""create.
:param service_name
:param service_json
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def delete(self, provider_service_id):
"""delete.
:param provider_service_id
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def purge(self, provider_service_id, purge_urls=None):
"""purge.
:param provider_service_id
:param purge_urls
:raises NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def get(self, service_name):
"""Get details of the service, as stored by the provider."""
"""Get details of the service, as stored by the provider.
:param service_name
:raises NotImplementedError
"""
raise NotImplementedError
def _map_service_name(self, service_name):
@ -55,6 +81,9 @@ class ServicesControllerBase(controller.ProviderControllerBase):
Map a poppy service name to a provider's service name so it
can comply provider's naming convention.
:param service_name
:raises NotImplementedError
"""
return service_name
@ -64,6 +93,9 @@ class ServicesControllerBase(controller.ProviderControllerBase):
This will needed call each provider's customer API,
useful for certain providers ( e.g fastly) and manage
master-sub account
master-sub account.
:param service_name
:raises NotImplementedError
"""
raise NotImplementedError

View File

@ -35,6 +35,7 @@ CLOUDFRONT_GROUP = 'drivers:provider:cloudfront'
class CDNProvider(base.Driver):
"""CloudFront CNDProvider."""
def __init__(self, conf):
super(CDNProvider, self).__init__(conf)
@ -46,6 +47,10 @@ class CDNProvider(base.Driver):
aws_secret_access_key=self.cloudfront_conf.aws_secret_access_key)
def is_alive(self):
"""is_alive.
:return boolean
"""
response = requests.get('http://aws.amazon.com/cloudfront/')
if response.status_code == 200:
return True
@ -53,12 +58,24 @@ class CDNProvider(base.Driver):
@property
def provider_name(self):
"""provider name.
:return 'CloudFront'
"""
return 'CloudFront'
@property
def client(self):
"""client to this provider.
:return client
"""
return self.cloudfront_client
@property
def service_controller(self):
"""Hook for service controller.
:return service controller
"""
return controllers.ServiceController(self)

View File

@ -23,6 +23,7 @@ LOG = log.getLogger(__name__)
class ServiceController(base.ServiceBase):
"""Base Service Controller Class."""
@property
def client(self):

View File

@ -33,6 +33,7 @@ FASTLY_GROUP = 'drivers:provider:fastly'
class CDNProvider(base.Driver):
"""Fastly CNDProvider."""
def __init__(self, conf):
super(CDNProvider, self).__init__(conf)
@ -44,6 +45,10 @@ class CDNProvider(base.Driver):
self.fastly_client = fastly.connect(self.fastly_conf.apikey)
def is_alive(self):
"""is_alive.
:return boolean
"""
response = requests.get('https://api.fastly.com/')
if response.status_code == 200:
return True
@ -51,12 +56,24 @@ class CDNProvider(base.Driver):
@property
def provider_name(self):
"""provider name.
:return 'Fastly'
"""
return "Fastly"
@property
def client(self):
"""client to this provider.
:return client
"""
return self.fastly_client
@property
def service_controller(self):
"""Hook for service controller.
:return service controller
"""
return controllers.ServiceController(self)

View File

@ -20,6 +20,7 @@ from poppy.provider import base
class ServiceController(base.ServiceBase):
"""Fastly Service Controller Class."""
@property
def client(self):

View File

@ -36,6 +36,7 @@ MAXCDN_GROUP = 'drivers:provider:maxcdn'
class CDNProvider(base.Driver):
"""MaxCND Provider."""
def __init__(self, conf):
"""Init constructor."""
@ -50,6 +51,10 @@ class CDNProvider(base.Driver):
self.maxcdn_conf.consumer_secret)
def is_alive(self):
"""is_alive.
:return boolean
"""
response = requests.get('https://rws.maxcdn.com/')
if response.status_code == 200:
return True
@ -57,15 +62,24 @@ class CDNProvider(base.Driver):
@property
def provider_name(self):
"""For name."""
"""provider name.
:return 'MaxCDN'
"""
return "MaxCDN"
@property
def client(self):
"""client to this provider."""
"""client to this provider.
:return client
"""
return self.maxcdn_client
@property
def service_controller(self):
"""Hook for service controller."""
"""Hook for service controller.
:return service controller
"""
return controllers.ServiceController(self)

View File

@ -24,10 +24,7 @@ MAXCDN_NAMING_REGEX = re.compile('^[a-zA-Z0-9-]{3,32}$')
class ServiceController(base.ServiceBase):
'''MaxCDN Service Controller.
'''
"""MaxCDN Service Controller."""
@property
def client(self):

View File

@ -23,17 +23,30 @@ LOG = logging.getLogger(__name__)
class CDNProvider(base.Driver):
"""Mock CDNProvider."""
def __init__(self, conf):
super(CDNProvider, self).__init__(conf)
def is_alive(self):
"""is_alive.
:return True
"""
return True
@property
def provider_name(self):
"""provider name.
:return 'Mock'
"""
return "Mock"
@property
def service_controller(self):
"""Hook for service controller.
:return service controller
"""
return controllers.ServiceController(self)

View File

@ -23,6 +23,7 @@ LOG = log.getLogger(__name__)
class ServiceController(base.ServiceBase):
"""Mock Service Controller."""
def __init__(self, driver):
super(ServiceController, self).__init__(driver)

View File

@ -48,19 +48,31 @@ class StorageDriverBase(object):
@abc.abstractmethod
def is_alive(self):
"""Check whether the storage is ready."""
"""Check whether the storage is ready.
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractproperty
def services_controller(self):
"""Returns the driver's hostname controller."""
"""Returns the driver's hostname controller.
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractproperty
def flavors_controller(self):
"""Returns the driver's hostname controller."""
"""Returns the driver's hostname controller.
:raise NotImplementedError
"""
raise NotImplementedError
def storage_name(self):
"""For name."""
"""For name.
:raise NotImplementedError
"""
raise NotImplementedError

View File

@ -22,22 +22,39 @@ from poppy.storage.base import controller
@six.add_metaclass(abc.ABCMeta)
class FlavorsControllerBase(controller.StorageControllerBase):
"""Flavors Controller Base definition."""
def __init__(self, driver):
super(FlavorsControllerBase, self).__init__(driver)
@abc.abstractmethod
def list(self):
"""list.
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def get(self, flavor_id):
"""get.
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def add(self, flavor):
"""add.
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def delete(self, flavor_id):
"""delete.
:raise NotImplementedError
"""
raise NotImplementedError

View File

@ -22,38 +22,86 @@ from poppy.storage.base import controller
@six.add_metaclass(abc.ABCMeta)
class ServicesControllerBase(controller.StorageControllerBase):
"""Services Controller Base definition."""
def __init__(self, driver):
super(ServicesControllerBase, self).__init__(driver)
@abc.abstractmethod
def list(self, project_id, marker=None, limit=None):
"""list
:param project_id
:param marker
:param limit
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def create(self, project_id, service_name, service_json):
"""create
:param project_id
:param service_name
:param service_json
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def update(self, project_id, service_name, service_json):
"""update
:param project_id
:param service_name
:param service_json
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def delete(self, project_id, service_name):
"""delete
:param project_id
:param service_name
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def get(self):
"""get
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def get_provider_details(self, project_id, service_name):
"""get_provider_details
:param project_id
:param service_name
:raise NotImplementedError
"""
raise NotImplementedError
@abc.abstractmethod
def update_provider_details(self, provider_details):
"""update_provider_details
:param provider_details
:raise NotImplementedError
"""
raise NotImplementedError
@staticmethod
def format_result(result):
"""format_result
:param result
:raise NotImplementedError
"""
raise NotImplementedError

View File

@ -63,6 +63,11 @@ CASSANDRA_GROUP = 'drivers:storage:cassandra'
def _connection(conf, datacenter):
"""connection.
:param datacenter
:returns session
"""
ssl_options = None
if conf.ssl_enabled:
ssl_options = {
@ -104,6 +109,11 @@ def _connection(conf, datacenter):
def _create_keyspace(session, keyspace, replication_strategy):
"""create_keyspace.
:param keyspace
:param replication_strategy
"""
# replication factor will come in as a string with quotes already
session.execute(
"CREATE KEYSPACE " + keyspace + " " +
@ -118,6 +128,7 @@ def _create_keyspace(session, keyspace, replication_strategy):
class CassandraStorageDriver(base.Driver):
"""Cassandra Storage Driver."""
def __init__(self, conf):
super(CassandraStorageDriver, self).__init__(conf)
@ -128,9 +139,17 @@ class CassandraStorageDriver(base.Driver):
self.lock = multiprocessing.Lock()
def change_namespace(self, namespace):
"""change_namespace.
:param namespace
"""
self.cassandra_conf.keyspace = namespace
def delete_namespace(self, namespace):
"""delete_namespace.
:param namespace
"""
self.connection.execute('DROP KEYSPACE ' + namespace)
def is_alive(self):
@ -138,7 +157,10 @@ class CassandraStorageDriver(base.Driver):
@property
def storage_name(self):
"""For name."""
"""storage name.
:returns 'Cassandra'
"""
return 'Cassandra'
@property
@ -148,14 +170,26 @@ class CassandraStorageDriver(base.Driver):
@property
def services_controller(self):
"""services_controller.
:returns service controller
"""
return controllers.ServicesController(self)
@property
def flavors_controller(self):
"""flavors_controller.
:returns flavor controller
"""
return controllers.FlavorsController(self)
@property
def database(self):
"""database.
:returns session
"""
# if the session has been shutdown, reopen a session
self.lock.acquire()
if self.session is None or self.session.is_shutdown:
@ -164,9 +198,15 @@ class CassandraStorageDriver(base.Driver):
return self.session
def connect(self):
"""connect.
:returns connection
"""
self.session = _connection(self.cassandra_conf, self.datacenter)
def close_connection(self):
"""close_connection."""
self.lock.acquire()
self.session.cluster.shutdown()
self.session.shutdown()

View File

@ -44,13 +44,21 @@ CQL_CREATE = '''
class FlavorsController(base.FlavorsController):
"""Flavors Controller."""
@property
def session(self):
"""Get session.
:returns database
"""
return self._driver.database
def list(self):
"""List the supported flavors."""
"""list.
:returns list List the supported flavors
"""
# get all
result = self.session.execute(CQL_GET_ALL)
@ -66,7 +74,11 @@ class FlavorsController(base.FlavorsController):
return flavors
def get(self, flavor_id):
"""Get the specified Flavor."""
"""get.
:param flavor_id
:returns flavor The specified Flavor
"""
args = {
'flavor_id': flavor_id
}
@ -92,7 +104,13 @@ class FlavorsController(base.FlavorsController):
u"Could not find a flavor with the id '{0}'".format(flavor_id))
def add(self, flavor):
"""Add a new flavor."""
"""add.
Add a new flavor
:param flavor
:raises ValueError
"""
# check if the flavor already exist.
# Note: If it does, no LookupError will be raised
@ -115,7 +133,12 @@ class FlavorsController(base.FlavorsController):
self.session.execute(CQL_CREATE, args)
def delete(self, flavor_id):
"""Delete a flavor."""
"""delete.
Delete a flavor.
:param flavor_id
"""
args = {
'flavor_id': flavor_id

View File

@ -123,13 +123,25 @@ CQL_UPDATE_PROVIDER_DETAILS = '''
class ServicesController(base.ServicesController):
"""Services Controller."""
@property
def session(self):
"""Get session.
:returns session
"""
return self._driver.database
def list(self, project_id, marker, limit):
"""list.
:param project_id
:param marker
:param limit
:returns services
"""
# list services
args = {
'project_id': project_id,
@ -143,6 +155,14 @@ class ServicesController(base.ServicesController):
return services
def get(self, project_id, service_name):
"""get.
:param project_id
:param service_name
:returns result The requested service
:raises ValueError
"""
# get the requested service from storage
args = {
'project_id': project_id,
@ -160,6 +180,13 @@ class ServicesController(base.ServicesController):
return self.format_result(result)
def create(self, project_id, service_obj):
"""create.
:param project_id
:param service_obj
:raises ValueError
"""
# create the service in storage
service_name = service_obj.name
@ -204,6 +231,10 @@ class ServicesController(base.ServicesController):
pass
def delete(self, project_id, service_name):
"""delete.
Delete local configuration storage
"""
# delete local configuration from storage
args = {
'project_id': project_id,
@ -212,6 +243,13 @@ class ServicesController(base.ServicesController):
self.session.execute(CQL_DELETE_SERVICE, args)
def get_provider_details(self, project_id, service_name):
"""get_provider_details.
:param project_id
:param service_name
:returns results Provider details
"""
args = {
'project_id': project_id,
'service_name': service_name
@ -243,6 +281,12 @@ class ServicesController(base.ServicesController):
def update_provider_details(self, project_id, service_name,
provider_details):
"""update_provider_details.
:param project_id
:param service_name
:param provider_details
"""
provider_detail_dict = {}
for provider_name in provider_details:
provider_detail_dict[provider_name] = json.dumps({
@ -266,6 +310,11 @@ class ServicesController(base.ServicesController):
@staticmethod
def format_result(result):
"""format_result.
:param result
:returns formatted result
"""
name = result.get('service_name')
origins = [json.loads(o) for o in result.get('origins', [])]
domains = [json.loads(d) for d in result.get('domains', [])]

View File

@ -34,17 +34,32 @@ class TransportDriverBase(object):
@property
def app(self):
"""Get app.
:returns app
"""
return self._app
@property
def conf(self):
"""Get conf.
:returns conf
"""
return self._conf
@property
def manager(self):
"""Get manager
:returns manager
"""
return self._manager
@abc.abstractmethod
def listen():
"""Start listening for client requests (self-hosting mode)."""
def listen(self):
"""Start listening for client requests (self-hosting mode).
:raises NotImplementedError
"""
raise NotImplementedError

View File

@ -29,9 +29,12 @@ from poppy.transport.validators.stoplight import rule
class FlavorsController(base.Controller):
"""Flavors Controller."""
@pecan.expose('json')
def get_all(self):
"""get all flavor list."""
flavors_controller = self.driver.manager.flavors_controller
result = flavors_controller.list()
@ -42,6 +45,11 @@ class FlavorsController(base.Controller):
@pecan.expose('json')
def get_one(self, flavor_id):
"""get_one
:param flavor_model
:returns JSON flavor(HTTP 200) or HTTP 404
"""
flavors_controller = self.driver.manager.flavors_controller
try:
result = flavors_controller.get(flavor_id)
@ -58,6 +66,10 @@ class FlavorsController(base.Controller):
helpers.abort_with_message,
stoplight_helpers.pecan_getter))
def post(self):
"""POST
:returns JSON flavor(HTTP 200) or HTTP 400
"""
flavors_controller = self.driver.manager.flavors_controller
flavor_json = json.loads(pecan.request.body.decode('utf-8'))
try:
@ -80,6 +92,11 @@ class FlavorsController(base.Controller):
@pecan.expose('json')
def delete(self, flavor_id):
"""DELETE
:param flavor_model
:returns HTTP 204
"""
flavors_controller = self.driver.manager.flavors_controller
flavors_controller.delete(flavor_id)
pecan.response.status = 204

View File

@ -20,10 +20,17 @@ from poppy.transport.pecan.models.response import health as health_response
class StorageHealthController(base.Controller):
"""Storage Health Controller."""
@pecan.expose('json')
def get(self, storage_name):
"""Returns the health of storage."""
"""GET.
Returns the health of storage
:param storage_name
:returns JSON storage model or HTTP 404
"""
health_controller = self._driver.manager.health_controller