Includes these commits: 3948aee Highlighting the deprecated nature of 'log-format'. b21fc56 Fix bad default for show_deleted d28fa69 python3: Add python3 compatibility. 0bf03b7 Add network_utils.urlsplit e456727 Remove useless logging in networks_utils 7119e29 Enable hacking H404 test. b41862d Use param keyword for docstrings 2f01388 Use Python 3.x compatible except construct e3545f8 Enable hacking H402 test 484a1df Enable hacking H403 test 35660da Enable hacking H401 test 874249e Add support for requirements.txt. b135234 Remove the notifier and its dependencies from log.py 926b3e9 Fixes import order nits Changes which may look not look so harmless: - the common get_admin_context() method is not used by Nova - network_utils.urlsplit() is added but not used yet - suppport for requirements.txt is added to patch_tox_venv but actually it doesn't use those files Change-Id: I03e67f4648dcaf57620f11e63cfd8e7dbe3665cb
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
						|
 | 
						|
# Copyright 2010 United States Government as represented by the
 | 
						|
# Administrator of the National Aeronautics and Space Administration.
 | 
						|
# All Rights Reserved.
 | 
						|
#
 | 
						|
#    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.
 | 
						|
 | 
						|
"""Super simple fake memcache client."""
 | 
						|
 | 
						|
from oslo.config import cfg
 | 
						|
 | 
						|
from nova.openstack.common import timeutils
 | 
						|
 | 
						|
memcache_opts = [
 | 
						|
    cfg.ListOpt('memcached_servers',
 | 
						|
                default=None,
 | 
						|
                help='Memcached servers or None for in process cache.'),
 | 
						|
]
 | 
						|
 | 
						|
CONF = cfg.CONF
 | 
						|
CONF.register_opts(memcache_opts)
 | 
						|
 | 
						|
 | 
						|
def get_client(memcached_servers=None):
 | 
						|
    client_cls = Client
 | 
						|
 | 
						|
    if not memcached_servers:
 | 
						|
        memcached_servers = CONF.memcached_servers
 | 
						|
    if memcached_servers:
 | 
						|
        try:
 | 
						|
            import memcache
 | 
						|
            client_cls = memcache.Client
 | 
						|
        except ImportError:
 | 
						|
            pass
 | 
						|
 | 
						|
    return client_cls(memcached_servers, debug=0)
 | 
						|
 | 
						|
 | 
						|
class Client(object):
 | 
						|
    """Replicates a tiny subset of memcached client interface."""
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        """Ignores the passed in args."""
 | 
						|
        self.cache = {}
 | 
						|
 | 
						|
    def get(self, key):
 | 
						|
        """Retrieves the value for a key or None.
 | 
						|
 | 
						|
        This expunges expired keys during each get.
 | 
						|
        """
 | 
						|
 | 
						|
        now = timeutils.utcnow_ts()
 | 
						|
        for k in self.cache.keys():
 | 
						|
            (timeout, _value) = self.cache[k]
 | 
						|
            if timeout and now >= timeout:
 | 
						|
                del self.cache[k]
 | 
						|
 | 
						|
        return self.cache.get(key, (0, None))[1]
 | 
						|
 | 
						|
    def set(self, key, value, time=0, min_compress_len=0):
 | 
						|
        """Sets the value for a key."""
 | 
						|
        timeout = 0
 | 
						|
        if time != 0:
 | 
						|
            timeout = timeutils.utcnow_ts() + time
 | 
						|
        self.cache[key] = (timeout, value)
 | 
						|
        return True
 | 
						|
 | 
						|
    def add(self, key, value, time=0, min_compress_len=0):
 | 
						|
        """Sets the value for a key if it doesn't exist."""
 | 
						|
        if self.get(key) is not None:
 | 
						|
            return False
 | 
						|
        return self.set(key, value, time, min_compress_len)
 | 
						|
 | 
						|
    def incr(self, key, delta=1):
 | 
						|
        """Increments the value for a key."""
 | 
						|
        value = self.get(key)
 | 
						|
        if value is None:
 | 
						|
            return None
 | 
						|
        new_value = int(value) + delta
 | 
						|
        self.cache[key] = (self.cache[key][0], str(new_value))
 | 
						|
        return new_value
 | 
						|
 | 
						|
    def delete(self, key, time=0):
 | 
						|
        """Deletes the value associated with a key."""
 | 
						|
        if key in self.cache:
 | 
						|
            del self.cache[key]
 |