BeforeEach(func() { var err error wsh, err = gexec.Build("github.com/cloudfoundry-incubator/garden-linux/container_daemon/wsh") Expect(err).ToNot(HaveOccurred()) tempDir, err = ioutil.TempDir("", "") Expect(err).ToNot(HaveOccurred()) socketPath = path.Join(tempDir, "test.sock") listener, err := unix_socket.NewListenerFromPath(socketPath) Expect(err).ToNot(HaveOccurred()) daemon = &container_daemon.ContainerDaemon{ CmdPreparer: &container_daemon.ProcessSpecPreparer{ Users: container_daemon.LibContainerUser{}, Reexec: container_daemon.CommandFunc(reexec.Command), Rlimits: &container_daemon.RlimitsManager{}, }, Spawner: &container_daemon.Spawn{ Runner: &FakeCommandRunner{}, }, Signaller: &FakeProcessSignaller{}, } go func(listener container_daemon.Listener, daemon *container_daemon.ContainerDaemon) { defer GinkgoRecover() Expect(daemon.Run(listener)).To(Succeed()) }(listener, daemon) }) AfterEach(func() {
// initd listens on a socket, spawns requested processes and reaps their // exit statuses. func start() { defer func() { if r := recover(); r != nil { fmt.Fprintf(os.Stderr, "initd: panicked: %s\n", r) os.Exit(4) } }() flag.String("title", "", "") dropCaps := flag.Bool("dropCapabilities", false, "drop capabilities before running processes") flag.Parse() container_daemon.Detach("/dev/null", "/dev/null") logger := lager.NewLogger("initd") syncWriter := os.NewFile(uintptr(4), "/dev/sync_writer") syscall.RawSyscall(syscall.SYS_FCNTL, uintptr(4), syscall.F_SETFD, syscall.FD_CLOEXEC) defer syncWriter.Close() sync := &containerizer.PipeSynchronizer{ Writer: syncWriter, } reaper := system.StartReaper(logger, syscall.Wait4) defer reaper.Stop() daemon := &container_daemon.ContainerDaemon{ CmdPreparer: &container_daemon.ProcessSpecPreparer{ Users: container_daemon.LibContainerUser{}, Rlimits: &container_daemon.RlimitsManager{}, Reexec: container_daemon.CommandFunc(func(args ...string) *exec.Cmd { return &exec.Cmd{ Path: "/proc/self/exe", Args: args, } }), AlwaysDropCapabilities: *dropCaps, }, Spawner: &container_daemon.Spawn{ Runner: reaper, PTY: system.KrPty, }, Signaller: &container_daemon.ProcessSignaller{ Logger: logger, }, } socketFile := os.NewFile(uintptr(5), "/dev/host.sock") listener, err := unix_socket.NewListenerFromFile(socketFile) if err != nil { fail(fmt.Sprintf("initd: failed to create listener: %s\n", err), 5) } socketFile.Close() if err := sync.SignalSuccess(); err != nil { fail(fmt.Sprintf("signal host: %s", err), 6) } if err := daemon.Run(listener); err != nil { fail(fmt.Sprintf("run daemon: %s", err), 7) } }