def _call_on_drivers(self,
                         method_name,
                         context,
                         continue_on_failure=False):
        """Helper method for calling a method across all policy drivers.

        :param method_name: name of the method to call
        :param context: context parameter to pass to each method call
        :param continue_on_failure: whether or not to continue to call
        all policy drivers once one has raised an exception
        :raises: neutron.services.group_policy.common.GroupPolicyDriverError
        if any policy driver call fails.
        """
        error = False
        drivers = (self.ordered_policy_drivers
                   if not method_name.startswith('delete') else
                   self.reverse_ordered_policy_drivers)
        for driver in drivers:
            try:
                getattr(driver.obj, method_name)(context)
            except gp_exc.GroupPolicyException:
                # This is an exception for the user.
                raise
            except Exception:
                # This is an internal failure.
                LOG.exception(
                    _("Policy driver '%(name)s' failed in %(method)s"), {
                        'name': driver.name,
                        'method': method_name
                    })
                error = True
                if not continue_on_failure:
                    break
        if error:
            raise gp_exc.GroupPolicyDriverError(method=method_name)
 def ensure_tenant(self, plugin_context, tenant_id):
     for driver in self.ordered_policy_drivers:
         if isinstance(driver.obj, group_policy_driver_api.PolicyDriver):
             try:
                 driver.obj.ensure_tenant(plugin_context, tenant_id)
             except Exception:
                 LOG.exception(_LE("Policy driver '%s' failed in "
                                   "ensure_tenant"), driver.name)
                 raise gp_exc.GroupPolicyDriverError(method="ensure_tenant")
    def _call_on_drivers(self,
                         method_name,
                         context,
                         continue_on_failure=False):
        """Helper method for calling a method across all policy drivers.

        :param method_name: name of the method to call
        :param context: context parameter to pass to each method call
        :param continue_on_failure: whether or not to continue to call
        all policy drivers once one has raised an exception
        :raises: neutron.services.group_policy.common.GroupPolicyDriverError
        if any policy driver call fails.
        """
        error = False
        drivers = (self.ordered_policy_drivers
                   if not method_name.startswith('delete') else
                   self.reverse_ordered_policy_drivers)
        for driver in drivers:
            try:
                getattr(driver.obj, method_name)(context)
            except Exception as e:
                if db_api.is_retriable(e):
                    with excutils.save_and_reraise_exception():
                        LOG.debug(
                            "Policy driver '%(name)s' failed in"
                            " %(method)s, operation will be retried", {
                                'name': driver.name,
                                'method': method_name
                            })
                elif isinstance(e, gp_exc.GroupPolicyException) or isinstance(
                        e, n_exc.NeutronException) or isinstance(
                            e, oslo_policy.PolicyNotAuthorized):
                    with excutils.save_and_reraise_exception():
                        LOG.exception(
                            _LE("Policy driver '%(name)s' failed in"
                                " %(method)s"), {
                                    'name': driver.name,
                                    'method': method_name
                                })
                else:
                    error = True
                    # We are eating a non-GBP/non-Neutron exception here
                    LOG.exception(
                        _LE("Policy driver '%(name)s' failed in %(method)s"), {
                            'name': driver.name,
                            'method': method_name
                        })
                    if not continue_on_failure:
                        break
        if error:
            raise gp_exc.GroupPolicyDriverError(method=method_name)
 def ensure_tenant(self, plugin_context, tenant_id):
     for driver in self.ordered_policy_drivers:
         if isinstance(driver.obj, group_policy_driver_api.PolicyDriver):
             try:
                 driver.obj.ensure_tenant(plugin_context, tenant_id)
             except Exception as e:
                 if db_api.is_retriable(e):
                     with excutils.save_and_reraise_exception():
                         LOG.debug(
                             "Policy driver '%(driver)s' failed in "
                             "ensure_tenant, operation will "
                             "be retried", {'driver': driver.name})
                 else:
                     LOG.exception(
                         "Policy driver '%s' failed in "
                         "ensure_tenant", driver.name)
                     raise gp_exc.GroupPolicyDriverError(
                         method="ensure_tenant")
 def _call_on_ext_drivers(self, method_name, session, data, result):
     """Helper method for calling a method across all extension drivers."""
     for driver in self.ordered_ext_drivers:
         try:
             getattr(driver.obj, method_name)(session, data, result)
         except (gp_exc.GroupPolicyException, n_exc.NeutronException):
             with excutils.save_and_reraise_exception():
                 LOG.exception(
                     _LE("Extension driver '%(name)s' "
                         "failed in %(method)s"),
                     {'name': driver.name, 'method': method_name}
                 )
         except Exception:
             LOG.exception(_LE("Extension driver '%(name)s' "
                               "failed in %(method)s"),
                           {'name': driver.name, 'method': method_name})
             # We are replacing a non-GBP/non-Neutron exception here
             raise gp_exc.GroupPolicyDriverError(method=method_name)