pybiolib 1.2.347__py3-none-any.whl → 1.2.406__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.
biolib/app/app.py CHANGED
@@ -11,7 +11,7 @@ from biolib.biolib_api_client.app_types import App, AppVersion
11
11
  from biolib.biolib_api_client.biolib_app_api import BiolibAppApi
12
12
  from biolib.biolib_api_client.biolib_job_api import BiolibJobApi
13
13
  from biolib.biolib_binary_format import ModuleInput
14
- from biolib.biolib_errors import BioLibError
14
+ from biolib.biolib_errors import BioLibError, JobResultNonZeroExitCodeError
15
15
  from biolib.biolib_logging import logger
16
16
  from biolib.compute_node.job_worker.job_worker import JobWorker
17
17
  from biolib.experiments.experiment import Experiment
@@ -59,10 +59,14 @@ class BioLibApp:
59
59
  machine_count: Optional[int] = None,
60
60
  experiment: Optional[str] = None,
61
61
  temporary_client_secrets: Optional[Dict[str, str]] = None,
62
+ check: bool = False,
62
63
  ) -> Job:
63
64
  if experiment_id and experiment:
64
65
  raise ValueError('Only one of experiment_id and experiment can be specified')
65
66
 
67
+ if check and not blocking:
68
+ raise ValueError('The argument "check" cannot be True when blocking is False')
69
+
66
70
  if not experiment_id:
67
71
  experiment_instance = Experiment(experiment) if experiment else Experiment.get_experiment_in_context()
68
72
  experiment_id = experiment_instance.uuid if experiment_instance else None
@@ -105,6 +109,11 @@ class BioLibApp:
105
109
  )
106
110
  job._stream_logs(enable_print=enable_print) # pylint: disable=protected-access
107
111
 
112
+ if check:
113
+ exit_code = job.get_exit_code()
114
+ if exit_code != 0:
115
+ raise JobResultNonZeroExitCodeError(exit_code)
116
+
108
117
  return job
109
118
 
110
119
  def exec(self, args=None, stdin=None, files=None, machine=''):
biolib/biolib_errors.py CHANGED
@@ -43,3 +43,12 @@ class JobResultNotFound(JobResultError):
43
43
 
44
44
  class JobResultPermissionError(JobResultError):
45
45
  pass
46
+
47
+
48
+ class JobResultNonZeroExitCodeError(JobResultError):
49
+ """Raised when an app returns a non-zero exit code and check=True."""
50
+ def __init__(self, exit_code: int, message: Optional[str] = None):
51
+ self.exit_code = exit_code
52
+ super().__init__(
53
+ message or f'App returned non-zero exit code: {exit_code}'
54
+ )
@@ -44,8 +44,10 @@ class DockerExecutor:
44
44
  self._send_system_exception = options['send_system_exception']
45
45
  self._send_stdout_and_stderr = options['send_stdout_and_stderr']
46
46
  self._random_docker_id = compute_node_utils.random_string(15)
47
- self._reserved_system_ram = int(os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES') * 0.06) + 500_000_000
48
- logger_no_user_data.info(f"System RAM reserved: {self._reserved_system_ram}")
47
+ total_memory_in_bytes = int(os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))
48
+ system_reserved_memory = int(total_memory_in_bytes * 0.1) + 500_000_000
49
+ self._available_memory_in_bytes = total_memory_in_bytes - system_reserved_memory
50
+ logger_no_user_data.info(f'Available memory for containers: {self._available_memory_in_bytes} bytes')
49
51
 
50
52
  if utils.IS_RUNNING_IN_CLOUD:
51
53
  self._compute_process_dir = os.getenv('BIOLIB_USER_DATA_PATH')
@@ -164,7 +166,6 @@ class DockerExecutor:
164
166
  may_contain_user_data=False,
165
167
  )
166
168
 
167
-
168
169
  def _execute_helper(self, module_input) -> None:
169
170
  job_uuid = self._options['job']['public_id']
170
171
  logger_no_user_data.debug(f'Initializing container for {job_uuid}.')
@@ -250,7 +251,6 @@ class DockerExecutor:
250
251
  logger_no_user_data.debug(f'Docker container exited with code {exit_code} for {job_uuid}')
251
252
  self._save_module_output_from_container(exit_code, self._metadata_for_save_output_on_cancel)
252
253
 
253
-
254
254
  def _save_module_output_from_container(self, exit_code: int, metadata: MetadataToSaveOutput) -> None:
255
255
  full_stdout = self._docker_api_client.logs(self._container.id, stdout=True, stderr=False)
256
256
  full_stderr = self._docker_api_client.logs(self._container.id, stdout=False, stderr=True)
@@ -267,7 +267,6 @@ class DockerExecutor:
267
267
  pre_start_diff=metadata['pre_start_diff'],
268
268
  )
269
269
 
270
-
271
270
  def cleanup(self):
272
271
  # Don't clean up if already in the process of doing so, or done doing so
273
272
  if self._is_cleaning_up:
@@ -283,7 +282,7 @@ class DockerExecutor:
283
282
  logger_no_user_data.debug(f'Container state {self._docker_container.status}')
284
283
  self._save_module_output_from_container(
285
284
  exit_code=self._docker_container.attrs['State']['ExitCode'],
286
- metadata=self._metadata_for_save_output_on_cancel
285
+ metadata=self._metadata_for_save_output_on_cancel,
287
286
  )
288
287
  logger_no_user_data.debug('Saved results')
289
288
  except BaseException as error:
@@ -412,8 +411,15 @@ class DockerExecutor:
412
411
 
413
412
  if utils.IS_RUNNING_IN_CLOUD:
414
413
  cloud_job = self._options['cloud_job']
415
- create_container_args['mem_limit'] = (
416
- f'{cloud_job["reserved_memory_in_bytes"] - self._reserved_system_ram}b'
414
+ container_memory_limit_in_bytes = min(
415
+ cloud_job['reserved_memory_in_bytes'], self._available_memory_in_bytes
416
+ )
417
+ create_container_args['mem_limit'] = f'{container_memory_limit_in_bytes}b'
418
+ logger_no_user_data.debug(
419
+ 'Setting container memory limit to '
420
+ f'{container_memory_limit_in_bytes} bytes '
421
+ f'(requested: {cloud_job["reserved_memory_in_bytes"]}, '
422
+ f'available: {self._available_memory_in_bytes})'
417
423
  )
418
424
  create_container_args['nano_cpus'] = cloud_job['reserved_cpu_in_nano_shares']
419
425
  create_container_args['pids_limit'] = 10_000
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pybiolib
3
- Version: 1.2.347
3
+ Version: 1.2.406
4
4
  Summary: BioLib Python Client
5
5
  License: MIT
6
6
  Keywords: biolib
@@ -29,7 +29,7 @@ biolib/_runtime/runtime.py,sha256=bZQ0m39R9jOBVAtlyvzDnOobKueOAQUCwMUZjDQnO7E,44
29
29
  biolib/api/__init__.py,sha256=mQ4u8FijqyLzjYMezMUUbbBGNB3iFmkNdjXnWPZ7Jlw,138
30
30
  biolib/api/client.py,sha256=EN3lDbbgWxw3aPDe8W5XIU6WkMfOHW7Dmsz-R6QqxAw,4176
31
31
  biolib/app/__init__.py,sha256=cdPtcfb_U-bxb9iSL4fCEq2rpD9OjkyY4W-Zw60B0LI,37
32
- biolib/app/app.py,sha256=mJafDLtnoX66egHF94NrUhmhzjpFzvRj2STh0RVGJCY,8862
32
+ biolib/app/app.py,sha256=qhPa-nkIYwq1YUIZyRvs_gzNRJiRpHnOFxIvktDp6Jg,9222
33
33
  biolib/app/search_apps.py,sha256=K4a41f5XIWth2BWI7OffASgIsD0ko8elCax8YL2igaY,1470
34
34
  biolib/biolib_api_client/__init__.py,sha256=E5EMa19wJoblwSdQPYrxc_BtIeRsAuO0L_jQweWw-Yk,182
35
35
  biolib/biolib_api_client/api_client.py,sha256=ohvbWbpresxLHFGPkvXACfmiTYsBk8RBx5XsBbLYg_M,7546
@@ -55,7 +55,7 @@ biolib/biolib_binary_format/system_status_update.py,sha256=aOELuQ0k-GtpaZTUxYd0G
55
55
  biolib/biolib_binary_format/utils.py,sha256=jq31QEShs7TSrSKZBr8jif-bJAwVzQrqVxmymL6crpU,5453
56
56
  biolib/biolib_docker_client/__init__.py,sha256=aBfA6mtWSI5dBEfNNMD6bIZzCPloW4ghKm0wqQiljdo,1481
57
57
  biolib/biolib_download_container.py,sha256=8TmBV8iv3bCvkNlHa1SSsc4zl0wX_eaxhfnW5rvFIh8,1779
58
- biolib/biolib_errors.py,sha256=xtdo3ybqnc0jhd959kVmBczFdBczrFMr8cZyd4hjKLk,842
58
+ biolib/biolib_errors.py,sha256=eyQolC4oGi350BDEMOd-gAHYVqo2L2lYgv6c4ZdXPjQ,1184
59
59
  biolib/biolib_logging.py,sha256=S2y6fk7jjxZQMN2BtKkHBb4JbVQQSSU97T7ep4P_QCE,2855
60
60
  biolib/cli/__init__.py,sha256=0v3c_J-U0k46c5ZWeQjLG_kTaKDJm81LBxQpDO2B_aI,1286
61
61
  biolib/cli/auth.py,sha256=rpWGmXs6Fz6CGrO9K8ibPRszOdXG78Vig_boKaVCD9A,2082
@@ -76,7 +76,7 @@ biolib/compute_node/job_worker/cache_state.py,sha256=MwjSRzcJJ_4jybqvBL4xdgnDYSI
76
76
  biolib/compute_node/job_worker/cache_types.py,sha256=ajpLy8i09QeQS9dEqTn3T6NVNMY_YsHQkSD5nvIHccQ,818
77
77
  biolib/compute_node/job_worker/docker_image_cache.py,sha256=ansHIkJIq_EMW1nZNlW-RRLVVeKWTbzNICYaOHpKiRE,7460
78
78
  biolib/compute_node/job_worker/executors/__init__.py,sha256=bW6t1qi3PZTlHM4quaTLa8EI4ALTCk83cqcVJfJfJfE,145
79
- biolib/compute_node/job_worker/executors/docker_executor.py,sha256=NpDSgNWbnC0Qr6aFaQMEfhib3O9BMOPsia-YqeTMhpU,30966
79
+ biolib/compute_node/job_worker/executors/docker_executor.py,sha256=UxWUSk15mM_H73q2k5_kBB1IWGYGphyXbyC-Bm0QneU,31550
80
80
  biolib/compute_node/job_worker/executors/docker_types.py,sha256=VhsU1DKtJjx_BbCkVmiPZPH4ROiL1ygW1Y_s1Kbpa2o,216
81
81
  biolib/compute_node/job_worker/executors/tars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
82
  biolib/compute_node/job_worker/executors/types.py,sha256=gw_T-oq0lty8Hg8WsTrqhtV-kyOF_l5nr9Xe8-kzetc,1657
@@ -118,8 +118,8 @@ biolib/utils/cache_state.py,sha256=u256F37QSRIVwqKlbnCyzAX4EMI-kl6Dwu6qwj-Qmag,3
118
118
  biolib/utils/multipart_uploader.py,sha256=XvGP1I8tQuKhAH-QugPRoEsCi9qvbRk-DVBs5PNwwJo,8452
119
119
  biolib/utils/seq_util.py,sha256=Ozk0blGtPur_D9MwShD02r_mphyQmgZkx-lOHOwnlIM,6730
120
120
  biolib/utils/zip/remote_zip.py,sha256=0wErYlxir5921agfFeV1xVjf29l9VNgGQvNlWOlj2Yc,23232
121
- pybiolib-1.2.347.dist-info/LICENSE,sha256=F2h7gf8i0agDIeWoBPXDMYScvQOz02pAWkKhTGOHaaw,1067
122
- pybiolib-1.2.347.dist-info/METADATA,sha256=MMaf_ltA6Tg3gAgfrmO1W9bZeWMM3D6_fGQkgN1Ono8,1570
123
- pybiolib-1.2.347.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
124
- pybiolib-1.2.347.dist-info/entry_points.txt,sha256=p6DyaP_2kctxegTX23WBznnrDi4mz6gx04O5uKtRDXg,42
125
- pybiolib-1.2.347.dist-info/RECORD,,
121
+ pybiolib-1.2.406.dist-info/LICENSE,sha256=F2h7gf8i0agDIeWoBPXDMYScvQOz02pAWkKhTGOHaaw,1067
122
+ pybiolib-1.2.406.dist-info/METADATA,sha256=RMsKTpxadkRTJtaOOCrJ8pg8vdwOyQGegrOWGX96SEs,1570
123
+ pybiolib-1.2.406.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
124
+ pybiolib-1.2.406.dist-info/entry_points.txt,sha256=p6DyaP_2kctxegTX23WBznnrDi4mz6gx04O5uKtRDXg,42
125
+ pybiolib-1.2.406.dist-info/RECORD,,