Skip to content

Commit

Permalink
Merge pull request #5533 from cylc/8.1.x-deconflict
Browse files Browse the repository at this point in the history
🤖 Merge 8.1.x-deconflict into master
  • Loading branch information
MetRonnie authored May 11, 2023
2 parents 3d49d4f + 7d23448 commit 250431c
Show file tree
Hide file tree
Showing 9 changed files with 57 additions and 16 deletions.
13 changes: 13 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,22 @@ short option for `--no-detach` to `-N`; add `-r` as a short option for
`--run-name`.

### Fixes

[#5328](https://github.com/cylc/cylc-flow/pull/5328) -
Efficiency improvements to reduce task management overheads on the Scheduler.

-------------------------------------------------------------------------------
## __cylc-8.1.5 (<span actions:bind='release-date'>Upcoming</span>)__

### Fixes

[#5228](https://github.com/cylc/cylc-flow/pull/5228) -
Enabled the "stop", "poll", "kill" and "message" commands to be issued from
the UI whilst the workflow is in the process of shutting down.

[#5524](https://github.com/cylc/cylc-flow/pull/5524) - Logging includes timestamps
for `cylc play` when called by `cylc vip` or `cylc vr`.

-------------------------------------------------------------------------------
## __cylc-8.1.4 (<span actions:bind='release-date'>Released 2023-05-04</span>)__

Expand Down
6 changes: 3 additions & 3 deletions cylc/flow/loggingutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -333,11 +333,11 @@ def re_formatter(log_string):
return log_string


def disable_timestamps(logger: logging.Logger) -> None:
"""For readability omit timestamps from logging."""
def set_timestamps(logger: logging.Logger, enable: bool) -> None:
"""Enable or disable logging timestamps."""
for handler in logger.handlers:
if isinstance(handler.formatter, CylcLogFormatter):
handler.formatter.configure(timestamp=False)
handler.formatter.configure(timestamp=enable)


def setup_segregated_log_streams(
Expand Down
8 changes: 4 additions & 4 deletions cylc/flow/network/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -1588,7 +1588,7 @@ class Meta:
this command to report messages and to report registered task
outputs.
Valid for: paused, running workflows.
Valid for: paused, running, stopping workflows.
''')
resolver = partial(mutator, command='put_messages')

Expand Down Expand Up @@ -1719,7 +1719,7 @@ class Meta:
be executed prior to shutdown, unless
the stop mode is `{WorkflowStopMode.Now.name}`.
Valid for: paused, running workflows.
Valid for: paused, running, stopping workflows.
''')
resolver = mutator

Expand Down Expand Up @@ -1872,7 +1872,7 @@ class Meta:
description = sstrip('''
Kill running or submitted jobs.
Valid for: paused, running workflows.
Valid for: paused, running, stopping workflows.
''')
resolver = partial(mutator, command='kill_tasks')

Expand All @@ -1889,7 +1889,7 @@ class Meta:
an associated job ID, including incomplete finished
tasks.
Valid for: paused, running workflows.
Valid for: paused, running, stopping workflows.
''')
resolver = partial(mutator, command='poll_tasks')

Expand Down
4 changes: 2 additions & 2 deletions cylc/flow/scripts/clean.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
from cylc.flow.exceptions import CylcError, InputError
import cylc.flow.flags
from cylc.flow.id_cli import parse_ids_async
from cylc.flow.loggingutil import disable_timestamps
from cylc.flow.loggingutil import set_timestamps
from cylc.flow.option_parsers import (
WORKFLOW_ID_MULTI_ARG_DOC,
CylcOptionParser as COP,
Expand Down Expand Up @@ -209,7 +209,7 @@ async def run(*ids: str, opts: 'Values') -> None:
@cli_function(get_option_parser)
def main(_, opts: 'Values', *ids: str):
if cylc.flow.flags.verbosity < 2:
disable_timestamps(LOG)
set_timestamps(LOG, False)

if opts.local_only and opts.remote_only:
raise InputError(
Expand Down
4 changes: 2 additions & 2 deletions cylc/flow/scripts/get_resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@

from cylc.flow import LOG
import cylc.flow.flags
from cylc.flow.loggingutil import disable_timestamps
from cylc.flow.loggingutil import set_timestamps
from cylc.flow.option_parsers import CylcOptionParser as COP
from cylc.flow.resources import get_resources, list_resources
from cylc.flow.terminal import cli_function
Expand Down Expand Up @@ -75,7 +75,7 @@ def get_option_parser():
@cli_function(get_option_parser)
def main(parser, opts, resource=None, tgt_dir=None):
if cylc.flow.flags.verbosity < 2:
disable_timestamps(LOG)
set_timestamps(LOG, False)
if not resource or opts.list:
list_resources()
sys.exit(0)
Expand Down
4 changes: 2 additions & 2 deletions cylc/flow/scripts/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import cylc.flow.flags
from cylc.flow.id import Tokens
from cylc.flow.id_cli import parse_id_async
from cylc.flow.loggingutil import disable_timestamps
from cylc.flow.loggingutil import set_timestamps
from cylc.flow.option_parsers import (
AGAINST_SOURCE_OPTION,
WORKFLOW_ID_OR_PATH_ARG_DOC,
Expand Down Expand Up @@ -145,7 +145,7 @@ async def wrapped_main(
profiler.start()

if cylc.flow.flags.verbosity < 2:
disable_timestamps(LOG)
set_timestamps(LOG, False)

workflow_id, _, flow_file = await parse_id_async(
workflow_id,
Expand Down
6 changes: 4 additions & 2 deletions cylc/flow/scripts/validate_install_play.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@
from cylc.flow.scripts.install import (
INSTALL_OPTIONS, install_cli as cylc_install, get_source_location
)
from cylc.flow import LOG
from cylc.flow.scheduler_cli import PLAY_OPTIONS
from cylc.flow.loggingutil import set_timestamps
from cylc.flow.option_parsers import (
CylcOptionParser as COP,
combine_options,
Expand Down Expand Up @@ -79,6 +81,7 @@ def get_option_parser() -> COP:
# no sense in a VIP context.
if option.kwargs.get('dest') != 'against_source':
parser.add_option(*option.args, **option.kwargs)

return parser


Expand All @@ -87,10 +90,8 @@ def main(parser: COP, options: 'Values', workflow_id: Optional[str] = None):
"""Run Cylc validate - install - play in sequence."""
if not workflow_id:
workflow_id = '.'

orig_source = workflow_id
source = get_source_location(workflow_id)

log_subcommand('validate', source)
validate_main(parser, options, str(source))

Expand All @@ -109,5 +110,6 @@ def main(parser: COP, options: 'Values', workflow_id: Optional[str] = None):
source=orig_source,
)

set_timestamps(LOG, options.log_timestamp)
log_subcommand('play', workflow_id)
_play(parser, options, workflow_id)
2 changes: 2 additions & 0 deletions cylc/flow/scripts/validate_reinstall.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
from cylc.flow import LOG
from cylc.flow.exceptions import ServiceFileError
from cylc.flow.id_cli import parse_id
from cylc.flow.loggingutil import set_timestamps
from cylc.flow.option_parsers import (
WORKFLOW_ID_ARG_DOC,
CylcOptionParser as COP,
Expand Down Expand Up @@ -180,6 +181,7 @@ def vro_cli(parser: COP, options: 'Values', workflow_id: str):

# run play anyway, to play a stopped workflow:
else:
set_timestamps(LOG, options.log_timestamp)
cleanup_sysargv(
'play',
unparsed_wid,
Expand Down
26 changes: 25 additions & 1 deletion tests/unit/test_loggingutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from time import sleep
import pytest
from pytest import param
import re
import sys
from typing import Callable
from unittest import mock

Expand All @@ -28,7 +30,8 @@
RotatingLogFileHandler,
CylcLogFormatter,
get_reload_start_number,
get_sorted_logs_by_time
get_sorted_logs_by_time,
set_timestamps,
)


Expand Down Expand Up @@ -173,3 +176,24 @@ def test_get_reload_number_no_logs(tmp_run_dir: Callable):
config_log_dir.mkdir(exist_ok=True, parents=True)
config_logs = get_sorted_logs_by_time(config_log_dir, "*.cylc")
assert get_reload_start_number(config_logs) == '01'


def test_set_timestamps(capsys):
"""The enable and disable timstamp methods do what they say"""
# Setup log handler
log_handler = logging.StreamHandler(sys.stderr)
log_handler.setFormatter(CylcLogFormatter())
LOG.addHandler(log_handler)

# Log some messages with timestamps on or off:
LOG.warning('foo')
set_timestamps(LOG, False)
LOG.warning('bar')
set_timestamps(LOG, True)
LOG.warning('baz')

# Check 1st and 3rd error have something timestamp-like:
errors = capsys.readouterr().err.split('\n')
assert re.match('^[0-9]{4}', errors[0])
assert re.match('^WARNING - bar', errors[1])
assert re.match('^[0-9]{4}', errors[2])

0 comments on commit 250431c

Please sign in to comment.