def dispatch(self, test=False):  # pylint: disable=too-many-branches
        """
        Send configuration to satellites

        :return: None
        """
        if not self.new_to_dispatch:
            raise DispatcherError("Dispatcher cannot dispatch, "
                                  "because no configuration is prepared!")

        if self.first_dispatch_done:
            raise DispatcherError("Dispatcher cannot dispatch, "
                                  "because the configuration is still dispatched!")

        if self.dispatch_ok:
            logger.info("Dispatching is already done and ok...")
            return

        logger.info("Trying to send configuration to the satellites...")

        self.dispatch_ok = True

        # todo: the 3 loops hereunder may be factorized
        for link in self.arbiters:
            # If not me and a spare arbiter...
            if link == self.arbiter_link:
                # I exclude myself from the dispatching, I have my configuration ;)
                continue

            if not link.active:
                # I exclude the daemons that are not active
                continue

            if not link.spare:
                # Do not dispatch to a master arbiter!
                continue

            if link.configuration_sent:
                logger.debug("Arbiter %s already sent!", link.name)
                continue

            if not link.reachable:
                logger.debug("Arbiter %s is not reachable to receive its configuration",
                             link.name)
                continue

            logger.info("Sending configuration to the arbiter %s", link.name)
            logger.debug("- %s", link.cfg)

            link.put_conf(link.cfg, test=test)
            link.configuration_sent = True

            logger.info("- sent")

            # Now that the spare arbiter has a configuration, tell him it must not run,
            # because I'm not dead ;)
            link.do_not_run()

        for link in self.schedulers:
            if link.configuration_sent:
                logger.debug("Scheduler %s already sent!", link.name)
                continue

            if not link.active:
                # I exclude the daemons that are not active
                continue

            if not link.reachable:
                logger.debug("Scheduler %s is not reachable to receive its configuration",
                             link.name)
                continue

            logger.info("Sending configuration to the scheduler %s", link.name)
            logger.debug("- %s", link.cfg)

            link.put_conf(link.cfg, test=test)
            link.configuration_sent = True

            logger.info("- sent")

        for link in self.satellites:
            if link.configuration_sent:
                logger.debug("%s %s already sent!", link.type, link.name)
                continue

            if not link.active:
                # I exclude the daemons that are not active
                continue

            if not link.reachable:
                logger.warning("%s %s is not reachable to receive its configuration",
                               link.type, link.name)
                continue

            logger.info("Sending configuration to the %s %s", link.type, link.name)
            logger.debug("- %s", link.cfg)

            link.put_conf(link.cfg, test=test)
            link.configuration_sent = True

            logger.info("- sent")

        if self.dispatch_ok:
            # Newly prepared configuration got dispatched correctly
            self.new_to_dispatch = False
            self.first_dispatch_done = True
Send configuration to satellites

        :return: None