github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/integration/dc_fixture_test.go (about) 1 //go:build integration 2 // +build integration 3 4 package integration 5 6 import ( 7 "bytes" 8 "context" 9 "fmt" 10 "io" 11 "io/ioutil" 12 "os/exec" 13 "strings" 14 "testing" 15 ) 16 17 type dcFixture struct { 18 *fixture 19 } 20 21 func newDCFixture(t *testing.T, dir string) *dcFixture { 22 ret := &dcFixture{} 23 t.Cleanup(ret.TearDown) 24 ret.fixture = newFixture(t, dir) 25 return ret 26 } 27 28 func (f *dcFixture) TearDown() { 29 // Double check it's all dead 30 f.dockerKillAll("tilt") 31 _ = exec.CommandContext(f.ctx, "pkill", "docker-compose").Run() 32 } 33 34 func (f *dcFixture) dockerCmd(args []string, outWriter io.Writer) *exec.Cmd { 35 outWriter = io.MultiWriter(f.logs, outWriter) 36 cmd := exec.CommandContext(f.ctx, "docker", args...) 37 cmd.Stdout = outWriter 38 cmd.Stderr = outWriter 39 return cmd 40 } 41 42 func (f *dcFixture) dockerCmdOutput(args []string) (string, error) { 43 out := &bytes.Buffer{} 44 cmd := f.dockerCmd(args, out) 45 err := cmd.Run() 46 return out.String(), err 47 } 48 49 func (f *dcFixture) dockerContainerID(name string) (string, error) { 50 out := &bytes.Buffer{} 51 cmd := f.dockerCmd([]string{ 52 "ps", "-q", "-f", fmt.Sprintf("name=%s", name), 53 }, out) 54 err := cmd.Run() 55 if err != nil { 56 return "", err 57 } 58 containerID := strings.TrimSpace(out.String()) 59 if containerID == "" { 60 return "", fmt.Errorf("No container found for %s", name) 61 } 62 return containerID, nil 63 } 64 65 func (f *dcFixture) dockerKillAll(name string) { 66 out := &bytes.Buffer{} 67 cmd := f.dockerCmd([]string{ 68 "ps", "-q", "-f", fmt.Sprintf("name=%s", name), 69 }, out) 70 err := cmd.Run() 71 if err != nil { 72 f.t.Fatal(err) 73 } 74 cIDs := strings.Split(strings.TrimSpace(out.String()), " ") 75 if len(cIDs) == 0 || (len(cIDs) == 1 && cIDs[0] == "") { 76 return 77 } 78 79 // Kill the containers and their networks. It's ok if the containers 80 // don't exist anymore. 81 cmd = f.dockerCmd(append([]string{ 82 "kill", 83 }, cIDs...), ioutil.Discard) 84 _ = cmd.Run() 85 86 cmd = f.dockerCmd([]string{"network", "prune", "-f"}, ioutil.Discard) 87 _ = cmd.Run() 88 } 89 90 func (f *dcFixture) CurlUntil(ctx context.Context, service string, url string, expectedContents string) { 91 f.WaitUntil(ctx, fmt.Sprintf("curl(%s)", url), func() (string, error) { 92 out := &bytes.Buffer{} 93 cID, err := f.dockerContainerID(service) 94 if err != nil { 95 return "", err 96 } 97 98 cmd := f.dockerCmd([]string{ 99 "exec", cID, "curl", "-s", url, 100 }, out) 101 err = cmd.Run() 102 return out.String(), err 103 }, expectedContents) 104 }