Example #1
0
def test_correct_run(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

        shutil.rmtree(TEST_FILES, ignore_errors=True)
    request.addfinalizer(finalizer)

    # create analysis and job workspaces
    os.makedirs(os.path.join(TEST_FILES, "workspace/job"), exist_ok=True)

    # local service
    env = {"__class__": "Environment",
           "geomop_root": geomop_root_local,
           "geomop_analysis_workspace": os.path.abspath(os.path.join(TEST_FILES, "workspace")),
           "python": "python3"}
    cl = {"__class__": "ConnectionLocal",
          "address": "localhost",
          "environment": env,
          "name": "local"}
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run, daemon=True)
    local_service_thread.start()

    # job data
    pe = {"__class__": "ProcessExec",
          "executable": {"__class__": "Executable",
                         "path": "JobPanel/services/job_service.py",
                         "script": True}}
    je = {"__class__": "Executable",
          "path": os.path.join(this_source_dir, "job_1.py"),
          "script": True}
    service_data = {"service_host_connection": cl,
                    "process": pe,
                    "job_executable": je,
                    "workspace": "job",
                    "config_file_name": GEOMOP_INTERNAL_DIR_NAME + "/job_service.conf",
                    "wait_before_run": 10.0}

    # start job
    local_service.request_start_child(service_data)
    job = local_service._child_services[1]

    # check correct job state transition
    time.sleep(5)
    assert job._status == ServiceStatus.queued
    time.sleep(10)
    assert job._status == ServiceStatus.running
    time.sleep(30)
    assert job._status == ServiceStatus.done
Example #2
0
def test_mc_get_delegator(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

    request.addfinalizer(finalizer)

    # metacentrum credentials
    mc_u, mc_p = get_passwords()["metacentrum"]

    # local service
    local_service = ServiceBase({})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # environment
    test_dir = METACENTRUM_HOME + "/" + mc_u + "/jenkins_test"
    env = {
        "__class__": "Environment",
        "geomop_root": test_dir + "/geomop",
        "python": test_dir + "/geomop/bin/python"
    }

    # ConnectionSSH
    con = ConnectionSSH({
        "address": METACENTRUM_FRONTEND,
        "uid": mc_u,
        "password": mc_p,
        "environment": env
    })
    con.set_local_service(local_service)
    con.connect()

    # get_delegator
    delegator_proxy = con.get_delegator()
    assert isinstance(delegator_proxy, ServiceProxy)

    con.close_connections()
Example #3
0
def test_get_delegator(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

    request.addfinalizer(finalizer)

    # local service
    local_service = ServiceBase({})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # environment
    env = {
        "__class__": "Environment",
        "geomop_root": geomop_root_local,
        "geomop_analysis_workspace": REMOTE_WORKSPACE,
        "python": "python3"
    }

    # ConnectionSSH
    u, p = get_test_password()
    con = ConnectionSSH({
        "address": "localhost",
        "uid": u,
        "password": p,
        "environment": env
    })
    con.set_local_service(local_service)
    con.connect()

    # get_delegator
    delegator_proxy = con.get_delegator()
    assert isinstance(delegator_proxy, ServiceProxy)

    con.close_connections()
Example #4
0
def test_mc_delegator_pbs(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

    request.addfinalizer(finalizer)

    # metacentrum credentials
    mc_u, mc_p = get_passwords()["metacentrum"]

    # local service
    local_service = ServiceBase({})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # environment
    test_dir = METACENTRUM_HOME + "/" + mc_u + "/jenkins_test"
    env = {
        "__class__": "Environment",
        "geomop_root": test_dir + "/geomop",
        "geomop_analysis_workspace": test_dir + "/workspace",
        "python": test_dir + "/geomop/bin/python"
    }

    # ConnectionSSH
    con = ConnectionSSH({
        "address": METACENTRUM_FRONTEND,
        "uid": mc_u,
        "password": mc_p,
        "environment": env
    })
    con.set_local_service(local_service)
    con.connect()

    # get_delegator
    delegator_proxy = con.get_delegator()
    assert isinstance(delegator_proxy, ServiceProxy)

    # start process
    process_config = {
        "__class__": "ProcessPBS",
        "executable": {
            "__class__": "Executable",
            "name": "sleep"
        },
        "exec_args": {
            "__class__": "ExecArgs",
            "args": ["600"],
            "pbs_args": {
                "__class__": "PbsConfig",
                "dialect": {
                    "__class__": "PbsDialectPBSPro"
                }
            }
        },
        "environment": env
    }
    answer = []
    delegator_proxy.call("request_process_start", process_config, answer)

    # wait for answer
    def wait_for_answer(ans, t):
        for i in range(t):
            time.sleep(1)
            if len(ans) > 0:
                break

    wait_for_answer(answer, 60)
    process_id = answer[-1]

    # get status
    time.sleep(10)
    process_config = {"__class__": "ProcessPBS", "process_id": process_id}
    answer = []
    delegator_proxy.call("request_process_status", process_config, answer)

    # wait for answer
    wait_for_answer(answer, 60)
    status = answer[-1][process_id]["status"]
    assert status == ServiceStatus.queued or status == ServiceStatus.running

    # kill
    process_config = {"__class__": "ProcessPBS", "process_id": process_id}
    answer = []
    delegator_proxy.call("request_process_kill", process_config, answer)

    # wait for answer
    wait_for_answer(answer, 60)
    assert answer[-1] is True

    con.close_connections()
Example #5
0
def test_docker(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

        shutil.rmtree(TEST_FILES, ignore_errors=True)

    request.addfinalizer(finalizer)

    # create analysis workspace
    os.makedirs(os.path.join(TEST_FILES, "workspace"), exist_ok=True)

    # local service
    env = {
        "__class__":
        "Environment",
        "geomop_root":
        geomop_root_local,
        "geomop_analysis_workspace":
        os.path.abspath(os.path.join(TEST_FILES, "workspace")),
        "python":
        "python3"
    }
    cl = {
        "__class__": "ConnectionLocal",
        "address": "localhost",
        "environment": env,
        "name": "local"
    }
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # service data
    cd = {
        "__class__": "ConnectionLocal",
        "address": "172.17.42.1",
        "environment": env,
        "name": "docker"
    }
    pd = {
        "__class__": "ProcessDocker",
        "executable": {
            "__class__": "Executable",
            "path": os.path.join(this_source_dir, "t_service.py"),
            "script": True
        }
    }
    service_data = {
        "service_host_connection": cd,
        "process": pd,
        "workspace": "",
        "config_file_name": "t_service.conf"
    }

    # start test service
    local_service.request_start_child(service_data)
    test_service = local_service._child_services[1]

    # wait for test service running
    time.sleep(10)
    assert test_service._status == ServiceStatus.running

    # stop test service
    answer = []
    test_service.call("request_stop", None, answer)
    time.sleep(5)
Example #6
0
def test_delegator_exec(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

    request.addfinalizer(finalizer)

    # local service
    env = {
        "__class__":
        "Environment",
        "geomop_root":
        geomop_root_local,
        "geomop_analysis_workspace":
        os.path.abspath(os.path.join(TEST_FILES, "workspace")),
        "python":
        "python3"
    }
    cl = {
        "__class__": "ConnectionLocal",
        "address": "localhost",
        "environment": env
    }
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # environment
    env_rem = {
        "__class__": "Environment",
        "geomop_root": geomop_root_local,
        "geomop_analysis_workspace": REMOTE_WORKSPACE,
        "python": "python3"
    }

    # ConnectionSSH
    u, p = get_test_password()
    con = ConnectionSSH({
        "address": "localhost",
        "uid": u,
        "password": p,
        "environment": env_rem
    })
    con.set_local_service(local_service)
    con.connect()

    # get_delegator
    delegator_proxy = con.get_delegator()
    assert isinstance(delegator_proxy, ServiceProxy)

    # start process
    process_config = {
        "__class__": "ProcessExec",
        "environment": env_rem,
        "executable": {
            "__class__": "Executable",
            "path": "../testing/JobPanel/backend/t_process.py",
            "script": True
        }
    }
    answer = []
    delegator_proxy.call("request_process_start", process_config, answer)

    # wait for answer
    time.sleep(5)
    delegator_proxy._process_answers()
    process_id = answer[-1]["data"]

    # get status
    process_config = {"__class__": "ProcessExec", "process_id": process_id}
    answer = []
    delegator_proxy.call("request_process_status", process_config, answer)

    # wait for answer
    time.sleep(5)
    delegator_proxy._process_answers()
    assert answer[-1]["data"][process_id]["running"] is True

    # kill
    process_config = {"__class__": "ProcessExec", "process_id": process_id}
    answer = []
    delegator_proxy.call("request_process_kill", process_config, answer)

    # wait for answer
    time.sleep(5)
    delegator_proxy._process_answers()
    assert answer[-1]["data"] is True

    con.close_connections()
Example #7
0
def test_port_forwarding(request):
    server = None
    server_thread = None
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

        # shutdown server
        if server_thread is not None:
            server.shutdown()
            server.server_close()
            server_thread.join(timeout=5)
            assert not server_thread.is_alive()

        shutil.rmtree(TEST_FILES, ignore_errors=True)

    request.addfinalizer(finalizer)

    class Server(socketserver.ThreadingTCPServer):
        daemon_threads = True
        allow_reuse_address = True

    class RequestHandler(socketserver.BaseRequestHandler):
        def handle(self):
            data = str(self.request.recv(1024), 'ascii')
            if data == "hello":
                self.request.sendall(bytes("hello", 'ascii'))

    def connection_test(ip, port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((ip, port))
        try:
            sock.sendall(bytes("hello", 'ascii'))
            response = str(sock.recv(1024), 'ascii')
            if response == "hello":
                return True
        finally:
            sock.close()
        return False

    server = Server(('', 0), RequestHandler)
    ip, origin_port = server.server_address

    # start server in thread
    server_thread = threading.Thread(target=server.serve_forever, daemon=True)
    server_thread.start()

    # local service
    env = {
        "__class__":
        "Environment",
        "geomop_root":
        geomop_root_local,
        "geomop_analysis_workspace":
        os.path.abspath(os.path.join(TEST_FILES, "workspace")),
        "python":
        "python3"
    }
    cl = {
        "__class__": "ConnectionLocal",
        "address": "localhost",
        "environment": env
    }
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # ConnectionLocal
    con = ConnectionLocal()
    con.set_local_service(local_service)
    con.connect()

    forwarded_port = con.forward_local_port(origin_port)
    assert connection_test("localhost", forwarded_port)

    forwarded_port = con.forward_remote_port(origin_port)
    assert connection_test("localhost", forwarded_port)

    con.close_connections()

    # environment
    env_rem = {
        "__class__": "Environment",
        "geomop_root": geomop_root_local,
        "geomop_analysis_workspace": REMOTE_WORKSPACE,
        "python": "python3"
    }

    # ConnectionSSH
    u, p = get_test_password()
    con = ConnectionSSH({
        "address": "localhost",
        "uid": u,
        "password": p,
        "environment": env_rem
    })
    con.set_local_service(local_service)
    con.connect()

    forwarded_port = con.forward_local_port(origin_port)
    assert connection_test("localhost", forwarded_port)

    forwarded_port = con.forward_remote_port(origin_port)
    assert connection_test("localhost", forwarded_port)

    con.close_connections()
Example #8
0
def test_upload_download(request):
    local_service = None
    local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

        shutil.rmtree(LOCAL_TEST_FILES, ignore_errors=True)
        shutil.rmtree(REMOTE_TEST_FILES, ignore_errors=True)

    request.addfinalizer(finalizer)

    files = [
        "f1.txt", "f2.txt", "l1.txt", "d1/f3.txt", "d2/f4.txt", "d2/d3/f5.txt",
        "d2/l2.txt"
    ]
    paths = ["f1.txt", "f2.txt", "l1.txt", "d1/f3.txt", "d2"]

    def create_dir(path):
        shutil.rmtree(path, ignore_errors=True)
        os.makedirs(path)
        os.chmod(path, 0o777)

    def create_files(path):
        create_dir(path)
        for file in files:
            dir = os.path.dirname(file)
            if len(dir):
                os.makedirs(os.path.join(path, dir), exist_ok=True)
            if os.path.basename(file).startswith("l"):
                os.symlink("target", os.path.join(path, file))
            else:
                with open(os.path.join(path, file), 'w') as fd:
                    fd.write(file)

    def check_files(path):
        for file in files:
            if os.path.islink(os.path.join(path, file)):
                assert os.readlink(os.path.join(path, file)) == "target"
            else:
                with open(os.path.join(path, file), 'r') as fd:
                    assert fd.read() == file

    def remove_files(path):
        shutil.rmtree(path, ignore_errors=True)

    def remove_files_rem(path, con):
        sftp = con._sftp_pool.acquire()
        try:
            for fileattr in sftp.listdir_attr(path):
                path_name = os.path.join(path, fileattr.filename)
                if stat.S_ISDIR(sftp.lstat(path_name).st_mode):
                    remove_files_rem(path_name, con)
                    sftp.rmdir(path_name)
                else:
                    sftp.remove(path_name)
        finally:
            con._sftp_pool.release(sftp)

    # local service
    env = {
        "__class__":
        "Environment",
        "geomop_root":
        geomop_root_local,
        "geomop_analysis_workspace":
        os.path.abspath(os.path.join(TEST_FILES, "workspace")),
        "python":
        "python3"
    }
    cl = {
        "__class__": "ConnectionLocal",
        "address": "localhost",
        "environment": env
    }
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # ConnectionLocal
    con = ConnectionLocal()
    con.set_local_service(local_service)
    con.connect()

    loc = os.path.join(LOCAL_TEST_FILES, "loc")
    rem = os.path.join(LOCAL_TEST_FILES, "rem")

    # upload
    create_files(loc)
    create_dir(rem)
    con.upload(paths, loc, rem, follow_symlinks=False)
    check_files(rem)
    remove_files(loc)
    remove_files(rem)

    # download
    create_files(rem)
    create_dir(loc)
    con.download(paths, loc, rem, follow_symlinks=False)
    check_files(loc)
    remove_files(loc)
    remove_files(rem)

    con.close_connections()

    # environment
    env_rem = {
        "__class__": "Environment",
        "geomop_root": geomop_root_local,
        "geomop_analysis_workspace": REMOTE_WORKSPACE,
        "python": "python3"
    }

    # ConnectionSSH
    u, p = get_test_password()
    con = ConnectionSSH({
        "address": "localhost",
        "uid": u,
        "password": p,
        "environment": env_rem
    })
    con.set_local_service(local_service)
    con.connect()

    loc = os.path.join(LOCAL_TEST_FILES, "loc")
    rem = os.path.join(REMOTE_TEST_FILES, "rem")

    # upload
    create_files(loc)
    create_dir(rem)
    con.upload(paths, loc, rem, follow_symlinks=False)
    check_files(rem)
    remove_files(loc)
    remove_files_rem(rem, con)
    remove_files(rem)

    # download
    create_files(rem)
    create_dir(loc)
    con.download(paths, loc, rem, follow_symlinks=False)
    check_files(loc)
    remove_files(loc)
    remove_files(rem)

    # FileNotFoundError
    try:
        con.upload(["x.txt"], loc, rem)
        assert False
    except FileNotFoundError:
        pass

    try:
        con.download(["x.txt"], loc, rem)
        assert False
    except FileNotFoundError:
        pass

    con.close_connections()
Example #9
0
def test_correct_run_connection_fail(request):
    local_service = None
    local_service_thread = None
    port_forwarder = None

    def finalizer():
        # stopping, closing
        if port_forwarder is not None:
            port_forwarder.close_all_forwarded_ports()

        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

        shutil.rmtree(TEST_FILES, ignore_errors=True)
    request.addfinalizer(finalizer)

    # create analysis and job workspaces
    os.makedirs(os.path.join(TEST_FILES, "workspace/job"), exist_ok=True)

    # local service
    env = {"__class__": "Environment",
           "geomop_root": geomop_root_local,
           "geomop_analysis_workspace": os.path.abspath(os.path.join(TEST_FILES, "workspace")),
           "python": "python3"}
    cl = {"__class__": "ConnectionLocal",
          "address": "localhost",
          "environment": env,
          "name": "local"}
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run, daemon=True)
    local_service_thread.start()

    # port forwarder
    port_forwarder = PortForwarder()
    forwarded_port = port_forwarder.forward_port(22)

    # job data
    env_rem = {"__class__": "Environment",
               "geomop_root": geomop_root_local,
               "geomop_analysis_workspace": REMOTE_WORKSPACE,
               "python": "python3"}
    u, p = get_test_password()
    cr = {"__class__": "ConnectionSSH",
          "address": "localhost",
          "port": forwarded_port,
          "uid": u,
          "password": p,
          "environment": env_rem,
          "name": "remote"}
    pe = {"__class__": "ProcessExec",
          "executable": {"__class__": "Executable",
                         "path": "JobPanel/services/job_service.py",
                         "script": True}}
    je = {"__class__": "Executable",
          "path": os.path.join(this_source_dir, "job_1.py"),
          "script": True}
    service_data = {"service_host_connection": cr,
                    "process": pe,
                    "job_executable": je,
                    "workspace": "job",
                    "config_file_name": GEOMOP_INTERNAL_DIR_NAME + "/job_service.conf",
                    "wait_before_run": 15.0}

    # start job
    local_service.request_start_child(service_data)
    #print(local_service._child_services.keys())
    job = local_service._child_services[2]

    # check correct job state transition
    time.sleep(5)
    port_forwarder.discard_data = True
    time.sleep(5)
    port_forwarder.discard_data = False
    time.sleep(10)
    assert job._status == ServiceStatus.running
    time.sleep(5)
    port_forwarder.discard_data = True
    time.sleep(5)
    port_forwarder.discard_data = False
    time.sleep(10)
    assert job._status == ServiceStatus.running
    assert job._online
    time.sleep(10)
    assert job._status == ServiceStatus.done
Example #10
0
def test_serialize_proxy(request):
    local_service = None
    local_service_thread = None
    new_local_service = None
    new_local_service_thread = None

    def finalizer():
        # stopping, closing
        if local_service_thread is not None:
            local_service._closing = True
            local_service_thread.join(timeout=5)
            assert not local_service_thread.is_alive()

        if new_local_service_thread is not None:
            new_local_service._closing = True
            new_local_service_thread.join(timeout=5)
            assert not new_local_service_thread.is_alive()

        shutil.rmtree(TEST_FILES, ignore_errors=True)

    request.addfinalizer(finalizer)

    # create analysis workspace
    os.makedirs(os.path.join(TEST_FILES, "workspace"), exist_ok=True)

    # local service
    env = {
        "__class__":
        "Environment",
        "geomop_root":
        geomop_root_local,
        "geomop_analysis_workspace":
        os.path.abspath(os.path.join(TEST_FILES, "workspace")),
        "python":
        "python3"
    }
    cl = {
        "__class__": "ConnectionLocal",
        "address": "localhost",
        "environment": env,
        "name": "local"
    }
    local_service = ServiceBase({"service_host_connection": cl})
    local_service_thread = threading.Thread(target=local_service.run,
                                            daemon=True)
    local_service_thread.start()

    # test service data
    pe = {
        "__class__": "ProcessExec",
        "executable": {
            "__class__": "Executable",
            "path": os.path.join(this_source_dir, "t_service.py"),
            "script": True
        }
    }
    service_data = {
        "service_host_connection": cl,
        "process": pe,
        "workspace": "",
        "config_file_name": "t_service.conf"
    }

    # start test service
    local_service.request_start_child(service_data)
    test_service_proxy = local_service._child_services[1]

    # wait for test service running
    time.sleep(5)
    assert test_service_proxy._status == ServiceStatus.running

    # serialize proxy
    serialized_proxy = test_service_proxy.serialize()

    # stop local service
    local_service._closing = True
    local_service_thread.join(timeout=5)
    assert not local_service_thread.is_alive()

    # new local service
    new_local_service = ServiceBase({"service_host_connection": cl})
    new_local_service_thread = threading.Thread(target=new_local_service.run,
                                                daemon=True)
    new_local_service_thread.start()

    # deserialize proxy
    del serialized_proxy["__class__"]
    test_service_proxy = ServiceProxy(serialized_proxy)
    con = new_local_service.get_connection(
        service_data["service_host_connection"])
    test_service_proxy.set_rep_con(new_local_service._repeater, con)
    test_service_proxy.connect_service()
    new_local_service._child_services[1] = test_service_proxy

    # check if test service running
    time.sleep(5)
    assert test_service_proxy._status == ServiceStatus.running
    assert test_service_proxy._online

    # stop test service
    answer = []
    test_service_proxy.call("request_stop", None, answer)
    time.sleep(5)