'Helper method for calling a method across all mechanism 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 mechanism drivers once one has raised an exception
:param raise_db_retriable: whether or not to treat retriable db
exception by mechanism drivers to propagate up to upper layer so
that upper layer can handle it or error in ML2 player
:raises: neutron.plugins.ml2.common.MechanismDriverError
if any mechanism driver call fails. or DB retriable error when
raise_db_retriable=False. See neutron.db.api.is_retriable for
what db exception is retriable'

def _call_on_drivers(self, method_name, context, continue_on_failure=False, raise_db_retriable=False):

    errors = []
    for driver in self.ordered_mech_drivers:
        try:
            getattr(driver.obj, method_name)(context)
        except Exception as e:
            if (raise_db_retriable and db_api.is_retriable(e)):
                with excutils.save_and_reraise_exception():
                    LOG.debug("DB    exception    raised    by    Mechanism    driver    '%(name)s'    in    %(method)s", {'name': driver.name, 'method': method_name}, exc_info=e)
            LOG.exception(_LE("Mechanism    driver    '%(name)s'    failed    in    %(method)s"), {'name': driver.name, 'method': method_name})
            errors.append(e)
            if (not continue_on_failure):
                break
    if errors:
        raise ml2_exc.MechanismDriverError(method=method_name, errors=errors)
