zaqar/marconi/proxy/utils/lookup.py
cpallares 5624bf1a14 Renamed "exceptions" module to "errors"
Changes exceptions.py into error.py

Renaming exception-related code to errors
because most of the conditions handled by
marconi are errorneous rather than exceptional.

Closes-Bug:#1232074

Change-Id: Ie3509236b07a372a44d97f97e5f3fe183b409606
2013-10-30 13:21:01 -05:00

166 lines
4.9 KiB
Python

# Copyright (c) 2013 Rackspace Hosting, 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.
"""lookup: functions to handle caching/lookup of proxy details."""
import msgpack
from marconi.openstack.common import log
from marconi.proxy.storage import errors
LOG = log.getLogger(__name__)
def _entry_key(project, queue):
assert project is not None, 'Project must not be None'
assert queue is not None, 'Queue must not be None'
return 'q:' + project + '/' + queue
def _partition_key(name):
return 'p:' + name
def try_cache_entry(project, queue, catalogue_controller, cache):
"""Attempts to cache a given project/queue's partition name.
:param project: the project namespace
:type project: text
:param queue: the name of the queue
:type queue: text
:param catalogue_controller: primary storage for the queue catalogue
:type catalogue_controller: marconi.proxy.storage.base:Catalogue*
:param cache: cache for catalogue - updated if lookup fails
:type cache: marconi.common.cache.backends:BaseCache
:returns: partition name or None if not found
:rtype: text | None
"""
LOG.debug('CACHE entry - project/queue: {0}/{1}'.format(
project, queue
))
key = _entry_key(project, queue)
name = None
try:
name = catalogue_controller.get(project, queue)['partition']
except errors.EntryNotFound:
return None
cache.set(key, name)
return name
def exists(project, queue, catalogue_controller, cache):
"""Checks whether a given project/queue exists.
:param project: the project namespace
:type project: text
:param queue: the name of the queue
:type queue: text
:param catalogue_controller: primary storage for the queue catalogue
:type catalogue_controller: marconi.proxy.storage.base:Catalogue*
:param cache: cache for catalogue - updated if lookup fails
:type cache: marconi.common.cache.backends:BaseCache
:returns: True or False
:rtype: bool
"""
key = _entry_key(project, queue)
if not cache.has_key(key): # flake8: noqa
return try_cache_entry(project, queue,
catalogue_controller, cache) is not None
return True
def invalidate_entry(project, queue, cache):
"""Removes an entry from the cache."""
LOG.debug('INVALIDATE entry - project/queue: {0}/{1}'.format(
project, queue
))
key = _entry_key(project, queue)
cache.unset(key)
def partition(project, queue, catalogue_controller, cache):
"""Returns the name of the partition associated with this project.queue
:param project: text - the project namespace
:type project: text
:param queue: text - the name of the queue
:type queue: text
:param catalogue_controller: primary storage for the queue catalogue
:type catalogue_controller: marconi.proxy.storage.base:Catalogue*
:param cache: cache for catalogue - updated if lookup fails
:type cache: marconi.common.cache.backends:BaseCache
:returns: partition name or None if not found
:rtype: text | None
"""
LOG.debug('LOOKUP partition - project/queue: {0}/{1}'.format(
project, queue
))
key = _entry_key(project, queue)
name = cache.get(key)
if not name:
LOG.debug('Entry not in cache: ' + key)
return try_cache_entry(project, queue,
catalogue_controller, cache)
return name
def invalidate_partition(name, cache):
"""Removes a partition from the cache."""
LOG.debug('INVALIDATE partition - partition: ' + name)
key = _partition_key(name)
cache.unset(key)
def hosts(name, partitions_controller, cache):
"""Returns the list of hosts associated with this partition.
:param name: text - the name of the partition to look up
:param partitions_controller: handler for primary storage
:param cache: cache to check first - updated if partition not found
:returns: Maybe [text] - list of hosts or None if not found
"""
LOG.debug('LOOKUP hosts - partition: ' + name)
key = _partition_key(name)
data = cache.get(key)
hosts = None
if data:
hosts = msgpack.loads(data)
if not hosts:
LOG.debug('Partition not in cache: ' + name)
try:
hosts = partitions_controller.get(name)['hosts']
except errors.PartitionNotFound:
LOG.debug('Partition not in primary storage: ' + name)
return None
cache.set(key, msgpack.dumps(hosts))
return hosts