github.com/jfrazelle/docker@v1.1.2-0.20210712172922-bf78e25fe508/testutil/daemon/daemon_unix.go (about) 1 // +build !windows 2 3 package daemon // import "github.com/docker/docker/testutil/daemon" 4 5 import ( 6 "fmt" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "strings" 11 "syscall" 12 "testing" 13 14 "github.com/moby/sys/mount" 15 "golang.org/x/sys/unix" 16 "gotest.tools/v3/assert" 17 ) 18 19 // cleanupMount unmounts the daemon root directory, or logs a message if 20 // unmounting failed. 21 func cleanupMount(t testing.TB, d *Daemon) { 22 t.Helper() 23 if err := mount.Unmount(d.Root); err != nil { 24 d.log.Logf("[%s] unable to unmount daemon root (%s): %v", d.id, d.Root, err) 25 } 26 } 27 28 func cleanupNetworkNamespace(t testing.TB, d *Daemon) { 29 t.Helper() 30 // Cleanup network namespaces in the exec root of this 31 // daemon because this exec root is specific to this 32 // daemon instance and has no chance of getting 33 // cleaned up when a new daemon is instantiated with a 34 // new exec root. 35 netnsPath := filepath.Join(d.execRoot, "netns") 36 filepath.Walk(netnsPath, func(path string, info os.FileInfo, err error) error { 37 if err := unix.Unmount(path, unix.MNT_DETACH); err != nil && err != unix.EINVAL && err != unix.ENOENT { 38 t.Logf("[%s] unmount of %s failed: %v", d.id, path, err) 39 } 40 os.Remove(path) 41 return nil 42 }) 43 } 44 45 // CgroupNamespace returns the cgroup namespace the daemon is running in 46 func (d *Daemon) CgroupNamespace(t testing.TB) string { 47 link, err := os.Readlink(fmt.Sprintf("/proc/%d/ns/cgroup", d.Pid())) 48 assert.NilError(t, err) 49 50 return strings.TrimSpace(link) 51 } 52 53 // SignalDaemonDump sends a signal to the daemon to write a dump file 54 func SignalDaemonDump(pid int) { 55 unix.Kill(pid, unix.SIGQUIT) 56 } 57 58 func signalDaemonReload(pid int) error { 59 return unix.Kill(pid, unix.SIGHUP) 60 } 61 62 func setsid(cmd *exec.Cmd) { 63 if cmd.SysProcAttr == nil { 64 cmd.SysProcAttr = &syscall.SysProcAttr{} 65 } 66 cmd.SysProcAttr.Setsid = true 67 }