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
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)}