github.com/grahambrereton-form3/tilt@v0.10.18/integration/dc_fixture_test.go (about) 1 //+build integration 2 3 package integration 4 5 import ( 6 "bytes" 7 "context" 8 "fmt" 9 "io" 10 "io/ioutil" 11 "os/exec" 12 "strings" 13 "testing" 14 ) 15 16 type dcFixture struct { 17 *fixture 18 } 19 20 func newDCFixture(t *testing.T, dir string) *dcFixture { 21 f := newFixture(t, dir) 22 return &dcFixture{fixture: f} 23 } 24 25 func (f *dcFixture) TearDown() { 26 f.StartTearDown() 27 f.fixture.TearDown() 28 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) dockerCreatedAt(name string) string { 66 out := &bytes.Buffer{} 67 cmd := f.dockerCmd([]string{ 68 "ps", "-q", "-f", fmt.Sprintf("name=%s", name), "--format", "{{.CreatedAt}}", 69 }, out) 70 err := cmd.Run() 71 if err != nil { 72 f.t.Fatal(fmt.Errorf("dockerCreatedAt failed: %v", err)) 73 } 74 containerID := strings.TrimSpace(out.String()) 75 if containerID == "" { 76 f.t.Fatal(fmt.Errorf("No container found for %s", name)) 77 } 78 return containerID 79 } 80 81 func (f *dcFixture) dockerKillAll(name string) { 82 out := &bytes.Buffer{} 83 cmd := f.dockerCmd([]string{ 84 "ps", "-q", "-f", fmt.Sprintf("name=%s", name), 85 }, out) 86 err := cmd.Run() 87 if err != nil { 88 f.t.Fatal(err) 89 } 90 cIDs := strings.Split(strings.TrimSpace(out.String()), " ") 91 if len(cIDs) == 0 || (len(cIDs) == 1 && cIDs[0] == "") { 92 return 93 } 94 95 // Kill the containers and their networks. It's ok if the containers 96 // don't exist anymore. 97 cmd = f.dockerCmd(append([]string{ 98 "kill", 99 }, cIDs...), ioutil.Discard) 100 _ = cmd.Run() 101 102 cmd = f.dockerCmd([]string{"network", "prune", "-f"}, ioutil.Discard) 103 _ = cmd.Run() 104 } 105 106 func (f *dcFixture) CurlUntil(ctx context.Context, service string, url string, expectedContents string) { 107 f.WaitUntil(ctx, fmt.Sprintf("curl(%s)", url), func() (string, error) { 108 out := &bytes.Buffer{} 109 cID, err := f.dockerContainerID(service) 110 if err != nil { 111 return "", err 112 } 113 114 cmd := f.dockerCmd([]string{ 115 "exec", cID, "curl", "-s", url, 116 }, out) 117 err = cmd.Run() 118 return out.String(), err 119 }, expectedContents) 120 }