

def distribute_agents(agents, get_host_fn):
    result = {
        
    }
    hosts = set()
    buckets = collections.defaultdict(list)
    for agent in agents.values():
        agent_id = agent['id']
        host_id = get_host_fn(agent_id)
        if (host_id not in hosts):
            hosts.add(host_id)
            agent['node'] = host_id
            buckets[agent['mode']].append(agent)
        else:
            LOG.info('Filter out agent %s, host %s is already occupied', agent_id, host_id)
    if buckets['alone']:
        result = dict(((a['id'], a) for a in buckets['alone']))
    else:
        for (master, slave) in zip(buckets['master'], buckets['slave']):
            master['slave_id'] = slave['id']
            slave['master_id'] = master['id']
            result[master['id']] = master
            result[slave['id']] = slave
    return result

dataset/ETHPy150Open openstack/shaker/shaker/engine/deploy.py distribute_agents/original