pybiolib 1.2.1056__py3-none-any.whl → 1.2.1074__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.
@@ -11,10 +11,10 @@ import zipfile
11
11
  from copy import copy
12
12
  from datetime import datetime
13
13
 
14
- import docker # type: ignore
15
- import docker.types # type: ignore
16
- from docker.errors import APIError, ImageNotFound # type: ignore
17
- from docker.models.containers import Container # type: ignore
14
+ import docker
15
+ import docker.types
16
+ from docker.errors import APIError, ImageNotFound
17
+ from docker.models.containers import Container
18
18
 
19
19
  from biolib import utils
20
20
  from biolib._internal.runtime import RuntimeJobDataDict
@@ -40,7 +40,7 @@ class DockerExecutor:
40
40
  self._options: LocalExecutorOptions = options
41
41
  self._is_cleaning_up = False
42
42
 
43
- self._absolute_image_uri = f"{utils.BIOLIB_SITE_HOSTNAME}/{self._options['module']['image_uri']}"
43
+ self._absolute_image_uri = f'{utils.BIOLIB_SITE_HOSTNAME}/{self._options["module"]["image_uri"]}'
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)
@@ -308,7 +308,8 @@ class DockerExecutor:
308
308
  job_uuid = self._options['job']['public_id']
309
309
  logger_no_user_data.debug(f'Job "{job_uuid}" initializing Docker container...')
310
310
  module = self._options['module']
311
- logger.debug(f"Initializing docker container with command: {module['command']}")
311
+ logger.debug(f'Initializing docker container with command: {module["command"]}')
312
+ docker_client = BiolibDockerClient.get_docker_client()
312
313
 
313
314
  docker_volume_mounts = [lfs.docker_mount for lfs in self._options['large_file_systems'].values()]
314
315
 
@@ -391,6 +392,9 @@ class DockerExecutor:
391
392
  'mounts': docker_volume_mounts,
392
393
  'network': internal_network.name,
393
394
  'working_dir': module['working_directory'],
395
+ 'networking_config': {
396
+ internal_network.name: docker_client.api.create_endpoint_config(aliases=['main'])
397
+ },
394
398
  }
395
399
 
396
400
  if self._options['job'].get('arguments_override_command'):
@@ -429,7 +433,6 @@ class DockerExecutor:
429
433
  if docker_runtime is not None:
430
434
  create_container_args['runtime'] = docker_runtime
431
435
 
432
- docker_client = BiolibDockerClient.get_docker_client()
433
436
  logger_no_user_data.debug(f'Job "{job_uuid}" initializing Docker container. Creating container...')
434
437
  self._docker_container = docker_client.containers.create(**create_container_args)
435
438
  logger_no_user_data.debug(f'Job "{job_uuid}" finished initializing Docker container.')
@@ -1,6 +1,6 @@
1
1
  import enum
2
2
 
3
- from biolib.typing_utils import TypedDict, Any
3
+ from biolib.typing_utils import Any, TypedDict
4
4
 
5
5
 
6
6
  class Proxy(TypedDict):
@@ -1,11 +1,11 @@
1
- from docker.models.networks import Network # type: ignore
1
+ from docker.models.networks import Network
2
2
 
3
+ from biolib.biolib_api_client.app_types import Module
4
+ from biolib.biolib_api_client.job_types import CloudJob, CreatedJobDict
3
5
  from biolib.compute_node.job_worker.large_file_system import LargeFileSystem
4
- from biolib.compute_node.webserver.webserver_types import ComputeNodeInfo
5
- from biolib.typing_utils import TypedDict, Callable, Optional, List, Dict
6
6
  from biolib.compute_node.remote_host_proxy import RemoteHostProxy
7
- from biolib.biolib_api_client.app_types import Module
8
- from biolib.biolib_api_client.job_types import CreatedJobDict, CloudJob
7
+ from biolib.compute_node.webserver.webserver_types import ComputeNodeInfo
8
+ from biolib.typing_utils import Callable, Dict, List, Optional, TypedDict
9
9
 
10
10
 
11
11
  class StatusUpdate(TypedDict):
@@ -43,6 +43,7 @@ class LocalExecutorOptions(TypedDict):
43
43
  send_system_exception: SendSystemExceptionType
44
44
  send_stdout_and_stderr: SendStdoutAndStderrType
45
45
 
46
+
46
47
  class MetadataToSaveOutput(TypedDict):
47
48
  arguments: List[str]
48
49
  startup_error_string: Optional[str]
@@ -80,7 +80,6 @@ class JobWorker:
80
80
 
81
81
  self._remote_host_proxies: List[RemoteHostProxy] = []
82
82
  self._internal_network: Optional[Network] = None
83
- self._public_network: Optional[Network] = None
84
83
  self._executors: List[DockerExecutor] = []
85
84
  self.is_cleaning_up: bool = False
86
85
 
@@ -217,8 +216,6 @@ class JobWorker:
217
216
  logger_no_user_data.debug('Cleaning up networks...')
218
217
  self._cleanup_network(self._internal_network)
219
218
  self._internal_network = None
220
- self._cleanup_network(self._public_network)
221
- self._public_network = None
222
219
  logger_no_user_data.debug('Cleaned up networks...')
223
220
 
224
221
  @staticmethod
@@ -291,20 +288,6 @@ class JobWorker:
291
288
  ) from exception
292
289
 
293
290
  if len(remote_hosts) > 0:
294
- logger_no_user_data.debug(f'Job "{job_id}" creating networks for remote host proxies...')
295
- try:
296
- self._public_network = docker_client.networks.create(
297
- name=f'biolib-proxy-network-{job_id}',
298
- internal=False,
299
- driver='bridge',
300
- )
301
- except Exception as exception:
302
- raise ComputeProcessException(
303
- exception,
304
- SystemExceptionCodes.FAILED_TO_CREATE_DOCKER_NETWORKS.value,
305
- self.send_system_exception,
306
- may_contain_user_data=False
307
- ) from exception
308
291
  logger_no_user_data.debug(f'Job "{job_id}" starting proxies for remote hosts: {remote_hosts}')
309
292
  try:
310
293
  hostname_to_ports: Dict[str, List[int]] = {}
@@ -323,11 +306,10 @@ class JobWorker:
323
306
 
324
307
  for hostname, ports in hostname_to_ports.items():
325
308
  remote_host_proxy = RemoteHostProxy(
326
- RemoteHost(hostname=hostname),
327
- self._public_network,
328
- self._internal_network,
329
- job_id,
330
- ports,
309
+ remote_host=RemoteHost(hostname=hostname),
310
+ internal_network=self._internal_network,
311
+ job_id=job_id,
312
+ ports=ports,
331
313
  )
332
314
  remote_host_proxy.start()
333
315
  self._remote_host_proxies.append(remote_host_proxy)
@@ -56,17 +56,13 @@ class LargeFileSystem:
56
56
  self._path_on_disk_for_write: Optional[str] = None
57
57
  self._send_status_update: Callable[[StatusUpdate], None] = send_status_update
58
58
 
59
- @property
60
- def _is_initialized(self) -> bool:
61
- return self._path_on_disk is not None
62
-
63
59
  @property
64
60
  def uuid(self) -> str:
65
61
  return self._lfs_mapping['uuid']
66
62
 
67
63
  @property
68
64
  def docker_mount(self) -> docker.types.Mount:
69
- if not self._is_initialized:
65
+ if not self._path_on_disk:
70
66
  raise LargeFileSystemError('LargeFileSystem not initialized')
71
67
 
72
68
  return docker.types.Mount(
@@ -77,7 +73,7 @@ class LargeFileSystem:
77
73
  )
78
74
 
79
75
  def initialize(self) -> None:
80
- if self._is_initialized:
76
+ if self._path_on_disk:
81
77
  logger_no_user_data.debug(f'LFS {self.uuid} is already initialized')
82
78
  return
83
79
 
@@ -1,14 +1,14 @@
1
1
  import base64
2
2
  import io
3
- import subprocess
4
3
  import tarfile
5
4
  import time
6
5
  from urllib.parse import urlparse
7
6
 
8
- from docker.errors import ImageNotFound # type: ignore
9
- from docker.models.containers import Container # type: ignore
10
- from docker.models.images import Image # type: ignore
11
- from docker.models.networks import Network # type: ignore
7
+ from docker.errors import ImageNotFound
8
+ from docker.models.containers import Container
9
+ from docker.models.images import Image
10
+ from docker.models.networks import Network
11
+ from docker.types import EndpointConfig
12
12
 
13
13
  from biolib import utils
14
14
  from biolib.biolib_api_client import BiolibApiClient, RemoteHost
@@ -16,7 +16,8 @@ from biolib.biolib_docker_client import BiolibDockerClient
16
16
  from biolib.biolib_errors import BioLibError
17
17
  from biolib.biolib_logging import logger_no_user_data
18
18
  from biolib.compute_node.cloud_utils import CloudUtils
19
- from biolib.typing_utils import List, Optional
19
+ from biolib.compute_node.utils import BIOLIB_PROXY_NETWORK_NAME
20
+ from biolib.typing_utils import Dict, List, Optional, cast
20
21
 
21
22
 
22
23
  # Prepare for remote hosts with specified port
@@ -28,14 +29,12 @@ class RemoteHostProxy:
28
29
  def __init__(
29
30
  self,
30
31
  remote_host: RemoteHost,
31
- public_network: Network,
32
32
  internal_network: Optional[Network],
33
33
  job_id: str,
34
34
  ports: List[int],
35
35
  ):
36
36
  self.is_app_caller_proxy = remote_host['hostname'] == 'AppCallerProxy'
37
37
  self._remote_host: RemoteHostExtended = RemoteHostExtended(hostname=remote_host['hostname'], ports=ports)
38
- self._public_network: Network = public_network
39
38
  self._internal_network: Optional[Network] = internal_network
40
39
 
41
40
  if not job_id:
@@ -44,7 +43,6 @@ class RemoteHostProxy:
44
43
  self._name = f'biolib-remote-host-proxy-{job_id}-{self.hostname}'
45
44
  self._job_uuid = job_id
46
45
  self._container: Optional[Container] = None
47
- self._enclave_traffic_forwarder_processes: List[subprocess.Popen] = []
48
46
  self._docker = BiolibDockerClient().get_docker_client()
49
47
 
50
48
  @property
@@ -70,6 +68,16 @@ class RemoteHostProxy:
70
68
 
71
69
  docker = BiolibDockerClient.get_docker_client()
72
70
 
71
+ networking_config: Optional[Dict[str, EndpointConfig]] = (
72
+ None
73
+ if not self.is_app_caller_proxy
74
+ else {
75
+ BIOLIB_PROXY_NETWORK_NAME: docker.api.create_endpoint_config(
76
+ aliases=[f'biolib-app-caller-proxy-{self._job_uuid}']
77
+ )
78
+ }
79
+ )
80
+
73
81
  for index in range(3):
74
82
  logger_no_user_data.debug(f'Attempt {index} at creating RemoteHostProxy container "{self._name}"...')
75
83
  try:
@@ -77,16 +85,17 @@ class RemoteHostProxy:
77
85
  detach=True,
78
86
  image=self._get_biolib_remote_host_proxy_image(),
79
87
  name=self._name,
80
- network=self._public_network.name,
88
+ network=BIOLIB_PROXY_NETWORK_NAME,
89
+ networking_config=networking_config,
81
90
  )
82
91
  break
83
- except Exception as error: # pylint: disable=broad-except
92
+ except Exception as error:
84
93
  logger_no_user_data.exception(f'Failed to create container "{self._name}" hit error: {error}')
85
94
 
86
95
  logger_no_user_data.debug('Sleeping before re-trying container creation...')
87
96
  time.sleep(3)
88
97
 
89
- if not self._container:
98
+ if not self._container or not self._container.id:
90
99
  raise BioLibError(f'Exceeded re-try limit for creating container {self._name}')
91
100
 
92
101
  self._write_nginx_config_to_container(
@@ -121,14 +130,11 @@ class RemoteHostProxy:
121
130
  if self._container:
122
131
  self._container.remove(force=True)
123
132
 
124
- for process in self._enclave_traffic_forwarder_processes:
125
- process.terminate()
126
-
127
133
  def _get_biolib_remote_host_proxy_image(self) -> Image:
128
134
  if utils.IS_RUNNING_IN_CLOUD:
129
135
  try:
130
136
  logger_no_user_data.debug('Getting local Docker image for remote host proxy')
131
- return self._docker.images.get('biolib-remote-host-proxy:latest')
137
+ return cast(Image, self._docker.images.get('biolib-remote-host-proxy:latest'))
132
138
  except ImageNotFound:
133
139
  logger_no_user_data.debug(
134
140
  'Local Docker image for remote host proxy not available. Falling back to public image...'
@@ -137,10 +143,10 @@ class RemoteHostProxy:
137
143
  public_image_uri = 'public.ecr.aws/h5y4b3l1/biolib-remote-host-proxy:latest'
138
144
  try:
139
145
  logger_no_user_data.debug('Getting public Docker image for remote host proxy')
140
- return self._docker.images.get(public_image_uri)
146
+ return cast(Image, self._docker.images.get(public_image_uri))
141
147
  except ImageNotFound:
142
148
  logger_no_user_data.debug('Pulling public Docker image for remote host proxy')
143
- return self._docker.images.pull(public_image_uri)
149
+ return cast(Image, self._docker.images.pull(public_image_uri))
144
150
 
145
151
  def _write_nginx_config_to_container(self, upstream_server_name: str, upstream_server_ports: List[int]) -> None:
146
152
  if not self._container:
@@ -4,6 +4,8 @@ from enum import Enum
4
4
 
5
5
  from biolib.biolib_logging import logger
6
6
 
7
+ BIOLIB_PROXY_NETWORK_NAME = 'biolib-proxy-network'
8
+
7
9
 
8
10
  def get_package_type(package):
9
11
  package_type = int.from_bytes(package[1:2], 'big')
@@ -1,19 +1,23 @@
1
1
  # pylint: disable=unsubscriptable-object
2
2
 
3
3
  import json
4
+ import logging
4
5
  import os
5
- import time
6
6
  import tempfile
7
- import logging
8
- from flask import Flask, request, Response, jsonify
7
+ import time
8
+
9
+ from docker.models.networks import Network # type: ignore
10
+ from flask import Flask, Response, jsonify, request
9
11
 
10
12
  from biolib import utils
11
13
  from biolib.biolib_api_client import BiolibApiClient
12
14
  from biolib.biolib_binary_format import SavedJob
13
- from biolib.compute_node.webserver import webserver_utils
15
+ from biolib.biolib_docker_client import BiolibDockerClient
16
+ from biolib.biolib_logging import TRACE, logger, logger_no_user_data
14
17
  from biolib.compute_node.cloud_utils.cloud_utils import CloudUtils
18
+ from biolib.compute_node.utils import BIOLIB_PROXY_NETWORK_NAME
19
+ from biolib.compute_node.webserver import webserver_utils
15
20
  from biolib.compute_node.webserver.gunicorn_flask_application import GunicornFlaskApplication
16
- from biolib.biolib_logging import logger, TRACE
17
21
  from biolib.compute_node.webserver.webserver_utils import get_job_compute_state_or_404
18
22
  from biolib.typing_utils import Optional
19
23
 
@@ -102,15 +106,14 @@ def status(job_id):
102
106
  response_data['is_completed'] = compute_state['is_completed']
103
107
 
104
108
  if current_status['stdout_and_stderr_packages_b64']:
105
- compute_state['streamed_logs_packages_b64'] = compute_state['streamed_logs_packages_b64'] + \
106
- current_status['stdout_and_stderr_packages_b64']
109
+ compute_state['streamed_logs_packages_b64'] = (
110
+ compute_state['streamed_logs_packages_b64'] + current_status['stdout_and_stderr_packages_b64']
111
+ )
107
112
 
108
113
  compute_state['status']['stdout_and_stderr_packages_b64'] = []
109
114
 
110
115
  if current_status['status_updates']:
111
- compute_state['previous_status_updates'].extend(
112
- current_status['status_updates']
113
- )
116
+ compute_state['previous_status_updates'].extend(current_status['status_updates'])
114
117
  compute_state['status']['status_updates'] = []
115
118
 
116
119
  if return_full_logs:
@@ -132,21 +135,31 @@ def send_package_to_compute_process(job_id, package_bytes):
132
135
 
133
136
 
134
137
  def start_webserver(
135
- host: str,
136
- port: int,
137
- tls_pem_certificate_path: Optional[str] = None,
138
- tls_pem_key_path: Optional[str] = None,
138
+ host: str,
139
+ port: int,
140
+ tls_pem_certificate_path: Optional[str] = None,
141
+ tls_pem_key_path: Optional[str] = None,
139
142
  ) -> None:
140
143
  def worker_exit(server, worker): # pylint: disable=unused-argument
141
- active_compute_states = list(
142
- webserver_utils.JOB_ID_TO_COMPUTE_STATE_DICT.values()) + webserver_utils.UNASSIGNED_COMPUTE_PROCESSES
144
+ active_compute_states = (
145
+ list(webserver_utils.JOB_ID_TO_COMPUTE_STATE_DICT.values()) + webserver_utils.UNASSIGNED_COMPUTE_PROCESSES
146
+ )
143
147
  logger.debug(f'Sending terminate signal to {len(active_compute_states)} compute processes')
144
148
  if active_compute_states:
145
149
  for compute_state in active_compute_states:
146
150
  if compute_state['worker_thread']:
147
151
  compute_state['worker_thread'].terminate()
148
152
  time.sleep(2)
149
- return
153
+
154
+ if utils.IS_RUNNING_IN_CLOUD:
155
+ try:
156
+ logger_no_user_data.debug(f'Removing Docker network {BIOLIB_PROXY_NETWORK_NAME}')
157
+ docker_client = BiolibDockerClient.get_docker_client()
158
+ biolib_proxy_network: Network = docker_client.networks.get(BIOLIB_PROXY_NETWORK_NAME)
159
+ biolib_proxy_network.remove()
160
+ logger_no_user_data.debug(f'Successfully removed Docker network {BIOLIB_PROXY_NETWORK_NAME}')
161
+ except BaseException:
162
+ logger_no_user_data.exception(f'Failed to clean up network {BIOLIB_PROXY_NETWORK_NAME}')
150
163
 
151
164
  def post_fork(server, worker): # pylint: disable=unused-argument
152
165
  logger.info('Started compute node')
@@ -157,8 +170,27 @@ def start_webserver(
157
170
  utils.IS_DEV = config['is_dev']
158
171
  BiolibApiClient.initialize(config['base_url'])
159
172
 
160
- CloudUtils.initialize()
161
- webserver_utils.start_auto_shutdown_timer()
173
+ biolib_proxy_network: Optional[Network] = None
174
+ try:
175
+ logger_no_user_data.debug(f'Creating Docker network {BIOLIB_PROXY_NETWORK_NAME}')
176
+ docker_client = BiolibDockerClient.get_docker_client()
177
+ biolib_proxy_network = docker_client.networks.create(
178
+ name=BIOLIB_PROXY_NETWORK_NAME,
179
+ internal=False,
180
+ driver='bridge',
181
+ )
182
+ logger_no_user_data.debug(f'Successfully created Docker network {BIOLIB_PROXY_NETWORK_NAME}')
183
+ except BaseException:
184
+ logger_no_user_data.exception(f'Failed to create Docker network {BIOLIB_PROXY_NETWORK_NAME}')
185
+
186
+ if biolib_proxy_network:
187
+ CloudUtils.initialize()
188
+ webserver_utils.start_auto_shutdown_timer()
189
+ else:
190
+ logger_no_user_data.error(
191
+ f'Docker network {BIOLIB_PROXY_NETWORK_NAME} was not created, shutting down...'
192
+ )
193
+ CloudUtils.deregister_and_shutdown()
162
194
 
163
195
  if logger.level == TRACE:
164
196
  gunicorn_log_level_name = 'DEBUG'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pybiolib
3
- Version: 1.2.1056
3
+ Version: 1.2.1074
4
4
  Summary: BioLib Python Client
5
5
  License: MIT
6
6
  Keywords: biolib
@@ -114,25 +114,25 @@ biolib/compute_node/job_worker/cache_state.py,sha256=MwjSRzcJJ_4jybqvBL4xdgnDYSI
114
114
  biolib/compute_node/job_worker/cache_types.py,sha256=ajpLy8i09QeQS9dEqTn3T6NVNMY_YsHQkSD5nvIHccQ,818
115
115
  biolib/compute_node/job_worker/docker_image_cache.py,sha256=ansHIkJIq_EMW1nZNlW-RRLVVeKWTbzNICYaOHpKiRE,7460
116
116
  biolib/compute_node/job_worker/executors/__init__.py,sha256=bW6t1qi3PZTlHM4quaTLa8EI4ALTCk83cqcVJfJfJfE,145
117
- biolib/compute_node/job_worker/executors/docker_executor.py,sha256=FFN4dn3mV19u6imT8e4vjpfDIxX9d3bpq9x2JPVOAus,31811
118
- biolib/compute_node/job_worker/executors/docker_types.py,sha256=VhsU1DKtJjx_BbCkVmiPZPH4ROiL1ygW1Y_s1Kbpa2o,216
117
+ biolib/compute_node/job_worker/executors/docker_executor.py,sha256=Rp9QAEwSetqk0GrntiIhch573VO0Z5jeBpOsB_xcrdA,31907
118
+ biolib/compute_node/job_worker/executors/docker_types.py,sha256=Hh8SwQYBLdIMGWgITwD2fzoo_sbW2ESx1G8j9Zq2n30,216
119
119
  biolib/compute_node/job_worker/executors/tars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
- biolib/compute_node/job_worker/executors/types.py,sha256=wbjWZZ2f9FttjqUCCOeZmn7n3L3Hu-7-2PZJ3BVf_Ps,1626
120
+ biolib/compute_node/job_worker/executors/types.py,sha256=dlp7p8KKkd19nC68o-RuAzRBhpdYFMWKg-__LFjvscs,1611
121
121
  biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py,sha256=_cvEiZbOwfkv6fYmfrvdi_FVviIEYr_dSClQcOQaUWM,1198
122
122
  biolib/compute_node/job_worker/job_max_runtime_timer_thread.py,sha256=K_xgz7IhiIjpLlXRk8sqaMyLoApcidJkgu29sJX0gb8,1174
123
123
  biolib/compute_node/job_worker/job_storage.py,sha256=J6B5wkBo3cqmT1AV-qJnm2Lt9Qmcp3qn-1AabjO9m60,4686
124
- biolib/compute_node/job_worker/job_worker.py,sha256=MpYRikixXBF6iZI0m5xW7vrJ-cdkpO_AQfElZaKoI_Q,29542
125
- biolib/compute_node/job_worker/large_file_system.py,sha256=XXqRlVtYhs-Ji9zQGIk5KQPXFO_Q5jJH0nnlw4GkeMY,10461
124
+ biolib/compute_node/job_worker/job_worker.py,sha256=2f5WrIkR-9im3fNEDPnNFz4-YtxcF4Us9yob5HiASbY,28721
125
+ biolib/compute_node/job_worker/large_file_system.py,sha256=Xe_LILVfTD9LXb-0HwLqGsp1fWiI-pU55BqgJ-6t8-0,10357
126
126
  biolib/compute_node/job_worker/mappings.py,sha256=Z48Kg4nbcOvsT2-9o3RRikBkqflgO4XeaWxTGz-CNvI,2499
127
127
  biolib/compute_node/job_worker/utilization_reporter_thread.py,sha256=7tm5Yk9coqJ9VbEdnO86tSXI0iM0omwIyKENxdxiVXk,8575
128
128
  biolib/compute_node/job_worker/utils.py,sha256=wgxcIA8yAhUPdCwyvuuJ0JmreyWmmUoBO33vWtG60xg,1282
129
- biolib/compute_node/remote_host_proxy.py,sha256=IBkBeljiFEos2KZJbYf_k45xjeKqpUmRronY6MlPwo0,17078
129
+ biolib/compute_node/remote_host_proxy.py,sha256=xyjq0zKSxbJGUA6a0q9JCnzquk7gIztbI1clLGnymQM,17278
130
130
  biolib/compute_node/socker_listener_thread.py,sha256=T5_UikA3MB9bD5W_dckYLPTgixh72vKUlgbBvj9dbM0,1601
131
131
  biolib/compute_node/socket_sender_thread.py,sha256=YgamPHeUm2GjMFGx8qk-99WlZhEs-kAb3q_2O6qByig,971
132
- biolib/compute_node/utils.py,sha256=fWtFIcGatek1NaVOT9Vaey6UFp8GKLYGLAVu8jgOwi8,4861
132
+ biolib/compute_node/utils.py,sha256=fvdbetPKMdfHkPqNZRw6eln_i13myu-n8tuceTUcfPU,4913
133
133
  biolib/compute_node/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
134
  biolib/compute_node/webserver/gunicorn_flask_application.py,sha256=jPfR_YvNBekLUXWo_vHFV-FIwlb8s8tacKmGHvh93qc,914
135
- biolib/compute_node/webserver/webserver.py,sha256=o4kOAStsqThUtKlnRE-U5TP0JIYntuySDjU7PH310xg,6620
135
+ biolib/compute_node/webserver/webserver.py,sha256=Ec5ZgOUBb_1pINjHrlENMUpLdAPiBiTyiaP51-FZ4gQ,8362
136
136
  biolib/compute_node/webserver/webserver_types.py,sha256=2t8EaFKESnves3BA_NBdnS2yAdo1qwamCFHiSt888nE,380
137
137
  biolib/compute_node/webserver/webserver_utils.py,sha256=XWvwYPbWNR3qS0FYbLLp-MDDfVk0QdaAmg3xPrT0H2s,4234
138
138
  biolib/compute_node/webserver/worker_thread.py,sha256=7uD9yQPhePYvP2HCJ27EeZ_h6psfIWFgqm1RHZxzobs,12483
@@ -155,8 +155,8 @@ biolib/utils/cache_state.py,sha256=u256F37QSRIVwqKlbnCyzAX4EMI-kl6Dwu6qwj-Qmag,3
155
155
  biolib/utils/multipart_uploader.py,sha256=XvGP1I8tQuKhAH-QugPRoEsCi9qvbRk-DVBs5PNwwJo,8452
156
156
  biolib/utils/seq_util.py,sha256=Ozk0blGtPur_D9MwShD02r_mphyQmgZkx-lOHOwnlIM,6730
157
157
  biolib/utils/zip/remote_zip.py,sha256=0wErYlxir5921agfFeV1xVjf29l9VNgGQvNlWOlj2Yc,23232
158
- pybiolib-1.2.1056.dist-info/LICENSE,sha256=F2h7gf8i0agDIeWoBPXDMYScvQOz02pAWkKhTGOHaaw,1067
159
- pybiolib-1.2.1056.dist-info/METADATA,sha256=QPQ_pu8Hn5MYAMFVNF5DK_DSZvBOLsWpFPFGDOz64ZI,1571
160
- pybiolib-1.2.1056.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
161
- pybiolib-1.2.1056.dist-info/entry_points.txt,sha256=p6DyaP_2kctxegTX23WBznnrDi4mz6gx04O5uKtRDXg,42
162
- pybiolib-1.2.1056.dist-info/RECORD,,
158
+ pybiolib-1.2.1074.dist-info/LICENSE,sha256=F2h7gf8i0agDIeWoBPXDMYScvQOz02pAWkKhTGOHaaw,1067
159
+ pybiolib-1.2.1074.dist-info/METADATA,sha256=6-pzWsBTeG5SfhcZB_0x4yindbrE9NkIY_kEpo3K2Q4,1571
160
+ pybiolib-1.2.1074.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
161
+ pybiolib-1.2.1074.dist-info/entry_points.txt,sha256=p6DyaP_2kctxegTX23WBznnrDi4mz6gx04O5uKtRDXg,42
162
+ pybiolib-1.2.1074.dist-info/RECORD,,