Example #1
0
def _get_rpc_workers():
    plugin = directory.get_plugin()
    service_plugins = directory.get_plugins().values()

    if cfg.CONF.rpc_workers < 1:
        cfg.CONF.set_override('rpc_workers', 1)

    # If 0 < rpc_workers then start_rpc_listeners would be called in a
    # subprocess and we cannot simply catch the NotImplementedError.  It is
    # simpler to check this up front by testing whether the plugin supports
    # multiple RPC workers.
    if not plugin.rpc_workers_supported():
        LOG.debug("Active plugin doesn't implement start_rpc_listeners")
        if 0 < cfg.CONF.rpc_workers:
            LOG.error("'rpc_workers = %d' ignored because "
                      "start_rpc_listeners is not implemented.",
                      cfg.CONF.rpc_workers)
        raise NotImplementedError()

    # passing service plugins only, because core plugin is among them
    rpc_workers = [RpcWorker(service_plugins,
                             worker_process_count=cfg.CONF.rpc_workers)]

    if (cfg.CONF.rpc_state_report_workers > 0 and
            plugin.rpc_state_report_workers_supported()):
        rpc_workers.append(
            RpcReportsWorker(
                [plugin],
                worker_process_count=cfg.CONF.rpc_state_report_workers
            )
        )
    return rpc_workers
Example #2
0
    def get_detailed_tenant_quotas(context, resources, tenant_id):
        """Given a list of resources and a sepecific tenant, retrieve
        the detailed quotas (limit, used, reserved).
        :param context: The request context, for access checks.
        :param resources: A dictionary of the registered resource keys.
        :return dict: mapping resource name in dict to its corresponding limit
            used and reserved. Reserved currently returns default value of 0
        """
        res_reserve_info = quota_api.get_reservations_for_resources(
            context, tenant_id, resources.keys())
        tenant_quota_ext = {}
        for key, resource in resources.items():
            if isinstance(resource, res.TrackedResource):
                used = resource.count_used(context, tenant_id,
                                           resync_usage=False)
            else:
                # NOTE(ihrachys) .count won't use the plugin we pass, but we
                # pass it regardless to keep the quota driver API intact
                plugins = directory.get_plugins()
                plugin = plugins.get(key, plugins[constants.CORE])
                used = resource.count(context, plugin, tenant_id)

            tenant_quota_ext[key] = {
                'limit': resource.default,
                'used': used,
                'reserved': res_reserve_info.get(key, 0),
            }
        # update with specific tenant limits
        quota_objs = quota_obj.Quota.get_objects(context, project_id=tenant_id)
        for item in quota_objs:
            tenant_quota_ext[item['resource']]['limit'] = item['limit']
        return tenant_quota_ext
Example #3
0
def _count_resource(context, collection_name, tenant_id):
    count_getter_name = "get_%s_count" % collection_name
    getter_name = "get_%s" % collection_name

    plugins = directory.get_plugins()
    for pname in sorted(plugins,
                        # inspect core plugin first
                        key=lambda n: n != constants.CORE):
        # Some plugins support a count method for particular resources, using a
        # DB's optimized counting features. We try to use that one if present.
        # Otherwise just use regular getter to retrieve all objects and count
        # in python, allowing older plugins to still be supported
        try:
            obj_count_getter = getattr(plugins[pname], count_getter_name)
            return obj_count_getter(
                context, filters={'tenant_id': [tenant_id]})
        except (NotImplementedError, AttributeError):
            try:
                obj_getter = getattr(plugins[pname], getter_name)
                obj_list = obj_getter(
                    context, filters={'tenant_id': [tenant_id]})
                return len(obj_list) if obj_list else 0
            except (NotImplementedError, AttributeError):
                pass
    raise NotImplementedError(
        _('No plugins that support counting %s found.') % collection_name)
Example #4
0
    def get_service_plugin_list(self, context, **kwargs):
        """Returns list of activated services.

        This will also update HA network port status to down for all HA routers
        hosted on <host>. This is needed to avoid l3 agent spawning keepalived
        when l2 agent not yet wired the port. This can happen after a system
        reboot that has wiped out flows, etc and the L2 agent hasn't started up
        yet. The port will still be ACTIVE in the data model and the L3 agent
        will use that info to mistakenly think that L2 network is ready.
        By forcing into DOWN, we will require the L2 agent to essentially ack
        that the port is indeed ACTIVE by reacting to the port update and
        calling update_device_up.
        """
        host = kwargs.get('host')
        # "_update_ha_network_port_status()" will result more RPC calls between
        # L2 agents and server(as l2 agent will try to wire the ports). These
        # resulting RPC calls shouldn't block(or delay processing of)
        # get_plugins() and thus current RPC execution. So get_plugins() is
        # called before _update_ha_network_port_status()
        plugins = directory.get_plugins().keys()
        if host and utils.is_extension_supported(
                self.plugin, constants.PORT_BINDING_EXT_ALIAS):
            LOG.info(
                _LI("Host %s requested to set all its HA network "
                    "ports status to DOWN."), host)
            self._update_ha_network_port_status(context, host)
        return plugins
Example #5
0
def _get_rpc_workers():
    plugin = directory.get_plugin()
    service_plugins = directory.get_plugins().values()

    if cfg.CONF.rpc_workers < 1:
        cfg.CONF.set_override('rpc_workers', 1)

    # If 0 < rpc_workers then start_rpc_listeners would be called in a
    # subprocess and we cannot simply catch the NotImplementedError.  It is
    # simpler to check this up front by testing whether the plugin supports
    # multiple RPC workers.
    if not plugin.rpc_workers_supported():
        LOG.debug("Active plugin doesn't implement start_rpc_listeners")
        if 0 < cfg.CONF.rpc_workers:
            LOG.error(
                _LE("'rpc_workers = %d' ignored because "
                    "start_rpc_listeners is not implemented."),
                cfg.CONF.rpc_workers)
        raise NotImplementedError()

    # passing service plugins only, because core plugin is among them
    rpc_workers = [
        RpcWorker(service_plugins, worker_process_count=cfg.CONF.rpc_workers)
    ]

    if (cfg.CONF.rpc_state_report_workers > 0
            and plugin.rpc_state_report_workers_supported()):
        rpc_workers.append(
            RpcReportsWorker(
                [plugin],
                worker_process_count=cfg.CONF.rpc_state_report_workers))
    return rpc_workers
Example #6
0
def _get_rpc_workers(plugin=None):
    if plugin is None:
        plugin = directory.get_plugin()
    service_plugins = directory.get_plugins().values()

    workers = cfg.CONF.rpc_workers
    if workers is None:
        # By default, half as many rpc workers as api workers
        workers = int(_get_api_workers() / 2)
    if workers < 1:
        workers = 1

    # If workers > 0 then start_rpc_listeners would be called in a
    # subprocess and we cannot simply catch the NotImplementedError.  It is
    # simpler to check this up front by testing whether the plugin supports
    # multiple RPC workers.
    if not plugin.rpc_workers_supported():
        LOG.debug("Active plugin doesn't implement start_rpc_listeners")
        if workers > 0:
            LOG.error(
                "'rpc_workers = %d' ignored because "
                "start_rpc_listeners is not implemented.", workers)
        raise NotImplementedError()

    # passing service plugins only, because core plugin is among them
    rpc_workers = [RpcWorker(service_plugins, worker_process_count=workers)]

    if (cfg.CONF.rpc_state_report_workers > 0
            and plugin.rpc_state_report_workers_supported()):
        rpc_workers.append(
            RpcReportsWorker(
                [plugin],
                worker_process_count=cfg.CONF.rpc_state_report_workers))
    return rpc_workers
Example #7
0
 def plugin_loaded(self):
     LOG.info('%s(): caller(): %s', log_utils.get_fname(1),
              log_utils.get_fname(2))
     if not hasattr(self, '_plugin_loaded'):
         self._plugin_loaded = (plugin_constants.QOS
                                in directory.get_plugins())
     return self._plugin_loaded
Example #8
0
    def get_detailed_tenant_quotas(context, resources, tenant_id):
        """Given a list of resources and a sepecific tenant, retrieve
        the detailed quotas (limit, used, reserved).
        :param context: The request context, for access checks.
        :param resources: A dictionary of the registered resource keys.
        :return dict: mapping resource name in dict to its corresponding limit
            used and reserved. Reserved currently returns default value of 0
        """
        res_reserve_info = quota_api.get_reservations_for_resources(
            context, tenant_id, resources.keys())
        tenant_quota_ext = {}
        for key, resource in resources.items():
            if isinstance(resource, res.TrackedResource):
                used = resource.count_used(context,
                                           tenant_id,
                                           resync_usage=False)
            else:
                # NOTE(ihrachys) .count won't use the plugin we pass, but we
                # pass it regardless to keep the quota driver API intact
                plugins = directory.get_plugins()
                plugin = plugins.get(key, plugins[constants.CORE])
                used = resource.count(context, plugin, tenant_id)

            tenant_quota_ext[key] = {
                'limit': resource.default,
                'used': used,
                'reserved': res_reserve_info.get(key, 0),
            }
        # update with specific tenant limits
        quota_objs = quota_obj.Quota.get_objects(context, project_id=tenant_id)
        for item in quota_objs:
            tenant_quota_ext[item['resource']]['limit'] = item['limit']
        return tenant_quota_ext
Example #9
0
def _count_resource(context, collection_name, tenant_id):
    count_getter_name = "get_%s_count" % collection_name
    getter_name = "get_%s" % collection_name

    plugins = directory.get_plugins()
    for pname in sorted(plugins,
                        # inspect core plugin first
                        key=lambda n: n != constants.CORE):
        # Some plugins support a count method for particular resources, using a
        # DB's optimized counting features. We try to use that one if present.
        # Otherwise just use regular getter to retrieve all objects and count
        # in python, allowing older plugins to still be supported
        try:
            obj_count_getter = getattr(plugins[pname], count_getter_name)
            return obj_count_getter(
                context, filters={'tenant_id': [tenant_id]})
        except (NotImplementedError, AttributeError):
            try:
                obj_getter = getattr(plugins[pname], getter_name)
                obj_list = obj_getter(
                    context, filters={'tenant_id': [tenant_id]})
                return len(obj_list) if obj_list else 0
            except (NotImplementedError, AttributeError):
                pass
    raise NotImplementedError(
        'No plugins that support counting %s found.' % collection_name)
Example #10
0
 def test_load_default_service_plugins(self):
     self.patched_default_svc_plugins.return_value = {
         'neutron.tests.unit.dummy_plugin.DummyServicePlugin': 'DUMMY'
     }
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     manager.init()
     svc_plugins = directory.get_plugins()
     self.assertIn('DUMMY', svc_plugins)
Example #11
0
 def get_instance(cls):
     LOG.info('%s(): caller(): %s', log_utils.get_fname(1),
              log_utils.get_fname(2))
     if cls._instance is None:
         service_plugins = directory.get_plugins()
         cls._instance = cls(get_extensions_path(service_plugins),
                             service_plugins)
     return cls._instance
Example #12
0
 def test_load_default_service_plugins(self):
     self.patched_default_svc_plugins.return_value = {
         'neutron.tests.unit.dummy_plugin.DummyServicePlugin': 'DUMMY'
     }
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     manager.init()
     svc_plugins = directory.get_plugins()
     self.assertIn('DUMMY', svc_plugins)
Example #13
0
 def test_multiple_plugins_by_name_specified_for_service_type(self):
     cfg.CONF.set_override("service_plugins",
                           [dummy_plugin.Dummy.get_alias(),
                            dummy_plugin.Dummy.get_alias()])
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     manager.NeutronManager.get_instance()
     plugins = directory.get_plugins()
     # CORE, DUMMY
     self.assertEqual(2, len(plugins))
 def test_core_plugin_supports_services(self):
     cfg.CONF.set_override("core_plugin",
                           "neutron.tests.unit.test_manager."
                           "MultiServiceCorePlugin")
     manager.init()
     svc_plugins = directory.get_plugins()
     self.assertEqual(3, len(svc_plugins))
     self.assertIn(lib_const.CORE, svc_plugins.keys())
     self.assertIn(dummy_plugin.DUMMY_SERVICE_TYPE, svc_plugins.keys())
 def test_multiple_plugins_by_name_specified_for_service_type(self):
     cfg.CONF.set_override("service_plugins",
                           [dummy_plugin.Dummy.get_alias(),
                            dummy_plugin.Dummy.get_alias()])
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     manager.NeutronManager.get_instance()
     plugins = directory.get_plugins()
     # CORE, DUMMY
     self.assertEqual(2, len(plugins))
Example #16
0
 def test_core_plugin_supports_services(self):
     cfg.CONF.set_override("core_plugin",
                           "neutron.tests.unit.test_manager."
                           "MultiServiceCorePlugin")
     manager.init()
     svc_plugins = directory.get_plugins()
     self.assertEqual(3, len(svc_plugins))
     self.assertIn(constants.CORE, svc_plugins.keys())
     self.assertIn(constants.LOADBALANCER, svc_plugins.keys())
     self.assertIn(constants.DUMMY, svc_plugins.keys())
Example #17
0
 def test_multiple_plugins_specified_for_service_type(self):
     cfg.CONF.set_override("service_plugins",
                           ["neutron.tests.unit.dummy_plugin."
                            "DummyServicePlugin",
                            "neutron.tests.unit.dummy_plugin."
                            "DummyServicePlugin"])
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     manager.NeutronManager.get_instance()
     plugins = directory.get_plugins()
     # CORE, DUMMY
     self.assertEqual(2, len(plugins))
Example #18
0
    def is_az_filter_supported(self):
        supported = self._is_az_filter_supported
        if supported is None:
            supported = False
            for plugin in directory.get_plugins().values():
                if extensions.is_extension_supported(plugin, azfil_ext.ALIAS):
                    supported = True
                    break
        self._is_az_filter_supported = supported

        return self._is_az_filter_supported
Example #19
0
 def test_service_plugin_conflicts_with_core_plugin(self):
     cfg.CONF.set_override("service_plugins",
                           ["neutron.tests.unit.dummy_plugin."
                            "DummyServicePlugin"])
     cfg.CONF.set_override("core_plugin",
                           "neutron.tests.unit.test_manager."
                           "MultiServiceCorePlugin")
     manager.NeutronManager.get_instance()
     plugins = directory.get_plugins()
     # CORE, LOADBALANCER, DUMMY
     self.assertEqual(3, len(plugins))
Example #20
0
    def is_az_filter_supported(self):
        supported = self._is_az_filter_supported
        if supported is None:
            supported = False
            for plugin in directory.get_plugins().values():
                if extensions.is_extension_supported(plugin, azfil_ext.ALIAS):
                    supported = True
                    break
        self._is_az_filter_supported = supported

        return self._is_az_filter_supported
 def test_service_plugin_conflicts_with_core_plugin(self):
     cfg.CONF.set_override("service_plugins",
                           ["neutron.tests.unit.dummy_plugin."
                            "DummyServicePlugin"])
     cfg.CONF.set_override("core_plugin",
                           "neutron.tests.unit.test_manager."
                           "MultiServiceCorePlugin")
     manager.NeutronManager.get_instance()
     plugins = directory.get_plugins()
     # CORE, FIREWALL, DUMMY
     self.assertEqual(3, len(plugins))
Example #22
0
 def test_multiple_plugins_specified_for_service_type(self):
     cfg.CONF.set_override("service_plugins", [
         "neutron.tests.unit.dummy_plugin."
         "DummyServicePlugin", "neutron.tests.unit.dummy_plugin."
         "DummyServicePlugin"
     ])
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     manager.NeutronManager.get_instance()
     plugins = directory.get_plugins()
     # CORE, DUMMY
     self.assertEqual(2, len(plugins))
Example #23
0
 def test_load_plugins_with_requirements_child_first(self):
     cfg.CONF.set_override("service_plugins", [
         "neutron.tests.unit.dummy_plugin."
         "DummyWithRequireServicePlugin", "neutron.tests.unit.dummy_plugin."
         "DummyServicePlugin"
     ])
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     with mock.patch(
             "neutron.tests.unit.dummy_plugin.DummyServicePlugin.__init__",
             return_value=None) as dummy_init_mock, mock.patch(
                 "neutron.tests.unit.dummy_plugin."
                 "DummyWithRequireServicePlugin.__init__",
                 return_value=None) as dummy_with_require_init_mock:
         manager.NeutronManager.get_instance()
         plugins = directory.get_plugins()
     # CORE, DUMMY, DUMMY_REQIURE
     self.assertEqual(3, len(plugins))
     # ensure that DUMMY and DUMMY_REQIURE was instantiate only once:
     self.assertEqual(1, dummy_init_mock.call_count)
     self.assertEqual(1, dummy_with_require_init_mock.call_count)
Example #24
0
 def test_load_plugins_with_requirements(self):
     cfg.CONF.set_override("service_plugins",
                           ["neutron.tests.unit.dummy_plugin."
                            "DummyWithRequireServicePlugin"])
     cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
     with mock.patch(
         "neutron.tests.unit.dummy_plugin.DummyServicePlugin.__init__",
         return_value=None
     ) as dummy_init_mock, mock.patch(
         "neutron.tests.unit.dummy_plugin."
         "DummyWithRequireServicePlugin.__init__",
         return_value=None
     ) as dummy_with_require_init_mock:
         manager.NeutronManager.get_instance()
         plugins = directory.get_plugins()
     # DUMMY will also be initialized since DUMMY_REQIURE needs it.
     # CORE, DUMMY, DUMMY_REQIURE
     self.assertEqual(3, len(plugins))
     # ensure that DUMMY and DUMMY_REQIURE was instantiate only once:
     self.assertEqual(1, dummy_init_mock.call_count)
     self.assertEqual(1, dummy_with_require_init_mock.call_count)
Example #25
0
def _get_rpc_workers(plugin=None):
    if plugin is None:
        plugin = directory.get_plugin()
    service_plugins = directory.get_plugins().values()

    workers = cfg.CONF.rpc_workers
    if workers is None:
        # By default, half as many rpc workers as api workers
        workers = int(_get_worker_count() / 2)
    if workers < 1:
        workers = 1

    # If workers > 0 then start_rpc_listeners would be called in a
    # subprocess and we cannot simply catch the NotImplementedError.  It is
    # simpler to check this up front by testing whether the plugin supports
    # multiple RPC workers.
    if not plugin.rpc_workers_supported():
        LOG.debug("Active plugin doesn't implement start_rpc_listeners")
        if workers > 0:
            LOG.error("'rpc_workers = %d' ignored because "
                      "start_rpc_listeners is not implemented.",
                      workers)
        raise NotImplementedError()

    # passing service plugins only, because core plugin is among them
    rpc_workers = [RpcWorker(service_plugins,
                             worker_process_count=workers)]

    if (cfg.CONF.rpc_state_report_workers > 0 and
            plugin.rpc_state_report_workers_supported()):
        rpc_workers.append(
            RpcReportsWorker(
                [plugin],
                worker_process_count=cfg.CONF.rpc_state_report_workers
            )
        )
    return rpc_workers
Example #26
0
 def get_instance(cls):
     if cls._instance is None:
         service_plugins = directory.get_plugins()
         cls._instance = cls(get_extensions_path(service_plugins),
                             service_plugins)
     return cls._instance
Example #27
0
 def plugin_loaded(self):
     if not hasattr(self, '_plugin_loaded'):
         self._plugin_loaded = (
             plugin_constants.QOS in directory.get_plugins())
     return self._plugin_loaded
Example #28
0
def init():
    """Call to load the plugins (core+services) machinery."""
    # TODO(armax): use is_loaded() when available
    if not directory.get_plugins():
        NeutronManager.get_instance()
Example #29
0
 def get_service_plugin_list(self, context, **kwargs):
     return directory.get_plugins().keys()
Example #30
0
 def get_instance(cls):
     if cls._instance is None:
         service_plugins = directory.get_plugins()
         cls._instance = cls(get_extensions_path(service_plugins),
                             service_plugins)
     return cls._instance
Example #31
0
 def test_get_plugins(self):
     directory.add_plugin('CORE', fake_plugin)
     self.assertIsNotNone(directory.get_plugins())
Example #32
0
 def test_get_plugins_none(self):
     self.assertFalse(directory.get_plugins())
Example #33
0
 def test_add_plugin(self):
     directory.add_plugin('foo', fake_plugin)
     self.assertIn('foo', directory.get_plugins())
Example #34
0
 def is_loaded(cls):
     return cls.get_plugin_type() in directory.get_plugins()
Example #35
0
 def get_service_plugin_list(self, context, **kwargs):
     return directory.get_plugins().keys()
Example #36
0
def init():
    """Call to load the plugins (core+services) machinery."""
    # TODO(armax): use is_loaded() when available
    if not directory.get_plugins():
        NeutronManager.get_instance()