示例#1
0
class BroadcastWebsocketManager(object):
    def __init__(self):
        self.event_loop = asyncio.get_event_loop()
        '''
        {
            'hostname1': BroadcastWebsocketTask(),
            'hostname2': BroadcastWebsocketTask(),
            'hostname3': BroadcastWebsocketTask(),
        }
        '''
        self.broadcast_tasks = dict()
        self.local_hostname = get_local_host()
        self.stats_mgr = BroadcastWebsocketStatsManager(self.event_loop, self.local_hostname)

    async def run_per_host_websocket(self):

        while True:
            known_hosts = await get_broadcast_hosts()
            future_remote_hosts = known_hosts.keys()
            current_remote_hosts = self.broadcast_tasks.keys()
            deleted_remote_hosts = set(current_remote_hosts) - set(future_remote_hosts)
            new_remote_hosts = set(future_remote_hosts) - set(current_remote_hosts)

            remote_addresses = {k: v.remote_host for k, v in self.broadcast_tasks.items()}
            for hostname, address in known_hosts.items():
                if hostname in self.broadcast_tasks and address != remote_addresses[hostname]:
                    deleted_remote_hosts.add(hostname)
                    new_remote_hosts.add(hostname)

            if deleted_remote_hosts:
                logger.warning(f"Removing {deleted_remote_hosts} from websocket broadcast list")
            if new_remote_hosts:
                logger.warning(f"Adding {new_remote_hosts} to websocket broadcast list")

            for h in deleted_remote_hosts:
                self.broadcast_tasks[h].cancel()
                del self.broadcast_tasks[h]
                self.stats_mgr.delete_remote_host_stats(h)

            for h in new_remote_hosts:
                stats = self.stats_mgr.new_remote_host_stats(h)
                broadcast_task = BroadcastWebsocketTask(name=self.local_hostname, event_loop=self.event_loop, stats=stats, remote_host=known_hosts[h])
                broadcast_task.start()
                self.broadcast_tasks[h] = broadcast_task

            await asyncio.sleep(settings.BROADCAST_WEBSOCKET_NEW_INSTANCE_POLL_RATE_SECONDS)

    def start(self):
        self.stats_mgr.start()

        self.async_task = self.event_loop.create_task(self.run_per_host_websocket())
        return self.async_task
示例#2
0
class BroadcastWebsocketManager(object):
    def __init__(self):
        self.event_loop = asyncio.get_event_loop()
        self.broadcast_tasks = dict()
        # parallel dict to broadcast_tasks that tracks stats
        self.local_hostname = get_local_host()
        self.stats_mgr = BroadcastWebsocketStatsManager(
            self.event_loop, self.local_hostname)

    async def run_per_host_websocket(self):

        while True:
            future_remote_hosts = get_broadcast_hosts()
            current_remote_hosts = self.broadcast_tasks.keys()
            deleted_remote_hosts = set(current_remote_hosts) - set(
                future_remote_hosts)
            new_remote_hosts = set(future_remote_hosts) - set(
                current_remote_hosts)

            if deleted_remote_hosts:
                logger.warn(
                    f"{self.local_hostname} going to remove {deleted_remote_hosts} from the websocket broadcast list"
                )
            if new_remote_hosts:
                logger.warn(
                    f"{self.local_hostname} going to add {new_remote_hosts} to the websocket broadcast list"
                )

            for h in deleted_remote_hosts:
                self.broadcast_tasks[h].cancel()
                del self.broadcast_tasks[h]
                self.stats_mgr.delete_remote_host_stats(h)

            for h in new_remote_hosts:
                stats = self.stats_mgr.new_remote_host_stats(h)
                broadcast_task = BroadcastWebsocketTask(
                    name=self.local_hostname,
                    event_loop=self.event_loop,
                    stats=stats,
                    remote_host=h)
                broadcast_task.start()
                self.broadcast_tasks[h] = broadcast_task

            await asyncio.sleep(
                settings.BROADCAST_WEBSOCKET_NEW_INSTANCE_POLL_RATE_SECONDS)

    def start(self):
        self.stats_mgr.start()

        self.async_task = self.event_loop.create_task(
            self.run_per_host_websocket())
        return self.async_task