def get_configured_replicasets(module_hostvars, play_hosts):
    replicasets = {}

    for instance_name in play_hosts:
        instance_vars = module_hostvars[instance_name]

        if helpers.is_expelled(instance_vars) or helpers.is_stateboard(
                instance_vars):
            continue

        if instance_vars.get('replicaset_alias') is None:
            continue

        replicaset_alias = instance_vars['replicaset_alias']
        if replicaset_alias not in replicasets:
            replicasets.update({
                replicaset_alias: {
                    'instances': [],
                    'roles':
                    instance_vars.get('roles', None),
                    'failover_priority':
                    instance_vars.get('failover_priority', None),
                    'all_rw':
                    instance_vars.get('all_rw', None),
                    'weight':
                    instance_vars.get('weight', None),
                    'vshard_group':
                    instance_vars.get('vshard_group', None),
                    'alias':
                    replicaset_alias,
                }
            })
        replicasets[replicaset_alias]['instances'].append(instance_name)

    return replicasets
Example #2
0
def connect_to_membership(params):
    control_console = helpers.get_control_console(params['console_sock'])
    module_hostvars = params['module_hostvars']
    play_hosts = params['play_hosts']

    changed = False

    for instance_name, instance_vars in module_hostvars.items():
        if helpers.is_expelled(instance_vars) or helpers.is_stateboard(
                instance_vars):
            continue

        if 'config' not in instance_vars or 'advertise_uri' not in instance_vars[
                'config']:
            continue

        connected, err = probe_server(control_console,
                                      instance_vars['config']['advertise_uri'])
        if err is not None and instance_name in play_hosts:
            return helpers.ModuleRes(failed=True, msg=err)

        if connected:
            changed = True

    return helpers.ModuleRes(changed=changed)
def get_alive_not_expelled_instance(params):
    module_hostvars = params['module_hostvars']
    play_hosts = params['play_hosts']
    app_name = params['app_name']

    canditates_by_uris = {}

    for instance_name in play_hosts:
        instance_vars = module_hostvars[instance_name]
        if helpers.is_expelled(instance_vars) or helpers.is_stateboard(
                instance_vars):
            continue

        instance_config = instance_vars.get('config')
        if instance_config is None:
            continue

        advertise_uri = instance_config['advertise_uri']
        canditates_by_uris[advertise_uri] = instance_name

    alive_not_expelled_instance_name = None
    for uri, instance_name in sorted(canditates_by_uris.items()):
        host, port = uri.rsplit(':', 1)

        try:
            conn = socket.create_connection((host, port),
                                            timeout=CONNECTION_TIMEOUT)
            conn.settimeout(CONNECTION_TIMEOUT)
            conn.recv(1024)
        except socket.error:
            continue

        alive_not_expelled_instance_name = instance_name
        break

    if alive_not_expelled_instance_name is None:
        errmsg = "Not found any alive instance that is not expelled and is not a stateboard"
        return helpers.ModuleRes(failed=True, msg=errmsg)

    instance_vars = module_hostvars[alive_not_expelled_instance_name]
    run_dir = instance_vars.get('cartridge_run_dir')
    console_sock = helpers.get_instance_console_sock(
        run_dir,
        app_name,
        alive_not_expelled_instance_name,
    )

    return helpers.ModuleRes(changed=False,
                             fact={
                                 'name': alive_not_expelled_instance_name,
                                 'console_sock': console_sock,
                             })
Example #4
0
def get_replicaset_leaders_by_play_hosts(play_hosts, module_hostvars,
                                         control_console):
    cluster_instances = helpers.get_cluster_instances_with_replicasets_info(
        control_console)

    dead_replicasets = set()
    chosen_leaders_priority = {}  # replicaset uuid: leader priority

    replicaset_leaders = {}
    for instance_name in play_hosts:
        instance_vars = module_hostvars[instance_name]

        if helpers.is_stateboard(instance_vars) or helpers.is_expelled(
                instance_vars):
            continue

        cluster_instance = cluster_instances.get(instance_name)
        if cluster_instance is None:
            continue

        instance_uuid = cluster_instance.get('uuid')
        if not instance_uuid:
            continue

        replicaset_uuid = cluster_instance.get('replicaset_uuid')
        if replicaset_uuid is None:
            continue

        replicaset_alias = cluster_instance.get('replicaset_alias',
                                                replicaset_uuid)

        if cluster_instance.get('status') != 'healthy':
            if replicaset_uuid not in replicaset_leaders:
                # there is no alive instances found for this replicaset
                dead_replicasets.add(replicaset_alias)
            continue

        if chosen_leaders_priority.get(replicaset_uuid) is not None:
            if cluster_instance['priority'] > chosen_leaders_priority[
                    replicaset_uuid]:
                # leader with less priority was already chosen
                continue

        replicaset_leaders[replicaset_uuid] = instance_uuid
        chosen_leaders_priority[replicaset_uuid] = cluster_instance['priority']
        dead_replicasets.discard(replicaset_alias)

    return replicaset_leaders, dead_replicasets
def get_instances_to_configure(module_hostvars, play_hosts):
    instances = {}

    for instance_name in play_hosts:
        instance_vars = module_hostvars[instance_name]

        if helpers.is_stateboard(instance_vars):
            continue

        instance = {}

        if helpers.is_expelled(instance_vars):
            instance['expelled'] = True
        else:
            if 'zone' in instance_vars:
                instance['zone'] = instance_vars['zone']
            if 'config' in instance_vars:
                if 'advertise_uri' in instance_vars['config']:
                    instance['uri'] = instance_vars['config']['advertise_uri']

        if instance:
            instances[instance_name] = instance

    return instances