daemon: agent-driven workspace images — repo→image registry (GET/PUT/DELETE /api/repos), spawn resolves custom image, self-healing lvmh-ops control container with docker.sock; 132 tests, e2e 87/87

This commit is contained in:
Raphael Westphal
2026-08-18 23:54:09 +02:00
parent 8fcaeb7c03
commit 7287b831e4
15 changed files with 1216 additions and 38 deletions
+53
View File
@@ -4,6 +4,7 @@ package main
import (
"path/filepath"
"reflect"
"testing"
)
@@ -132,3 +133,55 @@ func TestStoreSettingsAndContainers(t *testing.T) {
t.Fatal("container row should be gone")
}
}
func TestStoreRepoImages(t *testing.T) {
store := openTestStore(t)
if _, ok, err := store.GetRepoImage("group/proj"); err != nil || ok {
t.Fatalf("missing repo image = %v %v, want absent no-error", ok, err)
}
if rows, err := store.ListRepoImages(); err != nil || rows != nil {
t.Fatalf("empty list = %v %v, want nil no-error", rows, err)
}
if err := store.SetRepoImage("group/proj", "lvmh-worker-g--p-ab12cd"); err != nil {
t.Fatalf("set: %v", err)
}
if img, ok, _ := store.GetRepoImage("group/proj"); !ok || img != "lvmh-worker-g--p-ab12cd" {
t.Fatalf("get = %q %v", img, ok)
}
// upsert replaces
if err := store.SetRepoImage("group/proj", "lvmh-worker-g--p-ff99ee"); err != nil {
t.Fatalf("upsert: %v", err)
}
if img, _, _ := store.GetRepoImage("group/proj"); img != "lvmh-worker-g--p-ff99ee" {
t.Fatalf("after upsert = %q", img)
}
if err := store.SetRepoImage("other/repo", "lvmh-worker-o--r-11aabb"); err != nil {
t.Fatalf("set second: %v", err)
}
rows, err := store.ListRepoImages()
if err != nil {
t.Fatalf("list: %v", err)
}
want := []RepoImageRow{
{Repo: "group/proj", Image: "lvmh-worker-g--p-ff99ee"},
{Repo: "other/repo", Image: "lvmh-worker-o--r-11aabb"},
}
if !reflect.DeepEqual(rows, want) {
t.Fatalf("list = %+v, want %+v (sorted by repo)", rows, want)
}
if err := store.DeleteRepoImage("group/proj"); err != nil {
t.Fatalf("delete: %v", err)
}
if _, ok, _ := store.GetRepoImage("group/proj"); ok {
t.Fatal("repo image should be gone")
}
// idempotent delete
if err := store.DeleteRepoImage("group/proj"); err != nil {
t.Fatalf("delete absent: %v", err)
}
}