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  }