diff --git a/tests/unit/security/audit_test.go b/internal/security/audit_test.go similarity index 99% rename from tests/unit/security/audit_test.go rename to internal/security/audit_test.go index 01888ea..85e8102 100644 --- a/tests/unit/security/audit_test.go +++ b/internal/security/audit_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "log/slog" diff --git a/tests/unit/security/config_integrity_test.go b/internal/security/config_integrity_test.go similarity index 99% rename from tests/unit/security/config_integrity_test.go rename to internal/security/config_integrity_test.go index c1a4c3a..5656e41 100644 --- a/tests/unit/security/config_integrity_test.go +++ b/internal/security/config_integrity_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "os" diff --git a/tests/unit/security/filetype_test.go b/internal/security/filetype_test.go similarity index 99% rename from tests/unit/security/filetype_test.go rename to internal/security/filetype_test.go index 6fc7b2c..ae7e0b4 100644 --- a/tests/unit/security/filetype_test.go +++ b/internal/security/filetype_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "os" diff --git a/tests/unit/security/gpu_audit_test.go b/internal/security/gpu_audit_test.go similarity index 99% rename from tests/unit/security/gpu_audit_test.go rename to internal/security/gpu_audit_test.go index 68f11a5..34bb493 100644 --- a/tests/unit/security/gpu_audit_test.go +++ b/internal/security/gpu_audit_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "bytes" diff --git a/tests/unit/security/hipaa_validation_test.go b/internal/security/hipaa_validation_test.go similarity index 99% rename from tests/unit/security/hipaa_validation_test.go rename to internal/security/hipaa_validation_test.go index b580f44..c9afb04 100644 --- a/tests/unit/security/hipaa_validation_test.go +++ b/internal/security/hipaa_validation_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "fmt" diff --git a/tests/unit/security/manifest_filename_test.go b/internal/security/manifest_filename_test.go similarity index 99% rename from tests/unit/security/manifest_filename_test.go rename to internal/security/manifest_filename_test.go index 2eab25c..c4dcd77 100644 --- a/tests/unit/security/manifest_filename_test.go +++ b/internal/security/manifest_filename_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "os" diff --git a/tests/unit/security/path_traversal_test.go b/internal/security/path_traversal_test.go similarity index 99% rename from tests/unit/security/path_traversal_test.go rename to internal/security/path_traversal_test.go index bd3645c..a820b2d 100644 --- a/tests/unit/security/path_traversal_test.go +++ b/internal/security/path_traversal_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "os" diff --git a/tests/unit/security/resource_quota_test.go b/internal/security/resource_quota_test.go similarity index 99% rename from tests/unit/security/resource_quota_test.go rename to internal/security/resource_quota_test.go index 5ebfd03..347b09d 100644 --- a/tests/unit/security/resource_quota_test.go +++ b/internal/security/resource_quota_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "os" diff --git a/tests/unit/security/secrets_test.go b/internal/security/secrets_test.go similarity index 99% rename from tests/unit/security/secrets_test.go rename to internal/security/secrets_test.go index bcb3af8..5905695 100644 --- a/tests/unit/security/secrets_test.go +++ b/internal/security/secrets_test.go @@ -1,4 +1,4 @@ -package security +package security_test import ( "strings" diff --git a/tests/unit/storage/db_test.go b/internal/storage/db_test.go similarity index 99% rename from tests/unit/storage/db_test.go rename to internal/storage/db_test.go index 1391761..0c7974e 100644 --- a/tests/unit/storage/db_test.go +++ b/internal/storage/db_test.go @@ -1,4 +1,4 @@ -package storage +package storage_test import ( "os" diff --git a/tests/unit/storage/experiment_metadata_test.go b/internal/storage/experiment_metadata_test.go similarity index 99% rename from tests/unit/storage/experiment_metadata_test.go rename to internal/storage/experiment_metadata_test.go index 8096e2a..9ae99f1 100644 --- a/tests/unit/storage/experiment_metadata_test.go +++ b/internal/storage/experiment_metadata_test.go @@ -1,4 +1,4 @@ -package storage +package storage_test import ( "context" diff --git a/tests/unit/telemetry/telemetry_test.go b/internal/telemetry/telemetry_test.go similarity index 99% rename from tests/unit/telemetry/telemetry_test.go rename to internal/telemetry/telemetry_test.go index 03192dc..8da1b45 100644 --- a/tests/unit/telemetry/telemetry_test.go +++ b/internal/telemetry/telemetry_test.go @@ -1,4 +1,4 @@ -package telemetry +package telemetry_test import ( "testing" diff --git a/tests/unit/reproducibility/config_hash_test.go b/internal/tracking/config_hash_test.go similarity index 99% rename from tests/unit/reproducibility/config_hash_test.go rename to internal/tracking/config_hash_test.go index 5fd2c3f..dfd2d8f 100644 --- a/tests/unit/reproducibility/config_hash_test.go +++ b/internal/tracking/config_hash_test.go @@ -1,4 +1,4 @@ -package reproducibility +package tracking_test import ( "os" diff --git a/tests/unit/reproducibility/environment_capture_test.go b/internal/tracking/environment_capture_test.go similarity index 99% rename from tests/unit/reproducibility/environment_capture_test.go rename to internal/tracking/environment_capture_test.go index a07025f..1f86c85 100644 --- a/tests/unit/reproducibility/environment_capture_test.go +++ b/internal/tracking/environment_capture_test.go @@ -1,4 +1,4 @@ -package reproducibility +package tracking_test import ( "os" diff --git a/tests/unit/worker/artifacts_test.go b/internal/worker/artifacts_test.go similarity index 100% rename from tests/unit/worker/artifacts_test.go rename to internal/worker/artifacts_test.go diff --git a/tests/unit/worker/config_test.go b/internal/worker/config_test.go similarity index 100% rename from tests/unit/worker/config_test.go rename to internal/worker/config_test.go diff --git a/internal/worker/gpu_detector.go b/internal/worker/gpu_detector.go index cc53f60..ed3b4bf 100644 --- a/internal/worker/gpu_detector.go +++ b/internal/worker/gpu_detector.go @@ -1,6 +1,7 @@ package worker import ( + "errors" "fmt" "log/slog" "os" @@ -184,6 +185,24 @@ type DetectionResult struct { Info GPUDetectionInfo } +// Validate checks if the detection result is valid and returns an error if not. +// This ensures users get clear error messages for unimplemented features like AMD GPU. +func (r DetectionResult) Validate() error { + if r.Detector == nil { + switch r.Info.ConfiguredVendor { + case "amd": + return errors.New( + "AMD GPU support is not yet implemented. " + + "Use NVIDIA GPUs, Apple Silicon, or CPU-only mode. " + + "For development/testing, use FETCH_ML_MOCK_GPU_TYPE=AMD", + ) + default: + return fmt.Errorf("GPU detection failed for vendor %q", r.Info.ConfiguredVendor) + } + } + return nil +} + func (f *GPUDetectorFactory) CreateDetector(cfg *Config) GPUDetector { result := f.CreateDetectorWithInfo(cfg) return result.Detector @@ -233,9 +252,10 @@ func (f *GPUDetectorFactory) CreateDetectorWithInfo(cfg *Config) DetectionResult }, } case "amd": - // AMD env override uses NVIDIA detector (aliased) + // AMD GPU support not yet implemented + // Return error so user knows this is a known limitation return DetectionResult{ - Detector: &NVIDIADetector{}, + Detector: nil, // Will cause error when used Info: GPUDetectionInfo{ GPUType: GPUTypeAMD, ConfiguredVendor: "amd", @@ -295,9 +315,9 @@ func (f *GPUDetectorFactory) CreateDetectorWithInfo(cfg *Config) DetectionResult }, } case "amd": - // AMD env override uses NVIDIA detector (aliased) + // AMD GPU support not yet implemented return DetectionResult{ - Detector: &NVIDIADetector{}, + Detector: nil, Info: GPUDetectionInfo{ GPUType: GPUTypeAMD, ConfiguredVendor: "amd", @@ -388,14 +408,13 @@ func (f *GPUDetectorFactory) detectFromConfigWithSource(cfg *Config, source Dete }, } case "amd": - // AMD uses similar device exposure patterns in this codebase. - // This is the key aliasing point - we report AMD as configured vendor - // but use NVIDIADetector for implementation. + // AMD GPU support not yet implemented - tracked in roadmap + logWarningf("AMD GPU detection requested but not yet implemented. Consider using MOCK mode or contributing to the project.") return DetectionResult{ - Detector: &NVIDIADetector{}, + Detector: nil, Info: GPUDetectionInfo{ - GPUType: GPUTypeNVIDIA, - ConfiguredVendor: "amd", // User configured "amd" + GPUType: GPUTypeAMD, + ConfiguredVendor: "amd", DetectionMethod: source, EnvOverrideType: envType, EnvOverrideCount: envCount, @@ -491,9 +510,9 @@ func DetectCapabilities() scheduler.WorkerCapabilities { MemoryGB: getSystemMemoryGB(), Hostname: getHostname(), GPUInfo: scheduler.GPUDetectionInfo{ - GPUType: "vulkan", - Count: count, - Devices: getVulkanDevices(), + GPUType: "vulkan", + Count: count, + Devices: getVulkanDevices(), }, } } diff --git a/tests/unit/worker/hash_bench_test.go b/internal/worker/hash_bench_test.go similarity index 100% rename from tests/unit/worker/hash_bench_test.go rename to internal/worker/hash_bench_test.go diff --git a/tests/unit/worker/plugins/jupyter_task_test.go b/internal/worker/plugins/jupyter_task_test.go similarity index 99% rename from tests/unit/worker/plugins/jupyter_task_test.go rename to internal/worker/plugins/jupyter_task_test.go index b3f3e6a..137e039 100644 --- a/tests/unit/worker/plugins/jupyter_task_test.go +++ b/internal/worker/plugins/jupyter_task_test.go @@ -1,4 +1,4 @@ -package plugins__test +package plugins_test import ( "context" diff --git a/tests/unit/worker/plugins/vllm_test.go b/internal/worker/plugins/vllm_test.go similarity index 99% rename from tests/unit/worker/plugins/vllm_test.go rename to internal/worker/plugins/vllm_test.go index 9eb39b0..3256ddc 100644 --- a/tests/unit/worker/plugins/vllm_test.go +++ b/internal/worker/plugins/vllm_test.go @@ -1,4 +1,4 @@ -package plugins__test +package plugins_test import ( "context" diff --git a/tests/unit/worker/prewarm_v1_test.go b/internal/worker/prewarm_v1_test.go similarity index 100% rename from tests/unit/worker/prewarm_v1_test.go rename to internal/worker/prewarm_v1_test.go diff --git a/tests/unit/worker/run_manifest_execution_test.go b/internal/worker/run_manifest_execution_test.go similarity index 100% rename from tests/unit/worker/run_manifest_execution_test.go rename to internal/worker/run_manifest_execution_test.go diff --git a/tests/unit/worker/snapshot_stage_test.go b/internal/worker/snapshot_stage_test.go similarity index 100% rename from tests/unit/worker/snapshot_stage_test.go rename to internal/worker/snapshot_stage_test.go diff --git a/tests/unit/worker/snapshot_store_test.go b/internal/worker/snapshot_store_test.go similarity index 100% rename from tests/unit/worker/snapshot_store_test.go rename to internal/worker/snapshot_store_test.go diff --git a/tests/unit/worker/worker_test.go b/internal/worker/worker_test.go similarity index 100% rename from tests/unit/worker/worker_test.go rename to internal/worker/worker_test.go