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"