Exemplo n.º 1
0
def get_empty_groups(n):
    if manifest().get("symmetric_groups", False):
        result = bla.uncoupled_groups()
        logging.info("uncoupled groups: " + str(result))
        return result
    else:
        return None
Exemplo n.º 2
0
def couple_groups(n, request):
    try:
        logging.info("----------------------------------------")
        logging.info("New couple groups request: " + str(request))
        logging.info(request)
        uncoupled_groups = bla.uncoupled_groups()
        dc_by_group_id = {}
        group_by_dc = {}
        for group_id in uncoupled_groups:
            group_object = bla.get_group(group_id)
            dc = group_object.get_dc()
            dc_by_group_id[group_id] = dc
            groups_in_dc = group_by_dc.setdefault(dc, [])
            groups_in_dc.append(group_id)
        logging.info("dc by group: %s" % str(dc_by_group_id))
        logging.info("group_by_dc: %s" % str(group_by_dc))
        size = int(request[0])
        mandatory_groups = [int(g) for g in request[1]]
        # check mandatory set
        for group_id in mandatory_groups:
            if group_id not in uncoupled_groups:
                raise Exception("group %d is coupled" % group_id)
            dc = dc_by_group_id[group_id]
            if dc not in group_by_dc:
                raise Exception("groups must be in different dcs")
            del group_by_dc[dc]

        groups_to_couple = copy.copy(mandatory_groups)

        # need better algorithm for this. For a while - only 1 try and random selection
        n_groups_to_add = size - len(groups_to_couple)
        if n_groups_to_add > len(group_by_dc):
            raise Exception("Not enough dcs")
        if n_groups_to_add < 0:
            raise Exception("Too many mandatory groups")

        some_dcs = group_by_dc.keys()[:n_groups_to_add]

        for dc in some_dcs:
            groups_to_couple.append(group_by_dc[dc].pop())

        (good, bad) = make_symm_group(n, groups_to_couple)
        if bad:
            raise bad[1]

        return groups_to_couple
    except Exception as e:
        logging.error("Balancer error: " + str(e) + "\n" + traceback.format_exc())
        return {'Balancer error': str(e)}