From baf308eec9b74867fcf0091c8079a4c507529f36 Mon Sep 17 00:00:00 2001 From: Tim Pillinger <26465611+wxtim@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:14:41 +0000 Subject: [PATCH 1/4] Allow Cylc VIP to work with named runs. --- CHANGES.md | 8 ++++ cylc/flow/scripts/validate_reinstall.py | 4 +- cylc/flow/workflow_files.py | 2 +- .../cylc-combination-scripts/06-vip-named-run | 1 + .../06-vip-named-run.t | 45 +++++++++++++++++++ 5 files changed, 57 insertions(+), 3 deletions(-) create mode 120000 tests/functional/cylc-combination-scripts/06-vip-named-run create mode 100644 tests/functional/cylc-combination-scripts/06-vip-named-run.t diff --git a/CHANGES.md b/CHANGES.md index ce0bd1519b0..78c5a754ad7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,14 @@ updated. Only the first match gets replaced, so it's fine to leave the old ones in. --> ------------------------------------------------------------------------------- +## __cylc-8.1.1 (Coming Soon)__ + +### Fixes + +[#5314](https://github.com/cylc/cylc-flow/pull/5314) - Fix broken +command option: `cylc vip --run-name`. + + ## __cylc-8.1.0 (Released 2023-01-16)__ ### Breaking Changes diff --git a/cylc/flow/scripts/validate_reinstall.py b/cylc/flow/scripts/validate_reinstall.py index 2ea753820d0..f5a7b4c3663 100644 --- a/cylc/flow/scripts/validate_reinstall.py +++ b/cylc/flow/scripts/validate_reinstall.py @@ -162,12 +162,12 @@ def vro_cli(parser: COP, options: 'Values', workflow_id: str): ) return 1 - # Run reload if workflow is running, else play: + # Run reload if workflow is running or paused: if workflow_running: log_subcommand('reload', workflow_id) cylc_reload(options, workflow_id) - # run play anyway, to resume a paused workflow: + # run play anyway, to play a stopped workflow: else: cleanup_sysargv( 'play', diff --git a/cylc/flow/workflow_files.py b/cylc/flow/workflow_files.py index 29bbefdab02..3667206812d 100644 --- a/cylc/flow/workflow_files.py +++ b/cylc/flow/workflow_files.py @@ -1751,7 +1751,7 @@ def install_workflow( install_log.info(f'INSTALLED {named_run} from {source}') print(f'INSTALLED {named_run} from {source}') close_log(install_log) - return source, rundir, workflow_name + return source, rundir, named_run def get_run_dir_info( diff --git a/tests/functional/cylc-combination-scripts/06-vip-named-run b/tests/functional/cylc-combination-scripts/06-vip-named-run new file mode 120000 index 00000000000..da74c253b1e --- /dev/null +++ b/tests/functional/cylc-combination-scripts/06-vip-named-run @@ -0,0 +1 @@ +00-vip \ No newline at end of file diff --git a/tests/functional/cylc-combination-scripts/06-vip-named-run.t b/tests/functional/cylc-combination-scripts/06-vip-named-run.t new file mode 100644 index 00000000000..27a9410bfa9 --- /dev/null +++ b/tests/functional/cylc-combination-scripts/06-vip-named-run.t @@ -0,0 +1,45 @@ +#!/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 `cylc vip` (Validate Install Play) + +. "$(dirname "$0")/test_header" +set_test_number 5 + +WORKFLOW_NAME="cylctb-x$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6)" + +cp -r "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/flow.cylc" . +cp -r "${TEST_SOURCE_DIR}/${TEST_NAME_BASE}/reference.log" . + +run_ok "${TEST_NAME_BASE}-from-path" \ + cylc vip --no-detach --debug \ + --workflow-name "${WORKFLOW_NAME}" \ + --initial-cycle-point=1300 \ + --run-name sardine \ + --reference-test \ + +grep_ok "13000101T0000Z" "${TEST_NAME_BASE}-from-path.stdout" + +grep "\$" "${TEST_NAME_BASE}-from-path.stdout" > VIPOUT.txt + +named_grep_ok "${TEST_NAME_BASE}-it-validated" "$ cylc validate" "VIPOUT.txt" +named_grep_ok "${TEST_NAME_BASE}-it-installed" "$ cylc install" "VIPOUT.txt" +named_grep_ok "${TEST_NAME_BASE}-it-played" "$ cylc play" "VIPOUT.txt" + +purge +exit 0 From 949e38a597f59e0d92517a98278180fb28107640 Mon Sep 17 00:00:00 2001 From: Tim Pillinger <26465611+wxtim@users.noreply.github.com> Date: Mon, 23 Jan 2023 14:59:12 +0000 Subject: [PATCH 2/4] Get both workflow name and workflow id from install: Where name is `workflow` and id is `workflow/runX` or `workflow/name`. mypy fix --- cylc/flow/scripts/install.py | 15 ++++++++------- cylc/flow/scripts/validate_install_play.py | 2 +- cylc/flow/workflow_files.py | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cylc/flow/scripts/install.py b/cylc/flow/scripts/install.py index f58fcc542f4..b33856ad9ad 100755 --- a/cylc/flow/scripts/install.py +++ b/cylc/flow/scripts/install.py @@ -84,7 +84,7 @@ import asyncio from optparse import Values from pathlib import Path -from typing import Optional, Dict, Any +from typing import Any, Dict, Optional, Tuple from cylc.flow.scripts.scan import ( get_pipe, @@ -269,18 +269,18 @@ def main( def install_cli( opts: 'Values', reg: Optional[str] = None -) -> str: +) -> Tuple[str, str]: """Install workflow and scan for already-running instances.""" - wf_name = install(opts, reg) + wf_name, wf_id = install(opts, reg) asyncio.run( scan(wf_name, not opts.no_ping) ) - return wf_name + return wf_name, wf_id def install( opts: 'Values', reg: Optional[str] = None -) -> str: +) -> Tuple[str, str]: if opts.no_run_name and opts.run_name: raise InputError( "options --no-run-name and --run-name are mutually exclusive." @@ -306,7 +306,7 @@ def install( elif opts.symlink_dirs: cli_symdirs = parse_cli_sym_dirs(opts.symlink_dirs) - source_dir, rundir, workflow_name = install_workflow( + source_dir, rundir, workflow_name, workflow_id = install_workflow( source=source, workflow_name=opts.workflow_name, run_name=opts.run_name, @@ -331,4 +331,5 @@ def install( entry_point.name, exc ) from None - return workflow_name + + return workflow_name, workflow_id diff --git a/cylc/flow/scripts/validate_install_play.py b/cylc/flow/scripts/validate_install_play.py index 25f6e805b5e..655d101a369 100644 --- a/cylc/flow/scripts/validate_install_play.py +++ b/cylc/flow/scripts/validate_install_play.py @@ -95,7 +95,7 @@ def main(parser: COP, options: 'Values', workflow_id: Optional[str] = None): validate_main(parser, options, str(source)) log_subcommand('install', source) - workflow_id = cylc_install(options, workflow_id) + _, workflow_id = cylc_install(options, workflow_id) cleanup_sysargv( 'play', diff --git a/cylc/flow/workflow_files.py b/cylc/flow/workflow_files.py index 3667206812d..513ec70bea7 100644 --- a/cylc/flow/workflow_files.py +++ b/cylc/flow/workflow_files.py @@ -1633,7 +1633,7 @@ def install_workflow( run_name: Optional[str] = None, no_run_name: bool = False, cli_symlink_dirs: Optional[Dict[str, Dict[str, Any]]] = None -) -> Tuple[Path, Path, str]: +) -> Tuple[Path, Path, str, str]: """Install a workflow, or renew its installation. Install workflow into new run directory. @@ -1751,7 +1751,7 @@ def install_workflow( install_log.info(f'INSTALLED {named_run} from {source}') print(f'INSTALLED {named_run} from {source}') close_log(install_log) - return source, rundir, named_run + return source, rundir, workflow_name, named_run def get_run_dir_info( From a8ef493d9754fd5aef935571b6c5f5816a60fcf5 Mon Sep 17 00:00:00 2001 From: Tim Pillinger <26465611+wxtim@users.noreply.github.com> Date: Tue, 24 Jan 2023 10:56:05 +0000 Subject: [PATCH 3/4] Response to review --- cylc/flow/workflow_files.py | 1 + tests/integration/conftest.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cylc/flow/workflow_files.py b/cylc/flow/workflow_files.py index 513ec70bea7..f32ddc0afaa 100644 --- a/cylc/flow/workflow_files.py +++ b/cylc/flow/workflow_files.py @@ -1655,6 +1655,7 @@ def install_workflow( rundir: absolute path to run directory, where the workflow has been installed into. workflow_name: installed workflow name (which may be computed here). + named_run: Name of the run. Raise: WorkflowFilesError: diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 65fdab9713a..b2a4f0dde97 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -469,7 +469,7 @@ def _inner(source, **kwargs): # Cylc install's default limit. opts.workflow_name = ( f'{str(test_dir.relative_to(run_dir))}.{source.name}') - workflow_id = cylc_install(opts, str(source)) + workflow_id, _ = cylc_install(opts, str(source)) workflow_id = infer_latest_run_from_id(workflow_id) return workflow_id yield _inner From d5333f54e667f8904ca92863c2738973733fa477 Mon Sep 17 00:00:00 2001 From: Oliver Sanders Date: Tue, 24 Jan 2023 17:24:25 +0000 Subject: [PATCH 4/4] Update tests/functional/cylc-combination-scripts/06-vip-named-run.t --- tests/functional/cylc-combination-scripts/06-vip-named-run.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/cylc-combination-scripts/06-vip-named-run.t b/tests/functional/cylc-combination-scripts/06-vip-named-run.t index 27a9410bfa9..bb53b08dfcc 100644 --- a/tests/functional/cylc-combination-scripts/06-vip-named-run.t +++ b/tests/functional/cylc-combination-scripts/06-vip-named-run.t @@ -31,7 +31,7 @@ run_ok "${TEST_NAME_BASE}-from-path" \ --workflow-name "${WORKFLOW_NAME}" \ --initial-cycle-point=1300 \ --run-name sardine \ - --reference-test \ + --reference-test grep_ok "13000101T0000Z" "${TEST_NAME_BASE}-from-path.stdout"