isolate 0.13.3__tar.gz → 0.13.5__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.
Potentially problematic release.
This version of isolate might be problematic. Click here for more details.
- {isolate-0.13.3 → isolate-0.13.5}/PKG-INFO +1 -1
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/_isolate_version.py +2 -2
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/_base.py +0 -2
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/agent.py +17 -6
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/server.py +19 -10
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate.egg-info/PKG-INFO +1 -1
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_server.py +2 -2
- {isolate-0.13.3 → isolate-0.13.5}/.github/workflows/release.yml +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/.github/workflows/test.yml +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/.gitignore +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/.pre-commit-config.yaml +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/LICENSE +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/README.md +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/pyproject.toml +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/setup.cfg +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/_version.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/_base.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/common.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/conda.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/container.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/local.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/pyenv.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/remote.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/settings.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/backends/virtualenv.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/common/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/common/timestamp.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/_local/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/_local/_base.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/_local/agent_startup.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/common.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/configuration.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/agent.proto +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/agent_pb2.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/agent_pb2.pyi +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/agent_pb2_grpc.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/common.proto +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/common_pb2.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/common_pb2.pyi +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/common_pb2_grpc.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/interface.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/ipc/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/ipc/_base.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/ipc/agent.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/logger.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/logs.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/py.typed +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/registry.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/definitions/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/definitions/server.proto +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/definitions/server_pb2.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/definitions/server_pb2.pyi +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/definitions/server_pb2_grpc.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/health/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/health/health.proto +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/health/health_pb2.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/health/health_pb2.pyi +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/health/health_pb2_grpc.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/health_server.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate/server/interface.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate.egg-info/SOURCES.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate.egg-info/dependency_links.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate.egg-info/entry_points.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate.egg-info/requires.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/src/isolate.egg-info/top_level.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/__init__.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/conftest.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_backends.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_concurrency.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_connections.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_isolate.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_log.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tests/test_serialization.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tools/Dockerfile +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tools/agent_requirements.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tools/protobuf-requirements.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tools/regen_grpc.py +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tools/requirements.txt +0 -0
- {isolate-0.13.3 → isolate-0.13.5}/tools/test_agent_requirements.txt +0 -0
|
@@ -16,7 +16,6 @@ from isolate.connections.common import serialize_object
|
|
|
16
16
|
from isolate.connections.grpc import agent, definitions
|
|
17
17
|
from isolate.connections.grpc.configuration import get_default_options
|
|
18
18
|
from isolate.connections.grpc.interface import from_grpc
|
|
19
|
-
from isolate.logger import logger
|
|
20
19
|
from isolate.logs import LogLevel, LogSource
|
|
21
20
|
|
|
22
21
|
|
|
@@ -149,5 +148,4 @@ class LocalPythonGRPC(PythonExecutionBase[str], GRPCExecutionBase):
|
|
|
149
148
|
]
|
|
150
149
|
|
|
151
150
|
def handle_agent_log(self, line: str, level: LogLevel, source: LogSource) -> None:
|
|
152
|
-
logger.log(level, line, source)
|
|
153
151
|
self.log(line, level=level, source=source)
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
# agent-requires: isolate[server]
|
|
2
|
+
"""
|
|
3
|
+
This file contains the implementation of the gRPC agent. The agent is a
|
|
4
|
+
separate process that is responsible for running the user code in a
|
|
5
|
+
sandboxed environment.
|
|
6
|
+
|
|
7
|
+
This file is referenced by the latest version of the `isolate` package
|
|
8
|
+
but then runs it in the context of the frozen agent built environment.
|
|
9
|
+
"""
|
|
2
10
|
|
|
3
11
|
from __future__ import annotations
|
|
4
12
|
|
|
@@ -17,14 +25,16 @@ from typing import (
|
|
|
17
25
|
import grpc
|
|
18
26
|
from grpc import ServicerContext, StatusCode
|
|
19
27
|
|
|
20
|
-
|
|
28
|
+
try:
|
|
29
|
+
from isolate import __version__ as agent_version
|
|
30
|
+
except ImportError:
|
|
31
|
+
agent_version = "UNKNOWN"
|
|
32
|
+
|
|
21
33
|
from isolate.backends.common import sha256_digest_of
|
|
22
34
|
from isolate.connections.common import SerializationError, serialize_object
|
|
23
35
|
from isolate.connections.grpc import definitions
|
|
24
36
|
from isolate.connections.grpc.configuration import get_default_options
|
|
25
37
|
from isolate.connections.grpc.interface import from_grpc
|
|
26
|
-
from isolate.logger import logger
|
|
27
|
-
from isolate.logs import LogLevel, LogSource
|
|
28
38
|
|
|
29
39
|
|
|
30
40
|
@dataclass
|
|
@@ -117,7 +127,7 @@ class AgentServicer(definitions.AgentServicer):
|
|
|
117
127
|
# depickling is basically involves code execution from the *user*.
|
|
118
128
|
function = from_grpc(function)
|
|
119
129
|
except SerializationError:
|
|
120
|
-
|
|
130
|
+
traceback.print_exc()
|
|
121
131
|
raise AbortException(
|
|
122
132
|
f"The {function_kind} function could not be deserialized."
|
|
123
133
|
)
|
|
@@ -154,7 +164,8 @@ class AgentServicer(definitions.AgentServicer):
|
|
|
154
164
|
definition = serialize_object(serialization_method, result)
|
|
155
165
|
except SerializationError:
|
|
156
166
|
if stringized_tb:
|
|
157
|
-
|
|
167
|
+
print(stringized_tb, file=sys.stderr)
|
|
168
|
+
self.log(traceback.format_exc())
|
|
158
169
|
raise AbortException(
|
|
159
170
|
"Error while serializing the execution result "
|
|
160
171
|
f"(object of type {type(result)})."
|
|
@@ -179,7 +190,7 @@ class AgentServicer(definitions.AgentServicer):
|
|
|
179
190
|
)
|
|
180
191
|
|
|
181
192
|
def log(self, message: str) -> None:
|
|
182
|
-
self._log.write(message)
|
|
193
|
+
self._log.write(message + "\n")
|
|
183
194
|
self._log.flush()
|
|
184
195
|
|
|
185
196
|
def abort_with_msg(
|
|
@@ -9,7 +9,6 @@ from concurrent import futures
|
|
|
9
9
|
from concurrent.futures import ThreadPoolExecutor
|
|
10
10
|
from contextlib import ExitStack, contextmanager
|
|
11
11
|
from dataclasses import dataclass, field, replace
|
|
12
|
-
from functools import partial
|
|
13
12
|
from queue import Empty as QueueEmpty
|
|
14
13
|
from queue import Queue
|
|
15
14
|
from typing import Any, Callable, Iterator, cast
|
|
@@ -26,6 +25,7 @@ from isolate.backends.local import LocalPythonEnvironment
|
|
|
26
25
|
from isolate.backends.virtualenv import VirtualPythonEnvironment
|
|
27
26
|
from isolate.connections.grpc import AgentError, LocalPythonGRPC
|
|
28
27
|
from isolate.connections.grpc.configuration import get_default_options
|
|
28
|
+
from isolate.logger import logger
|
|
29
29
|
from isolate.logs import Log, LogLevel, LogSource
|
|
30
30
|
from isolate.server import definitions, health
|
|
31
31
|
from isolate.server.health_server import HealthServicer
|
|
@@ -191,9 +191,10 @@ class IsolateServicer(definitions.IsolateServicer):
|
|
|
191
191
|
StatusCode.INVALID_ARGUMENT,
|
|
192
192
|
)
|
|
193
193
|
|
|
194
|
+
log_handler = LogHandler(messages)
|
|
194
195
|
run_settings = replace(
|
|
195
196
|
self.default_settings,
|
|
196
|
-
log_hook=
|
|
197
|
+
log_hook=log_handler.handle,
|
|
197
198
|
serialization_method=request.function.method,
|
|
198
199
|
)
|
|
199
200
|
|
|
@@ -390,14 +391,22 @@ def _proxy_to_queue(
|
|
|
390
391
|
queue.put_nowait(message)
|
|
391
392
|
|
|
392
393
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
394
|
+
@dataclass
|
|
395
|
+
class LogHandler:
|
|
396
|
+
messages: Queue
|
|
397
|
+
|
|
398
|
+
def handle(self, log: Log) -> None:
|
|
399
|
+
logger.log(log.level, log.message, source=log.source)
|
|
400
|
+
self._add_log_to_queue(log)
|
|
401
|
+
|
|
402
|
+
def _add_log_to_queue(self, log: Log) -> None:
|
|
403
|
+
grpc_log = cast(definitions.Log, to_grpc(log))
|
|
404
|
+
grpc_result = definitions.PartialRunResult(
|
|
405
|
+
is_complete=False,
|
|
406
|
+
logs=[grpc_log],
|
|
407
|
+
result=None,
|
|
408
|
+
)
|
|
409
|
+
self.messages.put_nowait(grpc_result)
|
|
401
410
|
|
|
402
411
|
|
|
403
412
|
def main() -> None:
|
|
@@ -217,7 +217,7 @@ def test_server_builder_error(stub: definitions.IsolateStub, monkeypatch: Any) -
|
|
|
217
217
|
assert "Failure during 'pip install': Command" in exc.value.details()
|
|
218
218
|
|
|
219
219
|
raw_logs = [log.message for log in build_logs]
|
|
220
|
-
assert "ERROR: Invalid requirement: '$$$$'" in raw_logs
|
|
220
|
+
assert any("ERROR: Invalid requirement: '$$$$'" in raw_log for raw_log in raw_logs)
|
|
221
221
|
|
|
222
222
|
|
|
223
223
|
def test_user_logs_immediate(stub: definitions.IsolateStub, monkeypatch: Any) -> None:
|
|
@@ -402,7 +402,7 @@ def test_agent_show_logs_from_agent_requirements(
|
|
|
402
402
|
assert "Failure during 'pip install': Command" in exc.value.details()
|
|
403
403
|
|
|
404
404
|
raw_logs = [log.message for log in build_logs]
|
|
405
|
-
assert "ERROR: Invalid requirement: '$$$$'" in raw_logs
|
|
405
|
+
assert any("ERROR: Invalid requirement: '$$$$'" in raw_log for raw_log in raw_logs)
|
|
406
406
|
|
|
407
407
|
|
|
408
408
|
def test_bridge_connection_reuse(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/agent_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{isolate-0.13.3 → isolate-0.13.5}/src/isolate/connections/grpc/definitions/common_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|