# 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. from oslo_config import cfg from kite.common import exception CONF = cfg.CONF # NOTE(jamielennox): This class is a direct copy from nova, glance, heat and # a bunch of other projects. It has been submitted to OSLO # https://review.openstack.org/#/c/67002/ and should be synced when available. class LazyPluggable(object): """A pluggable backend loaded lazily based on some value.""" def __init__(self, pivot, config_group=None, **backends): self.__backends = backends self.__pivot = pivot self.__backend = None self.__config_group = config_group def __get_backend(self): if not self.__backend: if self.__config_group is None: backend_name = CONF[self.__pivot] else: backend_name = CONF[self.__config_group][self.__pivot] if backend_name not in self.__backends: allowed = ', '.join(self.__backends.iterkeys()) raise exception.BackendException(backend=backend_name, allowed=allowed) backend = self.__backends[backend_name] if isinstance(backend, tuple): name = backend[0] fromlist = backend[1] else: name = backend fromlist = backend self.__backend = __import__(name=name, globals=None, locals=None, fromlist=fromlist) return self.__backend def __getattr__(self, key): backend = self.__get_backend() return getattr(backend, key) class SingletonManager(object): _instance = None @classmethod def get_instance(cls): if not cls._instance: cls._instance = cls() return cls._instance @classmethod def reset(cls): cls._instance = None def split_host(string): if not string: return (None, None) try: host, generation = string.rsplit(':', 1) generation = int(generation) except ValueError: host = string generation = None return (host, generation) def join_host(host, generation): return "%s:%d" % (host, generation)