Ejemplo n.º 1
0
    def run(self):
        container = create_container(self.config)
        install_plugins(container, self.config.get('plugins', {}))
        install_interfaces(container, self.config.get('interfaces', {}))

        for cls_name in self.args.get('--interface', ()):
            cls = import_object(cls_name)
            container.install(cls)

        if self.args.get('--debug'):
            from gevent.backdoor import BackdoorServer
            backdoor = BackdoorServer(('127.0.0.1', 5005), locals={'container': container})
            gevent.spawn(backdoor.serve_forever)

        def handle_signal():
            logger.info('caught SIGINT/SIGTERM, pid=%s', os.getpid())
            container.stop()
            container.join()
            sys.exit(0)
        gevent.signal(signal.SIGINT, handle_signal)
        gevent.signal(signal.SIGTERM, handle_signal)

        setproctitle('lymph-instance (identity: %s, endpoint: %s, config: %s)' % (
            container.identity,
            container.endpoint,
            self.config.source,
        ))

        container.start(register=not self.args.get('--isolated', False))

        if self.args.get('--reload'):
            set_source_change_callback(container.stop)

        container.join()
Ejemplo n.º 2
0
    def _create_instance(self,
                         key,
                         instance_config,
                         default_class=None,
                         **kwargs):
        if instance_config is None:
            raise ConfigurationError("no config available for %r" % key)

        clspath = instance_config.get('class', default_class)

        if clspath is None:
            raise ConfigurationError(
                "no config available for %r (or no class configured)" % key)

        if callable(clspath):
            cls = clspath
        else:
            cls = import_object(clspath)

        if hasattr(cls, 'from_config'):
            return cls.from_config(instance_config, **kwargs)
        else:
            instance_config = copy.deepcopy(to_dict(instance_config))
            instance_config.pop('class', None)
            instance_config.update(kwargs)
            return cls(**instance_config)
Ejemplo n.º 3
0
def install_interfaces(container, interfaces):
    for name, instance_config in six.iteritems(interfaces):
        try:
            cls_name = instance_config['class']
        except KeyError:
            print("no instance class for '%s'" % name)
            sys.exit(1)
        cls = import_object(cls_name)
        instance = container.install(cls)
        instance.apply_config(instance_config)
Ejemplo n.º 4
0
def install_interfaces(container, interfaces):
    for name, instance_config in six.iteritems(interfaces):
        try:
            cls_name = instance_config['class']
        except KeyError:
            print("no instance class for '%s'" % name)
            sys.exit(1)
        cls = import_object(cls_name)
        instance = container.install_interface(cls, name=name)
        instance.apply_config(instance_config)
Ejemplo n.º 5
0
def _get_interfaces(config):
    interfaces = {}
    for name, attrs in config.get('interfaces', {}).items():
        cls = import_object(attrs['class'])
        schema = generate(cls, name)
        schema = schema.todict()
        for k in schema:
            if k in interfaces:
                interfaces[k].update(schema[k])
            else:
                interfaces[k] = schema[k]
    return interfaces
Ejemplo n.º 6
0
    def _setup_container(self, debug):
        self.container = create_container(self.config)
        self.container.debug = debug
        # Set global exception hook to send unhandled exception to the container's error_hook.
        sys.excepthook = self.container.excepthook

        install_plugins(self.container, self.config.get('plugins', {}))
        install_interfaces(self.container, self.config.get('interfaces', {}))

        for cls_name in self.args.get('--interface', ()):
            cls = import_object(cls_name)
            self.container.install_interface(cls)
Ejemplo n.º 7
0
    def _setup_container(self, debug):
        self.container = create_container(self.config)
        self.container.debug = debug
        # Set global exception hook to send unhandled exception to the container's error_hook.
        sys.excepthook = self.container.excepthook

        install_plugins(self.container, self.config.get('plugins', {}))
        install_interfaces(self.container, self.config.get('interfaces', {}))

        for cls_name in self.args.get('--interface', ()):
            cls = import_object(cls_name)
            self.container.install_interface(cls)
Ejemplo n.º 8
0
def install_interfaces(container, interfaces):
    for name, instance_config in six.iteritems(interfaces):
        try:
            cls_name = instance_config['class']
        except KeyError:
            print("no instance class for '%s'" % name)
            sys.exit(1)
        cls = import_object(cls_name)
        try:
            interface = container.install_interface(cls, name=name)
        except InterfaceSkipped as e:
            logger.info("skipping interface %s: %s", name, e)
            continue

        interface.apply_config(instance_config)
Ejemplo n.º 9
0
def install_interfaces(container, interfaces):
    for name_and_version, instance_config in six.iteritems(interfaces):
        name, version = parse_versioned_name(name_and_version)
        try:
            cls_name = instance_config['class']
        except KeyError:
            print("no instance class for '%s'" % name_and_version)
            sys.exit(1)
        cls = import_object(cls_name)
        try:
            interface = container.install_interface(cls, name=name, version=version)
        except InterfaceSkipped as e:
            logger.info("skipping interface %s: %s", name, e)
            continue

        interface.apply_config(instance_config)
Ejemplo n.º 10
0
    def _create_instance(self, key, instance_config, default_class=None, **kwargs):
        if instance_config is None:
            raise ConfigurationError("no config available for %r" % key)

        clspath = instance_config.get('class', default_class)
        if clspath is None:
            raise ConfigurationError("no config available for %r (or no class configured)" % key)

        cls = import_object(clspath)
        if hasattr(cls, 'from_config'):
            return cls.from_config(instance_config, **kwargs)
        else:
            instance_config = copy.deepcopy(dict(instance_config))
            del instance_config['class']
            instance_config.update(kwargs)
            return cls(**instance_config)
Ejemplo n.º 11
0
    def __init__(self, uri, base=Base, migrations=None, **kwargs):
        if 'models' in kwargs:
            warnings.warn("models argument was removed", DeprecationWarning)

        timezone = kwargs.pop('timezone', 'utc')
        connect_args = kwargs.pop('connect_args', {})
        options = connect_args.get('options', '')
        options = '%s -c timezone=%s' % (options, timezone)
        connect_args.update({'options': options})

        if isinstance(base, basestring):
            base = import_object(base)

        self.Base = base
        self.migrations = migrations or {}
        self._connection = kwargs.pop('connection', None)
        self.engine = sqlalchemy.create_engine(uri,
                                               connect_args=connect_args,
                                               **kwargs)
        self.init_session()
Ejemplo n.º 12
0
    def __init__(self, uri, base=Base, migrations=None, **kwargs):
        if 'models' in kwargs:
            warnings.warn("models argument was removed", DeprecationWarning)

        timezone = kwargs.pop('timezone', 'utc')
        connect_args = kwargs.pop('connect_args', {})
        options = connect_args.get('options', '')
        options = '%s -c timezone=%s' % (options, timezone)
        connect_args.update({
            'options': options
        })

        if isinstance(base, basestring):
            base = import_object(base)

        self.Base = base
        self.migrations = migrations or {}
        self._connection = kwargs.pop('connection', None)
        self.engine = sqlalchemy.create_engine(uri, connect_args=connect_args, **kwargs)
        self.init_session()
Ejemplo n.º 13
0
    def _create_instance(self, key, instance_config, default_class=None, **kwargs):
        if instance_config is None:
            raise ConfigurationError("no config available for %r" % key)

        clspath = instance_config.get("class", default_class)

        if clspath is None:
            raise ConfigurationError("no config available for %r (or no class configured)" % key)

        if callable(clspath):
            cls = clspath
        else:
            cls = import_object(clspath)

        if hasattr(cls, "from_config"):
            return cls.from_config(instance_config, **kwargs)
        else:
            instance_config = copy.deepcopy(to_dict(instance_config))
            instance_config.pop("class", None)
            instance_config.update(kwargs)
            return cls(**instance_config)
Ejemplo n.º 14
0
def install_plugins(container, plugins):
    for name, plugin_config in six.iteritems(plugins):
        cls = import_object(plugin_config['class'])
        container.install_plugin(cls, **plugin_config)
Ejemplo n.º 15
0
 def test_import_object(self):
     from lymph.core.container import ServiceContainer
     cls = import_object('lymph.core.container:ServiceContainer')
     self.assertIs(cls, ServiceContainer)
Ejemplo n.º 16
0
 def create_instance(self, key, default_class=None, **kwargs):
     config = self.get(key, {})
     path = config.get('class', default_class)
     cls = import_object(path)
     return cls.from_config(config, **kwargs)
Ejemplo n.º 17
0
def install_plugins(container, plugins):
    for name, plugin_config in six.iteritems(plugins):
        cls = import_object(plugin_config['class'])
        container.install_plugin(cls, **plugin_config)
Ejemplo n.º 18
0
 def test_import_object(self):
     from lymph.core.container import ServiceContainer
     cls = import_object('lymph.core.container:ServiceContainer')
     self.assertIs(cls, ServiceContainer)