async def test_single_component(monitor_factory, component_factory,
                                ui_client_factory):
    server_info = monitor_factory()

    component_name = 'name'
    component_group = 'group'
    component = await component_factory(component_name, component_group,
                                        server_info)
    ui_client = await ui_client_factory(server_info)

    info, components = await component.next_state()
    assert info is None
    assert components == []

    info, components = await component.next_state()
    assert info.name == component_name
    assert info.group == component_group
    assert info.rank == 1
    assert info.blessing is not None
    assert info.ready is None
    assert components == [info]

    ui_state = await ui_client.get_state()
    ui_info = common.find_ui_info(ui_state, info)
    assert ui_info
    assert ui_info['name'] == info.name
    assert ui_info['group'] == info.group

    component.client.set_ready(info.blessing)
    info, components = await component.next_state()
    assert info.blessing is not None
    assert info.ready is not None
    assert info.ready == info.blessing
    assert components == [info]

    ui_state = await ui_client.get_state()
    ui_info = common.find_ui_info(ui_state, info)
    assert ui_info
    assert ui_info['blessing'] == info.blessing
    assert ui_info['ready'] == ui_info['blessing']

    component.client.set_ready(None)
    info, components = await component.next_state()
    assert info.ready is None
    assert info.blessing != info.ready
    assert components == [info]

    ui_state = await ui_client.get_state()
    ui_info = common.find_ui_info(ui_state, info)
    assert ui_info
    assert ui_info['blessing'] == info.blessing
    assert ui_info['ready'] is None

    await ui_client.set_rank(info, 5)
    info, components = await component.next_state()
    assert info.rank == 5

    ui_state = await ui_client.get_state()
    ui_info = common.find_ui_info(ui_state, info)
    assert ui_info['rank'] == 5
Exemple #2
0
async def test_bless_all_group_setting(cluster_factory):
    cluster = await cluster_factory(
        {'group': {
            'algorithm': 'BLESS_ALL',
            'components': ['c1', 'c2']
        }},
        default_algorithm='BLESS_ONE')

    component1 = cluster.components['group']['c1']
    component2 = cluster.components['group']['c2']
    ui_client = cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()

    assert components1 == components2
    assert info1.blessing is not None
    assert info2.blessing is not None
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)
    assert ui_info1 and ui_info2
    assert ui_info1['blessing']
    assert ui_info2['blessing']

    component1.client.set_ready(info1.blessing)
    component2.client.set_ready(info2.blessing)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()

    assert info1.ready == info1.blessing
    assert info2.ready == info2.blessing

    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)
    assert ui_info1 and ui_info2
    assert ui_info1['ready'] == ui_info1['blessing']
    assert ui_info2['ready'] == ui_info2['blessing']

    await ui_client.set_rank(info1, 6)
    await ui_client.set_rank(info2, 2)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()
    assert info1.blessing is not None and info2.blessing is not None
    assert info1.rank == 6
    assert info2.rank == 2
Exemple #3
0
async def test_bless_all_behavior(cluster_factory, cluster_confs):
    clusters = []
    target_components = []
    ui_clients = []
    for conf in cluster_confs:
        cluster = await cluster_factory(
            group_conf=conf['groups'],
            default_algorithm=conf['default_algorithm'],
            parent_infos=[cluster.server_info for cluster in clusters],
            default_rank=1)
        target_components.extend(cluster.components['target_group'].values())
        clusters.append(cluster)
        ui_clients.append(cluster.ui_client)

    await asyncio.sleep(0.5)
    ui_states = [await ui_client.get_state() for ui_client in ui_clients]
    assert all([
        state['global_components'] == ui_states[0]['global_components']
        for state in ui_states
    ])

    master_ui_state = ui_states[0]
    for component in target_components:
        info, components = await component.newest_state()
        ui_info = common.find_ui_info(master_ui_state, info)
        assert info.blessing is not None
        assert ui_info['blessing'] is not None
        assert info.blessing == ui_info['blessing']
        component.client.set_ready(info.blessing)

    await asyncio.sleep(0.5)
    ui_states = [await ui_client.get_state() for ui_client in ui_clients]
    assert all([
        state['global_components'] == ui_states[0]['global_components']
        for state in ui_states
    ])

    master_ui_state = ui_states[0]
    for component in target_components:
        info, components = await component.newest_state()
        ui_info = common.find_ui_info(master_ui_state, info)
        assert info.blessing is not None
        assert info.ready is not None
        assert info.blessing == info.ready
        assert ui_info['blessing'] is not None
        assert ui_info['ready'] is not None
        assert ui_info['blessing'] == ui_info['ready']
        assert ui_info['blessing'] == info.ready
Exemple #4
0
async def test_bless_one_behavior(cluster_factory, cluster_confs):
    clusters = []
    target_components = []
    ui_clients = []
    for conf in cluster_confs:
        cluster = await cluster_factory(
            group_conf=conf['groups'],
            default_algorithm=conf['default_algorithm'],
            parent_infos=[cluster.server_info for cluster in clusters],
            default_rank=1)
        target_components.extend(cluster.components['target_group'].values())
        clusters.append(cluster)
        ui_clients.append(cluster.ui_client)

    await asyncio.sleep(0.5)
    ui_states = [await ui_client.get_state() for ui_client in ui_clients]
    assert all([
        state['global_components'] == ui_states[0]['global_components']
        for state in ui_states
    ])

    ui_state = ui_states[0]
    blessings_count = 0
    for component in target_components:
        info, components = await component.newest_state()
        ui_info = common.find_ui_info(ui_state, info)
        if info.blessing is not None:
            assert ui_info['blessing'] == info.blessing
            blessings_count += 1
        else:
            assert ui_info['blessing'] is None
        component.client.set_ready(info.blessing)

    assert blessings_count == 1

    await asyncio.sleep(0.5)
    ui_states = [await ui_client.get_state() for ui_client in ui_clients]
    assert all([
        state['global_components'] == ui_states[0]['global_components']
        for state in ui_states
    ])

    ui_state = ui_states[0]
    blessed_index = None
    for (i, component) in enumerate(target_components):
        info, components = await component.newest_state()
        ui_info = common.find_ui_info(ui_state, info)
        if info.blessing is not None:
            assert info.blessing == info.ready
            assert ui_info['ready'] == info.ready
            assert ui_info['blessing'] == ui_info['ready']

            await ui_clients[0].set_rank(info, 5)
            blessed_index = i
        else:
            assert info.ready is None
            assert ui_info['ready'] is None
            assert ui_info['blessing'] is None

    await asyncio.sleep(0.5)
    ui_states = [await ui_client.get_state() for ui_client in ui_clients]
    assert all([
        state['global_components'] == ui_states[0]['global_components']
        for state in ui_states
    ])

    ui_state = ui_states[0]
    for (i, component) in enumerate(target_components):
        info, components = await component.newest_state()
        ui_info = common.find_ui_info(ui_state, info)
        assert info.blessing is None
        assert ui_info['blessing'] is None
        component.client.set_ready(info.blessing)

    await asyncio.sleep(0.5)
    ui_states = [await ui_client.get_state() for ui_client in ui_clients]
    assert all([
        state['global_components'] == ui_states[0]['global_components']
        for state in ui_states
    ])

    ui_state = ui_states[0]
    blessings_count = 0
    for (i, component) in enumerate(target_components):
        info, components = await component.newest_state()
        ui_info = common.find_ui_info(ui_state, info)
        if info.blessing is not None:
            assert i != blessed_index
            assert ui_info['blessing'] == info.blessing
            blessings_count += 1
        component.client.set_ready(info.blessing)

    assert blessings_count == 1
Exemple #5
0
async def test_bless_all(cluster_factory):
    cluster = await cluster_factory({
        'g1': {
            'components': ['c1', 'c2']
        },
        'g2': {
            'components': ['c3']
        }
    })

    component1 = cluster.components['g1']['c1']
    component2 = cluster.components['g1']['c2']
    component3 = cluster.components['g2']['c3']
    ui_client = cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    info3, components3 = await component3.newest_state()
    ui_state = await ui_client.get_state()

    assert components1 == components2 and components2 == components3
    assert info1.blessing is not None
    assert info2.blessing is not None
    assert info3.blessing is not None
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)
    ui_info3 = common.find_ui_info(ui_state, info3)
    assert ui_info1 and ui_info2 and ui_info3
    assert ui_info1['blessing'] is not None
    assert ui_info2['blessing'] is not None
    assert ui_info3['blessing'] is not None

    component1.client.set_ready(info1.blessing)
    component2.client.set_ready(info2.blessing)
    component3.client.set_ready(info3.blessing)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    info3, components3 = await component3.newest_state()
    ui_state = await ui_client.get_state()

    assert info1.blessing is not None
    assert info2.blessing is not None
    assert info3.blessing is not None
    assert info1.ready == info1.blessing
    assert info2.ready == info2.blessing
    assert info3.ready == info3.blessing

    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)
    ui_info3 = common.find_ui_info(ui_state, info3)
    assert ui_info1 and ui_info2 and ui_info3
    assert ui_info1['ready'] == ui_info1['blessing']
    assert ui_info2['ready'] == ui_info2['blessing']
    assert ui_info3['ready'] == ui_info3['blessing']

    await ui_client.set_rank(info1, 6)
    await ui_client.set_rank(info2, 2)
    await ui_client.set_rank(info3, 4)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    info3, components3 = await component3.newest_state()
    ui_state = await ui_client.get_state()
    assert info1.blessing is not None
    assert info2.blessing is not None
    assert info3.blessing is not None
    assert info1.rank == 6
    assert info2.rank == 2
    assert info3.rank == 4
Exemple #6
0
async def test_peers_bless_one_group(cluster_factory):
    group_name = 'group'
    c1_name = 'c1'
    c2_name = 'c2'
    master_cluster = await cluster_factory(
        {group_name: {
            'components': [c1_name],
            'algorithm': 'BLESS_ONE'
        }})
    slave_cluster = await cluster_factory(
        {group_name: {
            'components': [c2_name]
        }},
        parent_infos=[master_cluster.server_info])
    component1 = master_cluster.components[group_name][c1_name]
    component2 = slave_cluster.components[group_name][c2_name]
    master_ui_client = master_cluster.ui_client
    slave_ui_client = slave_cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert (master_ui_state['global_components'] ==
            slave_ui_state['global_components'])
    ui_info1 = common.find_ui_info(master_ui_state, info1)
    ui_info2 = common.find_ui_info(master_ui_state, info2)

    assert info1.blessing is not None
    assert info2.blessing is None
    assert ui_info1['blessing'] == info1.blessing
    assert ui_info2['blessing'] is None

    component1.client.set_ready(info1.blessing)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert (master_ui_state['global_components'] ==
            slave_ui_state['global_components'])
    ui_info1 = common.find_ui_info(master_ui_state, info1)

    assert info1.ready == info1.blessing
    assert ui_info1['ready'] == info1.ready
    assert ui_info1['blessing'] == ui_info1['ready']

    await master_ui_client.set_rank(info1, 10)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert (master_ui_state['global_components'] ==
            slave_ui_state['global_components'])
    ui_info1 = common.find_ui_info(master_ui_state, info1)
    ui_info2 = common.find_ui_info(master_ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is None
    assert ui_info1['blessing'] is None
    assert ui_info2['blessing'] is None

    component1.client.set_ready(None)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert (master_ui_state['global_components'] ==
            slave_ui_state['global_components'])
    ui_info1 = common.find_ui_info(master_ui_state, info1)
    ui_info2 = common.find_ui_info(master_ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is not None
    assert ui_info1['blessing'] is None
    assert ui_info2['blessing'] == info2.blessing

    component2.client.set_ready(info2.blessing)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert (master_ui_state['global_components'] ==
            slave_ui_state['global_components'])
    ui_info1 = common.find_ui_info(master_ui_state, info1)
    ui_info2 = common.find_ui_info(master_ui_state, info2)

    assert info1.blessing is None
    assert ui_info2['ready'] == info2.ready
Exemple #7
0
async def test_peers_bless_all(cluster_factory):
    group_name = 'group'
    c1_name = 'c1'
    c2_name = 'c2'
    master_cluster = await cluster_factory(
        {group_name: {
            'components': [c1_name]
        }})
    slave_cluster = await cluster_factory(
        {group_name: {
            'components': [c2_name]
        }},
        parent_infos=[master_cluster.server_info])
    component1 = master_cluster.components[group_name][c1_name]
    component2 = slave_cluster.components[group_name][c2_name]
    master_ui_client = master_cluster.ui_client
    slave_ui_client = slave_cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state_master = await master_ui_client.get_state()
    ui_state_slave = await slave_ui_client.get_state()

    assert components1 == components2
    assert info1.blessing is not None
    assert info2.blessing is not None

    assert (ui_state_master['global_components'] ==
            ui_state_slave['global_components'])
    ui_info1 = common.find_ui_info(ui_state_master, info1)
    ui_info2 = common.find_ui_info(ui_state_master, info2)

    assert ui_info1 and ui_info2
    assert ui_info1['blessing'] is not None
    assert ui_info2['blessing'] is not None

    component1.client.set_ready(info1.blessing)
    component2.client.set_ready(info2.blessing)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state_master = await master_ui_client.get_state()

    assert info1.ready == info1.blessing
    assert info2.ready == info2.blessing

    ui_info1 = common.find_ui_info(ui_state_master, info1)
    ui_info2 = common.find_ui_info(ui_state_master, info2)
    assert ui_info1 and ui_info2
    assert ui_info1['ready'] == ui_info1['blessing']
    assert ui_info2['ready'] == ui_info2['blessing']

    await master_ui_client.set_rank(info1, 6)
    await master_ui_client.set_rank(info2, 2)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state_master = await master_ui_client.get_state()
    assert info1.blessing is not None and info2.blessing is not None
Exemple #8
0
async def test_bless_one_group_setting(cluster_factory):
    cluster = await cluster_factory(
        group_conf={
            'redundant': {
                'algorithm': 'BLESS_ONE',
                'components': ['primary', 'secondary']
            }
        })
    primary = cluster.components['redundant']['primary']
    secondary = cluster.components['redundant']['secondary']
    ui_client = cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await primary.newest_state()
    info2, components2 = await secondary.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is not None
    assert info2.blessing is None
    assert ui_info1['blessing'] == info1.blessing
    assert ui_info2['blessing'] is None

    primary.client.set_ready(info1.blessing)
    await asyncio.sleep(0.5)

    info1, components1 = await primary.newest_state()
    info2, components2 = await secondary.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)

    assert info1.ready == info1.blessing
    assert ui_info1['ready'] == info1.ready
    assert ui_info1['blessing'] == ui_info1['ready']

    await ui_client.set_rank(info1, 10)
    await asyncio.sleep(0.5)

    info1, components1 = await primary.newest_state()
    info2, components2 = await secondary.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is None
    assert ui_info1['blessing'] is None
    assert ui_info2['blessing'] is None

    primary.client.set_ready(None)
    await asyncio.sleep(0.5)

    info1, components1 = await primary.newest_state()
    info2, components2 = await secondary.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is not None
    assert ui_info1['blessing'] is None
    assert ui_info2['blessing'] == info2.blessing

    secondary.client.set_ready(info2.blessing)
    await asyncio.sleep(0.5)

    info1, components1 = await primary.newest_state()
    info2, components2 = await secondary.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is not None and info2.blessing == info2.ready
    assert ui_info1['blessing'] is None
    assert ui_info2['ready'] == info2.ready
Exemple #9
0
async def test_bless_one(cluster_factory):
    cluster = await cluster_factory({'group': {
        'components': ['c1', 'c2']
    }},
                                    default_algorithm='BLESS_ONE')

    component1 = cluster.components['group']['c1']
    component2 = cluster.components['group']['c2']
    ui_client = cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is not None
    assert info2.blessing is None
    assert ui_info1['blessing'] == info1.blessing
    assert ui_info2['blessing'] is None

    component1.client.set_ready(info1.blessing)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)

    assert info1.ready == info1.blessing
    assert ui_info1['ready'] == info1.ready
    assert ui_info1['blessing'] == ui_info1['ready']

    await ui_client.set_rank(info1, 10)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is None
    assert ui_info1['blessing'] is None
    assert ui_info2['blessing'] is None

    component1.client.set_ready(None)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is not None
    assert ui_info1['blessing'] is None
    assert ui_info2['blessing'] == info2.blessing

    component2.client.set_ready(info2.blessing)
    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    ui_state = await ui_client.get_state()
    ui_info1 = common.find_ui_info(ui_state, info1)
    ui_info2 = common.find_ui_info(ui_state, info2)

    assert info1.blessing is None
    assert info2.blessing is not None and info2.blessing == info2.ready
    assert ui_info1['blessing'] is None
    assert ui_info2['ready'] == info2.ready
async def test_peers_bless_all_group(cluster_factory):
    group_name = 'group'
    c1_name = 'c1'
    c2_name = 'c2'
    master_cluster = await cluster_factory(
        {group_name: {
            'components': [c1_name],
            'algorithm': 'BLESS_ALL'
        }},
        default_algorithm='BLESS_ONE')
    slave_cluster = await cluster_factory(
        {group_name: {
            'components': [c2_name]
        }},
        parent_infos=[master_cluster.server_info])
    component1 = master_cluster.components[group_name][c1_name]
    component2 = slave_cluster.components[group_name][c2_name]
    master_ui_client = master_cluster.ui_client
    slave_ui_client = slave_cluster.ui_client

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert components1 == components2
    assert info1.blessing is not None
    assert info2.blessing is not None

    assert master_ui_state['components'] == slave_ui_state['components']
    ui_info1 = common.find_ui_info(master_ui_state, info1)
    ui_info2 = common.find_ui_info(master_ui_state, info2)
    assert ui_info1 and ui_info2
    assert ui_info1['blessing']
    assert ui_info2['blessing']

    component1.client.set_ready(info1.blessing)
    component2.client.set_ready(info2.blessing)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    slave_ui_state = await slave_ui_client.get_state()

    assert info1.ready == info1.blessing
    assert info2.ready == info2.blessing

    assert master_ui_state['components'] == slave_ui_state['components']
    ui_info1 = common.find_ui_info(master_ui_state, info1)
    ui_info2 = common.find_ui_info(master_ui_state, info2)
    assert ui_info1 and ui_info2
    assert ui_info1['ready'] == ui_info1['blessing']
    assert ui_info2['ready'] == ui_info2['blessing']

    await master_ui_client.set_rank(info1, 6)
    await master_ui_client.set_rank(info2, 2)

    await asyncio.sleep(0.5)

    info1, components1 = await component1.newest_state()
    info2, components2 = await component2.newest_state()
    master_ui_state = await master_ui_client.get_state()
    assert info1.blessing is not None and info2.blessing is not None
    assert info1.rank == 6
    assert info2.rank == 2