From 7734584cea727d7060cc741215dc90f8eb7037d8 Mon Sep 17 00:00:00 2001 From: Zhang Lei Date: Sat, 12 Oct 2024 16:09:38 +0800 Subject: [PATCH] fix(interactive): Fix `list_jobs` API (#4286) Fix the problem in `list_jobs` API #4247 --- flex/engines/http_server/actor/admin_actor.act.cc | 6 ++---- .../sdk/python/gs_interactive/client/status.py | 3 +++ .../sdk/python/gs_interactive/tests/conftest.py | 15 +++++++++++---- .../gs_interactive/tests/test_robustness.py | 14 ++++++++++++++ flex/interactive/sdk/python/setup.cfg | 3 ++- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/flex/engines/http_server/actor/admin_actor.act.cc b/flex/engines/http_server/actor/admin_actor.act.cc index 71aeb133d8a9..71fc96aec849 100644 --- a/flex/engines/http_server/actor/admin_actor.act.cc +++ b/flex/engines/http_server/actor/admin_actor.act.cc @@ -303,7 +303,7 @@ gs::Result to_json_str( const std::vector& job_metas) { rapidjson::Document res(rapidjson::kArrayType); for (auto& job_meta : job_metas) { - rapidjson::Document job_json; + rapidjson::Document job_json(rapidjson::kObjectType, &res.GetAllocator()); if (job_json.Parse(job_meta.ToJson().c_str()).HasParseError()) { LOG(ERROR) << "Fail to parse job meta"; return gs::Result(gs::Status( @@ -311,9 +311,7 @@ gs::Result to_json_str( } res.PushBack(job_json, res.GetAllocator()); } - return res.Empty() - ? gs::Result("{}") - : gs::Result(gs::rapidjson_stringify(res)); + return gs::Result(gs::rapidjson_stringify(res)); } admin_actor::~admin_actor() { diff --git a/flex/interactive/sdk/python/gs_interactive/client/status.py b/flex/interactive/sdk/python/gs_interactive/client/status.py index 6691d1b5ec4a..13af0e0ed660 100644 --- a/flex/interactive/sdk/python/gs_interactive/client/status.py +++ b/flex/interactive/sdk/python/gs_interactive/client/status.py @@ -22,6 +22,7 @@ from gs_interactive.exceptions import ForbiddenException from gs_interactive.exceptions import NotFoundException from gs_interactive.exceptions import ServiceException +from urllib3.exceptions import MaxRetryError from gs_interactive.client.generated.interactive_pb2 import Code as StatusCode from gs_interactive.models.api_response_with_code import APIResponseWithCode @@ -105,6 +106,8 @@ def from_exception(exception: ApiException): return Status(StatusCode.SERVICE_UNAVAILABLE, exception.body) else: return Status(StatusCode.INTERNAL_ERROR, exception.body) + elif isinstance(exception, MaxRetryError): + return Status(StatusCode.INTERNAL_ERROR, exception) return Status( StatusCode.UNKNOWN, "Unknown Error from exception " + exception.body ) diff --git a/flex/interactive/sdk/python/gs_interactive/tests/conftest.py b/flex/interactive/sdk/python/gs_interactive/tests/conftest.py index 469bab8c3dd0..6282fc4a393b 100644 --- a/flex/interactive/sdk/python/gs_interactive/tests/conftest.py +++ b/flex/interactive/sdk/python/gs_interactive/tests/conftest.py @@ -304,7 +304,7 @@ def neo4j_session(interactive_driver): _neo4j_sess.close() -@pytest.fixture(scope="module") +@pytest.fixture(scope="function") def create_modern_graph(interactive_session): create_graph_request = CreateGraphRequest.from_dict(modern_graph_full) resp = interactive_session.create_graph(create_graph_request) @@ -314,7 +314,7 @@ def create_modern_graph(interactive_session): delete_running_graph(interactive_session, graph_id) -@pytest.fixture(scope="module") +@pytest.fixture(scope="function") def create_vertex_only_modern_graph(interactive_session): create_graph_request = CreateGraphRequest.from_dict(modern_graph_vertex_only) resp = interactive_session.create_graph(create_graph_request) @@ -324,7 +324,7 @@ def create_vertex_only_modern_graph(interactive_session): delete_running_graph(interactive_session, graph_id) -@pytest.fixture(scope="module") +@pytest.fixture(scope="function") def create_partial_modern_graph(interactive_session): create_graph_request = CreateGraphRequest.from_dict(modern_graph_partial) resp = interactive_session.create_graph(create_graph_request) @@ -357,6 +357,14 @@ def import_data_to_vertex_only_modern_graph(sess: Session, graph_id: str): assert wait_job_finish(sess, job_id) +def import_data_to_vertex_only_modern_graph_no_wait(sess: Session, graph_id: str): + schema_mapping = SchemaMapping.from_dict(modern_graph_vertex_only_import_config) + resp = sess.bulk_loading(graph_id, schema_mapping) + assert resp.is_ok() + job_id = resp.get_value().job_id + print("job_id: ", job_id) + + def import_data_to_partial_modern_graph(sess: Session, graph_id: str): schema_mapping = SchemaMapping.from_dict(modern_graph_partial_import_config) resp = sess.bulk_loading(graph_id, schema_mapping) @@ -414,7 +422,6 @@ def delete_running_graph(sess: Session, graph_id: str): assert resp.is_ok() # drop the graph resp = sess.delete_graph(graph_id) - assert resp.is_ok() def create_procedure( diff --git a/flex/interactive/sdk/python/gs_interactive/tests/test_robustness.py b/flex/interactive/sdk/python/gs_interactive/tests/test_robustness.py index 63ffff495ef3..a19a5ec50a0a 100644 --- a/flex/interactive/sdk/python/gs_interactive/tests/test_robustness.py +++ b/flex/interactive/sdk/python/gs_interactive/tests/test_robustness.py @@ -29,6 +29,9 @@ from gs_interactive.tests.conftest import import_data_to_full_modern_graph from gs_interactive.tests.conftest import import_data_to_partial_modern_graph from gs_interactive.tests.conftest import import_data_to_vertex_only_modern_graph +from gs_interactive.tests.conftest import ( + import_data_to_vertex_only_modern_graph_no_wait, +) from gs_interactive.tests.conftest import run_cypher_test_suite from gs_interactive.tests.conftest import start_service_on_graph from gs_interactive.tests.conftest import update_procedure @@ -236,3 +239,14 @@ def test_builtin_procedure(interactive_session, neo4j_session, create_modern_gra '"person"', "4L", ) + + +def test_list_jobs(interactive_session, create_vertex_only_modern_graph): + print("[Test list jobs]") + import_data_to_vertex_only_modern_graph_no_wait( + interactive_session, create_vertex_only_modern_graph + ) + resp = interactive_session.delete_graph(create_vertex_only_modern_graph) + + resp = interactive_session.list_jobs() + assert resp.is_ok() and len(resp.get_value()) > 0 diff --git a/flex/interactive/sdk/python/setup.cfg b/flex/interactive/sdk/python/setup.cfg index 9a1ad2c082dd..1e1839250158 100644 --- a/flex/interactive/sdk/python/setup.cfg +++ b/flex/interactive/sdk/python/setup.cfg @@ -1,4 +1,5 @@ [isort] +profile = black ensure_newline_before_comments = True line_length = 88 force_single_line = True @@ -28,4 +29,4 @@ extend-exclude = gs_interactive/rest.py [pylint] -max-line-length = 88 \ No newline at end of file +max-line-length = 88