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:
parent
53016bda58
commit
181a0216ec
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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__(
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -23,6 +23,7 @@ LOG = log.getLogger(__name__)
|
|||
|
||||
|
||||
class ServiceController(base.ServiceBase):
|
||||
"""Base Service Controller Class."""
|
||||
|
||||
@property
|
||||
def client(self):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -20,6 +20,7 @@ from poppy.provider import base
|
|||
|
||||
|
||||
class ServiceController(base.ServiceBase):
|
||||
"""Fastly Service Controller Class."""
|
||||
|
||||
@property
|
||||
def client(self):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -23,6 +23,7 @@ LOG = log.getLogger(__name__)
|
|||
|
||||
|
||||
class ServiceController(base.ServiceBase):
|
||||
"""Mock Service Controller."""
|
||||
|
||||
def __init__(self, driver):
|
||||
super(ServiceController, self).__init__(driver)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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', [])]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue