Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/packaging/environment_test.go
4093 views
1
//go:build !nonetwork && !nodocker && !race && packaging
2
// +build !nonetwork,!nodocker,!race,packaging
3
4
package packaging_test
5
6
import (
7
"archive/tar"
8
"bytes"
9
"fmt"
10
"io"
11
"os"
12
"path/filepath"
13
"runtime"
14
"testing"
15
16
"github.com/ory/dockertest/v3"
17
"github.com/ory/dockertest/v3/docker"
18
"github.com/stretchr/testify/require"
19
)
20
21
type Environment struct {
22
Install func() ExecResult
23
Uninstall func() ExecResult
24
ExecScript func(string) ExecResult
25
}
26
27
type ExecResult struct {
28
Stdout, Stderr string
29
ExitCode int
30
}
31
32
// RPMEnvironment creates an Environment to install an RPM against.
33
func RPMEnvironment(t *testing.T, packageName string, pool *dockertest.Pool) Environment {
34
t.Helper()
35
36
container := environmentContainer(
37
t,
38
pool,
39
"testdata/centos-systemd.Dockerfile",
40
packageName+"-test-centos-systemd",
41
fmt.Sprintf("../dist/%s-0.0.0-1.%s.rpm", packageName, runtime.GOARCH),
42
)
43
44
return Environment{
45
Install: func() ExecResult {
46
filename := fmt.Sprintf("/tmp/%s-0.0.0-1.%s.rpm", packageName, runtime.GOARCH)
47
return containerExec(t, container, "rpm", "-i", filename)
48
},
49
Uninstall: func() ExecResult {
50
return containerExec(t, container, "rpm", "-e", packageName)
51
},
52
ExecScript: func(script string) ExecResult {
53
return containerExec(t, container, "/bin/bash", "-c", script)
54
},
55
}
56
}
57
58
// DEBEnvironment creates an Environment to install a DEB against.
59
func DEBEnvironment(t *testing.T, packageName string, pool *dockertest.Pool) Environment {
60
t.Helper()
61
62
container := environmentContainer(
63
t,
64
pool,
65
"testdata/debian-systemd.Dockerfile",
66
packageName+"-test-debian-systemd",
67
fmt.Sprintf("../dist/%s-0.0.0-1.%s.deb", packageName, runtime.GOARCH),
68
)
69
70
return Environment{
71
Install: func() ExecResult {
72
filename := fmt.Sprintf("/tmp/%s-0.0.0-1.%s.deb", packageName, runtime.GOARCH)
73
return containerExec(t, container, "dpkg", "--force-confold", "-i", filename)
74
},
75
Uninstall: func() ExecResult {
76
return containerExec(t, container, "dpkg", "-r", packageName)
77
},
78
ExecScript: func(script string) ExecResult {
79
return containerExec(t, container, "/bin/bash", "-c", script)
80
},
81
}
82
}
83
84
func environmentContainer(t *testing.T, pool *dockertest.Pool, dockerfile string, name string, packagePath string) *dockertest.Resource {
85
t.Helper()
86
87
container, err := pool.BuildAndRunWithOptions(
88
dockerfile,
89
&dockertest.RunOptions{
90
Name: name,
91
Entrypoint: []string{"/bin/bash"},
92
Tty: true,
93
Mounts: []string{"/sys/fs/cgroup:/sys/fs/cgroup:ro"},
94
PortBindings: map[docker.Port][]docker.PortBinding{
95
"9009/tcp": {{HostIP: "0.0.0.0", HostPort: "0"}},
96
},
97
},
98
func(hc *docker.HostConfig) {
99
hc.Tmpfs = map[string]string{
100
"/run": "rw",
101
"/run/lock": "rw",
102
}
103
},
104
)
105
require.NoError(t, err)
106
t.Cleanup(func() {
107
_ = container.Close()
108
})
109
110
packageFile, err := buildTar(packagePath)
111
require.NoError(t, err)
112
err = pool.Client.UploadToContainer(container.Container.ID, docker.UploadToContainerOptions{
113
InputStream: packageFile,
114
Path: "/tmp",
115
})
116
require.NoError(t, err)
117
118
return container
119
}
120
121
func buildTar(path string) (io.Reader, error) {
122
f, err := os.Open(path)
123
if err != nil {
124
return nil, err
125
}
126
defer f.Close()
127
128
fi, err := f.Stat()
129
if err != nil {
130
return nil, err
131
}
132
133
var buf bytes.Buffer
134
w := tar.NewWriter(&buf)
135
defer w.Close()
136
137
err = w.WriteHeader(&tar.Header{
138
Typeflag: tar.TypeReg,
139
Name: filepath.Base(path),
140
Size: fi.Size(),
141
ModTime: fi.ModTime(),
142
Mode: 0600,
143
})
144
if err != nil {
145
return nil, err
146
}
147
148
_, err = io.Copy(w, f)
149
if err != nil {
150
return nil, err
151
}
152
return &buf, err
153
}
154
155
func containerExec(t *testing.T, res *dockertest.Resource, cmd ...string) ExecResult {
156
t.Helper()
157
158
var stdout, stderr bytes.Buffer
159
160
exitCode, err := res.Exec(cmd, dockertest.ExecOptions{
161
StdOut: &stdout,
162
StdErr: &stderr,
163
})
164
require.NoError(t, err)
165
166
return ExecResult{
167
Stdout: stdout.String(),
168
Stderr: stderr.String(),
169
ExitCode: exitCode,
170
}
171
}
172
173