mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-13 09:10:12 +00:00
Adds opt-in process isolation for custom nodes using pyisolate's bwrap sandbox and JSON-RPC bridge. Each isolated node pack runs in its own child process with zero-copy tensor transfer via shared memory. Core infrastructure: - CLI flag --use-process-isolation to enable isolation - Host/child startup fencing via PYISOLATE_CHILD env var - Manifest-driven node discovery and extension loading - JSON-RPC bridge between host and child processes - Shared memory forensics for leak detection Proxy layer: - ModelPatcher, CLIP, VAE, and ModelSampling proxies - Host service proxies (folder_paths, model_management, progress, etc.) - Proxy base with automatic method forwarding Execution integration: - Extension wrapper with V3 hidden param mapping - Runtime helpers for isolated node execution - Host policy for node isolation decisions - Fenced sampler device handling and model ejection parity Serializers for cross-process data transfer: - File3D (GLB), PLY (structured + gaussian), NPZ (streaming frames), VIDEO (VideoFromFile + VideoFromComponents) serializers - data_type flag in SerializerRegistry for type-aware dispatch - Isolated get_temp_directory() fence New core save nodes: - SavePLY and SaveNPZ with comfytype registrations (Ply, Npz) DynamicVRAM compatibility: - comfy-aimdo early init gated by isolation fence Tests: - Integration and policy tests for isolation lifecycle - Manifest loader, host policy, proxy, and adapter unit tests Depends on: pyisolate >= 0.9.2
57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
"""Unit tests for PyIsolate isolation system initialization."""
|
|
|
|
|
|
|
|
def test_log_prefix():
|
|
"""Verify LOG_PREFIX constant is correctly defined."""
|
|
from comfy.isolation import LOG_PREFIX
|
|
assert LOG_PREFIX == "]["
|
|
assert isinstance(LOG_PREFIX, str)
|
|
|
|
|
|
def test_module_initialization():
|
|
"""Verify module initializes without errors."""
|
|
import comfy.isolation
|
|
assert hasattr(comfy.isolation, 'LOG_PREFIX')
|
|
assert hasattr(comfy.isolation, 'initialize_proxies')
|
|
|
|
|
|
class TestInitializeProxies:
|
|
def test_initialize_proxies_runs_without_error(self):
|
|
from comfy.isolation import initialize_proxies
|
|
initialize_proxies()
|
|
|
|
def test_initialize_proxies_registers_folder_paths_proxy(self):
|
|
from comfy.isolation import initialize_proxies
|
|
from comfy.isolation.proxies.folder_paths_proxy import FolderPathsProxy
|
|
initialize_proxies()
|
|
proxy = FolderPathsProxy()
|
|
assert proxy is not None
|
|
assert hasattr(proxy, "get_temp_directory")
|
|
|
|
def test_initialize_proxies_registers_model_management_proxy(self):
|
|
from comfy.isolation import initialize_proxies
|
|
from comfy.isolation.proxies.model_management_proxy import ModelManagementProxy
|
|
initialize_proxies()
|
|
proxy = ModelManagementProxy()
|
|
assert proxy is not None
|
|
assert hasattr(proxy, "get_torch_device")
|
|
|
|
def test_initialize_proxies_can_be_called_multiple_times(self):
|
|
from comfy.isolation import initialize_proxies
|
|
initialize_proxies()
|
|
initialize_proxies()
|
|
initialize_proxies()
|
|
|
|
def test_dev_proxies_accessible_when_dev_mode(self, monkeypatch):
|
|
"""Verify dev mode does not break core proxy initialization."""
|
|
monkeypatch.setenv("PYISOLATE_DEV", "1")
|
|
from comfy.isolation import initialize_proxies
|
|
from comfy.isolation.proxies.folder_paths_proxy import FolderPathsProxy
|
|
from comfy.isolation.proxies.utils_proxy import UtilsProxy
|
|
initialize_proxies()
|
|
folder_proxy = FolderPathsProxy()
|
|
utils_proxy = UtilsProxy()
|
|
assert folder_proxy is not None
|
|
assert utils_proxy is not None
|