def _setup_lb_network_and_servers(cmgr, x_name, **kwargs):
    num_servers = kwargs.pop('num_servers', 2)
    username = kwargs.pop('username', 'cirros')
    password = kwargs.pop('password', 'cubswin:)')
    image_id = kwargs.pop('image_id', None)
    image_name = kwargs.pop('image_name', None)
    flavor_id = kwargs.pop('flavor_id', 1)
    extra_timeout = kwargs.pop('server_extra_wait_time', 1)
    my_name = data_utils.rand_name(x_name)
    cidr = kwargs.pop('cidr', '10.199.88.0/24')
    port = kwargs.pop('port', 80)
    public_network_id = kwargs.pop('public_network_id', None)
    # NSX-v plugin need to use exclusive router for its lbaas env
    # Overwrite it if your env requiring a different type
    router_type = kwargs.pop('router_type', 'exclusive')
    router, network, subnet = create_networks(cmgr, my_name, cidr,
                                              router_type=router_type,
                                              **kwargs)
    sg = NET.create_security_group_loginable(cmgr, my_name, http=True)
    # ssh keypair
    keypair = make_ssh_keypair(cmgr, my_name)
    kp_filename = keypair_to_tempfile_json(keypair)
    servers = {}
    for sid in range(1, (num_servers + 1)):
        server_name = "%s-%d" % (my_name, sid)
        server = NET.create_server_on_network(
            cmgr, network['id'], security_group_name_or_id=sg['id'],
            key_name=keypair['name'], server_name=server_name,
            image_id=image_id, image_name=image_name,
            flavor_id=flavor_id, wait_on_boot=False)
        servers[server['id']] = dict(server=server, fip=None)

    # servers need in status=ACTIVE before assign floatingip to them
    # vm1 should be active by now
    for server_id in servers.keys():
        waiters.wait_for_server_status(
            cmgr.manager.servers_client, server_id, 'ACTIVE',
            extra_timeout=extra_timeout)

    for server_id, server in servers.items():
        server['fip'] = NET.create_floatingip_for_server(cmgr, server_id,
                                                         public_network_id)
        server['server'] = cmgr.nova('server-show', server_id)
        img_id = server['server']['image']['id']
        img_name = cmgr.nova('image-show', img_id).get('name', '')
        server['image_name'] = img_name

    lb_env = dict(
        name=my_name, username=username, password=password,
        keypair=keypair, kp_filename=kp_filename,
        security_group=sg,
        router=router, port=port, network=network, subnet=subnet,
        servers=servers)
    return lb_env
def add_server_to_lb_network(cmgr, on_network_id, security_group_name_or_id,
                             sid_range, keypair_name=None,
                             username='******', password='******',
                             flavor_id=1, image_id=None, image_name=None,
                             public_network_id=None, extra_timeout=10,
                             build_timeout=900, build_interval=5.0,
                             halt=False):
    if halt:
        import pdb;
        pdb.set_trace()
    lb_network = cmgr.qsvc('net-show', on_network_id)
    lb_network_name = lb_network.get('name', None)
    sg = cmgr.qsvc('security-group-show', security_group_name_or_id)
    if keypair_name is None:
        # ssh keypair
        keypair = make_ssh_keypair(cmgr, lb_network_name)
        keypair_name = keypair['name']
    else:
        keypair = None

    servers = {}
    for sid in sid_range:
        server_name = "%s-%s" % (lb_network_name, sid)
        server = NET.create_server_on_network(
            cmgr, on_network_id, security_group_name_or_id=sg['id'],
            key_name=keypair_name, server_name=server_name,
            image_id=image_id, image_name=image_name,
            flavor_id=flavor_id, wait_on_boot=False)
        servers[server['id']] = dict(server=server, fip=None)

    # servers need in status=ACTIVE before assign floatingip to them
    # vm1 should be active by now
    for server_id in servers.keys():
        waiters.wait_for_server_status(
            cmgr.manager.servers_client, server_id, 'ACTIVE',
            extra_timeout=extra_timeout)

    for server_id, server in servers.items():
        server['fip'] = NET.create_floatingip_for_server(cmgr, server_id,
                                                         public_network_id)
        server['server'] = cmgr.nova('server-show', server_id)
        img_id = server['server']['image']['id']
        img_name = cmgr.nova('image-show', img_id).get('name', '')
        server['image_name'] = img_name

    # wait for servers having their floating-ip (CH+newton takes long time)
    timeout = extra_timeout + build_timeout
    t0 = time.time()
    for server_id, server in servers.items():
        while True:
            elapse_time = time.time() - t0
            sv = cmgr.nova('server-show', server_id)
            if get_server_ip_address(sv, 'floating', lb_network_name):
                msg = ("Take %d seconds to assign floating-ip to server[%s]"
                       % (int(elapse_time), sv.get('name')))
                U.log_msg(msg, 'OS-LBaaS')
                break
            if elapse_time > timeout:
                raise Exception("Server did not get its floating-ip.")
            time.sleep(build_interval)

    lb_env = dict(
        username=username, password=password,
        keypair_name=keypair_name, keypair=keypair,
        security_group=sg, servers=servers)
    return lb_env