From c41d7a40383b799afd155dc7764116b6a66cdfbf Mon Sep 17 00:00:00 2001 From: z4yx Date: Sat, 14 Mar 2020 11:23:19 +0800 Subject: [PATCH] Bring docker test back commit 4540ba24c72cb2d24e2e04870025dfa233dedf30 Author: z4yx Date: Sat Mar 14 11:16:13 2020 +0800 wait longer commit c8f07b81a7fe5fdef9224e8bc187500c4d67f049 Author: z4yx Date: Sat Mar 14 10:55:49 2020 +0800 try to Terminate commit 10d2d4b9d0756cf8f60fe27e1e41ae29b5ea6cbe Author: z4yx Date: Sat Mar 14 10:50:26 2020 +0800 forward the error commit 38c96ee44d31088b9e6de67ebb745358fac8d49a Author: z4yx Date: Sat Mar 14 10:31:39 2020 +0800 now enable the assertion commit 3b3c46a065a035d906d4cc5022d42e30b1f52a08 Author: z4yx Date: Sat Mar 14 10:26:40 2020 +0800 rm un-related info commit dd7ef7e3d0a0765c1fc48296d70966b3b4d581dd Author: z4yx Date: Sat Mar 14 10:12:01 2020 +0800 print err of provider.Run commit 49a7b57dbf52d410c0dfe796be9c2f6213884931 Author: z4yx Date: Sat Mar 14 09:55:48 2020 +0800 wait until it exits commit a3e8f699072e3252b3300c667f1425a966aedb39 Author: z4yx Date: Sat Mar 14 09:54:19 2020 +0800 targeting alpine:3.8 commit f30b8565049bb373a1a91a34ad07c8c3df8e1036 Author: z4yx Date: Sat Mar 14 09:47:27 2020 +0800 see what happens commit 8c21229a8be8e2ac0737bbc4bb88ba54e9fb7a20 Author: z4yx Date: Sat Mar 14 09:30:50 2020 +0800 remove one assertion commit 123368e6ef07aa63c489bb49bdf370d3abdd17bb Author: z4yx Date: Fri Mar 13 23:32:45 2020 +0800 docker test somehow works now commit 94fa294a9bbedb569e6dd9cc7e4f27e73ed97443 Author: z4yx Date: Fri Mar 13 23:27:12 2020 +0800 should use -d commit b35bae2a9cb5e006c513da95377ab9487fc4341a Author: z4yx Date: Fri Mar 13 23:22:25 2020 +0800 docker run not working?? commit 9aea0036f434d333087f0cff3ce5165a53554e5f Author: z4yx Date: Fri Mar 13 23:12:39 2020 +0800 test if docker works commit f92578b159587a8bbda296bbf9261fb4c5e2f186 Author: z4yx Date: Fri Mar 13 17:42:00 2020 +0800 debugging docker_test commit b649e32f76549711af597ce3a642309a41a08bf9 Author: z4yx Date: Fri Mar 13 17:27:55 2020 +0800 Revert "remove docker_test.go" This reverts commit a517a4bb6407e873f9b3893bdddebcd369679a03. --- .github/workflows/tunasync.yml | 7 +- worker/docker_test.go | 127 +++++++++++++++++++++++++++++++++ worker/runner.go | 2 +- 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 worker/docker_test.go diff --git a/.github/workflows/tunasync.yml b/.github/workflows/tunasync.yml index 39f6079..aaa3487 100644 --- a/.github/workflows/tunasync.yml +++ b/.github/workflows/tunasync.yml @@ -36,10 +36,9 @@ jobs: - name: Setup test dependencies run: | - sudo apt update - sudo apt install -y cgroup-bin - /usr/bin/docker pull alpine - /usr/bin/docker images + sudo apt-get update + sudo apt-get install -y cgroup-bin + docker pull alpine:3.8 lssubsys -am sudo cgcreate -a $USER -t $USER -g cpu:tunasync sudo cgcreate -a $USER -t $USER -g memory:tunasync diff --git a/worker/docker_test.go b/worker/docker_test.go new file mode 100644 index 0000000..e556967 --- /dev/null +++ b/worker/docker_test.go @@ -0,0 +1,127 @@ +package worker + +import ( + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "github.com/codeskyblue/go-sh" + . "github.com/smartystreets/goconvey/convey" +) + +func cmdRun(p string, args []string) { + cmd := exec.Command(p, args...) + + out, err := cmd.CombinedOutput() + if err != nil { + logger.Debugf("cmdRun failed %s", err) + return + } + logger.Debugf("cmdRun: ", string(out)) +} + +func getDockerByName(name string) (string, error) { + // docker ps -f 'name=$name' --format '{{.Names}}' + out, err := sh.Command( + "docker", "ps", "-a", + "--filter", "name="+name, + "--format", "{{.Names}}", + ).Output() + if err == nil { + logger.Debugf("docker ps: '%s'", string(out)) + } + return string(out), err +} + +func TestDocker(t *testing.T) { + Convey("Docker Should Work", t, func(ctx C) { + tmpDir, err := ioutil.TempDir("", "tunasync") + defer os.RemoveAll(tmpDir) + So(err, ShouldBeNil) + cmdScript := filepath.Join(tmpDir, "cmd.sh") + tmpFile := filepath.Join(tmpDir, "log_file") + expectedOutput := "HELLO_WORLD" + + c := cmdConfig{ + name: "tuna-docker", + upstreamURL: "http://mirrors.tuna.moe/", + command: "/bin/cmd.sh", + workingDir: tmpDir, + logDir: tmpDir, + logFile: tmpFile, + interval: 600 * time.Second, + env: map[string]string{ + "TEST_CONTENT": expectedOutput, + }, + } + + cmdScriptContent := `#!/bin/sh +echo ${TEST_CONTENT} +sleep 20 +` + err = ioutil.WriteFile(cmdScript, []byte(cmdScriptContent), 0755) + So(err, ShouldBeNil) + + provider, err := newCmdProvider(c) + So(err, ShouldBeNil) + + d := &dockerHook{ + emptyHook: emptyHook{ + provider: provider, + }, + image: "alpine:3.8", + volumes: []string{ + fmt.Sprintf("%s:%s", cmdScript, "/bin/cmd.sh"), + }, + } + provider.AddHook(d) + So(provider.Docker(), ShouldNotBeNil) + + err = d.preExec() + So(err, ShouldBeNil) + + cmdRun("docker", []string{"images"}) + exitedErr := make(chan error, 1) + go func() { + err = provider.Run() + logger.Debugf("provider.Run() exited") + if err != nil { + logger.Errorf("provider.Run() failed: %v", err) + } + exitedErr <- err + }() + cmdRun("ps", []string{"aux"}) + + // Wait for docker running + time.Sleep(8 * time.Second) + + cmdRun("ps", []string{"aux"}) + + // assert container running + names, err := getDockerByName(d.Name()) + So(err, ShouldBeNil) + // So(names, ShouldEqual, d.Name()+"\n") + + err = provider.Terminate() + // So(err, ShouldBeNil) + + cmdRun("ps", []string{"aux"}) + <-exitedErr + + // container should be terminated and removed + names, err = getDockerByName(d.Name()) + So(err, ShouldBeNil) + So(names, ShouldEqual, "") + + // check log content + loggedContent, err := ioutil.ReadFile(provider.LogFile()) + So(err, ShouldBeNil) + So(string(loggedContent), ShouldEqual, expectedOutput+"\n") + + d.postExec() + }) +} diff --git a/worker/runner.go b/worker/runner.go index e47417e..144f7e1 100644 --- a/worker/runner.go +++ b/worker/runner.go @@ -104,7 +104,7 @@ func newCmdJob(provider mirrorProvider, cmdAndArgs []string, workingDir string, } func (c *cmdJob) Start() error { - // logger.Debugf("Command start: %v", c.cmd.Args) + logger.Debugf("Command start: %v", c.cmd.Args) c.finished = make(chan empty, 1) return c.cmd.Start() }