Skip to content

Commit abe56f0

Browse files
authored
Update default kernel for in-VM Docker networking (#177)
* Update default kernel to 1.6-202603301 * Add Docker-in-VM integration coverage * Remove old 1.6 kernel entry
1 parent ddd8e85 commit abe56f0

2 files changed

Lines changed: 166 additions & 1 deletion

File tree

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
//go:build linux
2+
3+
package instances
4+
5+
import (
6+
"context"
7+
"os"
8+
"strings"
9+
"testing"
10+
"time"
11+
12+
"github.com/kernel/hypeman/lib/hypervisor"
13+
"github.com/kernel/hypeman/lib/volumes"
14+
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
16+
)
17+
18+
const dockerInVMManualEnv = "HYPEMAN_RUN_DOCKER_IN_VM_TESTS"
19+
20+
func requireDockerInVMManualRun(t *testing.T) {
21+
t.Helper()
22+
if os.Getenv(dockerInVMManualEnv) != "1" {
23+
t.Skipf("set %s=1 to run docker-in-vm integration tests", dockerInVMManualEnv)
24+
}
25+
}
26+
27+
func TestDockerInVMCloudHypervisorWithAttachedVolume(t *testing.T) {
28+
requireDockerInVMManualRun(t)
29+
requireKVMAccess(t)
30+
31+
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Minute)
32+
defer cancel()
33+
34+
manager, _ := setupCompressionTestManagerForHypervisor(t, hypervisor.TypeCloudHypervisor)
35+
imageName := integrationTestImageRef(t, "docker.io/library/debian:12-slim")
36+
37+
createImageAndWait(t, ctx, manager.imageManager, imageName)
38+
require.NoError(t, manager.systemManager.EnsureSystemFiles(ctx))
39+
40+
volumeManager := volumes.NewManager(manager.paths, 0, nil)
41+
vol, err := volumeManager.CreateVolume(ctx, volumes.CreateVolumeRequest{
42+
Name: "docker-data",
43+
SizeGb: 8,
44+
})
45+
require.NoError(t, err)
46+
47+
var inst *Instance
48+
t.Cleanup(func() {
49+
if inst != nil {
50+
logInstanceArtifactsOnFailure(t, manager, inst.Id)
51+
if t.Failed() {
52+
if output, code, err := execCommand(context.Background(), inst, "sh", "-lc", "cat /tmp/dockerd.log || true"); err == nil {
53+
t.Logf("dockerd log (exit=%d):\n%s", code, output)
54+
}
55+
}
56+
_ = manager.DeleteInstance(context.Background(), inst.Id)
57+
}
58+
_ = volumeManager.DeleteVolume(context.Background(), vol.Id)
59+
})
60+
61+
inst, err = manager.CreateInstance(ctx, CreateInstanceRequest{
62+
Name: "docker-in-vm",
63+
Image: imageName,
64+
Size: 4 * 1024 * 1024 * 1024,
65+
HotplugSize: 512 * 1024 * 1024,
66+
OverlaySize: 5 * 1024 * 1024 * 1024,
67+
Vcpus: 2,
68+
NetworkEnabled: true,
69+
Hypervisor: hypervisor.TypeCloudHypervisor,
70+
Entrypoint: []string{"/bin/sh", "-lc"},
71+
Cmd: []string{"sleep infinity"},
72+
Volumes: []VolumeAttachment{
73+
{
74+
VolumeID: vol.Id,
75+
MountPath: "/mnt/docker-data",
76+
Readonly: false,
77+
},
78+
},
79+
})
80+
require.NoError(t, err)
81+
82+
_, err = waitForInstanceState(ctx, manager, inst.Id, StateRunning, 60*time.Second)
83+
require.NoError(t, err)
84+
require.NoError(t, waitForExecAgent(ctx, manager, inst.Id, 60*time.Second))
85+
86+
output, exitCode, err := execCommand(ctx, inst, "sh", "-lc", "findmnt -n -o FSTYPE,SOURCE /mnt/docker-data")
87+
require.NoError(t, err)
88+
require.Equal(t, 0, exitCode, "findmnt should succeed: %s", output)
89+
assert.Contains(t, output, "ext4", "docker data volume should be ext4-backed")
90+
assert.Contains(t, output, "/dev/vd", "docker data volume should come from an attached block device")
91+
92+
output, exitCode, err = execCommand(ctx, inst, "sh", "-lc", `
93+
set -eux
94+
mkdir -p /var/lib/docker
95+
mount --bind /mnt/docker-data /var/lib/docker
96+
findmnt -n -o FSTYPE,SOURCE /var/lib/docker >/tmp/docker-bind-mount.txt
97+
grep -q ext4 /tmp/docker-bind-mount.txt
98+
`)
99+
require.NoError(t, err)
100+
require.Equal(t, 0, exitCode, "docker bind mount should work before docker install: %s", output)
101+
102+
output, exitCode, err = execCommand(ctx, inst, "sh", "-lc", `
103+
set -eux
104+
export DEBIAN_FRONTEND=noninteractive
105+
apt-get update
106+
apt-get install -y docker.io curl
107+
`)
108+
require.NoError(t, err)
109+
require.Equal(t, 0, exitCode, "docker install should succeed: %s", output)
110+
111+
output, exitCode, err = execCommand(ctx, inst, "sh", "-lc", `
112+
set -eux
113+
nohup dockerd >/tmp/dockerd.log 2>&1 &
114+
for i in $(seq 1 90); do
115+
if docker info >/tmp/docker-info.txt 2>/tmp/docker-info.err; then
116+
exit 0
117+
fi
118+
sleep 1
119+
done
120+
cat /tmp/docker-info.err || true
121+
cat /tmp/dockerd.log || true
122+
exit 1
123+
`)
124+
require.NoError(t, err)
125+
require.Equal(t, 0, exitCode, "dockerd should become ready: %s", output)
126+
127+
output, exitCode, err = execCommand(ctx, inst, "sh", "-lc", "docker info --format '{{.Driver}}'")
128+
require.NoError(t, err)
129+
require.Equal(t, 0, exitCode, "docker info should succeed: %s", output)
130+
assert.Equal(t, "overlay2", strings.TrimSpace(output), "docker should use overlay2 on the attached volume")
131+
132+
output, exitCode, err = execCommand(ctx, inst, "sh", "-lc", "docker run --rm hello-world")
133+
require.NoError(t, err)
134+
require.Equal(t, 0, exitCode, "hello-world should run successfully: %s", output)
135+
assert.Contains(t, output, "Hello from Docker!", "hello-world output should confirm container execution")
136+
137+
output, exitCode, err = execCommand(ctx, inst, "sh", "-lc", `
138+
set -eux
139+
docker rm -f docker-nginx >/dev/null 2>&1 || true
140+
docker run -d --rm --name docker-nginx -p 8080:80 nginx:alpine
141+
for i in $(seq 1 60); do
142+
if curl -fsS http://127.0.0.1:8080 >/tmp/docker-nginx.html; then
143+
grep -q 'Welcome to nginx!' /tmp/docker-nginx.html
144+
exit 0
145+
fi
146+
sleep 1
147+
done
148+
docker logs docker-nginx || true
149+
exit 1
150+
`)
151+
require.NoError(t, err)
152+
require.Equal(t, 0, exitCode, "docker port publishing should work: %s", output)
153+
}

lib/system/versions.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@ const (
1414

1515
// Kernel_202603091 is the current kernel version with iptables filter/xt match support for nested Hypeman networking
1616
Kernel_202603091 KernelVersion = "ch-6.12.8-kernel-1.5-202603091"
17+
18+
// Kernel_202603301 is the current kernel version with expanded nftables/raw support for Docker bridge networking
19+
Kernel_202603301 KernelVersion = "ch-6.12.8-kernel-1.6-202603301"
1720
)
1821

1922
var (
2023
// DefaultKernelVersion is the kernel version used for new instances
21-
DefaultKernelVersion = Kernel_202603091
24+
DefaultKernelVersion = Kernel_202603301
2225

2326
// SupportedKernelVersions lists all supported kernel versions
2427
SupportedKernelVersions = []KernelVersion{
28+
Kernel_202603301,
2529
Kernel_202603091,
2630
Kernel_202602101,
2731
Kernel_202601152,
@@ -30,6 +34,10 @@ var (
3034

3135
// KernelDownloadURLs maps kernel versions and architectures to download URLs
3236
var KernelDownloadURLs = map[KernelVersion]map[string]string{
37+
Kernel_202603301: {
38+
"x86_64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.6-202603301/vmlinux-x86_64",
39+
"aarch64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.6-202603301/Image-arm64",
40+
},
3341
Kernel_202603091: {
3442
"x86_64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.5-202603091/vmlinux-x86_64",
3543
"aarch64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.5-202603091/Image-arm64",
@@ -47,6 +55,10 @@ var KernelDownloadURLs = map[KernelVersion]map[string]string{
4755
// KernelHeaderURLs maps kernel versions and architectures to kernel header tarball URLs
4856
// These tarballs contain kernel headers needed for DKMS to build out-of-tree modules (e.g., NVIDIA vGPU drivers)
4957
var KernelHeaderURLs = map[KernelVersion]map[string]string{
58+
Kernel_202603301: {
59+
"x86_64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.6-202603301/kernel-headers-x86_64.tar.gz",
60+
"aarch64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.6-202603301/kernel-headers-aarch64.tar.gz",
61+
},
5062
Kernel_202603091: {
5163
"x86_64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.5-202603091/kernel-headers-x86_64.tar.gz",
5264
"aarch64": "https://github.com/kernel/linux/releases/download/ch-6.12.8-kernel-1.5-202603091/kernel-headers-aarch64.tar.gz",

0 commit comments

Comments
 (0)