parsl 2024.7.29__py3-none-any.whl → 2024.8.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. parsl/channels/__init__.py +1 -4
  2. parsl/channels/oauth_ssh/oauth_ssh.py +2 -2
  3. parsl/channels/ssh/ssh.py +1 -1
  4. parsl/channels/ssh_il/ssh_il.py +2 -2
  5. parsl/dataflow/dflow.py +2 -2
  6. parsl/executors/base.py +7 -7
  7. parsl/executors/high_throughput/executor.py +15 -7
  8. parsl/executors/high_throughput/interchange.py +40 -37
  9. parsl/executors/high_throughput/manager_selector.py +25 -0
  10. parsl/executors/status_handling.py +38 -24
  11. parsl/executors/taskvine/executor.py +2 -0
  12. parsl/executors/workqueue/executor.py +2 -0
  13. parsl/monitoring/db_manager.py +10 -10
  14. parsl/monitoring/errors.py +6 -0
  15. parsl/monitoring/monitoring.py +3 -3
  16. parsl/monitoring/radios.py +16 -0
  17. parsl/monitoring/remote.py +4 -4
  18. parsl/monitoring/router.py +71 -35
  19. parsl/providers/__init__.py +0 -4
  20. parsl/providers/ad_hoc/ad_hoc.py +6 -2
  21. parsl/tests/configs/local_adhoc.py +2 -2
  22. parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
  23. parsl/tests/test_htex/test_htex.py +28 -19
  24. parsl/tests/test_htex/test_zmq_binding.py +4 -1
  25. parsl/tests/test_monitoring/test_basic.py +14 -1
  26. parsl/tests/test_mpi_apps/test_mpiex.py +1 -1
  27. parsl/tests/test_providers/test_local_provider.py +6 -5
  28. parsl/version.py +1 -1
  29. {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/interchange.py +40 -37
  30. parsl-2024.8.12.dist-info/METADATA +101 -0
  31. {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/RECORD +38 -46
  32. {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/WHEEL +1 -1
  33. parsl/configs/ad_hoc.py +0 -38
  34. parsl/tests/configs/ad_hoc_cluster_htex.py +0 -35
  35. parsl/tests/configs/htex_ad_hoc_cluster.py +0 -26
  36. parsl/tests/configs/swan_htex.py +0 -43
  37. parsl/tests/integration/test_channels/test_scp_1.py +0 -45
  38. parsl/tests/integration/test_channels/test_ssh_1.py +0 -40
  39. parsl/tests/integration/test_channels/test_ssh_errors.py +0 -46
  40. parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -41
  41. parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -24
  42. parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -49
  43. parsl/tests/manual_tests/test_oauth_ssh.py +0 -13
  44. parsl-2024.7.29.dist-info/METADATA +0 -101
  45. {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/exec_parsl_function.py +0 -0
  46. {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/parsl_coprocess.py +0 -0
  47. {parsl-2024.7.29.data → parsl-2024.8.12.data}/scripts/process_worker_pool.py +0 -0
  48. {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/LICENSE +0 -0
  49. {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/entry_points.txt +0 -0
  50. {parsl-2024.7.29.dist-info → parsl-2024.8.12.dist-info}/top_level.txt +0 -0
@@ -1,26 +0,0 @@
1
- from parsl.channels import SSHChannel
2
- from parsl.config import Config
3
- from parsl.executors import HighThroughputExecutor
4
- from parsl.providers import AdHocProvider
5
- from parsl.tests.configs.user_opts import user_opts
6
-
7
- config = Config(
8
- executors=[
9
- HighThroughputExecutor(
10
- label='remote_htex',
11
- cores_per_worker=1,
12
- worker_debug=False,
13
- address=user_opts['public_ip'],
14
- encrypted=True,
15
- provider=AdHocProvider(
16
- move_files=False,
17
- parallelism=1,
18
- worker_init=user_opts['adhoc']['worker_init'],
19
- channels=[SSHChannel(hostname=m,
20
- username=user_opts['adhoc']['username'],
21
- script_dir=user_opts['adhoc']['script_dir'],
22
- ) for m in user_opts['adhoc']['remote_hostnames']]
23
- )
24
- )
25
- ],
26
- )
@@ -1,43 +0,0 @@
1
- """
2
- ================== Block
3
- | ++++++++++++++ | Node
4
- | | | |
5
- | | Task | | . . .
6
- | | | |
7
- | ++++++++++++++ |
8
- ==================
9
- """
10
- from parsl.channels import SSHChannel
11
- from parsl.config import Config
12
- from parsl.executors import HighThroughputExecutor
13
- from parsl.launchers import AprunLauncher
14
- from parsl.providers import TorqueProvider
15
-
16
- # If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
17
- # If you are a user copying-and-pasting this as an example, make sure to either
18
- # 1) create a local `user_opts.py`, or
19
- # 2) delete the user_opts import below and replace all appearances of `user_opts` with the literal value
20
- # (i.e., user_opts['swan']['username'] -> 'your_username')
21
- from .user_opts import user_opts
22
-
23
- config = Config(
24
- executors=[
25
- HighThroughputExecutor(
26
- label='swan_htex',
27
- encrypted=True,
28
- provider=TorqueProvider(
29
- channel=SSHChannel(
30
- hostname='swan.cray.com',
31
- username=user_opts['swan']['username'],
32
- script_dir=user_opts['swan']['script_dir'],
33
- ),
34
- nodes_per_block=1,
35
- init_blocks=1,
36
- max_blocks=1,
37
- launcher=AprunLauncher(),
38
- scheduler_options=user_opts['swan']['scheduler_options'],
39
- worker_init=user_opts['swan']['worker_init'],
40
- ),
41
- )
42
- ]
43
- )
@@ -1,45 +0,0 @@
1
- import os
2
-
3
- from parsl.channels.ssh.ssh import SSHChannel as SSH
4
-
5
-
6
- def connect_and_list(hostname, username):
7
- out = ''
8
- conn = SSH(hostname, username=username)
9
- conn.push_file(os.path.abspath('remote_run.sh'), '/home/davidk/')
10
- # ec, out, err = conn.execute_wait("ls /tmp/remote_run.sh; bash /tmp/remote_run.sh")
11
- conn.close()
12
- return out
13
-
14
-
15
- script = '''#!/bin/bash
16
- echo "Hostname: $HOSTNAME"
17
- echo "Cpu info -----"
18
- cat /proc/cpuinfo
19
- echo "Done----------"
20
- '''
21
-
22
-
23
- def test_connect_1():
24
- with open('remote_run.sh', 'w') as f:
25
- f.write(script)
26
-
27
- sites = {
28
- 'midway': {
29
- 'url': 'midway.rcc.uchicago.edu',
30
- 'uname': 'yadunand'
31
- },
32
- 'swift': {
33
- 'url': 'swift.rcc.uchicago.edu',
34
- 'uname': 'yadunand'
35
- }
36
- }
37
-
38
- for site in sites.values():
39
- out = connect_and_list(site['url'], site['uname'])
40
- print("Sitename :{0} hostname:{1}".format(site['url'], out))
41
-
42
-
43
- if __name__ == "__main__":
44
-
45
- test_connect_1()
@@ -1,40 +0,0 @@
1
- from parsl.channels.ssh.ssh import SSHChannel as SSH
2
-
3
-
4
- def connect_and_list(hostname, username):
5
- conn = SSH(hostname, username=username)
6
- ec, out, err = conn.execute_wait("echo $HOSTNAME")
7
- conn.close()
8
- return out
9
-
10
-
11
- def test_midway():
12
- ''' Test ssh channels to midway
13
- '''
14
- url = 'midway.rcc.uchicago.edu'
15
- uname = 'yadunand'
16
- out = connect_and_list(url, uname)
17
- print("Sitename :{0} hostname:{1}".format(url, out))
18
-
19
-
20
- def test_beagle():
21
- ''' Test ssh channels to beagle
22
- '''
23
- url = 'login04.beagle.ci.uchicago.edu'
24
- uname = 'yadunandb'
25
- out = connect_and_list(url, uname)
26
- print("Sitename :{0} hostname:{1}".format(url, out))
27
-
28
-
29
- def test_osg():
30
- ''' Test ssh connectivity to osg
31
- '''
32
- url = 'login.osgconnect.net'
33
- uname = 'yadunand'
34
- out = connect_and_list(url, uname)
35
- print("Sitename :{0} hostname:{1}".format(url, out))
36
-
37
-
38
- if __name__ == "__main__":
39
-
40
- pass
@@ -1,46 +0,0 @@
1
- from parsl.channels.errors import BadHostKeyException, SSHException
2
- from parsl.channels.ssh.ssh import SSHChannel as SSH
3
-
4
-
5
- def connect_and_list(hostname, username):
6
- conn = SSH(hostname, username=username)
7
- ec, out, err = conn.execute_wait("echo $HOSTNAME")
8
- conn.close()
9
- return out
10
-
11
-
12
- def test_error_1():
13
- try:
14
- connect_and_list("bad.url.gov", "ubuntu")
15
- except Exception as e:
16
- assert type(e) is SSHException, "Expected SSException, got: {0}".format(e)
17
-
18
-
19
- def test_error_2():
20
- try:
21
- connect_and_list("swift.rcc.uchicago.edu", "mango")
22
- except SSHException:
23
- print("Caught the right exception")
24
- else:
25
- raise Exception("Expected SSException, got: {0}".format(e))
26
-
27
-
28
- def test_error_3():
29
- ''' This should work
30
- '''
31
- try:
32
- connect_and_list("edison.nersc.gov", "yadunand")
33
- except BadHostKeyException as e:
34
- print("Caught exception BadHostKeyException: ", e)
35
- else:
36
- assert False, "Expected SSException, got: {0}".format(e)
37
-
38
-
39
- if __name__ == "__main__":
40
-
41
- tests = [test_error_1, test_error_2, test_error_3]
42
-
43
- for test in tests:
44
- print("---------Running : {0}---------------".format(test))
45
- test()
46
- print("----------------------DONE--------------------------")
@@ -1,41 +0,0 @@
1
- import parsl
2
- from parsl.channels.ssh.ssh import SSHChannel as SSH
3
-
4
-
5
- def connect_and_list(hostname, username):
6
- conn = SSH(hostname, username=username)
7
- ec, out, err = conn.execute_wait("echo $HOSTNAME")
8
- conn.close()
9
- return out
10
-
11
-
12
- def test_push(conn, fname="test001.txt"):
13
-
14
- with open(fname, 'w') as f:
15
- f.write("Hello from parsl.ssh testing\n")
16
-
17
- conn.push_file(fname, "/tmp")
18
- ec, out, err = conn.execute_wait("ls /tmp/{0}".format(fname))
19
- print(ec, out, err)
20
-
21
-
22
- def test_pull(conn, fname="test001.txt"):
23
-
24
- local = "foo"
25
- conn.pull_file("/tmp/{0}".format(fname), local)
26
-
27
- with open("{0}/{1}".format(local, fname), 'r') as f:
28
- print(f.readlines())
29
-
30
-
31
- if __name__ == "__main__":
32
-
33
- parsl.set_stream_logger()
34
-
35
- # This is for testing
36
- conn = SSH("midway.rcc.uchicago.edu", username="yadunand")
37
-
38
- test_push(conn)
39
- test_pull(conn)
40
-
41
- conn.close()
@@ -1,24 +0,0 @@
1
- import parsl
2
- from parsl.channels.ssh_il.ssh_il import SSHInteractiveLoginChannel as SSH
3
-
4
-
5
- def connect_and_list(hostname, username):
6
- conn = SSH(hostname, username=username)
7
- ec, out, err = conn.execute_wait("echo $HOSTNAME")
8
- conn.close()
9
- return out
10
-
11
-
12
- def test_cooley():
13
- ''' Test ssh channels to midway
14
- '''
15
- url = 'cooley.alcf.anl.gov'
16
- uname = 'yadunand'
17
- out = connect_and_list(url, uname)
18
- print("Sitename :{0} hostname:{1}".format(url, out))
19
- return
20
-
21
-
22
- if __name__ == "__main__":
23
- parsl.set_stream_logger()
24
- test_cooley()
@@ -1,49 +0,0 @@
1
- import parsl
2
- from parsl import python_app
3
-
4
- parsl.set_stream_logger()
5
-
6
- from parsl.channels import SSHChannel
7
- from parsl.config import Config
8
- from parsl.executors import HighThroughputExecutor
9
- from parsl.providers import AdHocProvider
10
-
11
- remotes = ['midway2-login2.rcc.uchicago.edu', 'midway2-login1.rcc.uchicago.edu']
12
-
13
- config = Config(
14
- executors=[
15
- HighThroughputExecutor(
16
- label='AdHoc',
17
- max_workers_per_node=2,
18
- worker_logdir_root="/scratch/midway2/yadunand/parsl_scripts",
19
- encrypted=True,
20
- provider=AdHocProvider(
21
- worker_init="source /scratch/midway2/yadunand/parsl_env_setup.sh",
22
- channels=[SSHChannel(hostname=m,
23
- username="yadunand",
24
- script_dir="/scratch/midway2/yadunand/parsl_cluster")
25
- for m in remotes]
26
- )
27
- )
28
- ]
29
- )
30
-
31
-
32
- @python_app
33
- def platform(sleep=2, stdout=None):
34
- import platform
35
- import time
36
- time.sleep(sleep)
37
- return platform.uname()
38
-
39
-
40
- def test_raw_provider():
41
-
42
- parsl.load(config)
43
-
44
- x = [platform() for i in range(10)]
45
- print([i.result() for i in x])
46
-
47
-
48
- if __name__ == "__main__":
49
- test_raw_provider()
@@ -1,13 +0,0 @@
1
- from parsl.channels import OAuthSSHChannel
2
-
3
-
4
- def test_channel():
5
- channel = OAuthSSHChannel(hostname='ssh.demo.globus.org', username='yadunand')
6
- x, stdout, stderr = channel.execute_wait('ls')
7
- print(x, stdout, stderr)
8
- assert x == 0, "Expected exit code 0, got {}".format(x)
9
-
10
-
11
- if __name__ == '__main__':
12
-
13
- test_channel()
@@ -1,101 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: parsl
3
- Version: 2024.7.29
4
- Summary: Simple data dependent workflows in Python
5
- Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2024.07.29.tar.gz
7
- Author: The Parsl Team
8
- Author-email: parsl@googlegroups.com
9
- License: Apache 2.0
10
- Keywords: Workflows,Scientific computing
11
- Classifier: Development Status :: 5 - Production/Stable
12
- Classifier: Intended Audience :: Developers
13
- Classifier: License :: OSI Approved :: Apache Software License
14
- Classifier: Programming Language :: Python :: 3.8
15
- Classifier: Programming Language :: Python :: 3.9
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
18
- Classifier: Programming Language :: Python :: 3.12
19
- Requires-Python: >=3.8.0
20
- License-File: LICENSE
21
- Requires-Dist: pyzmq >=17.1.2
22
- Requires-Dist: typeguard !=3.*,<5,>=2.10
23
- Requires-Dist: typing-extensions <5,>=4.6
24
- Requires-Dist: globus-sdk
25
- Requires-Dist: dill
26
- Requires-Dist: tblib
27
- Requires-Dist: requests
28
- Requires-Dist: paramiko
29
- Requires-Dist: psutil >=5.5.1
30
- Requires-Dist: setproctitle
31
- Requires-Dist: filelock <4,>=3.13
32
- Provides-Extra: all
33
- Requires-Dist: sqlalchemy <2,>=1.4 ; extra == 'all'
34
- Requires-Dist: pydot ; extra == 'all'
35
- Requires-Dist: networkx <2.6,>=2.5 ; extra == 'all'
36
- Requires-Dist: Flask >=1.0.2 ; extra == 'all'
37
- Requires-Dist: flask-sqlalchemy ; extra == 'all'
38
- Requires-Dist: pandas <2.2 ; extra == 'all'
39
- Requires-Dist: plotly ; extra == 'all'
40
- Requires-Dist: python-daemon ; extra == 'all'
41
- Requires-Dist: boto3 ; extra == 'all'
42
- Requires-Dist: kubernetes ; extra == 'all'
43
- Requires-Dist: oauth-ssh >=0.9 ; extra == 'all'
44
- Requires-Dist: ipython <=8.6.0 ; extra == 'all'
45
- Requires-Dist: nbsphinx ; extra == 'all'
46
- Requires-Dist: sphinx <7.2,>=7.1 ; extra == 'all'
47
- Requires-Dist: sphinx-rtd-theme ; extra == 'all'
48
- Requires-Dist: google-auth ; extra == 'all'
49
- Requires-Dist: google-api-python-client ; extra == 'all'
50
- Requires-Dist: python-gssapi ; extra == 'all'
51
- Requires-Dist: azure <=4 ; extra == 'all'
52
- Requires-Dist: msrestazure ; extra == 'all'
53
- Requires-Dist: work-queue ; extra == 'all'
54
- Requires-Dist: pyyaml ; extra == 'all'
55
- Requires-Dist: cffi ; extra == 'all'
56
- Requires-Dist: jsonschema ; extra == 'all'
57
- Requires-Dist: proxystore ; extra == 'all'
58
- Requires-Dist: radical.pilot ==1.60 ; extra == 'all'
59
- Requires-Dist: radical.utils ==1.60 ; extra == 'all'
60
- Provides-Extra: aws
61
- Requires-Dist: boto3 ; extra == 'aws'
62
- Provides-Extra: azure
63
- Requires-Dist: azure <=4 ; extra == 'azure'
64
- Requires-Dist: msrestazure ; extra == 'azure'
65
- Provides-Extra: docs
66
- Requires-Dist: ipython <=8.6.0 ; extra == 'docs'
67
- Requires-Dist: nbsphinx ; extra == 'docs'
68
- Requires-Dist: sphinx <7.2,>=7.1 ; extra == 'docs'
69
- Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
70
- Provides-Extra: flux
71
- Requires-Dist: pyyaml ; extra == 'flux'
72
- Requires-Dist: cffi ; extra == 'flux'
73
- Requires-Dist: jsonschema ; extra == 'flux'
74
- Provides-Extra: google_cloud
75
- Requires-Dist: google-auth ; extra == 'google_cloud'
76
- Requires-Dist: google-api-python-client ; extra == 'google_cloud'
77
- Provides-Extra: gssapi
78
- Requires-Dist: python-gssapi ; extra == 'gssapi'
79
- Provides-Extra: kubernetes
80
- Requires-Dist: kubernetes ; extra == 'kubernetes'
81
- Provides-Extra: monitoring
82
- Requires-Dist: sqlalchemy <2,>=1.4 ; extra == 'monitoring'
83
- Provides-Extra: oauth_ssh
84
- Requires-Dist: oauth-ssh >=0.9 ; extra == 'oauth_ssh'
85
- Provides-Extra: proxystore
86
- Requires-Dist: proxystore ; extra == 'proxystore'
87
- Provides-Extra: radical-pilot
88
- Requires-Dist: radical.pilot ==1.60 ; extra == 'radical-pilot'
89
- Requires-Dist: radical.utils ==1.60 ; extra == 'radical-pilot'
90
- Provides-Extra: visualization
91
- Requires-Dist: pydot ; extra == 'visualization'
92
- Requires-Dist: networkx <2.6,>=2.5 ; extra == 'visualization'
93
- Requires-Dist: Flask >=1.0.2 ; extra == 'visualization'
94
- Requires-Dist: flask-sqlalchemy ; extra == 'visualization'
95
- Requires-Dist: pandas <2.2 ; extra == 'visualization'
96
- Requires-Dist: plotly ; extra == 'visualization'
97
- Requires-Dist: python-daemon ; extra == 'visualization'
98
- Provides-Extra: workqueue
99
- Requires-Dist: work-queue ; extra == 'workqueue'
100
-
101
- Simple parallel workflows system for Python