async def test_server_set_rank(server_conf, client_conf):
    components_queue = aio.Queue()
    server = await hat.monitor.server.server.create(server_conf)
    server.register_change_cb(
        lambda: components_queue.put_nowait(server.components))
    client = await hat.monitor.client.connect(client_conf)
    c = (await components_queue.get())[0]
    assert c.rank == 1
    server.set_rank(c.cid, c.mid, 2)
    assert (await components_queue.get())[0].rank == 2
    server.set_rank(c.cid, c.mid, -11)
    assert (await components_queue.get())[0].rank == -11
    await client.async_close()
    assert client.closed.done()
    await server.async_close()
    assert server.closed.done()
Esempio n. 2
0
    async def _active_loop(self, server):
        def on_server_change():
            self._set_components(0, server.local_components)

        def on_master_change():
            server.update(0, self._components)

        try:
            mlog.debug('master activated')

            with server.register_change_cb(on_server_change):
                with self.register_change_cb(on_master_change):
                    on_master_change()
                    on_server_change()
                    await server.wait_closing()

        except Exception as e:
            mlog.warning('active loop error: %s', e, exc_info=e)

        finally:
            self._active_subgroup.close()
            self._components = []
            self._mid_components = {}
            self._change_cbs.notify()
            on_master_change()
            mlog.debug('master deactivated')
async def test_client_set_ready(server_conf, client_conf):
    components_queue = aio.Queue()
    server = await hat.monitor.server.server.create(server_conf)
    server.register_change_cb(
        lambda: components_queue.put_nowait(server.components))
    client = await hat.monitor.client.connect(client_conf)
    assert (await components_queue.get())[0].ready is None
    client.set_ready(5)
    assert (await components_queue.get())[0].ready == 5
    client.set_ready(7)
    assert (await components_queue.get())[0].ready == 7
    client.set_ready(None)
    assert (await components_queue.get())[0].ready is None
    client.set_ready(-3)
    assert (await components_queue.get())[0].ready == -3
    await client.async_close()
    assert client.closed.done()
    await server.async_close()
    assert server.closed.done()
async def test_client_connect_disconnect(server_conf, client_conf):
    components_queue = aio.Queue()
    server = await hat.monitor.server.server.create(server_conf)
    server.register_change_cb(
        lambda: components_queue.put_nowait(server.components))
    client = await hat.monitor.client.connect(client_conf)
    components = await components_queue.get()
    assert len(components) == 1
    c = components[0]
    assert (c.mid == server.mid and c.name == client_conf['name']
            and c.group == client_conf['group']
            and c.address == client_conf['component_address']
            and c.rank == server_conf['default_rank'] and c.blessing is None
            and c.ready is None)
    await client.async_close()
    assert client.closed.done()
    assert await components_queue.get() == []
    await server.async_close()
    assert server.closed.done()
async def test_server_set_master_mid_component(server_conf):
    c1 = ComponentInfo(cid=1,
                       mid=10,
                       name='c1',
                       group='g1',
                       address=None,
                       rank=1,
                       blessing=None,
                       ready=None)
    c2 = ComponentInfo(cid=2,
                       mid=11,
                       name='c2',
                       group='g2',
                       address='1.2.3.4',
                       rank=2,
                       blessing=3,
                       ready=3)
    server_change_queue = aio.Queue()
    server = await hat.monitor.server.server.create(server_conf)
    server.register_change_cb(lambda: server_change_queue.put_nowait((None)))
    assert server.mid == 0 and server.components == []
    master = common.create_master(mid=5, components=[c1, c2])
    server.set_master(master)
    await server_change_queue.get()
    assert server.mid == 5 and server.components == [c1, c2]
    master._set_mid(3)
    await server_change_queue.get()
    assert server.mid == 3 and server.components == [c1, c2]
    master._set_components([c2])
    await server_change_queue.get()
    assert server.mid == 3 and server.components == [c2]
    server.set_master(None)
    await server_change_queue.get()
    assert server.mid == 0 and server.components == []
    await server.async_close()
    assert server.closed.done()
Esempio n. 6
0
async def test_local_components(server_address, conn_count):
    conf = {'address': server_address, 'default_rank': 123}

    changes = aio.Queue()

    def on_change():
        changes.put_nowait(server.local_components)

    server = await hat.monitor.server.server.create(conf)
    server.register_change_cb(on_change)

    assert server.local_components == []
    assert changes.empty()

    conns = []
    for _ in range(conn_count):
        conn = await connect(server_address)
        conns.append(conn)

        local_components = await changes.get()
        assert len(local_components) == len(conns)
        for info in local_components:
            assert info.address is None
            assert info.rank == conf['default_rank']
            assert info.blessing is None
            assert info.ready is None

        msg = await conn.receive()
        info = local_components[-1]
        assert msg.cid == info.cid
        assert msg.mid == info.mid
        assert msg.mid == server.mid
        assert msg.components == server.global_components

    for i, conn in enumerate(conns):
        msg = common.MsgClient(name=f'name{i}',
                               group=f'group{i}',
                               address=f'address{i}',
                               ready=i)
        conn.send(msg)

        local_components = await changes.get()
        assert len(local_components) == len(conns)
        info = local_components[i]

        assert info.name == msg.name
        assert info.group == msg.group
        assert info.address == msg.address
        assert info.ready == msg.ready

        conn.send(msg)
        with pytest.raises(asyncio.TimeoutError):
            await asyncio.wait_for(changes.get(), 0.001)

    while conns:
        conn, conns = conns[0], conns[1:]
        await conn.async_close()

        local_components = await changes.get()
        assert len(local_components) == len(conns)

    await server.async_close()
Esempio n. 7
0
async def test_set_rank(server_address):
    conf = {'address': server_address, 'default_rank': 123}

    msg = common.MsgClient(name='name',
                           group='group',
                           address=None,
                           ready=None)

    changes = aio.Queue()

    def on_change():
        changes.put_nowait(server.local_components)

    server = await hat.monitor.server.server.create(conf)
    server.register_change_cb(on_change)

    server.set_rank(123, 321)
    with pytest.raises(asyncio.TimeoutError):
        await asyncio.wait_for(changes.get(), 0.001)

    conn = await connect(server_address)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.name is None
    assert info.rank == conf['default_rank']

    server.set_rank(info.cid, 321)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.rank == 321

    await conn.async_close()

    components = await changes.get()
    assert components == []

    conn = await connect(server_address)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.name is None
    assert info.rank == conf['default_rank']

    conn.send(msg)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.name == msg.name
    assert info.rank == conf['default_rank']

    server.set_rank(info.cid, 321)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.rank == 321

    await conn.async_close()

    components = await changes.get()
    assert components == []

    conn = await connect(server_address)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.name is None
    assert info.rank == conf['default_rank']

    conn.send(msg)

    components = await changes.get()
    assert len(components) == 1
    info = components[0]
    assert info.name == msg.name
    assert info.rank == 321

    await conn.async_close()

    components = await changes.get()
    assert components == []

    await server.async_close()