Skip to content

Commit cc8405c

Browse files
author
Nathan Lee
committed
Removal of unused imports. Added new signal and notification options
1 parent 850f35f commit cc8405c

File tree

6 files changed

+36
-22
lines changed

6 files changed

+36
-22
lines changed

pyrunner/core/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ def __init__(self):
103103
'dryrun' : { 'type': bool, 'preserve': False, 'env': 'APP_DRYRUN' , 'value': None, 'default': False },
104104
'email_on_fail' : { 'type': bool, 'preserve': False, 'env': 'APP_EMAIL_ON_FAIL' , 'value': None, 'default': True },
105105
'email_on_success' : { 'type': bool, 'preserve': False, 'env': 'APP_EMAIL_ON_SUCCESS' , 'value': None, 'default': True },
106+
'notify_on_fail' : { 'type': bool, 'preserve': False, 'env': 'APP_NOTIFY_ON_FAIL' , 'value': None, 'default': True },
107+
'notify_on_success' : { 'type': bool, 'preserve': False, 'env': 'APP_NOTIFY_ON_SUCCESS' , 'value': None, 'default': True },
108+
'as_service' : { 'type': bool, 'preserve': True, 'env': 'APP_AS_SERVICE' , 'value': None, 'default': False },
106109
'test_mode' : { 'type': bool, 'preserve': True, 'env': 'APP_TEST_MODE' , 'value': None, 'default': False }
107110
}
108111
self._iter_keys = None

pyrunner/core/engine.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,10 @@
1717
import pyrunner.core.constants as constants
1818
from pyrunner.core.config import Config
1919
from pyrunner.core.context import Context
20-
from pyrunner.core.signal import SignalHandler, SIG_ABORT, SIG_PAUSE
20+
from pyrunner.core.signal import SignalHandler, SIG_ABORT, SIG_PULSE, SIG_RESTART
2121
from multiprocessing import Manager
2222

23-
import os, sys, glob
24-
import time
25-
import pickle
23+
import sys, time
2624

2725
class ExecutionEngine:
2826
"""
@@ -89,14 +87,19 @@ def initiate(self, **kwargs):
8987
# Execution loop
9088
try:
9189
while self.register.running_nodes or self.register.pending_nodes:
92-
sig_set = signal_handler.consume()
90+
# Consume pulse signal, if any, to indicate app is already running
91+
signal_handler.consume(SIG_PULSE)
9392

9493
# Check for abort signals
95-
if SIG_ABORT in sig_set:
94+
if signal_handler.consume(SIG_ABORT):
9695
print('ABORT signal received! Terminating all running Workers.')
9796
self._abort_all_workers()
9897
return -1
9998

99+
# Check for restart signals; restart failed nodes, if any
100+
if signal_handler.consume(SIG_RESTART):
101+
pass
102+
100103
# Poll running nodes for completion/failure
101104
for node in self.register.running_nodes.copy():
102105
retcode = node.poll()

pyrunner/core/node.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,10 @@
1414
#
1515
# SPDX-License-Identifier: Apache-2.0
1616

17-
import pyrunner.core.constants as constants
1817
import pyrunner.logger.file as lg
1918
from pyrunner.worker.abstract import Worker
2019

21-
import os, sys
22-
import time
23-
import multiprocessing
24-
import importlib
25-
import traceback
26-
import inspect
27-
28-
from time import gmtime, strftime
20+
import time, multiprocessing, importlib
2921

3022
class ExecutionNode:
3123
"""

pyrunner/core/pyrunner.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import shutil
2020
import zipfile
2121
import getopt
22-
import traceback
2322

2423
import pyrunner.serde as serde
2524
import pyrunner.notification as notification
@@ -60,7 +59,7 @@ def __init__(self, **kwargs):
6059
raise OSError('Another process for "{}" is already running!'.format(self.config['app_name']))
6160
else:
6261
# Clear signals, if any, to ensure clean start.
63-
self.signal_handler.consume()
62+
self.signal_handler.consume_all()
6463

6564
def reset_env(self):
6665
os.environ.clear()
@@ -360,7 +359,8 @@ def parse_args(self, run_getopts=True):
360359
'env=', 'cvar=', 'context=', 'time-between-tasks=',
361360
'to=', 'from=', 'descendants=', 'ancestors=',
362361
'norun=', 'exec-only=', 'exec-proc-name=',
363-
'max-procs=', 'serde=', 'exec-loop-interval='
362+
'max-procs=', 'serde=', 'exec-loop-interval=',
363+
'notify-on-fail=', 'notify-on-success=', 'as-service'
364364
]
365365

366366
if run_getopts:
@@ -396,6 +396,10 @@ def parse_args(self, run_getopts=True):
396396
self.config['email_on_fail'] = arg
397397
elif opt in ['--email-on-success']:
398398
self.config['email_on_success'] = arg
399+
elif opt == '--notify-on-fail':
400+
self.config['notify_on_fail'] = arg
401+
elif opt == '--notify-on-success':
402+
self.config['nitory_on_success'] = arg
399403
elif opt == '--env':
400404
parts = arg.split('=')
401405
os.environ[parts[0]] = parts[1]
@@ -420,6 +424,8 @@ def parse_args(self, run_getopts=True):
420424
self.config['allow_duplicate_jobs'] = True
421425
elif opt in ['--exec-proc-name']:
422426
self.config['exec_proc_name'] = arg
427+
elif opt == '--as-service':
428+
self.config['as_service'] = True
423429
elif opt == '--abort':
424430
abort = True
425431
elif opt == '--silent':

pyrunner/core/signal.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
SIG_ABORT = 'sig.abort'
2020
SIG_PAUSE = 'sig.pause'
2121
SIG_PULSE = 'sig.pulse'
22+
SIG_RESTART = 'sig.restart'
2223

23-
_valid_signals = (SIG_ABORT, SIG_PAUSE, SIG_PULSE)
24+
_valid_signals = (SIG_ABORT, SIG_PAUSE, SIG_PULSE, SIG_RESTART)
2425

2526
class SignalHandler:
2627

@@ -31,10 +32,19 @@ def sig_file(self, sig):
3132
return '{}/.{}.{}'.format(self.config['temp_dir'], self.config['app_name'], sig)
3233

3334
def emit(self, sig):
34-
if sig not in _valid_signals: return ValueError('Unknown signal type: {}'.format(sig))
35+
if sig not in _valid_signals: raise ValueError('Unknown signal type: {}'.format(sig))
3536
open(self.sig_file(sig), 'a').close()
3637

37-
def consume(self):
38+
def consume(self, sig):
39+
if sig not in _valid_signals:
40+
raise ValueError('Unknown signal type: {}'.format(sig))
41+
if sig in self.peek():
42+
os.remove(self.sig_file(sig))
43+
return True
44+
else:
45+
return False
46+
47+
def consume_all(self):
3848
sig_set = self.peek()
3949
for sig in sig_set:
4050
os.remove(self.sig_file(sig))

pyrunner/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '5.2.1'
1+
__version__ = '6.0.0'

0 commit comments

Comments
 (0)