From 1e8b63362e062b63f9c16f5470b43e2137723381 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Fri, 7 Jun 2024 09:30:11 +0100 Subject: [PATCH 1/2] protobuf: automate derived file generation * Use the bufbuild/buf tool to: * Lint the protobuf schema. * Check for breaking changes. * Configure the generation of derived Python files. * Adds a GitHub action which automates the checking and generation of derived files and commits the results back on pull request branches. --- .codacy.yml | 2 +- .codecov.yml | 2 +- .coveragerc | 4 +- .github/workflows/protobuf.yml | 82 ++++ cylc/flow/data_messages_pb2.py | 100 ----- cylc/flow/data_store_mgr.py | 20 +- cylc/flow/network/protobuf/buf.gen.yaml | 10 + cylc/flow/network/protobuf/buf.yaml | 11 + .../network/protobuf/cylc/v5/schema.proto | 380 ++++++++++++++++++ .../network/protobuf/cylc/v5/schema_pb2.py | 99 +++++ .../protobuf/cylc/v5/schema_pb2.pyi} | 6 +- cylc/flow/network/server.py | 2 +- cylc/flow/prerequisite.py | 2 +- proto/buf.gen.yaml | 10 + proto/buf.yaml | 11 + .../cylc/flow/v5/schema.proto | 22 +- pytest.ini | 2 +- tests/unit/network/test_graphql.py | 2 +- tox.ini | 2 +- 19 files changed, 641 insertions(+), 128 deletions(-) create mode 100644 .github/workflows/protobuf.yml delete mode 100644 cylc/flow/data_messages_pb2.py create mode 100644 cylc/flow/network/protobuf/buf.gen.yaml create mode 100644 cylc/flow/network/protobuf/buf.yaml create mode 100644 cylc/flow/network/protobuf/cylc/v5/schema.proto create mode 100644 cylc/flow/network/protobuf/cylc/v5/schema_pb2.py rename cylc/flow/{data_messages_pb2.pyi => network/protobuf/cylc/v5/schema_pb2.pyi} (99%) create mode 100644 proto/buf.gen.yaml create mode 100644 proto/buf.yaml rename cylc/flow/data_messages.proto => proto/cylc/flow/v5/schema.proto (95%) diff --git a/.codacy.yml b/.codacy.yml index 0c37c0c2898..25f4ed60e5c 100644 --- a/.codacy.yml +++ b/.codacy.yml @@ -1,4 +1,4 @@ exclude_paths: - 'etc/**' - 'tests/**' - - 'cylc/flow/**_pb2.py' + - 'cylc/flow/network/protobuf/**_pb2.py' diff --git a/.codecov.yml b/.codecov.yml index 5b3d02564ba..51c036a4457 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -28,7 +28,7 @@ coverage: # files to ignore ignore: - "tests/**" - - "ws_messages_pb2.py" + - "cylc/flow/network/protobuf/cylc/v5/schema_pb2.py" - "cylc/flow/scripts/report_timings.py" flag_management: diff --git a/.coveragerc b/.coveragerc index 5a4b396f19c..3120d48b8a5 100644 --- a/.coveragerc +++ b/.coveragerc @@ -14,7 +14,7 @@ disable_warnings = module-not-measured omit = tests/* - */cylc/flow/*_pb2.py + */cylc/flow/network/protobuf/cylc/v5/*_pb2.py cylc/flow/etc/* cylc/flow/scripts/report_timings.py parallel = True @@ -43,7 +43,7 @@ fail_under=0 ignore_errors = False omit = tests/* - */cylc/flow/*_pb2.py + */cylc/flow/network/protobuf/cylc/v5/*_pb2.py cylc/flow/etc/* precision = 2 show_missing = False diff --git a/.github/workflows/protobuf.yml b/.github/workflows/protobuf.yml new file mode 100644 index 00000000000..65c4e1e61a9 --- /dev/null +++ b/.github/workflows/protobuf.yml @@ -0,0 +1,82 @@ +name: protobuf + +on: + pull_request: + # NOTE: don't run this on "workflow_dispatch" or "schedule" as it will commit + # directly to the branch + +jobs: + protobuf: + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + # we need all of the commits on the PR branch in order to be able to add new ones + fetch-depth: 100 + + - name: Configure git + uses: cylc/release-actions/configure-git@v1 + + - name: Install Protobuf + uses: mamba-org/setup-micromamba@v1 + with: + environment-name: protobuf + create-args: protobuf + init-shell: bash + + - name: Install bufbuild/buf + run: | + # activate homebrew (NOTE: must use "shell: bash -el {0}" to use this) + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # activate homebrew + + # NOTE: bufbuild does exist on conda-forge but hasn't been updated for a while + brew install bufbuild/buf/buf + + - name: Lint + run: | + # lint .proto files + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # activate homebrew + cd cylc/flow/network/protobuf + buf lint + + - name: Compatibility + shell: bash -el {0} + run: | + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # activate homebrew + cd cylc/flow/network/protobuf + # NOTE: "buf breaking" exits "100" for a missing file (i.e. new version not present on old branch) + # --against 'https://github.com/cylc/cylc-flow.git#tag=${{ github.base_ref }},subdir=proto') \ + buf breaking \ + --against 'https://github.com/oliver-sanders/cylc-flow.git#tag=${{ github.base_ref }},subdir=cylc/flow/network/protobuf' \ + || ( \ + ret=$?; \ + if [[ $ret == 100 ]]; then exit 0; \ + elif [[ $ret != 0 ]]; then echo '::error:: Breaking changes detected, create a new version of the protobuf schema if this is desired and increment the Cylc API number to match'; \ + fi \ + ) + + - name: Build + shell: bash -el {0} + run: | + # generate .py and .pyi files from the .proto files + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # activate homebrew + micromamba activate protobuf + cd cylc/flow/network/protobuf + buf generate + + - name: Commit & Push + run: | + if [[ -z $(git diff --stat) ]]; then + echo '::error:: No functional changes made to the protobuf schema' + exit 0 + else + echo '::info:: pushing update commit' + git add -u + git commit -m 'protobuf: updating generated files' + git remote add pr https://github.com/${{ github.event.pull_request.head.repo.owner.login }}/cylc-flow + git push pr HEAD:${{ github.head_ref }} + exit 0 + fi diff --git a/cylc/flow/data_messages_pb2.py b/cylc/flow/data_messages_pb2.py deleted file mode 100644 index 7fb5ae84d24..00000000000 --- a/cylc/flow/data_messages_pb2.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: data_messages.proto -# Protobuf Python Version: 4.25.3 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13\x64\x61ta_messages.proto\"\x96\x01\n\x06PbMeta\x12\x12\n\x05title\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03URL\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cuser_defined\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x08\n\x06_titleB\x0e\n\x0c_descriptionB\x06\n\x04_URLB\x0f\n\r_user_defined\"\xaa\x01\n\nPbTimeZone\x12\x12\n\x05hours\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07minutes\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x19\n\x0cstring_basic\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1c\n\x0fstring_extended\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x08\n\x06_hoursB\n\n\x08_minutesB\x0f\n\r_string_basicB\x12\n\x10_string_extended\"\'\n\x0fPbTaskProxyRefs\x12\x14\n\x0ctask_proxies\x18\x01 \x03(\t\"\xd4\x0c\n\nPbWorkflow\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06status\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x11\n\x04host\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x11\n\x04port\x18\x06 \x01(\x05H\x05\x88\x01\x01\x12\x12\n\x05owner\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\r\n\x05tasks\x18\x08 \x03(\t\x12\x10\n\x08\x66\x61milies\x18\t \x03(\t\x12\x1c\n\x05\x65\x64ges\x18\n \x01(\x0b\x32\x08.PbEdgesH\x07\x88\x01\x01\x12\x18\n\x0b\x61pi_version\x18\x0b \x01(\x05H\x08\x88\x01\x01\x12\x19\n\x0c\x63ylc_version\x18\x0c \x01(\tH\t\x88\x01\x01\x12\x19\n\x0clast_updated\x18\r \x01(\x01H\n\x88\x01\x01\x12\x1a\n\x04meta\x18\x0e \x01(\x0b\x32\x07.PbMetaH\x0b\x88\x01\x01\x12&\n\x19newest_active_cycle_point\x18\x10 \x01(\tH\x0c\x88\x01\x01\x12&\n\x19oldest_active_cycle_point\x18\x11 \x01(\tH\r\x88\x01\x01\x12\x15\n\x08reloaded\x18\x12 \x01(\x08H\x0e\x88\x01\x01\x12\x15\n\x08run_mode\x18\x13 \x01(\tH\x0f\x88\x01\x01\x12\x19\n\x0c\x63ycling_mode\x18\x14 \x01(\tH\x10\x88\x01\x01\x12\x32\n\x0cstate_totals\x18\x15 \x03(\x0b\x32\x1c.PbWorkflow.StateTotalsEntry\x12\x1d\n\x10workflow_log_dir\x18\x16 \x01(\tH\x11\x88\x01\x01\x12(\n\x0etime_zone_info\x18\x17 \x01(\x0b\x32\x0b.PbTimeZoneH\x12\x88\x01\x01\x12\x17\n\ntree_depth\x18\x18 \x01(\x05H\x13\x88\x01\x01\x12\x15\n\rjob_log_names\x18\x19 \x03(\t\x12\x14\n\x0cns_def_order\x18\x1a \x03(\t\x12\x0e\n\x06states\x18\x1b \x03(\t\x12\x14\n\x0ctask_proxies\x18\x1c \x03(\t\x12\x16\n\x0e\x66\x61mily_proxies\x18\x1d \x03(\t\x12\x17\n\nstatus_msg\x18\x1e \x01(\tH\x14\x88\x01\x01\x12\x1a\n\ris_held_total\x18\x1f \x01(\x05H\x15\x88\x01\x01\x12\x0c\n\x04jobs\x18 \x03(\t\x12\x15\n\x08pub_port\x18! \x01(\x05H\x16\x88\x01\x01\x12\x17\n\nbroadcasts\x18\" \x01(\tH\x17\x88\x01\x01\x12\x1c\n\x0fis_queued_total\x18# \x01(\x05H\x18\x88\x01\x01\x12=\n\x12latest_state_tasks\x18$ \x03(\x0b\x32!.PbWorkflow.LatestStateTasksEntry\x12\x13\n\x06pruned\x18% \x01(\x08H\x19\x88\x01\x01\x12\x1e\n\x11is_runahead_total\x18& \x01(\x05H\x1a\x88\x01\x01\x12\x1b\n\x0estates_updated\x18\' \x01(\x08H\x1b\x88\x01\x01\x12\x1c\n\x0fn_edge_distance\x18( \x01(\x05H\x1c\x88\x01\x01\x1a\x32\n\x10StateTotalsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x1aI\n\x15LatestStateTasksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.PbTaskProxyRefs:\x02\x38\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_statusB\x07\n\x05_hostB\x07\n\x05_portB\x08\n\x06_ownerB\x08\n\x06_edgesB\x0e\n\x0c_api_versionB\x0f\n\r_cylc_versionB\x0f\n\r_last_updatedB\x07\n\x05_metaB\x1c\n\x1a_newest_active_cycle_pointB\x1c\n\x1a_oldest_active_cycle_pointB\x0b\n\t_reloadedB\x0b\n\t_run_modeB\x0f\n\r_cycling_modeB\x13\n\x11_workflow_log_dirB\x11\n\x0f_time_zone_infoB\r\n\x0b_tree_depthB\r\n\x0b_status_msgB\x10\n\x0e_is_held_totalB\x0b\n\t_pub_portB\r\n\x0b_broadcastsB\x12\n\x10_is_queued_totalB\t\n\x07_prunedB\x14\n\x12_is_runahead_totalB\x11\n\x0f_states_updatedB\x12\n\x10_n_edge_distance\"\xe1\x06\n\tPbRuntime\x12\x15\n\x08platform\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x06script\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0binit_script\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x17\n\nenv_script\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nerr_script\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x18\n\x0b\x65xit_script\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x17\n\npre_script\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x18\n\x0bpost_script\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x19\n\x0cwork_sub_dir\x18\t \x01(\tH\x08\x88\x01\x01\x12(\n\x1b\x65xecution_polling_intervals\x18\n \x01(\tH\t\x88\x01\x01\x12#\n\x16\x65xecution_retry_delays\x18\x0b \x01(\tH\n\x88\x01\x01\x12!\n\x14\x65xecution_time_limit\x18\x0c \x01(\tH\x0b\x88\x01\x01\x12)\n\x1csubmission_polling_intervals\x18\r \x01(\tH\x0c\x88\x01\x01\x12$\n\x17submission_retry_delays\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x17\n\ndirectives\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x18\n\x0b\x65nvironment\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x14\n\x07outputs\x18\x11 \x01(\tH\x10\x88\x01\x01\x12\x17\n\ncompletion\x18\x12 \x01(\tH\x11\x88\x01\x01\x42\x0b\n\t_platformB\t\n\x07_scriptB\x0e\n\x0c_init_scriptB\r\n\x0b_env_scriptB\r\n\x0b_err_scriptB\x0e\n\x0c_exit_scriptB\r\n\x0b_pre_scriptB\x0e\n\x0c_post_scriptB\x0f\n\r_work_sub_dirB\x1e\n\x1c_execution_polling_intervalsB\x19\n\x17_execution_retry_delaysB\x17\n\x15_execution_time_limitB\x1f\n\x1d_submission_polling_intervalsB\x1a\n\x18_submission_retry_delaysB\r\n\x0b_directivesB\x0e\n\x0c_environmentB\n\n\x08_outputsB\r\n\x0b_completion\"\x9d\x05\n\x05PbJob\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\nsubmit_num\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x12\n\x05state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x17\n\ntask_proxy\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x1b\n\x0esubmitted_time\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x19\n\x0cstarted_time\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rfinished_time\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x13\n\x06job_id\x18\t \x01(\tH\x08\x88\x01\x01\x12\x1c\n\x0fjob_runner_name\x18\n \x01(\tH\t\x88\x01\x01\x12!\n\x14\x65xecution_time_limit\x18\x0e \x01(\x02H\n\x88\x01\x01\x12\x15\n\x08platform\x18\x0f \x01(\tH\x0b\x88\x01\x01\x12\x18\n\x0bjob_log_dir\x18\x11 \x01(\tH\x0c\x88\x01\x01\x12\x11\n\x04name\x18\x1e \x01(\tH\r\x88\x01\x01\x12\x18\n\x0b\x63ycle_point\x18\x1f \x01(\tH\x0e\x88\x01\x01\x12\x10\n\x08messages\x18 \x03(\t\x12 \n\x07runtime\x18! \x01(\x0b\x32\n.PbRuntimeH\x0f\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\r\n\x0b_submit_numB\x08\n\x06_stateB\r\n\x0b_task_proxyB\x11\n\x0f_submitted_timeB\x0f\n\r_started_timeB\x10\n\x0e_finished_timeB\t\n\x07_job_idB\x12\n\x10_job_runner_nameB\x17\n\x15_execution_time_limitB\x0b\n\t_platformB\x0e\n\x0c_job_log_dirB\x07\n\x05_nameB\x0e\n\x0c_cycle_pointB\n\n\x08_runtimeJ\x04\x08\x1d\x10\x1e\"\xe2\x02\n\x06PbTask\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\x04meta\x18\x04 \x01(\x0b\x32\x07.PbMetaH\x03\x88\x01\x01\x12\x1e\n\x11mean_elapsed_time\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x12\n\x05\x64\x65pth\x18\x06 \x01(\x05H\x05\x88\x01\x01\x12\x0f\n\x07proxies\x18\x07 \x03(\t\x12\x11\n\tnamespace\x18\x08 \x03(\t\x12\x0f\n\x07parents\x18\t \x03(\t\x12\x19\n\x0c\x66irst_parent\x18\n \x01(\tH\x06\x88\x01\x01\x12 \n\x07runtime\x18\x0b \x01(\x0b\x32\n.PbRuntimeH\x07\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_nameB\x07\n\x05_metaB\x14\n\x12_mean_elapsed_timeB\x08\n\x06_depthB\x0f\n\r_first_parentB\n\n\x08_runtime\"\xd8\x01\n\nPbPollTask\x12\x18\n\x0blocal_proxy\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08workflow\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0cremote_proxy\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x16\n\treq_state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x19\n\x0cgraph_string\x18\x05 \x01(\tH\x04\x88\x01\x01\x42\x0e\n\x0c_local_proxyB\x0b\n\t_workflowB\x0f\n\r_remote_proxyB\x0c\n\n_req_stateB\x0f\n\r_graph_string\"\xcb\x01\n\x0bPbCondition\x12\x17\n\ntask_proxy\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nexpr_alias\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x16\n\treq_state\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x16\n\tsatisfied\x18\x04 \x01(\x08H\x03\x88\x01\x01\x12\x14\n\x07message\x18\x05 \x01(\tH\x04\x88\x01\x01\x42\r\n\x0b_task_proxyB\r\n\x0b_expr_aliasB\x0c\n\n_req_stateB\x0c\n\n_satisfiedB\n\n\x08_message\"\x96\x01\n\x0ePbPrerequisite\x12\x17\n\nexpression\x18\x01 \x01(\tH\x00\x88\x01\x01\x12 \n\nconditions\x18\x02 \x03(\x0b\x32\x0c.PbCondition\x12\x14\n\x0c\x63ycle_points\x18\x03 \x03(\t\x12\x16\n\tsatisfied\x18\x04 \x01(\x08H\x01\x88\x01\x01\x42\r\n\x0b_expressionB\x0c\n\n_satisfied\"\x8c\x01\n\x08PbOutput\x12\x12\n\x05label\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07message\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tsatisfied\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x11\n\x04time\x18\x04 \x01(\x01H\x03\x88\x01\x01\x42\x08\n\x06_labelB\n\n\x08_messageB\x0c\n\n_satisfiedB\x07\n\x05_time\"\xa5\x01\n\tPbTrigger\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07message\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x16\n\tsatisfied\x18\x04 \x01(\x08H\x03\x88\x01\x01\x12\x11\n\x04time\x18\x05 \x01(\x01H\x04\x88\x01\x01\x42\x05\n\x03_idB\x08\n\x06_labelB\n\n\x08_messageB\x0c\n\n_satisfiedB\x07\n\x05_time\"\x91\x08\n\x0bPbTaskProxy\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04task\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x12\n\x05state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0b\x63ycle_point\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x12\n\x05\x64\x65pth\x18\x06 \x01(\x05H\x05\x88\x01\x01\x12\x18\n\x0bjob_submits\x18\x07 \x01(\x05H\x06\x88\x01\x01\x12*\n\x07outputs\x18\t \x03(\x0b\x32\x19.PbTaskProxy.OutputsEntry\x12\x11\n\tnamespace\x18\x0b \x03(\t\x12&\n\rprerequisites\x18\x0c \x03(\x0b\x32\x0f.PbPrerequisite\x12\x0c\n\x04jobs\x18\r \x03(\t\x12\x19\n\x0c\x66irst_parent\x18\x0f \x01(\tH\x07\x88\x01\x01\x12\x11\n\x04name\x18\x10 \x01(\tH\x08\x88\x01\x01\x12\x14\n\x07is_held\x18\x11 \x01(\x08H\t\x88\x01\x01\x12\r\n\x05\x65\x64ges\x18\x12 \x03(\t\x12\x11\n\tancestors\x18\x13 \x03(\t\x12\x16\n\tflow_nums\x18\x14 \x01(\tH\n\x88\x01\x01\x12=\n\x11\x65xternal_triggers\x18\x17 \x03(\x0b\x32\".PbTaskProxy.ExternalTriggersEntry\x12.\n\txtriggers\x18\x18 \x03(\x0b\x32\x1b.PbTaskProxy.XtriggersEntry\x12\x16\n\tis_queued\x18\x19 \x01(\x08H\x0b\x88\x01\x01\x12\x18\n\x0bis_runahead\x18\x1a \x01(\x08H\x0c\x88\x01\x01\x12\x16\n\tflow_wait\x18\x1b \x01(\x08H\r\x88\x01\x01\x12 \n\x07runtime\x18\x1c \x01(\x0b\x32\n.PbRuntimeH\x0e\x88\x01\x01\x12\x18\n\x0bgraph_depth\x18\x1d \x01(\x05H\x0f\x88\x01\x01\x1a\x39\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x18\n\x05value\x18\x02 \x01(\x0b\x32\t.PbOutput:\x02\x38\x01\x1a\x43\n\x15\x45xternalTriggersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x19\n\x05value\x18\x02 \x01(\x0b\x32\n.PbTrigger:\x02\x38\x01\x1a<\n\x0eXtriggersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x19\n\x05value\x18\x02 \x01(\x0b\x32\n.PbTrigger:\x02\x38\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_taskB\x08\n\x06_stateB\x0e\n\x0c_cycle_pointB\x08\n\x06_depthB\x0e\n\x0c_job_submitsB\x0f\n\r_first_parentB\x07\n\x05_nameB\n\n\x08_is_heldB\x0c\n\n_flow_numsB\x0c\n\n_is_queuedB\x0e\n\x0c_is_runaheadB\x0c\n\n_flow_waitB\n\n\x08_runtimeB\x0e\n\x0c_graph_depth\"\xc8\x02\n\x08PbFamily\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x11\n\x04name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\x04meta\x18\x04 \x01(\x0b\x32\x07.PbMetaH\x03\x88\x01\x01\x12\x12\n\x05\x64\x65pth\x18\x05 \x01(\x05H\x04\x88\x01\x01\x12\x0f\n\x07proxies\x18\x06 \x03(\t\x12\x0f\n\x07parents\x18\x07 \x03(\t\x12\x13\n\x0b\x63hild_tasks\x18\x08 \x03(\t\x12\x16\n\x0e\x63hild_families\x18\t \x03(\t\x12\x19\n\x0c\x66irst_parent\x18\n \x01(\tH\x05\x88\x01\x01\x12 \n\x07runtime\x18\x0b \x01(\x0b\x32\n.PbRuntimeH\x06\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_nameB\x07\n\x05_metaB\x08\n\x06_depthB\x0f\n\r_first_parentB\n\n\x08_runtime\"\xae\x06\n\rPbFamilyProxy\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63ycle_point\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x11\n\x04name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x13\n\x06\x66\x61mily\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x12\n\x05state\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x12\n\x05\x64\x65pth\x18\x07 \x01(\x05H\x06\x88\x01\x01\x12\x19\n\x0c\x66irst_parent\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x13\n\x0b\x63hild_tasks\x18\n \x03(\t\x12\x16\n\x0e\x63hild_families\x18\x0b \x03(\t\x12\x14\n\x07is_held\x18\x0c \x01(\x08H\x08\x88\x01\x01\x12\x11\n\tancestors\x18\r \x03(\t\x12\x0e\n\x06states\x18\x0e \x03(\t\x12\x35\n\x0cstate_totals\x18\x0f \x03(\x0b\x32\x1f.PbFamilyProxy.StateTotalsEntry\x12\x1a\n\ris_held_total\x18\x10 \x01(\x05H\t\x88\x01\x01\x12\x16\n\tis_queued\x18\x11 \x01(\x08H\n\x88\x01\x01\x12\x1c\n\x0fis_queued_total\x18\x12 \x01(\x05H\x0b\x88\x01\x01\x12\x18\n\x0bis_runahead\x18\x13 \x01(\x08H\x0c\x88\x01\x01\x12\x1e\n\x11is_runahead_total\x18\x14 \x01(\x05H\r\x88\x01\x01\x12 \n\x07runtime\x18\x15 \x01(\x0b\x32\n.PbRuntimeH\x0e\x88\x01\x01\x12\x18\n\x0bgraph_depth\x18\x16 \x01(\x05H\x0f\x88\x01\x01\x1a\x32\n\x10StateTotalsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x0e\n\x0c_cycle_pointB\x07\n\x05_nameB\t\n\x07_familyB\x08\n\x06_stateB\x08\n\x06_depthB\x0f\n\r_first_parentB\n\n\x08_is_heldB\x10\n\x0e_is_held_totalB\x0c\n\n_is_queuedB\x12\n\x10_is_queued_totalB\x0e\n\x0c_is_runaheadB\x14\n\x12_is_runahead_totalB\n\n\x08_runtimeB\x0e\n\x0c_graph_depth\"\xbc\x01\n\x06PbEdge\x12\x12\n\x05stamp\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x02id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06source\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x13\n\x06target\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x14\n\x07suicide\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x11\n\x04\x63ond\x18\x06 \x01(\x08H\x05\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\t\n\x07_sourceB\t\n\x07_targetB\n\n\x08_suicideB\x07\n\x05_cond\"{\n\x07PbEdges\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\r\n\x05\x65\x64ges\x18\x02 \x03(\t\x12+\n\x16workflow_polling_tasks\x18\x03 \x03(\x0b\x32\x0b.PbPollTask\x12\x0e\n\x06leaves\x18\x04 \x03(\t\x12\x0c\n\x04\x66\x65\x65t\x18\x05 \x03(\tB\x05\n\x03_id\"\xf2\x01\n\x10PbEntireWorkflow\x12\"\n\x08workflow\x18\x01 \x01(\x0b\x32\x0b.PbWorkflowH\x00\x88\x01\x01\x12\x16\n\x05tasks\x18\x02 \x03(\x0b\x32\x07.PbTask\x12\"\n\x0ctask_proxies\x18\x03 \x03(\x0b\x32\x0c.PbTaskProxy\x12\x14\n\x04jobs\x18\x04 \x03(\x0b\x32\x06.PbJob\x12\x1b\n\x08\x66\x61milies\x18\x05 \x03(\x0b\x32\t.PbFamily\x12&\n\x0e\x66\x61mily_proxies\x18\x06 \x03(\x0b\x32\x0e.PbFamilyProxy\x12\x16\n\x05\x65\x64ges\x18\x07 \x03(\x0b\x32\x07.PbEdgeB\x0b\n\t_workflow\"\xaf\x01\n\x07\x45\x44\x65ltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x16\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x07.PbEdge\x12\x18\n\x07updated\x18\x04 \x03(\x0b\x32\x07.PbEdge\x12\x0e\n\x06pruned\x18\x05 \x03(\t\x12\x15\n\x08reloaded\x18\x06 \x01(\x08H\x02\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xb3\x01\n\x07\x46\x44\x65ltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x18\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\t.PbFamily\x12\x1a\n\x07updated\x18\x04 \x03(\x0b\x32\t.PbFamily\x12\x0e\n\x06pruned\x18\x05 \x03(\t\x12\x15\n\x08reloaded\x18\x06 \x01(\x08H\x02\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xbe\x01\n\x08\x46PDeltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x1d\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x0e.PbFamilyProxy\x12\x1f\n\x07updated\x18\x04 \x03(\x0b\x32\x0e.PbFamilyProxy\x12\x0e\n\x06pruned\x18\x05 \x03(\t\x12\x15\n\x08reloaded\x18\x06 \x01(\x08H\x02\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xad\x01\n\x07JDeltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x15\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x06.PbJob\x12\x17\n\x07updated\x18\x04 \x03(\x0b\x32\x06.PbJob\x12\x0e\n\x06pruned\x18\x05 \x03(\t\x12\x15\n\x08reloaded\x18\x06 \x01(\x08H\x02\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xaf\x01\n\x07TDeltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x16\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x07.PbTask\x12\x18\n\x07updated\x18\x04 \x03(\x0b\x32\x07.PbTask\x12\x0e\n\x06pruned\x18\x05 \x03(\t\x12\x15\n\x08reloaded\x18\x06 \x01(\x08H\x02\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xba\x01\n\x08TPDeltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x1b\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x0c.PbTaskProxy\x12\x1d\n\x07updated\x18\x04 \x03(\x0b\x32\x0c.PbTaskProxy\x12\x0e\n\x06pruned\x18\x05 \x03(\t\x12\x15\n\x08reloaded\x18\x06 \x01(\x08H\x02\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xc3\x01\n\x07WDeltas\x12\x11\n\x04time\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x1f\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x0b\x32\x0b.PbWorkflowH\x01\x88\x01\x01\x12!\n\x07updated\x18\x03 \x01(\x0b\x32\x0b.PbWorkflowH\x02\x88\x01\x01\x12\x15\n\x08reloaded\x18\x04 \x01(\x08H\x03\x88\x01\x01\x12\x13\n\x06pruned\x18\x05 \x01(\tH\x04\x88\x01\x01\x42\x07\n\x05_timeB\x08\n\x06_addedB\n\n\x08_updatedB\x0b\n\t_reloadedB\t\n\x07_pruned\"\xd1\x01\n\tAllDeltas\x12\x1a\n\x08\x66\x61milies\x18\x01 \x01(\x0b\x32\x08.FDeltas\x12!\n\x0e\x66\x61mily_proxies\x18\x02 \x01(\x0b\x32\t.FPDeltas\x12\x16\n\x04jobs\x18\x03 \x01(\x0b\x32\x08.JDeltas\x12\x17\n\x05tasks\x18\x04 \x01(\x0b\x32\x08.TDeltas\x12\x1f\n\x0ctask_proxies\x18\x05 \x01(\x0b\x32\t.TPDeltas\x12\x17\n\x05\x65\x64ges\x18\x06 \x01(\x0b\x32\x08.EDeltas\x12\x1a\n\x08workflow\x18\x07 \x01(\x0b\x32\x08.WDeltasb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'data_messages_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - _globals['_PBWORKFLOW_STATETOTALSENTRY']._options = None - _globals['_PBWORKFLOW_STATETOTALSENTRY']._serialized_options = b'8\001' - _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._options = None - _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._serialized_options = b'8\001' - _globals['_PBTASKPROXY_OUTPUTSENTRY']._options = None - _globals['_PBTASKPROXY_OUTPUTSENTRY']._serialized_options = b'8\001' - _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._options = None - _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._serialized_options = b'8\001' - _globals['_PBTASKPROXY_XTRIGGERSENTRY']._options = None - _globals['_PBTASKPROXY_XTRIGGERSENTRY']._serialized_options = b'8\001' - _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._options = None - _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._serialized_options = b'8\001' - _globals['_PBMETA']._serialized_start=24 - _globals['_PBMETA']._serialized_end=174 - _globals['_PBTIMEZONE']._serialized_start=177 - _globals['_PBTIMEZONE']._serialized_end=347 - _globals['_PBTASKPROXYREFS']._serialized_start=349 - _globals['_PBTASKPROXYREFS']._serialized_end=388 - _globals['_PBWORKFLOW']._serialized_start=391 - _globals['_PBWORKFLOW']._serialized_end=2011 - _globals['_PBWORKFLOW_STATETOTALSENTRY']._serialized_start=1441 - _globals['_PBWORKFLOW_STATETOTALSENTRY']._serialized_end=1491 - _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._serialized_start=1493 - _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._serialized_end=1566 - _globals['_PBRUNTIME']._serialized_start=2014 - _globals['_PBRUNTIME']._serialized_end=2879 - _globals['_PBJOB']._serialized_start=2882 - _globals['_PBJOB']._serialized_end=3551 - _globals['_PBTASK']._serialized_start=3554 - _globals['_PBTASK']._serialized_end=3908 - _globals['_PBPOLLTASK']._serialized_start=3911 - _globals['_PBPOLLTASK']._serialized_end=4127 - _globals['_PBCONDITION']._serialized_start=4130 - _globals['_PBCONDITION']._serialized_end=4333 - _globals['_PBPREREQUISITE']._serialized_start=4336 - _globals['_PBPREREQUISITE']._serialized_end=4486 - _globals['_PBOUTPUT']._serialized_start=4489 - _globals['_PBOUTPUT']._serialized_end=4629 - _globals['_PBTRIGGER']._serialized_start=4632 - _globals['_PBTRIGGER']._serialized_end=4797 - _globals['_PBTASKPROXY']._serialized_start=4800 - _globals['_PBTASKPROXY']._serialized_end=5841 - _globals['_PBTASKPROXY_OUTPUTSENTRY']._serialized_start=5451 - _globals['_PBTASKPROXY_OUTPUTSENTRY']._serialized_end=5508 - _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._serialized_start=5510 - _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._serialized_end=5577 - _globals['_PBTASKPROXY_XTRIGGERSENTRY']._serialized_start=5579 - _globals['_PBTASKPROXY_XTRIGGERSENTRY']._serialized_end=5639 - _globals['_PBFAMILY']._serialized_start=5844 - _globals['_PBFAMILY']._serialized_end=6172 - _globals['_PBFAMILYPROXY']._serialized_start=6175 - _globals['_PBFAMILYPROXY']._serialized_end=6989 - _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._serialized_start=1441 - _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._serialized_end=1491 - _globals['_PBEDGE']._serialized_start=6992 - _globals['_PBEDGE']._serialized_end=7180 - _globals['_PBEDGES']._serialized_start=7182 - _globals['_PBEDGES']._serialized_end=7305 - _globals['_PBENTIREWORKFLOW']._serialized_start=7308 - _globals['_PBENTIREWORKFLOW']._serialized_end=7550 - _globals['_EDELTAS']._serialized_start=7553 - _globals['_EDELTAS']._serialized_end=7728 - _globals['_FDELTAS']._serialized_start=7731 - _globals['_FDELTAS']._serialized_end=7910 - _globals['_FPDELTAS']._serialized_start=7913 - _globals['_FPDELTAS']._serialized_end=8103 - _globals['_JDELTAS']._serialized_start=8106 - _globals['_JDELTAS']._serialized_end=8279 - _globals['_TDELTAS']._serialized_start=8282 - _globals['_TDELTAS']._serialized_end=8457 - _globals['_TPDELTAS']._serialized_start=8460 - _globals['_TPDELTAS']._serialized_end=8646 - _globals['_WDELTAS']._serialized_start=8649 - _globals['_WDELTAS']._serialized_end=8844 - _globals['_ALLDELTAS']._serialized_start=8847 - _globals['_ALLDELTAS']._serialized_end=9056 -# @@protoc_insertion_point(module_scope) diff --git a/cylc/flow/data_store_mgr.py b/cylc/flow/data_store_mgr.py index 9b3b39509a2..161cedae0c3 100644 --- a/cylc/flow/data_store_mgr.py +++ b/cylc/flow/data_store_mgr.py @@ -73,7 +73,7 @@ from cylc.flow import __version__ as CYLC_VERSION, LOG from cylc.flow.cycling.loader import get_point -from cylc.flow.data_messages_pb2 import ( +from cylc.flow.network.protobuf.cylc.v5.schema_pb2 import ( PbEdge, PbEntireWorkflow, PbFamily, PbFamilyProxy, PbJob, PbTask, PbTaskProxy, PbWorkflow, PbRuntime, AllDeltas, EDeltas, FDeltas, FPDeltas, JDeltas, TDeltas, TPDeltas, WDeltas) @@ -382,7 +382,7 @@ def create_delta_store(delta=None, workflow_id=None): """Create a mini data-store out of the all deltas message. Args: - delta (cylc.flow.data_messages_pb2.AllDeltas): + delta (cylc.flow.v5.schema_pb2.AllDeltas): The message of accumulated deltas for publish/push. workflow_id (str): The workflow ID. @@ -430,18 +430,18 @@ class DataStoreMgr: Local store of config.get_first_parent_ancestors() .data (dict): .edges (dict): - cylc.flow.data_messages_pb2.PbEdge by internal ID. + cylc.flow.v5.schema_pb2.PbEdge by internal ID. .families (dict): - cylc.flow.data_messages_pb2.PbFamily by name (internal ID). + cylc.flow.v5.schema_pb2.PbFamily by name (internal ID). .family_proxies (dict): - cylc.flow.data_messages_pb2.PbFamilyProxy by internal ID. + cylc.flow.v5.schema_pb2.PbFamilyProxy by internal ID. .jobs (dict): - cylc.flow.data_messages_pb2.PbJob by internal ID. + cylc.flow.v5.schema_pb2.PbJob by internal ID. .tasks (dict): - cylc.flow.data_messages_pb2.PbTask by name (internal ID). + cylc.flow.v5.schema_pb2.PbTask by name (internal ID). .task_proxies (dict): - cylc.flow.data_messages_pb2.PbTaskProxy by internal ID. - .workflow (cylc.flow.data_messages_pb2.PbWorkflow) + cylc.flow.v5.schema_pb2.PbTaskProxy by internal ID. + .workflow (cylc.flow.v5.schema_pb2.PbWorkflow) Message containing the global information of the workflow. .descendants (dict): Local store of config.get_first_parent_descendants() @@ -2688,7 +2688,7 @@ def get_entire_workflow(self): """Gather data elements into single Protobuf message. Returns: - cylc.flow.data_messages_pb2.PbEntireWorkflow + cylc.flow.v5.schema_pb2.PbEntireWorkflow """ diff --git a/cylc/flow/network/protobuf/buf.gen.yaml b/cylc/flow/network/protobuf/buf.gen.yaml new file mode 100644 index 00000000000..ad4f94328d9 --- /dev/null +++ b/cylc/flow/network/protobuf/buf.gen.yaml @@ -0,0 +1,10 @@ +# file containing protobuf configuration + +version: v2 + +plugins: + - protoc_builtin: python + out: . + + - protoc_builtin: pyi + out: . diff --git a/cylc/flow/network/protobuf/buf.yaml b/cylc/flow/network/protobuf/buf.yaml new file mode 100644 index 00000000000..27a2c58ce65 --- /dev/null +++ b/cylc/flow/network/protobuf/buf.yaml @@ -0,0 +1,11 @@ +# file containing protobuf configuration + +version: v2 + +lint: + use: + - DEFAULT + +breaking: + use: + - FILE diff --git a/cylc/flow/network/protobuf/cylc/v5/schema.proto b/cylc/flow/network/protobuf/cylc/v5/schema.proto new file mode 100644 index 00000000000..ae5901ea68a --- /dev/null +++ b/cylc/flow/network/protobuf/cylc/v5/schema.proto @@ -0,0 +1,380 @@ +syntax = "proto3"; + +package cylc.v5; + +/* THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. + Copyright (C) NIWA & British Crown (Met Office) & Contributors. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see .*/ + + +/* Protobuf message definitions + * + * The original intention of these messages is for use as data elements sent + * to and used in resolving GraphQL queries at the UI Server. + * + * This file is not needed at runtime. It is used to generate python protobuf + * message modules. + * + * Hand edit this file to make changes to the schema, use "bufbuild" to lint + * changes and regenerate Python files e.g: + * + * # cd into the directory which contains the "buf.yaml" file, this is the + * # project's root directory as far as protobuf is concerned + * $ cd cylc/flow/network/protobuf + * + * # install bufbuild + * $ npm install @bufbuild/buf + * + * # lint protobuf schema source files + * node_modules/@bufbuild/buf/bin/buf lint + * + * # generate Python files + * node_modules/@bufbuild/buf/bin/buf generate + * + * WARNING: Avoid re-indexing existing fields! + * - Field numbers do not need to be continuous/sequential (gaps are fine). + * - These numbers are used by the client to know which field they correspond to, + * so changing them can break back-compatibility (i.e. already running or old UIS). + * - If in doubt, just leave the current fields as is, and just take a number + * not in use for new fields. + * + * https://developers.google.com/protocol-buffers/docs/proto3#assigning_field_numbers + * + * */ + + +// Query type messages +message PbMeta { + optional string title = 1; + optional string description = 2; + // buf:lint:ignore FIELD_LOWER_SNAKE_CASE + optional string URL = 3; +} + +message PbTimeZone { + optional int32 hours = 1; + optional int32 minutes = 2; + optional string string_basic = 3; + optional string string_extended = 4; +} + +message PbTaskProxyRefs { + repeated string task_proxies = 1; +} + +message PbWorkflow { + optional string stamp = 1; + optional string id = 2; + optional string name = 3; + optional string status = 4; + optional string host = 5; + optional int32 port = 6; + optional string owner = 7; + repeated string tasks = 8; + repeated string families = 9; + optional PbEdges edges = 10; + optional int32 api_version = 11; + optional string cylc_version = 12; + optional double last_updated = 13; + optional PbMeta meta = 14; + optional string newest_active_cycle_point = 16; + optional string oldest_active_cycle_point = 17; + optional bool reloaded = 18; + optional string run_mode = 19; + optional string cycling_mode = 20; + map state_totals = 21; + optional string workflow_log_dir = 22; + optional PbTimeZone time_zone_info = 23; + optional int32 tree_depth = 24; + repeated string job_log_names = 25; + repeated string ns_def_order = 26; + repeated string states = 27; + repeated string task_proxies = 28; + repeated string family_proxies = 29; + optional string status_msg = 30; + optional int32 is_held_total = 31; + repeated string jobs = 32; + optional int32 pub_port = 33; + optional string broadcasts = 34; + optional int32 is_queued_total = 35; + map latest_state_tasks = 36; + optional bool pruned = 37; + optional int32 is_runahead_total = 38; + optional bool states_updated = 39; + optional int32 n_edge_distance = 40; +} + +// Selected runtime fields +message PbRuntime { + optional string platform = 1; + optional string script = 2; + optional string init_script = 3; + optional string env_script = 4; + optional string err_script = 5; + optional string exit_script = 6; + optional string pre_script = 7; + optional string post_script = 8; + optional string work_sub_dir = 9; + optional string execution_polling_intervals = 10; + optional string execution_retry_delays = 11; + optional string execution_time_limit = 12; + optional string submission_polling_intervals = 13; + optional string submission_retry_delays = 14; + optional string directives = 15; + optional string environment = 16; + optional string outputs = 17; + optional string completion = 18; +} + + +// Nodes +message PbJob { + reserved 29; /* see https://github.com/cylc/cylc-flow/pull/5672 */ + optional string stamp = 1; + optional string id = 2; + optional int32 submit_num = 3; + optional string state = 4; + optional string task_proxy = 5; + optional string submitted_time = 6; + optional string started_time = 7; + optional string finished_time = 8; + optional string job_id = 9; + optional string job_runner_name = 10; + optional float execution_time_limit = 14; + optional string platform = 15; + optional string job_log_dir = 17; + optional string name = 30; /* filter item */ + optional string cycle_point = 31; /* filter item */ + repeated string messages = 32; + optional PbRuntime runtime = 33; +} + +message PbTask { + optional string stamp = 1; + optional string id = 2; + optional string name = 3; + optional PbMeta meta = 4; + optional float mean_elapsed_time = 5; + optional int32 depth = 6; + repeated string proxies = 7; + repeated string namespace = 8; + repeated string parents = 9; + optional string first_parent = 10; + optional PbRuntime runtime = 11; +} + +message PbPollTask { + optional string local_proxy = 1; + optional string workflow = 2; + optional string remote_proxy = 3; + optional string req_state = 4; + optional string graph_string = 5; +} + +message PbCondition { + optional string task_proxy = 1; + optional string expr_alias = 2; + optional string req_state = 3; + optional bool satisfied = 4; + optional string message = 5; +} + +message PbPrerequisite { + optional string expression = 1; + repeated PbCondition conditions = 2; + repeated string cycle_points = 3; + optional bool satisfied = 4; +} + +message PbOutput { + optional string label = 1; + optional string message = 2; + optional bool satisfied = 3; + optional double time = 4; +} + +message PbTrigger { + optional string id = 1; + optional string label = 2; + optional string message = 3; + optional bool satisfied = 4; + optional double time = 5; +} + +message PbTaskProxy { + optional string stamp = 1; + optional string id = 2; + optional string task = 3; + optional string state = 4; + optional string cycle_point = 5; + optional int32 depth = 6; + optional int32 job_submits = 7; + map outputs = 9; + repeated string namespace = 11; + repeated PbPrerequisite prerequisites = 12; + repeated string jobs = 13; + optional string first_parent = 15; + optional string name = 16; /* filter item */ + optional bool is_held = 17; + repeated string edges = 18; + repeated string ancestors = 19; + optional string flow_nums = 20; + map external_triggers = 23; + map xtriggers = 24; + optional bool is_queued = 25; + optional bool is_runahead = 26; + optional bool flow_wait = 27; + optional PbRuntime runtime = 28; + optional int32 graph_depth = 29; +} + +message PbFamily { + optional string stamp = 1; + optional string id = 2; + optional string name = 3; + optional PbMeta meta = 4; + optional int32 depth = 5; + repeated string proxies = 6; + repeated string parents = 7; + repeated string child_tasks = 8; + repeated string child_families = 9; + optional string first_parent = 10; + optional PbRuntime runtime = 11; +} + +message PbFamilyProxy { + optional string stamp = 1; + optional string id = 2; + optional string cycle_point = 3; + optional string name = 4; /* filter item */ + optional string family = 5; + optional string state = 6; + optional int32 depth = 7; + optional string first_parent = 8; + repeated string child_tasks = 10; + repeated string child_families = 11; + optional bool is_held = 12; + repeated string ancestors = 13; + repeated string states = 14; + map state_totals = 15; + optional int32 is_held_total = 16; + optional bool is_queued = 17; + optional int32 is_queued_total = 18; + optional bool is_runahead = 19; + optional int32 is_runahead_total = 20; + optional PbRuntime runtime = 21; + optional int32 graph_depth = 22; +} + +message PbEdge { + optional string stamp = 1; + optional string id = 2; + optional string source = 3; + optional string target = 4; + optional bool suicide = 5; + optional bool cond = 6; +} + +message PbEdges { + optional string id = 1; + repeated string edges = 2; + repeated PbPollTask workflow_polling_tasks = 3; + repeated string leaves = 4; + repeated string feet = 5; +} + + +/* Now bundle for messaging */ +message PbEntireWorkflow { + optional PbWorkflow workflow = 1; + repeated PbTask tasks = 2; + repeated PbTaskProxy task_proxies = 3; + repeated PbJob jobs = 4; + repeated PbFamily families = 5; + repeated PbFamilyProxy family_proxies = 6; + repeated PbEdge edges = 7; +} + +message EDeltas { + optional double time = 1; + optional int64 checksum = 2; + repeated PbEdge added = 3; + repeated PbEdge updated = 4; + repeated string pruned = 5; + optional bool reloaded = 6; +} + +message FDeltas { + optional double time = 1; + optional int64 checksum = 2; + repeated PbFamily added = 3; + repeated PbFamily updated = 4; + repeated string pruned = 5; + optional bool reloaded = 6; +} + +message FPDeltas { + optional double time = 1; + optional int64 checksum = 2; + repeated PbFamilyProxy added = 3; + repeated PbFamilyProxy updated = 4; + repeated string pruned = 5; + optional bool reloaded = 6; +} + +message JDeltas { + optional double time = 1; + optional int64 checksum = 2; + repeated PbJob added = 3; + repeated PbJob updated = 4; + repeated string pruned = 5; + optional bool reloaded = 6; +} + +message TDeltas { + optional double time = 1; + optional int64 checksum = 2; + repeated PbTask added = 3; + repeated PbTask updated = 4; + repeated string pruned = 5; + optional bool reloaded = 6; +} + +message TPDeltas { + optional double time = 1; + optional int64 checksum = 2; + repeated PbTaskProxy added = 3; + repeated PbTaskProxy updated = 4; + repeated string pruned = 5; + optional bool reloaded = 6; +} + +message WDeltas { + optional double time = 1; + optional PbWorkflow added = 2; + optional PbWorkflow updated = 3; + optional bool reloaded = 4; + optional string pruned = 5; +} + +message AllDeltas { + FDeltas families = 1; + FPDeltas family_proxies = 2; + JDeltas jobs = 3; + TDeltas tasks = 4; + TPDeltas task_proxies = 5; + EDeltas edges = 6; + WDeltas workflow = 7; +} diff --git a/cylc/flow/network/protobuf/cylc/v5/schema_pb2.py b/cylc/flow/network/protobuf/cylc/v5/schema_pb2.py new file mode 100644 index 00000000000..b24be1e7e42 --- /dev/null +++ b/cylc/flow/network/protobuf/cylc/v5/schema_pb2.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: cylc/v5/schema.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14\x63ylc/v5/schema.proto\x12\x07\x63ylc.v5\"\xec\x01\n\x06PbMeta\x12\x19\n\x05title\x18\x01 \x01(\tH\x00R\x05title\x88\x01\x01\x12%\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x01R\x0b\x64\x65scription\x88\x01\x01\x12\x15\n\x03URL\x18\x03 \x01(\tH\x02R\x03URL\x88\x01\x01\x12&\n\x0cuser_defined\x18\x04 \x01(\tH\x03R\x0buserDefined\x88\x01\x01\x12 \n\tnew_field\x18\x05 \x01(\tH\x04R\x08newField\x88\x01\x01\x42\x08\n\x06_titleB\x0e\n\x0c_descriptionB\x06\n\x04_URLB\x0f\n\r_user_definedB\x0c\n\n_new_field\"\xd7\x01\n\nPbTimeZone\x12\x19\n\x05hours\x18\x01 \x01(\x05H\x00R\x05hours\x88\x01\x01\x12\x1d\n\x07minutes\x18\x02 \x01(\x05H\x01R\x07minutes\x88\x01\x01\x12&\n\x0cstring_basic\x18\x03 \x01(\tH\x02R\x0bstringBasic\x88\x01\x01\x12,\n\x0fstring_extended\x18\x04 \x01(\tH\x03R\x0estringExtended\x88\x01\x01\x42\x08\n\x06_hoursB\n\n\x08_minutesB\x0f\n\r_string_basicB\x12\n\x10_string_extended\"4\n\x0fPbTaskProxyRefs\x12!\n\x0ctask_proxies\x18\x01 \x03(\tR\x0btaskProxies\"\xda\x10\n\nPbWorkflow\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12\x17\n\x04name\x18\x03 \x01(\tH\x02R\x04name\x88\x01\x01\x12\x1b\n\x06status\x18\x04 \x01(\tH\x03R\x06status\x88\x01\x01\x12\x17\n\x04host\x18\x05 \x01(\tH\x04R\x04host\x88\x01\x01\x12\x17\n\x04port\x18\x06 \x01(\x05H\x05R\x04port\x88\x01\x01\x12\x19\n\x05owner\x18\x07 \x01(\tH\x06R\x05owner\x88\x01\x01\x12\x14\n\x05tasks\x18\x08 \x03(\tR\x05tasks\x12\x1a\n\x08\x66\x61milies\x18\t \x03(\tR\x08\x66\x61milies\x12+\n\x05\x65\x64ges\x18\n \x01(\x0b\x32\x10.cylc.v5.PbEdgesH\x07R\x05\x65\x64ges\x88\x01\x01\x12$\n\x0b\x61pi_version\x18\x0b \x01(\x05H\x08R\napiVersion\x88\x01\x01\x12&\n\x0c\x63ylc_version\x18\x0c \x01(\tH\tR\x0b\x63ylcVersion\x88\x01\x01\x12&\n\x0clast_updated\x18\r \x01(\x01H\nR\x0blastUpdated\x88\x01\x01\x12(\n\x04meta\x18\x0e \x01(\x0b\x32\x0f.cylc.v5.PbMetaH\x0bR\x04meta\x88\x01\x01\x12>\n\x19newest_active_cycle_point\x18\x10 \x01(\tH\x0cR\x16newestActiveCyclePoint\x88\x01\x01\x12>\n\x19oldest_active_cycle_point\x18\x11 \x01(\tH\rR\x16oldestActiveCyclePoint\x88\x01\x01\x12\x1f\n\x08reloaded\x18\x12 \x01(\x08H\x0eR\x08reloaded\x88\x01\x01\x12\x1e\n\x08run_mode\x18\x13 \x01(\tH\x0fR\x07runMode\x88\x01\x01\x12&\n\x0c\x63ycling_mode\x18\x14 \x01(\tH\x10R\x0b\x63yclingMode\x88\x01\x01\x12G\n\x0cstate_totals\x18\x15 \x03(\x0b\x32$.cylc.v5.PbWorkflow.StateTotalsEntryR\x0bstateTotals\x12-\n\x10workflow_log_dir\x18\x16 \x01(\tH\x11R\x0eworkflowLogDir\x88\x01\x01\x12>\n\x0etime_zone_info\x18\x17 \x01(\x0b\x32\x13.cylc.v5.PbTimeZoneH\x12R\x0ctimeZoneInfo\x88\x01\x01\x12\"\n\ntree_depth\x18\x18 \x01(\x05H\x13R\ttreeDepth\x88\x01\x01\x12\"\n\rjob_log_names\x18\x19 \x03(\tR\x0bjobLogNames\x12 \n\x0cns_def_order\x18\x1a \x03(\tR\nnsDefOrder\x12\x16\n\x06states\x18\x1b \x03(\tR\x06states\x12!\n\x0ctask_proxies\x18\x1c \x03(\tR\x0btaskProxies\x12%\n\x0e\x66\x61mily_proxies\x18\x1d \x03(\tR\rfamilyProxies\x12\"\n\nstatus_msg\x18\x1e \x01(\tH\x14R\tstatusMsg\x88\x01\x01\x12\'\n\ris_held_total\x18\x1f \x01(\x05H\x15R\x0bisHeldTotal\x88\x01\x01\x12\x12\n\x04jobs\x18 \x03(\tR\x04jobs\x12\x1e\n\x08pub_port\x18! \x01(\x05H\x16R\x07pubPort\x88\x01\x01\x12#\n\nbroadcasts\x18\" \x01(\tH\x17R\nbroadcasts\x88\x01\x01\x12+\n\x0fis_queued_total\x18# \x01(\x05H\x18R\risQueuedTotal\x88\x01\x01\x12W\n\x12latest_state_tasks\x18$ \x03(\x0b\x32).cylc.v5.PbWorkflow.LatestStateTasksEntryR\x10latestStateTasks\x12\x1b\n\x06pruned\x18% \x01(\x08H\x19R\x06pruned\x88\x01\x01\x12/\n\x11is_runahead_total\x18& \x01(\x05H\x1aR\x0fisRunaheadTotal\x88\x01\x01\x12*\n\x0estates_updated\x18\' \x01(\x08H\x1bR\rstatesUpdated\x88\x01\x01\x12+\n\x0fn_edge_distance\x18( \x01(\x05H\x1cR\rnEdgeDistance\x88\x01\x01\x1a>\n\x10StateTotalsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\x05R\x05value:\x02\x38\x01\x1a]\n\x15LatestStateTasksEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12.\n\x05value\x18\x02 \x01(\x0b\x32\x18.cylc.v5.PbTaskProxyRefsR\x05value:\x02\x38\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_nameB\t\n\x07_statusB\x07\n\x05_hostB\x07\n\x05_portB\x08\n\x06_ownerB\x08\n\x06_edgesB\x0e\n\x0c_api_versionB\x0f\n\r_cylc_versionB\x0f\n\r_last_updatedB\x07\n\x05_metaB\x1c\n\x1a_newest_active_cycle_pointB\x1c\n\x1a_oldest_active_cycle_pointB\x0b\n\t_reloadedB\x0b\n\t_run_modeB\x0f\n\r_cycling_modeB\x13\n\x11_workflow_log_dirB\x11\n\x0f_time_zone_infoB\r\n\x0b_tree_depthB\r\n\x0b_status_msgB\x10\n\x0e_is_held_totalB\x0b\n\t_pub_portB\r\n\x0b_broadcastsB\x12\n\x10_is_queued_totalB\t\n\x07_prunedB\x14\n\x12_is_runahead_totalB\x11\n\x0f_states_updatedB\x12\n\x10_n_edge_distance\"\xea\x08\n\tPbRuntime\x12\x1f\n\x08platform\x18\x01 \x01(\tH\x00R\x08platform\x88\x01\x01\x12\x1b\n\x06script\x18\x02 \x01(\tH\x01R\x06script\x88\x01\x01\x12$\n\x0binit_script\x18\x03 \x01(\tH\x02R\ninitScript\x88\x01\x01\x12\"\n\nenv_script\x18\x04 \x01(\tH\x03R\tenvScript\x88\x01\x01\x12\"\n\nerr_script\x18\x05 \x01(\tH\x04R\terrScript\x88\x01\x01\x12$\n\x0b\x65xit_script\x18\x06 \x01(\tH\x05R\nexitScript\x88\x01\x01\x12\"\n\npre_script\x18\x07 \x01(\tH\x06R\tpreScript\x88\x01\x01\x12$\n\x0bpost_script\x18\x08 \x01(\tH\x07R\npostScript\x88\x01\x01\x12%\n\x0cwork_sub_dir\x18\t \x01(\tH\x08R\nworkSubDir\x88\x01\x01\x12\x43\n\x1b\x65xecution_polling_intervals\x18\n \x01(\tH\tR\x19\x65xecutionPollingIntervals\x88\x01\x01\x12\x39\n\x16\x65xecution_retry_delays\x18\x0b \x01(\tH\nR\x14\x65xecutionRetryDelays\x88\x01\x01\x12\x35\n\x14\x65xecution_time_limit\x18\x0c \x01(\tH\x0bR\x12\x65xecutionTimeLimit\x88\x01\x01\x12\x45\n\x1csubmission_polling_intervals\x18\r \x01(\tH\x0cR\x1asubmissionPollingIntervals\x88\x01\x01\x12;\n\x17submission_retry_delays\x18\x0e \x01(\tH\rR\x15submissionRetryDelays\x88\x01\x01\x12#\n\ndirectives\x18\x0f \x01(\tH\x0eR\ndirectives\x88\x01\x01\x12%\n\x0b\x65nvironment\x18\x10 \x01(\tH\x0fR\x0b\x65nvironment\x88\x01\x01\x12\x1d\n\x07outputs\x18\x11 \x01(\tH\x10R\x07outputs\x88\x01\x01\x12#\n\ncompletion\x18\x12 \x01(\tH\x11R\ncompletion\x88\x01\x01\x42\x0b\n\t_platformB\t\n\x07_scriptB\x0e\n\x0c_init_scriptB\r\n\x0b_env_scriptB\r\n\x0b_err_scriptB\x0e\n\x0c_exit_scriptB\r\n\x0b_pre_scriptB\x0e\n\x0c_post_scriptB\x0f\n\r_work_sub_dirB\x1e\n\x1c_execution_polling_intervalsB\x19\n\x17_execution_retry_delaysB\x17\n\x15_execution_time_limitB\x1f\n\x1d_submission_polling_intervalsB\x1a\n\x18_submission_retry_delaysB\r\n\x0b_directivesB\x0e\n\x0c_environmentB\n\n\x08_outputsB\r\n\x0b_completion\"\xdb\x06\n\x05PbJob\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12\"\n\nsubmit_num\x18\x03 \x01(\x05H\x02R\tsubmitNum\x88\x01\x01\x12\x19\n\x05state\x18\x04 \x01(\tH\x03R\x05state\x88\x01\x01\x12\"\n\ntask_proxy\x18\x05 \x01(\tH\x04R\ttaskProxy\x88\x01\x01\x12*\n\x0esubmitted_time\x18\x06 \x01(\tH\x05R\rsubmittedTime\x88\x01\x01\x12&\n\x0cstarted_time\x18\x07 \x01(\tH\x06R\x0bstartedTime\x88\x01\x01\x12(\n\rfinished_time\x18\x08 \x01(\tH\x07R\x0c\x66inishedTime\x88\x01\x01\x12\x1a\n\x06job_id\x18\t \x01(\tH\x08R\x05jobId\x88\x01\x01\x12+\n\x0fjob_runner_name\x18\n \x01(\tH\tR\rjobRunnerName\x88\x01\x01\x12\x35\n\x14\x65xecution_time_limit\x18\x0e \x01(\x02H\nR\x12\x65xecutionTimeLimit\x88\x01\x01\x12\x1f\n\x08platform\x18\x0f \x01(\tH\x0bR\x08platform\x88\x01\x01\x12#\n\x0bjob_log_dir\x18\x11 \x01(\tH\x0cR\tjobLogDir\x88\x01\x01\x12\x17\n\x04name\x18\x1e \x01(\tH\rR\x04name\x88\x01\x01\x12$\n\x0b\x63ycle_point\x18\x1f \x01(\tH\x0eR\ncyclePoint\x88\x01\x01\x12\x1a\n\x08messages\x18 \x03(\tR\x08messages\x12\x31\n\x07runtime\x18! \x01(\x0b\x32\x12.cylc.v5.PbRuntimeH\x0fR\x07runtime\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\r\n\x0b_submit_numB\x08\n\x06_stateB\r\n\x0b_task_proxyB\x11\n\x0f_submitted_timeB\x0f\n\r_started_timeB\x10\n\x0e_finished_timeB\t\n\x07_job_idB\x12\n\x10_job_runner_nameB\x17\n\x15_execution_time_limitB\x0b\n\t_platformB\x0e\n\x0c_job_log_dirB\x07\n\x05_nameB\x0e\n\x0c_cycle_pointB\n\n\x08_runtimeJ\x04\x08\x1d\x10\x1e\"\xd4\x03\n\x06PbTask\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12\x17\n\x04name\x18\x03 \x01(\tH\x02R\x04name\x88\x01\x01\x12(\n\x04meta\x18\x04 \x01(\x0b\x32\x0f.cylc.v5.PbMetaH\x03R\x04meta\x88\x01\x01\x12/\n\x11mean_elapsed_time\x18\x05 \x01(\x02H\x04R\x0fmeanElapsedTime\x88\x01\x01\x12\x19\n\x05\x64\x65pth\x18\x06 \x01(\x05H\x05R\x05\x64\x65pth\x88\x01\x01\x12\x18\n\x07proxies\x18\x07 \x03(\tR\x07proxies\x12\x1c\n\tnamespace\x18\x08 \x03(\tR\tnamespace\x12\x18\n\x07parents\x18\t \x03(\tR\x07parents\x12&\n\x0c\x66irst_parent\x18\n \x01(\tH\x06R\x0b\x66irstParent\x88\x01\x01\x12\x31\n\x07runtime\x18\x0b \x01(\x0b\x32\x12.cylc.v5.PbRuntimeH\x07R\x07runtime\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_nameB\x07\n\x05_metaB\x14\n\x12_mean_elapsed_timeB\x08\n\x06_depthB\x0f\n\r_first_parentB\n\n\x08_runtime\"\x92\x02\n\nPbPollTask\x12$\n\x0blocal_proxy\x18\x01 \x01(\tH\x00R\nlocalProxy\x88\x01\x01\x12\x1f\n\x08workflow\x18\x02 \x01(\tH\x01R\x08workflow\x88\x01\x01\x12&\n\x0cremote_proxy\x18\x03 \x01(\tH\x02R\x0bremoteProxy\x88\x01\x01\x12 \n\treq_state\x18\x04 \x01(\tH\x03R\x08reqState\x88\x01\x01\x12&\n\x0cgraph_string\x18\x05 \x01(\tH\x04R\x0bgraphString\x88\x01\x01\x42\x0e\n\x0c_local_proxyB\x0b\n\t_workflowB\x0f\n\r_remote_proxyB\x0c\n\n_req_stateB\x0f\n\r_graph_string\"\xff\x01\n\x0bPbCondition\x12\"\n\ntask_proxy\x18\x01 \x01(\tH\x00R\ttaskProxy\x88\x01\x01\x12\"\n\nexpr_alias\x18\x02 \x01(\tH\x01R\texprAlias\x88\x01\x01\x12 \n\treq_state\x18\x03 \x01(\tH\x02R\x08reqState\x88\x01\x01\x12!\n\tsatisfied\x18\x04 \x01(\x08H\x03R\tsatisfied\x88\x01\x01\x12\x1d\n\x07message\x18\x05 \x01(\tH\x04R\x07message\x88\x01\x01\x42\r\n\x0b_task_proxyB\r\n\x0b_expr_aliasB\x0c\n\n_req_stateB\x0c\n\n_satisfiedB\n\n\x08_message\"\xce\x01\n\x0ePbPrerequisite\x12#\n\nexpression\x18\x01 \x01(\tH\x00R\nexpression\x88\x01\x01\x12\x34\n\nconditions\x18\x02 \x03(\x0b\x32\x14.cylc.v5.PbConditionR\nconditions\x12!\n\x0c\x63ycle_points\x18\x03 \x03(\tR\x0b\x63yclePoints\x12!\n\tsatisfied\x18\x04 \x01(\x08H\x01R\tsatisfied\x88\x01\x01\x42\r\n\x0b_expressionB\x0c\n\n_satisfied\"\xad\x01\n\x08PbOutput\x12\x19\n\x05label\x18\x01 \x01(\tH\x00R\x05label\x88\x01\x01\x12\x1d\n\x07message\x18\x02 \x01(\tH\x01R\x07message\x88\x01\x01\x12!\n\tsatisfied\x18\x03 \x01(\x08H\x02R\tsatisfied\x88\x01\x01\x12\x17\n\x04time\x18\x04 \x01(\x01H\x03R\x04time\x88\x01\x01\x42\x08\n\x06_labelB\n\n\x08_messageB\x0c\n\n_satisfiedB\x07\n\x05_time\"\xca\x01\n\tPbTrigger\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12\x19\n\x05label\x18\x02 \x01(\tH\x01R\x05label\x88\x01\x01\x12\x1d\n\x07message\x18\x03 \x01(\tH\x02R\x07message\x88\x01\x01\x12!\n\tsatisfied\x18\x04 \x01(\x08H\x03R\tsatisfied\x88\x01\x01\x12\x17\n\x04time\x18\x05 \x01(\x01H\x04R\x04time\x88\x01\x01\x42\x05\n\x03_idB\x08\n\x06_labelB\n\n\x08_messageB\x0c\n\n_satisfiedB\x07\n\x05_time\"\xde\n\n\x0bPbTaskProxy\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12\x17\n\x04task\x18\x03 \x01(\tH\x02R\x04task\x88\x01\x01\x12\x19\n\x05state\x18\x04 \x01(\tH\x03R\x05state\x88\x01\x01\x12$\n\x0b\x63ycle_point\x18\x05 \x01(\tH\x04R\ncyclePoint\x88\x01\x01\x12\x19\n\x05\x64\x65pth\x18\x06 \x01(\x05H\x05R\x05\x64\x65pth\x88\x01\x01\x12$\n\x0bjob_submits\x18\x07 \x01(\x05H\x06R\njobSubmits\x88\x01\x01\x12;\n\x07outputs\x18\t \x03(\x0b\x32!.cylc.v5.PbTaskProxy.OutputsEntryR\x07outputs\x12\x1c\n\tnamespace\x18\x0b \x03(\tR\tnamespace\x12=\n\rprerequisites\x18\x0c \x03(\x0b\x32\x17.cylc.v5.PbPrerequisiteR\rprerequisites\x12\x12\n\x04jobs\x18\r \x03(\tR\x04jobs\x12&\n\x0c\x66irst_parent\x18\x0f \x01(\tH\x07R\x0b\x66irstParent\x88\x01\x01\x12\x17\n\x04name\x18\x10 \x01(\tH\x08R\x04name\x88\x01\x01\x12\x1c\n\x07is_held\x18\x11 \x01(\x08H\tR\x06isHeld\x88\x01\x01\x12\x14\n\x05\x65\x64ges\x18\x12 \x03(\tR\x05\x65\x64ges\x12\x1c\n\tancestors\x18\x13 \x03(\tR\tancestors\x12 \n\tflow_nums\x18\x14 \x01(\tH\nR\x08\x66lowNums\x88\x01\x01\x12W\n\x11\x65xternal_triggers\x18\x17 \x03(\x0b\x32*.cylc.v5.PbTaskProxy.ExternalTriggersEntryR\x10\x65xternalTriggers\x12\x41\n\txtriggers\x18\x18 \x03(\x0b\x32#.cylc.v5.PbTaskProxy.XtriggersEntryR\txtriggers\x12 \n\tis_queued\x18\x19 \x01(\x08H\x0bR\x08isQueued\x88\x01\x01\x12$\n\x0bis_runahead\x18\x1a \x01(\x08H\x0cR\nisRunahead\x88\x01\x01\x12 \n\tflow_wait\x18\x1b \x01(\x08H\rR\x08\x66lowWait\x88\x01\x01\x12\x31\n\x07runtime\x18\x1c \x01(\x0b\x32\x12.cylc.v5.PbRuntimeH\x0eR\x07runtime\x88\x01\x01\x12$\n\x0bgraph_depth\x18\x1d \x01(\x05H\x0fR\ngraphDepth\x88\x01\x01\x1aM\n\x0cOutputsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\'\n\x05value\x18\x02 \x01(\x0b\x32\x11.cylc.v5.PbOutputR\x05value:\x02\x38\x01\x1aW\n\x15\x45xternalTriggersEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x12.cylc.v5.PbTriggerR\x05value:\x02\x38\x01\x1aP\n\x0eXtriggersEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x12.cylc.v5.PbTriggerR\x05value:\x02\x38\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_taskB\x08\n\x06_stateB\x0e\n\x0c_cycle_pointB\x08\n\x06_depthB\x0e\n\x0c_job_submitsB\x0f\n\r_first_parentB\x07\n\x05_nameB\n\n\x08_is_heldB\x0c\n\n_flow_numsB\x0c\n\n_is_queuedB\x0e\n\x0c_is_runaheadB\x0c\n\n_flow_waitB\n\n\x08_runtimeB\x0e\n\x0c_graph_depth\"\xb9\x03\n\x08PbFamily\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12\x17\n\x04name\x18\x03 \x01(\tH\x02R\x04name\x88\x01\x01\x12(\n\x04meta\x18\x04 \x01(\x0b\x32\x0f.cylc.v5.PbMetaH\x03R\x04meta\x88\x01\x01\x12\x19\n\x05\x64\x65pth\x18\x05 \x01(\x05H\x04R\x05\x64\x65pth\x88\x01\x01\x12\x18\n\x07proxies\x18\x06 \x03(\tR\x07proxies\x12\x18\n\x07parents\x18\x07 \x03(\tR\x07parents\x12\x1f\n\x0b\x63hild_tasks\x18\x08 \x03(\tR\nchildTasks\x12%\n\x0e\x63hild_families\x18\t \x03(\tR\rchildFamilies\x12&\n\x0c\x66irst_parent\x18\n \x01(\tH\x05R\x0b\x66irstParent\x88\x01\x01\x12\x31\n\x07runtime\x18\x0b \x01(\x0b\x32\x12.cylc.v5.PbRuntimeH\x06R\x07runtime\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x07\n\x05_nameB\x07\n\x05_metaB\x08\n\x06_depthB\x0f\n\r_first_parentB\n\n\x08_runtime\"\xa5\x08\n\rPbFamilyProxy\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12$\n\x0b\x63ycle_point\x18\x03 \x01(\tH\x02R\ncyclePoint\x88\x01\x01\x12\x17\n\x04name\x18\x04 \x01(\tH\x03R\x04name\x88\x01\x01\x12\x1b\n\x06\x66\x61mily\x18\x05 \x01(\tH\x04R\x06\x66\x61mily\x88\x01\x01\x12\x19\n\x05state\x18\x06 \x01(\tH\x05R\x05state\x88\x01\x01\x12\x19\n\x05\x64\x65pth\x18\x07 \x01(\x05H\x06R\x05\x64\x65pth\x88\x01\x01\x12&\n\x0c\x66irst_parent\x18\x08 \x01(\tH\x07R\x0b\x66irstParent\x88\x01\x01\x12\x1f\n\x0b\x63hild_tasks\x18\n \x03(\tR\nchildTasks\x12%\n\x0e\x63hild_families\x18\x0b \x03(\tR\rchildFamilies\x12\x1c\n\x07is_held\x18\x0c \x01(\x08H\x08R\x06isHeld\x88\x01\x01\x12\x1c\n\tancestors\x18\r \x03(\tR\tancestors\x12\x16\n\x06states\x18\x0e \x03(\tR\x06states\x12J\n\x0cstate_totals\x18\x0f \x03(\x0b\x32\'.cylc.v5.PbFamilyProxy.StateTotalsEntryR\x0bstateTotals\x12\'\n\ris_held_total\x18\x10 \x01(\x05H\tR\x0bisHeldTotal\x88\x01\x01\x12 \n\tis_queued\x18\x11 \x01(\x08H\nR\x08isQueued\x88\x01\x01\x12+\n\x0fis_queued_total\x18\x12 \x01(\x05H\x0bR\risQueuedTotal\x88\x01\x01\x12$\n\x0bis_runahead\x18\x13 \x01(\x08H\x0cR\nisRunahead\x88\x01\x01\x12/\n\x11is_runahead_total\x18\x14 \x01(\x05H\rR\x0fisRunaheadTotal\x88\x01\x01\x12\x31\n\x07runtime\x18\x15 \x01(\x0b\x32\x12.cylc.v5.PbRuntimeH\x0eR\x07runtime\x88\x01\x01\x12$\n\x0bgraph_depth\x18\x16 \x01(\x05H\x0fR\ngraphDepth\x88\x01\x01\x1a>\n\x10StateTotalsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\x05R\x05value:\x02\x38\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\x0e\n\x0c_cycle_pointB\x07\n\x05_nameB\t\n\x07_familyB\x08\n\x06_stateB\x08\n\x06_depthB\x0f\n\r_first_parentB\n\n\x08_is_heldB\x10\n\x0e_is_held_totalB\x0c\n\n_is_queuedB\x12\n\x10_is_queued_totalB\x0e\n\x0c_is_runaheadB\x14\n\x12_is_runahead_totalB\n\n\x08_runtimeB\x0e\n\x0c_graph_depth\"\xe6\x01\n\x06PbEdge\x12\x19\n\x05stamp\x18\x01 \x01(\tH\x00R\x05stamp\x88\x01\x01\x12\x13\n\x02id\x18\x02 \x01(\tH\x01R\x02id\x88\x01\x01\x12\x1b\n\x06source\x18\x03 \x01(\tH\x02R\x06source\x88\x01\x01\x12\x1b\n\x06target\x18\x04 \x01(\tH\x03R\x06target\x88\x01\x01\x12\x1d\n\x07suicide\x18\x05 \x01(\x08H\x04R\x07suicide\x88\x01\x01\x12\x17\n\x04\x63ond\x18\x06 \x01(\x08H\x05R\x04\x63ond\x88\x01\x01\x42\x08\n\x06_stampB\x05\n\x03_idB\t\n\x07_sourceB\t\n\x07_targetB\n\n\x08_suicideB\x07\n\x05_cond\"\xb2\x01\n\x07PbEdges\x12\x13\n\x02id\x18\x01 \x01(\tH\x00R\x02id\x88\x01\x01\x12\x14\n\x05\x65\x64ges\x18\x02 \x03(\tR\x05\x65\x64ges\x12I\n\x16workflow_polling_tasks\x18\x03 \x03(\x0b\x32\x13.cylc.v5.PbPollTaskR\x14workflowPollingTasks\x12\x16\n\x06leaves\x18\x04 \x03(\tR\x06leaves\x12\x12\n\x04\x66\x65\x65t\x18\x05 \x03(\tR\x04\x66\x65\x65tB\x05\n\x03_id\"\xee\x02\n\x10PbEntireWorkflow\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\x13.cylc.v5.PbWorkflowH\x00R\x08workflow\x88\x01\x01\x12%\n\x05tasks\x18\x02 \x03(\x0b\x32\x0f.cylc.v5.PbTaskR\x05tasks\x12\x37\n\x0ctask_proxies\x18\x03 \x03(\x0b\x32\x14.cylc.v5.PbTaskProxyR\x0btaskProxies\x12\"\n\x04jobs\x18\x04 \x03(\x0b\x32\x0e.cylc.v5.PbJobR\x04jobs\x12-\n\x08\x66\x61milies\x18\x05 \x03(\x0b\x32\x11.cylc.v5.PbFamilyR\x08\x66\x61milies\x12=\n\x0e\x66\x61mily_proxies\x18\x06 \x03(\x0b\x32\x16.cylc.v5.PbFamilyProxyR\rfamilyProxies\x12%\n\x05\x65\x64ges\x18\x07 \x03(\x0b\x32\x0f.cylc.v5.PbEdgeR\x05\x65\x64gesB\x0b\n\t_workflow\"\xf1\x01\n\x07\x45\x44\x65ltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12\x1f\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01R\x08\x63hecksum\x88\x01\x01\x12%\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x0f.cylc.v5.PbEdgeR\x05\x61\x64\x64\x65\x64\x12)\n\x07updated\x18\x04 \x03(\x0b\x32\x0f.cylc.v5.PbEdgeR\x07updated\x12\x16\n\x06pruned\x18\x05 \x03(\tR\x06pruned\x12\x1f\n\x08reloaded\x18\x06 \x01(\x08H\x02R\x08reloaded\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xf5\x01\n\x07\x46\x44\x65ltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12\x1f\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01R\x08\x63hecksum\x88\x01\x01\x12\'\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x11.cylc.v5.PbFamilyR\x05\x61\x64\x64\x65\x64\x12+\n\x07updated\x18\x04 \x03(\x0b\x32\x11.cylc.v5.PbFamilyR\x07updated\x12\x16\n\x06pruned\x18\x05 \x03(\tR\x06pruned\x12\x1f\n\x08reloaded\x18\x06 \x01(\x08H\x02R\x08reloaded\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\x80\x02\n\x08\x46PDeltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12\x1f\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01R\x08\x63hecksum\x88\x01\x01\x12,\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x16.cylc.v5.PbFamilyProxyR\x05\x61\x64\x64\x65\x64\x12\x30\n\x07updated\x18\x04 \x03(\x0b\x32\x16.cylc.v5.PbFamilyProxyR\x07updated\x12\x16\n\x06pruned\x18\x05 \x03(\tR\x06pruned\x12\x1f\n\x08reloaded\x18\x06 \x01(\x08H\x02R\x08reloaded\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xef\x01\n\x07JDeltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12\x1f\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01R\x08\x63hecksum\x88\x01\x01\x12$\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x0e.cylc.v5.PbJobR\x05\x61\x64\x64\x65\x64\x12(\n\x07updated\x18\x04 \x03(\x0b\x32\x0e.cylc.v5.PbJobR\x07updated\x12\x16\n\x06pruned\x18\x05 \x03(\tR\x06pruned\x12\x1f\n\x08reloaded\x18\x06 \x01(\x08H\x02R\x08reloaded\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xf1\x01\n\x07TDeltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12\x1f\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01R\x08\x63hecksum\x88\x01\x01\x12%\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x0f.cylc.v5.PbTaskR\x05\x61\x64\x64\x65\x64\x12)\n\x07updated\x18\x04 \x03(\x0b\x32\x0f.cylc.v5.PbTaskR\x07updated\x12\x16\n\x06pruned\x18\x05 \x03(\tR\x06pruned\x12\x1f\n\x08reloaded\x18\x06 \x01(\x08H\x02R\x08reloaded\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xfc\x01\n\x08TPDeltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12\x1f\n\x08\x63hecksum\x18\x02 \x01(\x03H\x01R\x08\x63hecksum\x88\x01\x01\x12*\n\x05\x61\x64\x64\x65\x64\x18\x03 \x03(\x0b\x32\x14.cylc.v5.PbTaskProxyR\x05\x61\x64\x64\x65\x64\x12.\n\x07updated\x18\x04 \x03(\x0b\x32\x14.cylc.v5.PbTaskProxyR\x07updated\x12\x16\n\x06pruned\x18\x05 \x03(\tR\x06pruned\x12\x1f\n\x08reloaded\x18\x06 \x01(\x08H\x02R\x08reloaded\x88\x01\x01\x42\x07\n\x05_timeB\x0b\n\t_checksumB\x0b\n\t_reloaded\"\xfb\x01\n\x07WDeltas\x12\x17\n\x04time\x18\x01 \x01(\x01H\x00R\x04time\x88\x01\x01\x12.\n\x05\x61\x64\x64\x65\x64\x18\x02 \x01(\x0b\x32\x13.cylc.v5.PbWorkflowH\x01R\x05\x61\x64\x64\x65\x64\x88\x01\x01\x12\x32\n\x07updated\x18\x03 \x01(\x0b\x32\x13.cylc.v5.PbWorkflowH\x02R\x07updated\x88\x01\x01\x12\x1f\n\x08reloaded\x18\x04 \x01(\x08H\x03R\x08reloaded\x88\x01\x01\x12\x1b\n\x06pruned\x18\x05 \x01(\tH\x04R\x06pruned\x88\x01\x01\x42\x07\n\x05_timeB\x08\n\x06_addedB\n\n\x08_updatedB\x0b\n\t_reloadedB\t\n\x07_pruned\"\xcd\x02\n\tAllDeltas\x12,\n\x08\x66\x61milies\x18\x01 \x01(\x0b\x32\x10.cylc.v5.FDeltasR\x08\x66\x61milies\x12\x38\n\x0e\x66\x61mily_proxies\x18\x02 \x01(\x0b\x32\x11.cylc.v5.FPDeltasR\rfamilyProxies\x12$\n\x04jobs\x18\x03 \x01(\x0b\x32\x10.cylc.v5.JDeltasR\x04jobs\x12&\n\x05tasks\x18\x04 \x01(\x0b\x32\x10.cylc.v5.TDeltasR\x05tasks\x12\x34\n\x0ctask_proxies\x18\x05 \x01(\x0b\x32\x11.cylc.v5.TPDeltasR\x0btaskProxies\x12&\n\x05\x65\x64ges\x18\x06 \x01(\x0b\x32\x10.cylc.v5.EDeltasR\x05\x65\x64ges\x12,\n\x08workflow\x18\x07 \x01(\x0b\x32\x10.cylc.v5.WDeltasR\x08workflowb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cylc.v5.schema_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + _globals['_PBWORKFLOW_STATETOTALSENTRY']._options = None + _globals['_PBWORKFLOW_STATETOTALSENTRY']._serialized_options = b'8\001' + _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._options = None + _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._serialized_options = b'8\001' + _globals['_PBTASKPROXY_OUTPUTSENTRY']._options = None + _globals['_PBTASKPROXY_OUTPUTSENTRY']._serialized_options = b'8\001' + _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._options = None + _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._serialized_options = b'8\001' + _globals['_PBTASKPROXY_XTRIGGERSENTRY']._options = None + _globals['_PBTASKPROXY_XTRIGGERSENTRY']._serialized_options = b'8\001' + _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._options = None + _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._serialized_options = b'8\001' + _globals['_PBMETA']._serialized_start=34 + _globals['_PBMETA']._serialized_end=270 + _globals['_PBTIMEZONE']._serialized_start=273 + _globals['_PBTIMEZONE']._serialized_end=488 + _globals['_PBTASKPROXYREFS']._serialized_start=490 + _globals['_PBTASKPROXYREFS']._serialized_end=542 + _globals['_PBWORKFLOW']._serialized_start=545 + _globals['_PBWORKFLOW']._serialized_end=2683 + _globals['_PBWORKFLOW_STATETOTALSENTRY']._serialized_start=2081 + _globals['_PBWORKFLOW_STATETOTALSENTRY']._serialized_end=2143 + _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._serialized_start=2145 + _globals['_PBWORKFLOW_LATESTSTATETASKSENTRY']._serialized_end=2238 + _globals['_PBRUNTIME']._serialized_start=2686 + _globals['_PBRUNTIME']._serialized_end=3816 + _globals['_PBJOB']._serialized_start=3819 + _globals['_PBJOB']._serialized_end=4678 + _globals['_PBTASK']._serialized_start=4681 + _globals['_PBTASK']._serialized_end=5149 + _globals['_PBPOLLTASK']._serialized_start=5152 + _globals['_PBPOLLTASK']._serialized_end=5426 + _globals['_PBCONDITION']._serialized_start=5429 + _globals['_PBCONDITION']._serialized_end=5684 + _globals['_PBPREREQUISITE']._serialized_start=5687 + _globals['_PBPREREQUISITE']._serialized_end=5893 + _globals['_PBOUTPUT']._serialized_start=5896 + _globals['_PBOUTPUT']._serialized_end=6069 + _globals['_PBTRIGGER']._serialized_start=6072 + _globals['_PBTRIGGER']._serialized_end=6274 + _globals['_PBTASKPROXY']._serialized_start=6277 + _globals['_PBTASKPROXY']._serialized_end=7651 + _globals['_PBTASKPROXY_OUTPUTSENTRY']._serialized_start=7201 + _globals['_PBTASKPROXY_OUTPUTSENTRY']._serialized_end=7278 + _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._serialized_start=7280 + _globals['_PBTASKPROXY_EXTERNALTRIGGERSENTRY']._serialized_end=7367 + _globals['_PBTASKPROXY_XTRIGGERSENTRY']._serialized_start=7369 + _globals['_PBTASKPROXY_XTRIGGERSENTRY']._serialized_end=7449 + _globals['_PBFAMILY']._serialized_start=7654 + _globals['_PBFAMILY']._serialized_end=8095 + _globals['_PBFAMILYPROXY']._serialized_start=8098 + _globals['_PBFAMILYPROXY']._serialized_end=9159 + _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._serialized_start=2081 + _globals['_PBFAMILYPROXY_STATETOTALSENTRY']._serialized_end=2143 + _globals['_PBEDGE']._serialized_start=9162 + _globals['_PBEDGE']._serialized_end=9392 + _globals['_PBEDGES']._serialized_start=9395 + _globals['_PBEDGES']._serialized_end=9573 + _globals['_PBENTIREWORKFLOW']._serialized_start=9576 + _globals['_PBENTIREWORKFLOW']._serialized_end=9942 + _globals['_EDELTAS']._serialized_start=9945 + _globals['_EDELTAS']._serialized_end=10186 + _globals['_FDELTAS']._serialized_start=10189 + _globals['_FDELTAS']._serialized_end=10434 + _globals['_FPDELTAS']._serialized_start=10437 + _globals['_FPDELTAS']._serialized_end=10693 + _globals['_JDELTAS']._serialized_start=10696 + _globals['_JDELTAS']._serialized_end=10935 + _globals['_TDELTAS']._serialized_start=10938 + _globals['_TDELTAS']._serialized_end=11179 + _globals['_TPDELTAS']._serialized_start=11182 + _globals['_TPDELTAS']._serialized_end=11434 + _globals['_WDELTAS']._serialized_start=11437 + _globals['_WDELTAS']._serialized_end=11688 + _globals['_ALLDELTAS']._serialized_start=11691 + _globals['_ALLDELTAS']._serialized_end=12024 +# @@protoc_insertion_point(module_scope) diff --git a/cylc/flow/data_messages_pb2.pyi b/cylc/flow/network/protobuf/cylc/v5/schema_pb2.pyi similarity index 99% rename from cylc/flow/data_messages_pb2.pyi rename to cylc/flow/network/protobuf/cylc/v5/schema_pb2.pyi index 4e96c6ed2da..1a61c69446c 100644 --- a/cylc/flow/data_messages_pb2.pyi +++ b/cylc/flow/network/protobuf/cylc/v5/schema_pb2.pyi @@ -6,16 +6,18 @@ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Map DESCRIPTOR: _descriptor.FileDescriptor class PbMeta(_message.Message): - __slots__ = ["title", "description", "URL", "user_defined"] + __slots__ = ["title", "description", "URL", "user_defined", "new_field"] TITLE_FIELD_NUMBER: _ClassVar[int] DESCRIPTION_FIELD_NUMBER: _ClassVar[int] URL_FIELD_NUMBER: _ClassVar[int] USER_DEFINED_FIELD_NUMBER: _ClassVar[int] + NEW_FIELD_FIELD_NUMBER: _ClassVar[int] title: str description: str URL: str user_defined: str - def __init__(self, title: _Optional[str] = ..., description: _Optional[str] = ..., URL: _Optional[str] = ..., user_defined: _Optional[str] = ...) -> None: ... + new_field: str + def __init__(self, title: _Optional[str] = ..., description: _Optional[str] = ..., URL: _Optional[str] = ..., user_defined: _Optional[str] = ..., new_field: _Optional[str] = ...) -> None: ... class PbTimeZone(_message.Message): __slots__ = ["hours", "minutes", "string_basic", "string_extended"] diff --git a/cylc/flow/network/server.py b/cylc/flow/network/server.py index 2c170e61198..c7e62dbe8b2 100644 --- a/cylc/flow/network/server.py +++ b/cylc/flow/network/server.py @@ -36,7 +36,7 @@ from cylc.flow.network.resolvers import Resolvers from cylc.flow.network.schema import schema from cylc.flow.data_store_mgr import DELTAS_MAP -from cylc.flow.data_messages_pb2 import PbEntireWorkflow +from cylc.flow.network.protobuf.cylc.v5.schema_pb2 import PbEntireWorkflow if TYPE_CHECKING: from cylc.flow.scheduler import Scheduler diff --git a/cylc/flow/prerequisite.py b/cylc/flow/prerequisite.py index b388934e2de..3220385adc3 100644 --- a/cylc/flow/prerequisite.py +++ b/cylc/flow/prerequisite.py @@ -22,7 +22,7 @@ from cylc.flow.cycling.loader import get_point from cylc.flow.exceptions import TriggerExpressionError -from cylc.flow.data_messages_pb2 import ( +from cylc.flow.network.protobuf.cylc.v5.schema_pb2 import ( PbPrerequisite, PbCondition, ) diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml new file mode 100644 index 00000000000..1237ebf526a --- /dev/null +++ b/proto/buf.gen.yaml @@ -0,0 +1,10 @@ +# file containing protobuf configuration + +version: v2 + +plugins: + - protoc_builtin: python + out: ../ + + - protoc_builtin: pyi + out: ../ diff --git a/proto/buf.yaml b/proto/buf.yaml new file mode 100644 index 00000000000..27a2c58ce65 --- /dev/null +++ b/proto/buf.yaml @@ -0,0 +1,11 @@ +# file containing protobuf configuration + +version: v2 + +lint: + use: + - DEFAULT + +breaking: + use: + - FILE diff --git a/cylc/flow/data_messages.proto b/proto/cylc/flow/v5/schema.proto similarity index 95% rename from cylc/flow/data_messages.proto rename to proto/cylc/flow/v5/schema.proto index c0af5094c0d..f93ee7a8ac6 100644 --- a/cylc/flow/data_messages.proto +++ b/proto/cylc/flow/v5/schema.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +package cylc.flow.v5; + /* THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE. Copyright (C) NIWA & British Crown (Met Office) & Contributors. @@ -16,6 +18,7 @@ syntax = "proto3"; You should have received a copy of the GNU General Public License along with this program. If not, see .*/ + /* Protobuf message definitions * * The original intention of these messages is for use as data elements sent @@ -24,15 +27,20 @@ syntax = "proto3"; * This file is not needed at runtime. It is used to generate python protobuf * message modules. * - * Command: - * $ protoc -I=./ --python_out=./ --pyi_out=./ data_messages.proto + * Hand edit this file to make changes to the schema, use "bufbuild" to lint + * changes and regenerate Python files e.g: * - * Pre-compiled protoc binary may be download from: - * https://github.com/protocolbuffers/protobuf/releases + * # install bufbuild + * $ npm install @bufbuild/buf * - * If merge/rebase conflicts arise, then regenerate the module. - * (DO NOT manually resolve conflicts) + * # run commands from within the proto directory (protobuf root dir) + * $ cd proto/ * + * # lint protobuf schema source files + * ../node_modules/@bufbuild/buf/bin/buf lint + * + * # generate Python files + * ../node_modules/@bufbuild/buf/bin/buf generate * * WARNING: Avoid re-indexing existing fields! * - Field numbers do not need to be continuous/sequential (gaps are fine). @@ -43,7 +51,6 @@ syntax = "proto3"; * * https://developers.google.com/protocol-buffers/docs/proto3#assigning_field_numbers * - * * */ @@ -51,6 +58,7 @@ syntax = "proto3"; message PbMeta { optional string title = 1; optional string description = 2; + // buf:lint:ignore FIELD_LOWER_SNAKE_CASE optional string URL = 3; optional string user_defined = 4; } diff --git a/pytest.ini b/pytest.ini index 04d12d224b4..4abf7d7f9ee 100644 --- a/pytest.ini +++ b/pytest.ini @@ -22,7 +22,7 @@ addopts = --verbose # group tests by module or class --dist=loadscope # ignore files which cause issues with test collection - --ignore=cylc/flow/data_messages_pb2.py + --ignore=cylc/flow/v5/* --ignore=cylc/flow/parsec/empysupport.py --ignore=cylc/flow/parsec/example # disable pytest-tornasync because it conflicts with pytest-asyncio's auto mode diff --git a/tests/unit/network/test_graphql.py b/tests/unit/network/test_graphql.py index e5be079e289..e4b741617c1 100644 --- a/tests/unit/network/test_graphql.py +++ b/tests/unit/network/test_graphql.py @@ -20,7 +20,7 @@ from pytest import param from graphql import parse -from cylc.flow.data_messages_pb2 import PbTaskProxy, PbPrerequisite +from cylc.flow.network.protobuf.cylc.v5.schema_pb2 import PbTaskProxy, PbPrerequisite from cylc.flow.network.graphql import ( AstDocArguments, null_setter, NULL_VALUE, grow_tree ) diff --git a/tox.ini b/tox.ini index 95222eeb859..83e4fcf738d 100644 --- a/tox.ini +++ b/tox.ini @@ -25,7 +25,7 @@ exclude= .git, __pycache__, .tox, - **data_messages_pb2.py + cylc/flow/network/protobuf/cylc/** paths = ./cylc/flow ./tests From b01398a6fc7cd581adabfc6f2db5aac01400668e Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Thu, 13 Jun 2024 16:03:03 +0100 Subject: [PATCH 2/2] remove a protobuf field --- cylc/flow/network/protobuf/cylc/v5/schema.proto | 1 - 1 file changed, 1 deletion(-) diff --git a/cylc/flow/network/protobuf/cylc/v5/schema.proto b/cylc/flow/network/protobuf/cylc/v5/schema.proto index ae5901ea68a..a50e3888325 100644 --- a/cylc/flow/network/protobuf/cylc/v5/schema.proto +++ b/cylc/flow/network/protobuf/cylc/v5/schema.proto @@ -60,7 +60,6 @@ message PbMeta { optional string title = 1; optional string description = 2; // buf:lint:ignore FIELD_LOWER_SNAKE_CASE - optional string URL = 3; } message PbTimeZone {