dotcloud/docker

View on GitHub
integration/internal/build/build.go

Summary

Maintainability
A
0 mins
Test Coverage
package build

import (
    "context"
    "encoding/json"
    "io"
    "testing"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/api/types/image"
    "github.com/docker/docker/client"
    "github.com/docker/docker/pkg/jsonmessage"
    "github.com/docker/docker/testutil/fakecontext"
    "gotest.tools/v3/assert"
)

// Do builds an image from the given context and returns the image ID.
func Do(ctx context.Context, t *testing.T, client client.APIClient, buildCtx *fakecontext.Fake) string {
    resp, err := client.ImageBuild(ctx, buildCtx.AsTarReader(t), types.ImageBuildOptions{})
    if resp.Body != nil {
        defer resp.Body.Close()
    }
    assert.NilError(t, err)
    img := GetImageIDFromBody(t, resp.Body)
    t.Cleanup(func() {
        client.ImageRemove(ctx, img, image.RemoveOptions{Force: true})
    })
    return img
}

// GetImageIDFromBody reads the image ID from the build response body.
func GetImageIDFromBody(t *testing.T, body io.Reader) string {
    var (
        jm  jsonmessage.JSONMessage
        br  types.BuildResult
        dec = json.NewDecoder(body)
    )
    for {
        err := dec.Decode(&jm)
        if err == io.EOF {
            break
        }
        assert.NilError(t, err)
        if jm.Aux == nil {
            continue
        }
        assert.NilError(t, json.Unmarshal(*jm.Aux, &br))
        assert.Assert(t, br.ID != "", "could not read image ID from build output")
        break
    }
    io.Copy(io.Discard, body)
    return br.ID
}