Skip to content

Commit 956c44a

Browse files
authored
Merge pull request #637 from austinvazquez/integ-test-ref
refactor: integ test common code into internal package
2 parents 8892911 + 82d8478 commit 956c44a

File tree

11 files changed

+234
-153
lines changed

11 files changed

+234
-153
lines changed

internal/integtest/containerd.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"). You may
4+
// not use this file except in compliance with the License. A copy of the
5+
// License is located at
6+
//
7+
// http://aws.amazon.com/apache2.0/
8+
//
9+
// or in the "license" file accompanying this file. This file is distributed
10+
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11+
// express or implied. See the License for the specific language governing
12+
// permissions and limitations under the License.
13+
14+
package integtest
15+
16+
import (
17+
"bytes"
18+
"context"
19+
20+
"github.com/containerd/containerd"
21+
"github.com/containerd/containerd/cio"
22+
)
23+
24+
// CommandResult encapsulates the stdout, stderr, and exit code returned
25+
// from a task.
26+
type CommandResult struct {
27+
Stdout string
28+
Stderr string
29+
ExitCode uint32
30+
}
31+
32+
// RunTask is a utility function for running a task and returning the result.
33+
func RunTask(ctx context.Context, c containerd.Container) (*CommandResult, error) {
34+
var stdout bytes.Buffer
35+
var stderr bytes.Buffer
36+
37+
task, err := c.NewTask(ctx, cio.NewCreator(cio.WithStreams(nil, &stdout, &stderr)))
38+
if err != nil {
39+
return nil, err
40+
}
41+
42+
exitCh, err := task.Wait(ctx)
43+
if err != nil {
44+
return nil, err
45+
}
46+
47+
err = task.Start(ctx)
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
select {
53+
case exitStatus := <-exitCh:
54+
if err := exitStatus.Error(); err != nil {
55+
return nil, err
56+
}
57+
58+
_, err := task.Delete(ctx)
59+
if err != nil {
60+
return nil, err
61+
}
62+
63+
return &CommandResult{
64+
Stdout: stdout.String(),
65+
Stderr: stderr.String(),
66+
ExitCode: exitStatus.ExitCode(),
67+
}, nil
68+
case <-ctx.Done():
69+
return nil, ctx.Err()
70+
}
71+
}

internal/integtest/firecracker.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"). You may
4+
// not use this file except in compliance with the License. A copy of the
5+
// License is located at
6+
//
7+
// http://aws.amazon.com/apache2.0/
8+
//
9+
// or in the "license" file accompanying this file. This file is distributed
10+
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11+
// express or implied. See the License for the specific language governing
12+
// permissions and limitations under the License.
13+
14+
package integtest
15+
16+
import "github.com/firecracker-microvm/firecracker-containerd/firecracker-control/client"
17+
18+
// NewFCControlClient returns a Firecracker control client for the given socket.
19+
func NewFCControlClient(socket string) (*client.Client, error) {
20+
return client.New(socket + ".ttrpc")
21+
}

internal/integtest/network.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"). You may
4+
// not use this file except in compliance with the License. A copy of the
5+
// License is located at
6+
//
7+
// http://aws.amazon.com/apache2.0/
8+
//
9+
// or in the "license" file accompanying this file. This file is distributed
10+
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11+
// express or implied. See the License for the specific language governing
12+
// permissions and limitations under the License.
13+
14+
package integtest
15+
16+
import (
17+
"github.com/firecracker-microvm/firecracker-containerd/config"
18+
"github.com/firecracker-microvm/firecracker-containerd/proto"
19+
)
20+
21+
// WithDefaultNetwork is an option to use the default network configuration
22+
// in the runtime configuration for integration testing
23+
func WithDefaultNetwork() func(c *config.Config) {
24+
return func(c *config.Config) {
25+
c.DefaultNetworkInterfaces = []proto.FirecrackerNetworkInterface{
26+
{
27+
CNIConfig: &proto.CNIConfiguration{
28+
NetworkName: "fcnet",
29+
InterfaceName: "veth0",
30+
},
31+
},
32+
}
33+
}
34+
}

internal/integtest/runtime.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"). You may
4+
// not use this file except in compliance with the License. A copy of the
5+
// License is located at
6+
//
7+
// http://aws.amazon.com/apache2.0/
8+
//
9+
// or in the "license" file accompanying this file. This file is distributed
10+
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
11+
// express or implied. See the License for the specific language governing
12+
// permissions and limitations under the License.
13+
14+
package integtest
15+
16+
import (
17+
"os"
18+
)
19+
20+
const (
21+
// FirecrackerRuntime is the Firecracker-containerd runtime
22+
FirecrackerRuntime = "aws.firecracker"
23+
24+
containerdSockPathEnvVar = "CONTAINERD_SOCKET"
25+
)
26+
27+
var (
28+
// ContainerdSockPath is the default Firecracker-containerd socket path
29+
ContainerdSockPath = "/run/firecracker-containerd/containerd.sock"
30+
)
31+
32+
func init() {
33+
if v := os.Getenv(containerdSockPathEnvVar); v != "" {
34+
ContainerdSockPath = v
35+
}
36+
}

runtime/benchmark_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ func createAndStopVM(
5757
}
5858

5959
func benchmarkCreateAndStopVM(t *testing.T, vcpuCount uint32, kernelArgs string) {
60-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
61-
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
60+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
61+
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
6262
defer client.Close()
6363

6464
ctx := namespaces.WithNamespace(context.Background(), "default")
6565

66-
fcClient, err := newFCControlClient(containerdSockPath)
66+
fcClient, err := integtest.NewFCControlClient(integtest.ContainerdSockPath)
6767
require.NoError(t, err, "failed to create fccontrol client")
6868

6969
request := proto.CreateVMRequest{

runtime/cni_integ_test.go

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
"github.com/stretchr/testify/assert"
3333
"github.com/stretchr/testify/require"
3434

35-
"github.com/firecracker-microvm/firecracker-containerd/config"
3635
"github.com/firecracker-microvm/firecracker-containerd/internal"
3736
"github.com/firecracker-microvm/firecracker-containerd/internal/integtest"
3837
"github.com/firecracker-microvm/firecracker-containerd/proto"
@@ -45,11 +44,11 @@ func TestCNISupport_Isolated(t *testing.T) {
4544
ctx, cancel := context.WithTimeout(namespaces.WithNamespace(context.Background(), defaultNamespace), testTimeout)
4645
defer cancel()
4746

48-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
49-
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
47+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
48+
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
5049
defer client.Close()
5150

52-
fcClient, err := newFCControlClient(containerdSockPath)
51+
fcClient, err := integtest.NewFCControlClient(integtest.ContainerdSockPath)
5352
require.NoError(t, err, "failed to create fccontrol client")
5453

5554
image, err := alpineImage(ctx, client, defaultSnapshotterName)
@@ -148,14 +147,14 @@ func TestCNISupport_Isolated(t *testing.T) {
148147
}
149148

150149
func TestAutomaticCNISupport_Isolated(t *testing.T) {
151-
integtest.Prepare(t, withDefaultNetwork())
150+
integtest.Prepare(t, integtest.WithDefaultNetwork())
152151

153152
testTimeout := 120 * time.Second
154153
ctx, cancel := context.WithTimeout(namespaces.WithNamespace(context.Background(), defaultNamespace), testTimeout)
155154
defer cancel()
156155

157-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
158-
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
156+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
157+
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
159158
defer client.Close()
160159

161160
image, err := alpineImage(ctx, client, defaultSnapshotterName)
@@ -226,11 +225,11 @@ func TestCNIPlugin_Performance(t *testing.T) {
226225
ctx, cancel := context.WithTimeout(namespaces.WithNamespace(context.Background(), defaultNamespace), testTimeout)
227226
defer cancel()
228227

229-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
230-
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
228+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
229+
require.NoError(t, err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
231230
defer client.Close()
232231

233-
fcClient, err := newFCControlClient(containerdSockPath)
232+
fcClient, err := integtest.NewFCControlClient(integtest.ContainerdSockPath)
234233
require.NoError(t, err, "failed to create ttrpc client")
235234

236235
image, err := iperf3Image(ctx, client, defaultSnapshotterName)
@@ -362,19 +361,6 @@ func writeCNIConf(path, chainedPluginName, networkName, nameserver string) error
362361
}`, networkName, nameserver, chainedPluginName)), 0644)
363362
}
364363

365-
func withDefaultNetwork() func(c *config.Config) {
366-
return func(c *config.Config) {
367-
c.DefaultNetworkInterfaces = []proto.FirecrackerNetworkInterface{
368-
{
369-
CNIConfig: &proto.CNIConfiguration{
370-
NetworkName: "fcnet",
371-
InterfaceName: "veth0",
372-
},
373-
},
374-
}
375-
}
376-
}
377-
378364
func runCommand(ctx context.Context, t *testing.T, name string, args ...string) {
379365
t.Helper()
380366
output, err := exec.CommandContext(ctx, name, args...).CombinedOutput()

runtime/integ_test.go

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,8 @@
1313
package main
1414

1515
import (
16-
"bytes"
17-
"context"
1816
"strings"
1917

20-
"github.com/containerd/containerd"
21-
"github.com/containerd/containerd/cio"
22-
"github.com/pkg/errors"
23-
24-
"github.com/firecracker-microvm/firecracker-containerd/firecracker-control/client"
2518
"github.com/firecracker-microvm/firecracker-containerd/internal"
2619
"github.com/firecracker-microvm/firecracker-containerd/internal/integtest"
2720
)
@@ -45,53 +38,3 @@ var testNameToVMIDReplacer = strings.NewReplacer("/", "-", "_", "-")
4538
func testNameToVMID(s string) string {
4639
return testNameToVMIDReplacer.Replace(s)
4740
}
48-
49-
type commandResult struct {
50-
stdout string
51-
stderr string
52-
exitCode uint32
53-
}
54-
55-
func runTask(ctx context.Context, c containerd.Container) (*commandResult, error) {
56-
var stdout bytes.Buffer
57-
var stderr bytes.Buffer
58-
59-
task, err := c.NewTask(ctx, cio.NewCreator(cio.WithStreams(nil, &stdout, &stderr)))
60-
if err != nil {
61-
return nil, err
62-
}
63-
64-
exitCh, err := task.Wait(ctx)
65-
if err != nil {
66-
return nil, err
67-
}
68-
69-
err = task.Start(ctx)
70-
if err != nil {
71-
return nil, err
72-
}
73-
74-
select {
75-
case exitStatus := <-exitCh:
76-
if err := exitStatus.Error(); err != nil {
77-
return nil, err
78-
}
79-
80-
_, err := task.Delete(ctx)
81-
if err != nil {
82-
return nil, err
83-
}
84-
85-
return &commandResult{
86-
stdout: stdout.String(),
87-
stderr: stderr.String(),
88-
exitCode: exitStatus.ExitCode(),
89-
}, nil
90-
case <-ctx.Done():
91-
return nil, errors.New("context cancelled")
92-
}
93-
}
94-
95-
func newFCControlClient(socket string) (*client.Client, error) {
96-
return client.New(socket + ".ttrpc")
97-
}

runtime/jailer_integ_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ func fsSafeTestName(tb testing.TB) string {
9494
func testJailer(t *testing.T, jailerConfig *proto.JailerConfig) {
9595
require := require.New(t)
9696

97-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
98-
require.NoError(err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
97+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
98+
require.NoError(err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
9999
defer client.Close()
100100

101101
ctx := namespaces.WithNamespace(context.Background(), "default")
@@ -140,7 +140,7 @@ func testJailer(t *testing.T, jailerConfig *proto.JailerConfig) {
140140
require.NoError(err, "failed to chown %q", additionalDrive)
141141
}
142142

143-
fcClient, err := newFCControlClient(containerdSockPath)
143+
fcClient, err := integtest.NewFCControlClient(integtest.ContainerdSockPath)
144144
require.NoError(err)
145145

146146
_, err = fcClient.CreateVM(ctx, &request)
@@ -202,16 +202,16 @@ func TestJailerCPUSet_Isolated(t *testing.T) {
202202

203203
func testAttachBlockDevice(t *testing.T, jailerConfig *proto.JailerConfig) {
204204
require := require.New(t)
205-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
206-
require.NoError(err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
205+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
206+
require.NoError(err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
207207
defer client.Close()
208208

209209
ctx := namespaces.WithNamespace(context.Background(), "default")
210210

211211
image, err := alpineImage(ctx, client, defaultSnapshotterName)
212212
require.NoError(err, "failed to get alpine image")
213213

214-
fcClient, err := newFCControlClient(containerdSockPath)
214+
fcClient, err := integtest.NewFCControlClient(integtest.ContainerdSockPath)
215215
require.NoError(err)
216216

217217
vmID := testNameToVMID(t.Name())

runtime/limits_integ_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ func TestDiskLimit_Isolated(t *testing.T) {
3232

3333
ctx := namespaces.WithNamespace(context.Background(), "default")
3434

35-
client, err := containerd.New(containerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
36-
require.NoError(err, "unable to create client to containerd service at %s, is containerd running?", containerdSockPath)
35+
client, err := containerd.New(integtest.ContainerdSockPath, containerd.WithDefaultRuntime(firecrackerRuntime))
36+
require.NoError(err, "unable to create client to containerd service at %s, is containerd running?", integtest.ContainerdSockPath)
3737
defer client.Close()
3838

3939
image, err := alpineImage(ctx, client, defaultSnapshotterName)
@@ -57,11 +57,11 @@ func TestDiskLimit_Isolated(t *testing.T) {
5757
require.NoError(err, "failed to delete a container")
5858
}()
5959

60-
result, err := runTask(ctx, container)
60+
result, err := integtest.RunTask(ctx, container)
6161
require.NoError(err, "failed to create a container")
6262

63-
assert.Equal(uint32(1), result.exitCode, "writing 2GB must fail")
63+
assert.Equal(uint32(1), result.ExitCode, "writing 2GB must fail")
6464
assert.Equal(`952+0 records in
6565
951+0 records out
66-
`, result.stderr, "but it must be able to write ~1024MB")
66+
`, result.Stderr, "but it must be able to write ~1024MB")
6767
}

0 commit comments

Comments
 (0)