From 95d0e59ab2c22419b7323f84e055aaf388362428 Mon Sep 17 00:00:00 2001 From: Mark Dawson Date: Tue, 5 Dec 2023 17:42:13 +0000 Subject: [PATCH] added suite state xtrigger for back commpat extended back compat a unit test added deprecation log message refactored implementation flake8 review amends added test for warning text review amends more review ammends Replace icky unit test with functional test (#4) * Replace icky unit test with functional test * Update changelog --- changes.d/5864.feat.md | 1 + cylc/flow/xtriggers/suite_state.py | 42 +++++++++++++++++ tests/functional/xtriggers/04-suite_state.t | 50 +++++++++++++++++++++ tests/unit/xtriggers/test_workflow_state.py | 10 ++++- 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 changes.d/5864.feat.md create mode 100644 cylc/flow/xtriggers/suite_state.py create mode 100644 tests/functional/xtriggers/04-suite_state.t diff --git a/changes.d/5864.feat.md b/changes.d/5864.feat.md new file mode 100644 index 00000000000..905b6b9dadd --- /dev/null +++ b/changes.d/5864.feat.md @@ -0,0 +1 @@ +Reimplemented the `suite-state` xtrigger for interoperability with Cylc 7. diff --git a/cylc/flow/xtriggers/suite_state.py b/cylc/flow/xtriggers/suite_state.py new file mode 100644 index 00000000000..38c085bff32 --- /dev/null +++ b/cylc/flow/xtriggers/suite_state.py @@ -0,0 +1,42 @@ +# 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 . + +from cylc.flow import LOG +import cylc.flow.flags +from cylc.flow.xtriggers.workflow_state import workflow_state + +if not cylc.flow.flags.cylc7_back_compat: + LOG.warning( + "The suite_state xtrigger is deprecated. " + "Please use the workflow_state xtrigger instead." + ) + + +def suite_state(suite, task, point, offset=None, status='succeeded', + message=None, cylc_run_dir=None, debug=False): + '''The suite_state xtrigger was renamed to workflow_state, + this breaks Cylc 7-8 interoperability. + This suite_state xtrigger replicates + workflow_state - ensuring back-support''' + return workflow_state( + workflow=suite, + task=task, + point=point, + offset=offset, + status=status, + message=message, + cylc_run_dir=cylc_run_dir + ) diff --git a/tests/functional/xtriggers/04-suite_state.t b/tests/functional/xtriggers/04-suite_state.t new file mode 100644 index 00000000000..ece9cbe715e --- /dev/null +++ b/tests/functional/xtriggers/04-suite_state.t @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# 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 . + +# Test that deprecation warnings are printed appropriately for the suite_state +# xtrigger. + +. "$(dirname "$0")/test_header" + +set_test_number 4 + +init_workflow "$TEST_NAME_BASE" << __FLOW_CONFIG__ +[scheduling] + initial cycle point = 2000 + [[dependencies]] + [[[R1]]] + graph = @upstream => foo + [[xtriggers]] + upstream = suite_state(suite=thorin/oin/gloin, task=mithril, point=1) +[runtime] + [[foo]] +__FLOW_CONFIG__ + +msg='WARNING - The suite_state xtrigger is deprecated' + +TEST_NAME="${TEST_NAME_BASE}-val" +run_ok "$TEST_NAME" cylc validate "$WORKFLOW_NAME" + +grep_ok "$msg" "${TEST_NAME}.stderr" + +# Rename flow.cylc to suite.rc: +mv "${WORKFLOW_RUN_DIR}/flow.cylc" "${WORKFLOW_RUN_DIR}/suite.rc" + +TEST_NAME="${TEST_NAME_BASE}-val-2" +run_ok "$TEST_NAME" cylc validate "$WORKFLOW_NAME" + +grep_fail "$msg" "${TEST_NAME}.stderr" diff --git a/tests/unit/xtriggers/test_workflow_state.py b/tests/unit/xtriggers/test_workflow_state.py index b3d25737cc2..ed02750f04a 100644 --- a/tests/unit/xtriggers/test_workflow_state.py +++ b/tests/unit/xtriggers/test_workflow_state.py @@ -42,7 +42,7 @@ def test_inferred_run(tmp_run_dir: Callable, monkeymock: MonkeyMock): assert results['workflow'] == expected_workflow_id -def test_back_compat(tmp_run_dir): +def test_back_compat(tmp_run_dir, caplog): """Test workflow_state xtrigger backwards compatibility with Cylc 7 database.""" id_ = 'celebrimbor' @@ -80,7 +80,15 @@ def test_back_compat(tmp_run_dir): finally: conn.close() + # Test workflow_state function satisfied, _ = workflow_state(id_, task='mithril', point='2012') assert satisfied satisfied, _ = workflow_state(id_, task='arkenstone', point='2012') assert not satisfied + + # Test back-compat (old suite_state function) + from cylc.flow.xtriggers.suite_state import suite_state + satisfied, _ = suite_state(suite=id_, task='mithril', point='2012') + assert satisfied + satisfied, _ = suite_state(suite=id_, task='arkenstone', point='2012') + assert not satisfied