102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package epinject
|
|
|
|
import (
|
|
"context"
|
|
"crypto/rand"
|
|
"encoding/json"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/go-hclog"
|
|
"github.com/oklog/ulid"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestEPInject(t *testing.T) {
|
|
t.Run("can alter the entrypoint of a docker image", func(t *testing.T) {
|
|
_, err := exec.LookPath("docker")
|
|
if err != nil {
|
|
t.Skip("docker isn't available to test with")
|
|
}
|
|
|
|
// Use the nginx image for this
|
|
|
|
out, err := exec.Command("docker", "pull", "nginx").CombinedOutput()
|
|
require.NoError(t, err, string(out))
|
|
|
|
var inspectOut []struct {
|
|
Config struct {
|
|
Entrypoint []string `json:"entrypoint"`
|
|
} `json:"Config"`
|
|
}
|
|
|
|
out, err = exec.Command("docker", "inspect", "nginx").CombinedOutput()
|
|
require.NoError(t, err, string(out))
|
|
|
|
err = json.Unmarshal(out, &inspectOut)
|
|
require.NoError(t, err)
|
|
|
|
ctx := context.Background()
|
|
|
|
u, err := ulid.New(ulid.Now(), rand.Reader)
|
|
require.NoError(t, err)
|
|
|
|
origEp := inspectOut[0].Config.Entrypoint
|
|
|
|
testImage := strings.ToLower("epinject-test-" + u.String() + ":latest")
|
|
|
|
// Be sure we cleanup our test image
|
|
defer exec.Command("docker", "rmi", "-f", testImage).Run()
|
|
|
|
L := hclog.New(&hclog.LoggerOptions{Level: hclog.Trace})
|
|
|
|
ctx = hclog.WithContext(ctx, L)
|
|
|
|
injectF, err := os.Open("./testdata/cowsay")
|
|
require.NoError(t, err)
|
|
defer injectF.Close()
|
|
injectFI, err := injectF.Stat()
|
|
require.NoError(t, err)
|
|
|
|
_, err = AlterEntrypoint(ctx, "nginx:latest", func(cur []string) (*NewEntrypoint, error) {
|
|
assert.Equal(t, origEp, cur)
|
|
|
|
ep := &NewEntrypoint{
|
|
NewImage: testImage,
|
|
Entrypoint: append([]string{"/bin/cowsay"}, cur...),
|
|
InjectFiles: map[string]InjectFile{
|
|
"/bin/cowsay": {
|
|
Reader: injectF,
|
|
Info: injectFI,
|
|
},
|
|
},
|
|
}
|
|
|
|
return ep, nil
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
out, err = exec.Command("docker", "inspect", testImage).Output()
|
|
require.NoError(t, err)
|
|
|
|
inspectOut = nil
|
|
|
|
err = json.Unmarshal(out, &inspectOut)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "/bin/cowsay", inspectOut[0].Config.Entrypoint[0])
|
|
assert.Equal(t, origEp, inspectOut[0].Config.Entrypoint[1:])
|
|
|
|
// Check for cowsay
|
|
|
|
out, err = exec.Command("docker", "run", "--rm", testImage, "/bin/cowsay").Output()
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, "moooooo\n", string(out))
|
|
|
|
})
|
|
}
|