diff --git a/core/progress.py b/core/progress.py index 5074357..73be894 100644 --- a/core/progress.py +++ b/core/progress.py @@ -2,6 +2,7 @@ import threading import time +import uuid from typing import Any, Callable, Dict, Optional from .log_system import create_module_logger @@ -9,6 +10,11 @@ from .log_system import create_module_logger log = create_module_logger(__name__) +def generate_progress_id(prefix: str) -> str: + """Generate an opaque progress ID with a stable caller-provided prefix.""" + return f"{prefix}_{uuid.uuid4().hex}" + + class JobProgressTracker: """Helper class for thread-safe job progress tracking and cancellation management.""" diff --git a/core/services/hash_service.py b/core/services/hash_service.py index d1a6295..9f5faf6 100644 --- a/core/services/hash_service.py +++ b/core/services/hash_service.py @@ -2,10 +2,10 @@ import os import time -import uuid from .. import path_utils from ..local_hash_matches import collect_local_hash_matches_for_result +from ..progress import generate_progress_id from ..request_utils import extract_request_sha256, validate_workflow_payload from ..routes.context import RouteContext @@ -608,7 +608,7 @@ class HashService: return error_response self.hash_tracker.cleanup() - progress_id = f"hash_{uuid.uuid4().hex}" + progress_id = generate_progress_id("hash") self.hash_tracker.update( progress_id, status="queued", diff --git a/core/services/metadata_service.py b/core/services/metadata_service.py index 68d889b..68015c3 100644 --- a/core/services/metadata_service.py +++ b/core/services/metadata_service.py @@ -1,7 +1,6 @@ """Metadata audit and build orchestration used by HTTP route adapters.""" -import uuid - +from ..progress import generate_progress_id from ..request_utils import read_optional_object_payload from ..routes.context import RouteContext @@ -64,7 +63,7 @@ class MetadataService: payload.get("metadata_mode") ) self.metadata_builder_progress.cleanup() - progress_id = f"metadata_build_{uuid.uuid4().hex}" + progress_id = generate_progress_id("metadata_build") self.metadata_builder_progress.update( progress_id, status="queued", diff --git a/tests/test_resolver_robustness.py b/tests/test_resolver_robustness.py index ce2da39..54e13b8 100644 --- a/tests/test_resolver_robustness.py +++ b/tests/test_resolver_robustness.py @@ -29,11 +29,19 @@ from core.settings import ( _resolve_base_model_mapping, ) -from core.progress import JobProgressTracker +from core.progress import JobProgressTracker, generate_progress_id class ModelResolverRobustnessTests(unittest.TestCase): + def test_progress_id_generation_preserves_prefix_and_uuid_shape(self): + metadata_id = generate_progress_id("metadata_build") + hash_id = generate_progress_id("hash") + + self.assertRegex(metadata_id, r"^metadata_build_[0-9a-f]{32}$") + self.assertRegex(hash_id, r"^hash_[0-9a-f]{32}$") + self.assertNotEqual(metadata_id, hash_id) + def test_download_match_paths_use_a_normalized_absolute_comparison_key(self): raw_path = " models{}..{}checkpoints{}model.safetensors ".format( os.sep,