fetch_ml/tests/e2e/tracking_test.go

97 lines
2.6 KiB
Go

package tests
import (
"fmt"
"log/slog"
"os"
"testing"
"time"
"github.com/jfraeys/fetch_ml/internal/container"
"github.com/jfraeys/fetch_ml/internal/logging"
"github.com/jfraeys/fetch_ml/internal/tracking"
"github.com/jfraeys/fetch_ml/internal/tracking/factory"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestTrackingIntegration(t *testing.T) {
if os.Getenv("CI") != "" || os.Getenv("SKIP_E2E") != "" {
t.Skip("Skipping tracking E2E test in CI")
}
logger := logging.NewLogger(slog.LevelDebug, false)
// ctx := context.Background()
// 1. Setup Podman Manager
podmanMgr, err := container.NewPodmanManager(logger)
require.NoError(t, err)
// 2. Setup Tracking Registry & Loader
registry := tracking.NewRegistry(logger)
loader := factory.NewPluginLoader(logger, podmanMgr)
// 3. Configure Plugins (Use simple alpine for sidecar test to save time/bandwidth)
// We'll mimic MLflow using a small image
plugins := map[string]factory.PluginConfig{
"mlflow": {
Enabled: true,
Image: "alpine:latest", // Mock image for speed
Mode: "sidecar",
ArtifactPath: "/tmp/artifacts",
Settings: map[string]any{
"tracking_uri": "http://mock:5000",
},
},
"tensorboard": {
Enabled: true,
Image: "alpine:latest",
Mode: "sidecar",
LogBasePath: "/tmp/logs",
},
}
// 4. Load Plugins
err = loader.LoadPlugins(plugins, registry)
require.NoError(t, err)
// 5. Test Provisioning
taskID := fmt.Sprintf("test-task-%d", time.Now().Unix())
_ = taskID // Suppress unused for now
_ = taskID // Suppress unused for now
// Provision all (mocks sidecar startup)
configs := map[string]tracking.ToolConfig{
"mlflow": {
Enabled: true,
Mode: tracking.ModeSidecar,
Settings: map[string]any{
"job_name": "test-job",
},
},
"tensorboard": {
Enabled: true,
Mode: tracking.ModeSidecar,
Settings: map[string]any{
"job_name": "test-job",
},
},
}
// Just verify that the keys in configs align with registered plugins
for name := range configs {
_, ok := registry.Get(name)
assert.True(t, ok, fmt.Sprintf("Plugin %s should be registered", name))
}
// For E2E we can try to actually run ProvisionAll if we had mocks or a "dry run" mode.
// But without mocking podman, it tries to actually run.
// We'll trust the registration for now as the lighter weight E2E check.
_, ok := registry.Get("mlflow")
assert.True(t, ok, "MLflow plugin should be registered")
_, ok = registry.Get("tensorboard")
assert.True(t, ok, "TensorBoard plugin should be registered")
}