Exemplo n.º 1
0
async def restart_lab_api():
    '''
    try:
        hosts_ids = request.json.get('hosts', list)
    except (ValueError, AttributeError):
        return abort(400)

    hosts = Host.select().where(Host.id in hosts_ids)

    if len(hosts) == 0:
        return abort(400)
    elif len(hosts) == 1:
        runtime = 'docker'
    else:
        runtime = 'cluster'
    '''

    data = await request.json

    if data is None or 'name' not in data:
        return abort(400)

    name = data.get('name')

    lab, created = Lab.get_or_create(name=name, defaults={'runtime': runtime})

    tc_options = data.get('tc_options', {})
    hosts = Host.get_all_configs()

    if created:
        ret, killed_routers = start_lab(lab_path(name),
                                          prefix(name),
                                          *(() if runtime!='cluster' else \
                                                (hosts,)),
                                          default_tc_options=tc_options,
                                          runtime=runtime)
    else:
        ret, killed_routers = restart_lab(lab_path(name),
                                        prefix(name),
                                        *(() if runtime!='cluster' else \
                                            (lab.get_host_map(), hosts)),
                                        default_tc_options=tc_options,
                                        runtime=runtime)
        print('\n[ deleting old nodes & network ]\n')
        Node.delete().where(Node.lab_id == lab.id).execute()
        Network.delete().where(Network.lab_id == lab.id).execute()

    print('\n[ mid-state ]', list(Node.select()))

    if runtime == 'cluster':
        hosts_map = ret
        for host_name, (containers, networks) in ret.items():
            Node.bulk_create([
                Node(name=c.name,
                     short_id=c.short_id,
                     lab=lab,
                     host_id=hosts[host_name]['id']) for c in containers
            ])
            Network.bulk_create([
                Network(name=n, lab=lab, host=hosts[host_name]['id'])
                for n in networks
            ])

    msgr = Messenger(name)

    # with open(os.path.join('/sockets', name, 'lab.sock'), 'w') as f:
    #     f.write('no')

    for container_name in killed_routers:
        routers_cache.set(container_name, True)

    return 'OK', 200