import logging import socket import re import sys from petrel_client.client_base import ClientBase from petrel_client.common.exception import InvalidMcUriError LOG = logging.getLogger(__name__) _MC_URI_PATTERN = re.compile(r'^mc://(.+)') import_map = {'memcached': 'petrel_client.cache.mc.mc.MC'} class Cache(ClientBase): @staticmethod def parse_uri(uri): m = _MC_URI_PATTERN.match(uri) if m: return m.group(1) else: raise InvalidMcUriError(uri) @staticmethod def get_engine_cls(engine_type): import_name = import_map.get(engine_type) module_name, callable_name = import_name.rsplit('.', 1) __import__(module_name) module = sys.modules[module_name] return getattr(module, callable_name) @staticmethod def create(conf, *args, **kwargs): fake = conf.get_boolean('fake') if fake: from petrel_client.fake_client import FakeClient name = f'MC: {socket.gethostname()}' return FakeClient(client_type='mc', conf=conf, name=name, **kwargs) engine_type = conf.get('cache_engine', 'memcached') try: engine_cls = Cache.get_engine_cls(engine_type) instance = engine_cls(conf, *args, **kwargs) if not hasattr(instance, 'log'): setattr(instance, 'log', LOG) return instance except Exception as err: LOG.warn('can not init cache client') LOG.exception(err) return None def __init__(self, *args, **kwargs): super(Cache, self).__init__(*args, **kwargs)