Exemplo n.º 1
0
def remote_start(case_name, result_file, test_data, pic_name, user_manager, parameters, performance):
    global session, rdp_server, user
    if parameters['vdi'].upper() == 'RDP':
        session = parameters.get('session')
        rdp_server = user_manager.get_a_available_key(session.lower())
        conn = vdi_connection.RDPLinux(user=user, parameters=parameters, rdp_server=rdp_server)
    elif parameters['vdi'].upper() == 'VIEW':
        conn = vdi_connection.ViewLinux(user=user, parameters=parameters)
    elif parameters['vdi'].upper() == 'CITRIX':
        conn = vdi_connection.CitrixLinux(user=user, parameters=parameters)
    else:
        conn = None
    log.info('init connection instance')
    first_collect_flag = False
    if conn:
        # VDI Test
        conn_flag = False
        for count in range(2):
            logon = conn.logon(parameters['session'])
            if logon is True:
                pymouse.PyMouse().click(1, 1)
                log.info('successfully logon session: {}'.format(parameters['session']))
                steps = {
                    'step_name': 'logon vdi',
                    'result': 'Pass',
                    'expect': '',  # can be string or pic path
                    'actual': 'logon successfully',
                    'note': ''}
                common_function.update_cases_result(result_file, case_name, steps)
                conn_flag = True
                pic_sim, diff_res, first_collect_flag = check_layout(os.path.join(test_data,
                                                              'td_multiple_display',
                                                              '{}_pic'.format(parameters['vdi']).lower(),
                                                              pic_name))
                if pic_sim >= 0.99:
                    log.info('check layout pass')
                    steps = {
                        'step_name': 'check vdi layout',
                        'result': 'Pass',
                        'expect': 'similarity > 99%',  # can be string or pic path
                        'actual': 'layout and resolution set correctly: {}'.format(pic_sim),
                        'note': ''}
                    common_function.update_cases_result(result_file, case_name, steps)
                else:
                    log.error('check layout Fail, autual: {}'.format(pic_sim))
                    shutil.copy(common_function.get_current_dir('temp.png'),
                                common_function.get_current_dir('Test_Report', 'img', '{}.jpg'.format(case_name)))
                    steps = {
                        'step_name': 'check vdi layout',
                        'result': 'Fail',
                        'expect': 'similarity > 99%',  # can be string or pic path
                        'actual': 'img/{}.png'.format(case_name),  # can be string or pic path
                        'note': 'actual result: {}'.format(pic_sim)}
                    common_function.update_cases_result(result_file, case_name, steps)
                    if not os.path.exists(common_function.get_current_dir('Test_Report', 'img')):
                        os.mkdir(common_function.get_current_dir('Test_Report', 'img'))
                    try:
                        common_function.check_free_memory("beforeremote")
                        picture_operator.save_from_data(
                            '{}'.format(common_function.get_current_dir('Test_Report', 'img',
                                                                        '{}.png'.format(
                                                                            case_name))),
                            diff_res)
                        common_function.check_free_memory("afterremote")
                    except:
                        save_fail_path = common_function.get_current_dir('Test_Report', 'img', 'save_fail_remote_{}.txt'.format(case_name))
                        f = open(save_fail_path, "w")
                        f.write(traceback.format_exc())
                        f.close()
                    finally:
                        log.debug(gc.garbage)
                        gc.collect()

                log.info("collecting performance data")
                path = "{}/Test_Report/performance/".format(common_function.get_current_dir())
                if not os.path.exists(path):
                    os.makedirs(path)
                performance.file = path + "{}.txt".format("".join(case_name.split("_")[2:-4]).replace(" ", ""))
                performance.start()
                conn.logoff()
                break
            elif isinstance(logon, str):
                log.warning('logon fail in cycle {}'.format(count))
                # wait 2min try again
                time.sleep(120)
                if not user:
                    log.info("user get none before, try to get a new user")
                    user = user_manager.get_a_available_key()
                    conn.user = user
                if parameters['vdi'].upper() == 'RDP' and not rdp_server:
                    log.info("try to get rdp_server")
                    session = parameters.get('session')
                    rdp_server = user_manager.get_a_available_key(session.lower())
                    conn.server = rdp_server
                    conn.domain_list = [rdp_server]
                continue
            else:
                log.error("logon fail in cycle {}& white list can't catch it, break!".format(count))
                break

        if not conn_flag:
            log.error('logon fail, and try count finished')
            steps = {
                'step_name': 'logon vdi',
                'result': 'Fail',
                'expect': '',  # can be string or pic path
                'actual': 'Fail to logon within 6 mins',  # can be string or pic path
                'note': ''}
            common_function.update_cases_result(result_file, case_name, steps)
            return False, first_collect_flag
    return True, first_collect_flag
def step_9(**kwargs):
    log = kwargs.get("log")
    case_name = kwargs.get("case_name")
    user_password = kwargs.get("user_password", "1")
    try:
        pmcf.SwitchThinProMode("user")
        multiuser = vdi_connection.MultiUserManger()
        for _ in range(6):
            user = multiuser.get_a_available_key()
            if user:
                break
            time.sleep(180)
        else:
            log.error("not get a valid user")
            return [False, "not has invalid user"]
        parameters = {'vdi': 'citrix', 'session': 'win10'}
        vdi = vdi_connection.CitrixLinux(user=user,
                                         setting=vdi_setting()["set"]["citrix"]
                                         ["screen_lock_with_password_step3"],
                                         parameters=parameters)
        for _ in range(2):
            if vdi.logon(parameters.get("session", "")):
                for _ in range(10):
                    time.sleep(10)
                    if wait_element(pic("_win10_start_icon")):
                        break
                else:
                    log.debug(
                        "log on vdi fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    vdi.logoff()
                    time.sleep(5)
                    continue
                break
        else:
            log.debug(
                "log on vdi fail",
                cf.get_current_dir(
                    'Test_Report', 'img',
                    '{}.png'.format(case_name.replace(' ', '_'))))
            multiuser.reset_key(user)
            return [False, "log on vdi fail"]
        log.info("logon vdi success")
        log.info("start lock screen")
        screensaver = ScreenSaver()
        screensaver.lock_screen_by_hotkey()  # lock screen
        time.sleep(2)
        pyautogui.click()
        if not wait_element(pic("_user_of_credentials")):
            log.error("'user' not in credentials list")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "'user' not in credentials list"]
        log.info("'user' in credentials list")
        log.info("try use logon vdi password to unlock")
        pyautogui.typewrite(vdi_user_info()["password"], interval=0.1)
        time.sleep(1)
        pyautogui.press("enter")
        time.sleep(1)
        if not wait_element(pic("_win10_start_icon")):
            log.error("unlock screen fail")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "unlock screen fail"]
        log.info("unlock screen success")

        time.sleep(2)
        screensaver.lock_screen_by_hotkey()
        time.sleep(2)
        pyautogui.click()
        if not wait_element(pic("_user_of_credentials")):
            log.error("'user' not in credentials list")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "'user' not in credentials list"]
        log.info("'user' in credentials list")
        log.info("try use 'user' to unlock")

        if wait_element(pic("_tool")):
            pyautogui.press("tab", presses=5, interval=0.3)
        else:
            pyautogui.press("tab", presses=9, interval=0.3)
        pyautogui.typewrite("user", interval=0.1)
        pyautogui.press("tab")
        time.sleep(1)
        pyautogui.typewrite(user_password, interval=0.1)
        time.sleep(1)
        pyautogui.press("enter")
        if not wait_element(pic("_win10_start_icon")):
            log.error("unlock screen fail")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "'user' not in credentials list"]
        log.info("unlock screen success")
        log.info("start logoff vdi")
        vdi.logoff()
        multiuser.reset_key(user)
        return [True, "success"]
    except:
        log.error(traceback.format_exc())
        return [False, traceback.format_exc()]
def step_2(**kwargs):
    log = kwargs.get("log")
    case_name = kwargs.get("case_name")
    try:
        pmcf.SwitchThinProMode("user")
        multiuser = vdi_connection.MultiUserManger()
        for _ in range(6):
            user = multiuser.get_a_available_key()
            if user:
                break
            time.sleep(180)
        else:
            log.error("not get a valid user")
            return [False, "not has invalid user"]
        parameters = {'vdi': 'citrix', 'session': 'win10'}
        citrix = vdi_connection.CitrixLinux(
            user=user,
            setting=vdi_setting()["set"]["citrix"]
            ["screen_lock_with_password_step2"],
            parameters=parameters)

        for _ in range(2):
            if citrix.logon(parameters.get("session", "")):
                for _ in range(10):
                    time.sleep(10)
                    if wait_element(pic("_win10_start_icon")):
                        break
                else:
                    log.debug(
                        "log on vdi fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    citrix.logoff()
                    time.sleep(5)
                    continue
                break
        else:
            log.debug(
                "log on vdi fail",
                cf.get_current_dir(
                    'Test_Report', 'img',
                    '{}.png'.format(case_name.replace(' ', '_'))))
            os.system("wmctrl -c 'Citrix Workspace'")
            multiuser.reset_key(user)
            return [False, "log on vdi fail"]
        log.info("logon vdi success")
        screensaver = ScreenSaver()
        screensaver.lock_screen_by_hotkey()
        log.info("lock screen")
        time.sleep(2)
        pyautogui.click()
        time.sleep(2)
        if wait_element(pic("_lock_screen_dialog")):
            log.error("found lock screen dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "found lock screen dialog"]
        if wait_element(pic("_win10_start_icon")):
            log.info("unlock screen success")
            citrix.logoff()
            multiuser.reset_key(user)
            return [True, "unlock screen success"]
        log.error("unlock screen fail")
        citrix.logoff()
        multiuser.reset_key(user)
        return [False, "unlock screen fail"]
    except:
        log.error(traceback.format_exc())
        return [False, traceback.format_exc()]
def step_5_6(**kwargs):
    log = kwargs.get("log")
    session = kwargs.get("session")
    case_name = kwargs.get('case_name')
    root_password = kwargs.get("root_password", "1")
    try:
        pmcf.SwitchThinProMode("user")
        multiuser = vdi_connection.MultiUserManger()
        for _ in range(6):
            user = multiuser.get_a_available_key()
            if user:
                break
            time.sleep(180)
        else:
            log.error("not get a valid user")
            return [False, "not has invalid user"]
        citrix = vdi_connection.CitrixLinux(
            user=user,
            setting=vdi_setting()["set"]["citrix"]
            ["screen_lock_with_password_step5"],
            parameters={
                'vdi': 'citrix',
                'session': 'win10'
            })
        if not citrix.import_cert():
            log.error("thinpro import rootca certificate fail")
            multiuser.reset_key(user)
            return [False, "thinpro import rootca certificate fail"]
        citrix.delete_vdi('xen')
        citrix.create_vdi('xen')
        time.sleep(1)
        citrix_id = citrix.vdi_connection_id('xen')[0]
        citrix.set_citrix_connection_from_yml(citrix_id)

        log.info("connect citrix VDI desktop")
        time.sleep(1)
        # os.popen("connection-mgr start {}".format(citrix_id))
        for _ in range(2):
            citrix.connect_vdi_by_pic()

            time.sleep(10)
            if not wait_element(pic("_citrix_input_credentials_dialog")):
                log.debug(
                    "not open input credentials dialog",
                    cf.get_current_dir(
                        'Test_Report', 'img',
                        '{}.png'.format(case_name.replace(' ', '_'))))
                os.system("wmctrl -c 'HP - Citrix Server Error'")
                os.system("wmctrl -c 'Citrix Workspace'")
                time.sleep(5)
                continue
            log.info("input domain, user and password")
            pyautogui.typewrite(r"{}\{}".format(vdi_user_info()["domain"],
                                                user),
                                interval=0.1)
            pyautogui.press("tab")
            pyautogui.typewrite(vdi_user_info()["password"], interval=0.1)
            pyautogui.press("enter")
            log.info(r"user: '******', password: '******'".format(
                vdi_user_info()["domain"], user,
                vdi_user_info()["password"]))
            time.sleep(20)

            if not wait_element(pic("_citrix_workspace_broker")):
                if wait_element(pic("_win10_start_icon")
                                ):  # check whether auto logon vdi desktop
                    log.info("auto logon vdi desktop success")
                    pyautogui.click(1, 1)
                    break
                else:
                    log.debug(
                        "open citrix workspace broker fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    os.system("wmctrl -c 'HP - Citrix Server Error'")
                    os.system("wmctrl -c 'Citrix Workspace'")
                    time.sleep(5)
                    continue
            else:
                log.info("open citrix workspace broker success")
                if not citrix.logon_desktop_by_pic():
                    log.debug(
                        "desktops or target desktop not found",
                        cf.get_current_dir('Test_Report', 'img',
                                           '{}.png'.format(case_name)))
                    os.system("wmctrl -c 'HP - Citrix Server Error'")
                    os.system("wmctrl -c 'Citrix Workspace'")
                    time.sleep(5)
                    continue
                for i in range(15):
                    log.info("wait log on citrix desktop...")
                    time.sleep(10)
                    if wait_element(pic("_win10_start_icon")):
                        log.info("login vdi connection success")
                        break
                    else:
                        continue
                else:
                    log.debug(
                        "login vdi connection fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    os.system("wmctrl -c 'HP - Citrix Server Error'")
                    os.system("wmctrl -c 'Citrix Workspace'")
                    time.sleep(5)
                    continue
                break
        else:
            os.system("wmctrl -c 'Citrix Workspace'")
            multiuser.reset_key(user)
            return [False, "login vdi connection fail"]

        time.sleep(5)
        screensaver = ScreenSaver()
        screensaver.lock_screen_by_hotkey()  # lock screen
        time.sleep(2)
        pyautogui.press("enter")
        time.sleep(2)
        if not wait_element(pic("_lock_screen_dialog")):
            log.error("not found the lock screen dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "not found the lock screen dialog"]
        if wait_element(pic("_user_of_credentials")
                        ):  # user in the list of new credentials
            log.error("'user' in credentials dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "'user' in credentials dialog"]
        log.info("'user' not in credentials dialog")
        log.info("try use 'root' to unlock")
        if wait_element(pic("_tool")):
            pyautogui.press("tab", presses=5, interval=0.3)
        else:
            pyautogui.press("tab", presses=9, interval=0.3)
        pyautogui.typewrite("root", interval=0.1)
        pyautogui.press("tab")
        pyautogui.typewrite(root_password, interval=0.1)
        pyautogui.press("enter")
        time.sleep(2)

        if not wait_element(pic(
                "_invalid_credentials")):  # check invalid credentials dialog
            log.error("not found invalid credentials dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "not found invalid credentials dialog"]
        pyautogui.press("enter")
        cancel = wait_element(pic("_cancel"))
        pyautogui.click(cancel[0])
        time.sleep(1)
        pyautogui.press("enter")
        time.sleep(1)
        pyautogui.typewrite(vdi_user_info()["password"], interval=0.1)
        pyautogui.press("enter")
        time.sleep(2)
        if not wait_element(pic("_win10_start_icon")):
            log.error("into the vdi desktop fail")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "into the vdi desktop fail"]
        log.info("into the vdi desktop success")
        log.info("screen can be unlock by the credentials")
        citrix.logoff()
        multiuser.reset_key(user)
        return [True, "screen can be unlock by the credentials"]
    except:
        log.info(traceback.format_exc())
        return [False, traceback.format_exc()]