type RunArvMount func([]string) (*exec.Cmd, error)
+type MkTempDir func(string, string) (string, error)
+
// ThinDockerClient is the minimal Docker client interface used by crunch-run.
type ThinDockerClient interface {
StopContainer(id string, timeout int) error
LogCollection *CollectionWriter
LogsPDH *string
RunArvMount
+ MkTempDir
ArvMount *exec.Cmd
ArvMountPoint string
HostOutputDir string
}
func (runner *ContainerRunner) SetupMounts() (err error) {
- runner.ArvMountPoint, err = ioutil.TempDir("", "keep")
+ runner.ArvMountPoint, err = runner.MkTempDir("", "keep")
if err != nil {
return fmt.Errorf("While creating keep mount temp dir: %v", err)
}
collectionPaths = append(collectionPaths, src)
} else if mnt.Kind == "tmp" {
if bind == runner.ContainerRecord.OutputPath {
- runner.HostOutputDir, err = ioutil.TempDir("", "")
+ runner.HostOutputDir, err = runner.MkTempDir("", "")
if err != nil {
return fmt.Errorf("While creating mount temp dir: %v", err)
}
cr := &ContainerRunner{ArvClient: api, Kc: kc, Docker: docker}
cr.NewLogWriter = cr.NewArvLogWriter
cr.RunArvMount = cr.ArvMountCmd
+ cr.MkTempDir = ioutil.TempDir
cr.LogCollection = &CollectionWriter{kc, nil, sync.Mutex{}}
cr.ContainerRecord.UUID = containerUUID
cr.CrunchLog = NewThrottledLogger(cr.NewLogWriter("crunch-run"))
. "gopkg.in/check.v1"
"io"
"io/ioutil"
+ "os/exec"
"strings"
"syscall"
"testing"
c.Check(strings.HasSuffix(api.Logs["stdout"].String(), "bilbo\n"), Equals, true)
}
+
+type ArvMountCmdLine struct {
+ Cmd []string
+}
+
+func (am *ArvMountCmdLine) ArvMountTest(c []string) (*exec.Cmd, error) {
+ am.Cmd = c
+ return nil, nil
+}
+
+func (s *TestSuite) TestSetupMounts(c *C) {
+ api := &ArvTestClient{}
+ kc := &KeepTestClient{}
+ cr := NewContainerRunner(api, kc, nil, "zzzzz-zzzzz-zzzzzzzzzzzzzzz")
+ am := &ArvMountCmdLine{}
+ cr.RunArvMount = am.ArvMountTest
+
+ i := 0
+ cr.MkTempDir = func(string, string) (string, error) {
+ i += 1
+ return fmt.Sprintf("/tmp/mktmpdir%v", i), nil
+ }
+
+ cr.ContainerRecord.Mounts = make(map[string]Mount)
+ cr.ContainerRecord.Mounts["/tmp"] = Mount{Kind: "tmp"}
+ cr.OutputPath = "/tmp"
+
+ err := cr.SetupMounts()
+ c.Check(err, IsNil)
+ c.Check(am.Cmd, DeepEquals, []string{"--foreground", "--mount-by-pdh", "by_id", "/tmp/mktmpdir1"})
+ c.Check(cr.Binds, DeepEquals, []string{"/tmp/mktmpdir2:/tmp"})
+}