mesh/merge-gate pass: builds mesh-host → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery covered: a later merge that contains it was delivered: novox/mesh-host@7c046a8a1d84 (merged as d28ca959 into main, walk plan-17915049347305…
The review of #64 asked for containerd's tree, dockerd's --data-root from its unit and drop-ins, and podman's graphroot to be refused like docker's own (hq issue 339); and the controller now tells a directory a send found from one found before it, which needs the time it was first found kept across applies instead of the time of the last apply. A hand-over now names the resource it was for, so it lapses if another declaration points at the path.
45 lines
1.8 KiB
Go
45 lines
1.8 KiB
Go
package apply
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// The container runtimes keep every container's filesystem somewhere the machine may have moved: dockerd's
|
|
// --data-root on its unit's command line or a drop-in, podman's graphroot, containerd's own tree (novox/hq issue
|
|
// 339). Each is refused as a place, an access or a mount, wherever it is said.
|
|
func TestEveryRuntimesDataRootIsRefused(t *testing.T) {
|
|
dir := t.TempDir()
|
|
write := func(name, content string) string {
|
|
t.Helper()
|
|
p := filepath.Join(dir, name)
|
|
if err := os.MkdirAll(filepath.Dir(p), 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(p, []byte(content), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return p
|
|
}
|
|
unit := write("lib/docker.service", "[Service]\nExecStart=/usr/bin/dockerd -H fd:// --data-root /data/docker-a\n")
|
|
dropIn := write("etc/docker.service.d/root.conf", "[Service]\nExecStart=\nExecStart=/usr/bin/dockerd --data-root=/data/docker-b --log-level warn\n")
|
|
storage := write("containers/storage.conf", "[storage]\ndriver = \"overlay\"\n graphroot = \"/data/podman\"\nrunroot = \"/run/containers/storage\"\n")
|
|
before := runtimeConfigs
|
|
runtimeConfigs = runtimeFiles{daemonJSON: filepath.Join(dir, "none.json"), units: []string{unit},
|
|
dropInDirs: []string{filepath.Dir(dropIn)}, storageConf: storage}
|
|
t.Cleanup(func() { runtimeConfigs = before })
|
|
|
|
for _, kind := range []placing{placingDirectory, placingAccess, placingMount} {
|
|
for _, path := range []string{"/var/lib/containerd", "/var/lib/containerd/io.containerd.content.v1",
|
|
"/data/docker-a/volumes", "/data/docker-b", "/data/podman/overlay"} {
|
|
if err := refusePath(path, kind, "notes", ""); err == nil {
|
|
t.Errorf("%v at %s was taken", kind, path)
|
|
}
|
|
}
|
|
if err := refusePath("/data/media", kind, "notes", ""); err != nil {
|
|
t.Errorf("%v at /data/media: %v", kind, err)
|
|
}
|
|
}
|
|
}
|