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  }