girder-worker 5.0.14.dev12__tar.gz → 5.0.15.dev2__tar.gz

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 (78) hide show
  1. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/PKG-INFO +1 -1
  2. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/app.py +21 -0
  3. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/tasks/__init__.py +37 -9
  4. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/task.py +16 -0
  5. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/__init__.py +7 -0
  6. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/PKG-INFO +1 -1
  7. girder_worker-5.0.15.dev2/girder_worker.egg-info/scm_version.json +8 -0
  8. girder_worker-5.0.14.dev12/girder_worker.egg-info/scm_version.json +0 -8
  9. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/MANIFEST.in +0 -0
  10. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/.gitignore +0 -0
  11. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/__init__.py +0 -0
  12. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/_test_plugins/__init__.py +0 -0
  13. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/_test_plugins/plugins.py +0 -0
  14. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/_test_plugins/tasks.py +0 -0
  15. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/celeryconfig.py +0 -0
  16. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/context/__init__.py +0 -0
  17. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/context/girder_context.py +0 -0
  18. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/context/nongirder_context.py +0 -0
  19. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/__init__.py +0 -0
  20. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/io/__init__.py +0 -0
  21. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/io/girder.py +0 -0
  22. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/nvidia.py +0 -0
  23. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/stream_adapter.py +0 -0
  24. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/transforms/__init__.py +0 -0
  25. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/transforms/girder.py +0 -0
  26. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/docker/utils.py +0 -0
  27. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/entrypoint.py +0 -0
  28. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/log_utils.py +0 -0
  29. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/decorators.py +0 -0
  30. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tee.py +0 -0
  31. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/__init__.py +0 -0
  32. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/contrib/__init__.py +0 -0
  33. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/contrib/girder_io_test.py +0 -0
  34. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/decorators_test.py +0 -0
  35. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/fake_dir/file1.txt +0 -0
  36. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/fake_dir/file2.txt +0 -0
  37. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/fake_dir/subdir/file3.txt +0 -0
  38. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/girder_io_test.py +0 -0
  39. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/tee_test.py +0 -0
  40. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/transform_test.py +0 -0
  41. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/tests/types_test.py +0 -0
  42. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/transform.py +0 -0
  43. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/transforms/__init__.py +0 -0
  44. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/transforms/common.py +0 -0
  45. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/transforms/contrib/__init__.py +0 -0
  46. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/transforms/contrib/girder_io.py +0 -0
  47. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/transforms/girder_io.py +0 -0
  48. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/__init__.py +0 -0
  49. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/base.py +0 -0
  50. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/boolean.py +0 -0
  51. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/choice.py +0 -0
  52. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/color.py +0 -0
  53. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/girder.py +0 -0
  54. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/girder_folder.py +0 -0
  55. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/girder_item.py +0 -0
  56. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/integer.py +0 -0
  57. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/number.py +0 -0
  58. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/number_choice.py +0 -0
  59. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/number_multichoice.py +0 -0
  60. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/number_vector.py +0 -0
  61. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/range.py +0 -0
  62. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/string.py +0 -0
  63. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/string_choice.py +0 -0
  64. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/string_multichoice.py +0 -0
  65. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/string_vector.py +0 -0
  66. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/utils/types/vector.py +0 -0
  67. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker/worker.dist.cfg +0 -0
  68. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/SOURCES.txt +0 -0
  69. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/dependency_links.txt +0 -0
  70. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/entry_points.txt +0 -0
  71. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/not-zip-safe +0 -0
  72. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/requires.txt +0 -0
  73. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/scm_file_list.json +0 -0
  74. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/girder_worker.egg-info/top_level.txt +0 -0
  75. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/pyproject.toml +0 -0
  76. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/requirements.in +0 -0
  77. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/setup.cfg +0 -0
  78. {girder_worker-5.0.14.dev12 → girder_worker-5.0.15.dev2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: girder-worker
3
- Version: 5.0.14.dev12
3
+ Version: 5.0.15.dev2
4
4
  Summary: Batch execution engine built on celery.
5
5
  Home-page: https://github.com/girder/girder_worker
6
6
  Author: Kitware, Inc.
@@ -18,6 +18,8 @@ from girder_worker.utils import (JobSpecNotFound, JobStatus, StateTransitionExce
18
18
  from girder_worker.utils.transform import ResultTransform
19
19
  from kombu.serialization import register
20
20
 
21
+ CeleryAppInfo = {'threads_pool': False}
22
+
21
23
 
22
24
  @before_task_publish.connect # noqa: C901
23
25
  def girder_before_task_publish(sender=None, body=None, exchange=None,
@@ -78,6 +80,25 @@ def girder_before_task_publish(sender=None, body=None, exchange=None,
78
80
  raise
79
81
 
80
82
 
83
+ @worker_ready.connect
84
+ def _capture_celery_pool(sender, **kwargs):
85
+ """
86
+ Determine if the celery task pool is thread based; we use this to govern
87
+ some logging choices.
88
+
89
+ :param sender: a celery.worker.worker.Worker instance
90
+ """
91
+ pool = getattr(sender, 'pool', None)
92
+ try:
93
+ if pool and 'thread' in type(pool).__module__.lower():
94
+ CeleryAppInfo['threads_pool'] = True
95
+ logger.info('Using a threads pool')
96
+ else:
97
+ logger.info('Not using a threads pool')
98
+ except Exception:
99
+ logger.exception('Failed to determine pool type')
100
+
101
+
81
102
  @worker_ready.connect
82
103
  def check_celery_version(*args, **kwargs):
83
104
  if LooseVersion(__version__) < LooseVersion('4.0.0'):
@@ -40,6 +40,10 @@ def _pull_image(image):
40
40
  raise
41
41
 
42
42
 
43
+ def _is_no_such_container(exc):
44
+ return 'No such container' in str(exc) or type(exc).__name__ == 'NotFound'
45
+
46
+
43
47
  def _get_docker_network():
44
48
  try:
45
49
  ip = socket.gethostbyname(socket.gethostname())
@@ -48,10 +52,23 @@ def _get_docker_network():
48
52
  client = docker.from_env(version='auto', timeout=timeout)
49
53
  else:
50
54
  client = docker.from_env(version='auto')
51
- for container in client.containers.list(all=True, filters={'status': 'running'}):
52
- for nw in container.attrs['NetworkSettings']['Networks'].values():
55
+ # we use client.api.containers rather than client.containers.list
56
+ # because containers.lists casts to a list which can throw an
57
+ # exception rather than allowing graceful handling.
58
+ for container in client.api.containers(all=True, filters={'status': ['running']}):
59
+ cid = container.get('Id') or container.get('ID')
60
+ if not cid:
61
+ continue
62
+ try:
63
+ data = client.api.inspect_container(cid)
64
+ except Exception as exc:
65
+ if _is_no_such_container(exc):
66
+ continue
67
+ raise
68
+ networks = (data.get('NetworkSettings', {}) or {}).get('Networks', {}) or {}
69
+ for nw in networks.values():
53
70
  if nw['IPAddress'] == ip:
54
- return 'container:%s' % container.id
71
+ return 'container:%s' % cid
55
72
  except Exception:
56
73
  logger.exception('Failed to get docker network')
57
74
 
@@ -59,12 +76,23 @@ def _get_docker_network():
59
76
  def _remove_stopped_container(client, name):
60
77
  if name is None:
61
78
  return
62
- for container in client.containers.list(all=True, filters={'name': name}):
63
- try:
64
- logger.info('Removing container %s ' % (name))
65
- container.remove()
66
- except Exception:
67
- pass
79
+ # we use client.api.containers rather than client.containers.list
80
+ # because containers.lists casts to a list which can throw an
81
+ # exception rather than allowing graceful handling.
82
+ try:
83
+ for container in client.api.containers(all=True, filters={'name': [name]}):
84
+ cid = container.get('Id') or container.get('ID')
85
+ if not cid:
86
+ continue
87
+ try:
88
+ logger.info('Removing container %s ' % (name))
89
+ client.api.remove_container(cid)
90
+ except Exception:
91
+ pass
92
+ except Exception as exc:
93
+ if _is_no_such_container(exc):
94
+ return
95
+ raise
68
96
 
69
97
 
70
98
  def _run_container(image, container_args, **kwargs):
@@ -172,3 +172,19 @@ class Task(celery.Task):
172
172
  if hasattr(self.request, 'girder_result_hooks'):
173
173
  for hook in self.request.girder_result_hooks:
174
174
  self._maybe_cleanup(hook)
175
+
176
+ @property
177
+ def job_manager(self):
178
+ return getattr(self.request, 'girder_job_manager', None)
179
+
180
+ @job_manager.setter
181
+ def job_manager(self, value):
182
+ self.request.girder_job_manager = value
183
+
184
+ @property
185
+ def girder_client(self):
186
+ return getattr(self.request, 'girder_client_instance', None)
187
+
188
+ @girder_client.setter
189
+ def girder_client(self, value):
190
+ self.request.girder_client_instance = value
@@ -358,6 +358,13 @@ class JobManager:
358
358
  :type interval: int or float
359
359
  :param reference: optional reference to store with the job.
360
360
  """
361
+ from ..app import CeleryAppInfo
362
+
363
+ # When we are using a threads pool, tee-ing stdout and stderr to
364
+ # logPrint can lead to the logs being written to multiple threads and
365
+ # therefore multiple workers.
366
+ if CeleryAppInfo['threads_pool']:
367
+ logPrint = None
361
368
  self.logPrint = logPrint
362
369
  self.method = method or 'PUT'
363
370
  self.url = url
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: girder-worker
3
- Version: 5.0.14.dev12
3
+ Version: 5.0.15.dev2
4
4
  Summary: Batch execution engine built on celery.
5
5
  Home-page: https://github.com/girder/girder_worker
6
6
  Author: Kitware, Inc.
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "5.0.14",
3
+ "distance": 2,
4
+ "node": "gd1e1c16e6052eb126499cab3ff8916c5062e48b0",
5
+ "dirty": false,
6
+ "branch": "master",
7
+ "node_date": "2026-08-04"
8
+ }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "5.0.13",
3
- "distance": 12,
4
- "node": "g94cb701e241e311f3afe273c7706c9028705874a",
5
- "dirty": false,
6
- "branch": "master",
7
- "node_date": "2026-07-28"
8
- }