Skip to content

Commit fb10317

Browse files
test: updates E2E test network and image configuration (#2054)
Description This PR updates E2E test network and image configuration to make VM connectivity and migration scenarios more deterministic. Key changes: - Configure test ClusterNetwork to existing VLAN 4006 (cn-4006-for-e2e-test) instead of VLAN 1003 (cn-1003-for-e2e-test). - Normalize image usage in E2E tests (switch most cases from perf image to stable Alpine UEFI image where needed). - Fix object builders for Ubuntu resources (VI/CVI/VD) to use Ubuntu image URL instead of Alpine BIOS URL. - Add dedicated constructors for Alpine BIOS/UEFI images in object helpers. Update additional network interfaces test: - move additional IPs to per-test-case params, - pass explicit IPs into connectivity checks, - adjust Alpine cloud-init service startup commands. --------- Signed-off-by: Nikita Korolev <nikita.korolev@flant.com>
1 parent 7cf3bb9 commit fb10317

15 files changed

+143
-92
lines changed

test/e2e/blockdevice/importer_network_policy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ var _ = Describe("ImporterNetworkPolicy", func() {
4646
util.UntilObjectState("Deployed", framework.ShortTimeout, project)
4747

4848
By("Create virtual image")
49-
vi := object.NewGeneratedHTTPVIUbuntu("vi-", project.Name)
49+
vi := object.NewGeneratedHTTPVIAlpineBIOS("vi-", project.Name)
5050
err = f.CreateWithDeferredDeletion(context.Background(), vi)
5151
Expect(err).NotTo(HaveOccurred())
5252

@@ -62,7 +62,7 @@ var _ = Describe("ImporterNetworkPolicy", func() {
6262
util.UntilObjectState("Deployed", framework.ShortTimeout, project)
6363

6464
By("Create virtual disk")
65-
vd := object.NewGeneratedHTTPVDUbuntu("vd-", project.Name)
65+
vd := object.NewHTTPVDAlpineBIOS("vd-", project.Name)
6666
err = f.CreateWithDeferredDeletion(context.Background(), vd)
6767
Expect(err).NotTo(HaveOccurred())
6868

test/e2e/blockdevice/virtual_disk_provisioning.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var _ = Describe("VirtualDiskProvisioning", func() {
5454
vi = vibuilder.New(
5555
vibuilder.WithName("vi"),
5656
vibuilder.WithNamespace(f.Namespace().Name),
57-
vibuilder.WithDataSourceHTTP(object.ImageURLAlpineUEFIPerf, nil, nil),
57+
vibuilder.WithDataSourceHTTP(object.ImageURLAlpineUEFI, nil, nil),
5858
vibuilder.WithStorage(v1alpha2.StoragePersistentVolumeClaim),
5959
)
6060

test/e2e/blockdevice/virtual_image_creation.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ var _ = Describe("VirtualImageCreation", func() {
6464
vdbuilder.WithSize(ptr.To(resource.MustParse("350Mi"))),
6565
vdbuilder.WithDataSourceHTTP(
6666
&v1alpha2.DataSourceHTTP{
67-
URL: object.ImageURLAlpineUEFIPerf,
67+
URL: object.ImageURLAlpineUEFI,
6868
},
6969
),
7070
)
@@ -98,9 +98,7 @@ var _ = Describe("VirtualImageCreation", func() {
9898
baseCvis = append(baseCvis, cvibuilder.New(
9999
cvibuilder.WithGenerateName(fmt.Sprintf("%s-cvi-http-", cviPrefix)),
100100
cvibuilder.WithDataSourceHTTP(
101-
object.ImageURLAlpineUEFIPerf,
102-
nil,
103-
nil,
101+
object.ImageURLAlpineUEFI, nil, nil,
104102
),
105103
))
106104
baseCvis = append(baseCvis, cvibuilder.New(
@@ -120,9 +118,7 @@ var _ = Describe("VirtualImageCreation", func() {
120118
vibuilder.WithNamespace(f.Namespace().Name),
121119
vibuilder.WithStorage(v1alpha2.StorageContainerRegistry),
122120
vibuilder.WithDataSourceHTTP(
123-
object.ImageURLAlpineUEFIPerf,
124-
nil,
125-
nil,
121+
object.ImageURLAlpineUEFI, nil, nil,
126122
),
127123
))
128124
baseVis = append(baseVis, vibuilder.New(
@@ -146,9 +142,7 @@ var _ = Describe("VirtualImageCreation", func() {
146142
vibuilder.WithNamespace(f.Namespace().Name),
147143
vibuilder.WithStorage(v1alpha2.StoragePersistentVolumeClaim),
148144
vibuilder.WithDataSourceHTTP(
149-
object.ImageURLAlpineUEFIPerf,
150-
nil,
151-
nil,
145+
object.ImageURLAlpineUEFI, nil, nil,
152146
),
153147
))
154148
baseVis = append(baseVis, vibuilder.New(

test/e2e/internal/object/const.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ limitations under the License.
1717
package object
1818

1919
const (
20-
ImageURLAlpineUEFIPerf = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/alpine/alpine-3-23-3-uefi-base.qcow2"
21-
ImageURLAlpineBIOS = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/alpine/alpine-3-23-3-bios-base.qcow2"
22-
ImageURLUbuntu = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/ubuntu/ubuntu-24.04-minimal-cloudimg-amd64.qcow2"
23-
ImageURLContainerImage = "cr.yandex/crpvs5j3nh1mi2tpithr/e2e/alpine/alpine-image:latest"
24-
ImageURLMinimalQCOW = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/test/test.qcow2"
25-
ImageURLMinimalISO = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/test/test.iso"
26-
Mi256 = 256 * 1024 * 1024
27-
DefaultVMClass = "generic"
20+
ImageURLAlpineUEFI = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/alpine/alpine-3-23-3-uefi-base.qcow2"
21+
ImageURLAlpineBIOS = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/alpine/alpine-3-23-3-bios-base.qcow2"
22+
ImagesURLAlpineUEFIPerf = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/alpine/alpine-3-21-uefi-perf.qcow2"
23+
ImageURLUbuntu = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/ubuntu/ubuntu-24.04-minimal-cloudimg-amd64.qcow2"
24+
ImageURLContainerImage = "cr.yandex/crpvs5j3nh1mi2tpithr/e2e/alpine/alpine-image:latest"
25+
// No bootable
26+
ImageTestDataQCOW = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/test/test.qcow2"
27+
ImageTestDataISO = "https://89d64382-20df-4581-8cc7-80df331f67fa.selstorage.ru/test/test.iso"
28+
Mi256 = 256 * 1024 * 1024
29+
DefaultVMClass = "generic"
2830

2931
cloudInitBase = `#cloud-config
3032
package_update: true

test/e2e/internal/object/cvi.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ func NewHTTPCVIUbuntu(name string, opts ...cvi.Option) *v1alpha2.ClusterVirtualI
2525
baseOpts := []cvi.Option{
2626
cvi.WithName(name),
2727
cvi.WithDataSourceHTTP(
28-
ImageURLAlpineBIOS,
29-
nil,
30-
nil,
28+
ImageURLUbuntu, nil, nil,
3129
),
3230
}
3331
baseOpts = append(baseOpts, opts...)
@@ -38,9 +36,7 @@ func NewGenerateHTTPCVIUbuntu(prefix string, opts ...cvi.Option) *v1alpha2.Clust
3836
baseOpts := []cvi.Option{
3937
cvi.WithGenerateName(prefix),
4038
cvi.WithDataSourceHTTP(
41-
ImageURLAlpineBIOS,
42-
nil,
43-
nil,
39+
ImageURLUbuntu, nil, nil,
4440
),
4541
}
4642
baseOpts = append(baseOpts, opts...)

test/e2e/internal/object/vd.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func NewGeneratedHTTPVDUbuntu(prefix, namespace string, opts ...vd.Option) *v1al
7878
vd.WithGenerateName(prefix),
7979
vd.WithNamespace(namespace),
8080
vd.WithDataSourceHTTP(&v1alpha2.DataSourceHTTP{
81-
URL: ImageURLAlpineBIOS,
81+
URL: ImageURLUbuntu,
8282
}),
8383
}
8484
baseOpts = append(baseOpts, opts...)
@@ -96,3 +96,27 @@ func NewHTTPVDAlpineBIOS(name, namespace string, opts ...vd.Option) *v1alpha2.Vi
9696
baseOpts = append(baseOpts, opts...)
9797
return vd.New(baseOpts...)
9898
}
99+
100+
func NewHTTPVDAlpineUEFI(name, namespace string, opts ...vd.Option) *v1alpha2.VirtualDisk {
101+
baseOpts := []vd.Option{
102+
vd.WithName(name),
103+
vd.WithNamespace(namespace),
104+
vd.WithDataSourceHTTP(&v1alpha2.DataSourceHTTP{
105+
URL: ImageURLAlpineUEFI,
106+
}),
107+
}
108+
baseOpts = append(baseOpts, opts...)
109+
return vd.New(baseOpts...)
110+
}
111+
112+
func NewHTTPVDAlpineUEFIPerf(name, namespace string, opts ...vd.Option) *v1alpha2.VirtualDisk {
113+
baseOpts := []vd.Option{
114+
vd.WithName(name),
115+
vd.WithNamespace(namespace),
116+
vd.WithDataSourceHTTP(&v1alpha2.DataSourceHTTP{
117+
URL: ImagesURLAlpineUEFIPerf,
118+
}),
119+
}
120+
baseOpts = append(baseOpts, opts...)
121+
return vd.New(baseOpts...)
122+
}

test/e2e/internal/object/vi.go

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,35 @@ func NewHTTPVIUbuntu(name, namespace string, opts ...vi.Option) *v1alpha2.Virtua
2727
vi.WithStorage(v1alpha2.StorageContainerRegistry),
2828
vi.WithNamespace(namespace),
2929
vi.WithDataSourceHTTP(
30-
ImageURLAlpineBIOS,
31-
nil,
32-
nil,
30+
ImageURLUbuntu, nil, nil,
31+
),
32+
vi.WithStorage(v1alpha2.StorageContainerRegistry),
33+
}
34+
baseOpts = append(baseOpts, opts...)
35+
return vi.New(baseOpts...)
36+
}
37+
38+
func NewHTTPVIAlpineBIOS(name, namespace string, opts ...vi.Option) *v1alpha2.VirtualImage {
39+
baseOpts := []vi.Option{
40+
vi.WithName(name),
41+
vi.WithStorage(v1alpha2.StorageContainerRegistry),
42+
vi.WithNamespace(namespace),
43+
vi.WithDataSourceHTTP(
44+
ImageURLAlpineBIOS, nil, nil,
45+
),
46+
vi.WithStorage(v1alpha2.StorageContainerRegistry),
47+
}
48+
baseOpts = append(baseOpts, opts...)
49+
return vi.New(baseOpts...)
50+
}
51+
52+
func NewHTTPVIAlpineUEFI(name, namespace string, opts ...vi.Option) *v1alpha2.VirtualImage {
53+
baseOpts := []vi.Option{
54+
vi.WithName(name),
55+
vi.WithStorage(v1alpha2.StorageContainerRegistry),
56+
vi.WithNamespace(namespace),
57+
vi.WithDataSourceHTTP(
58+
ImageURLAlpineUEFI, nil, nil,
3359
),
3460
vi.WithStorage(v1alpha2.StorageContainerRegistry),
3561
}
@@ -42,9 +68,33 @@ func NewGeneratedHTTPVIUbuntu(prefix, namespace string, opts ...vi.Option) *v1al
4268
vi.WithGenerateName(prefix),
4369
vi.WithNamespace(namespace),
4470
vi.WithDataSourceHTTP(
45-
ImageURLAlpineBIOS,
46-
nil,
47-
nil,
71+
ImageURLUbuntu, nil, nil,
72+
),
73+
vi.WithStorage(v1alpha2.StorageContainerRegistry),
74+
}
75+
baseOpts = append(baseOpts, opts...)
76+
return vi.New(baseOpts...)
77+
}
78+
79+
func NewGeneratedHTTPVIAlpineBIOS(prefix, namespace string, opts ...vi.Option) *v1alpha2.VirtualImage {
80+
baseOpts := []vi.Option{
81+
vi.WithGenerateName(prefix),
82+
vi.WithNamespace(namespace),
83+
vi.WithDataSourceHTTP(
84+
ImageURLAlpineBIOS, nil, nil,
85+
),
86+
vi.WithStorage(v1alpha2.StorageContainerRegistry),
87+
}
88+
baseOpts = append(baseOpts, opts...)
89+
return vi.New(baseOpts...)
90+
}
91+
92+
func NewGeneratedHTTPVIAlpineUEFI(prefix, namespace string, opts ...vi.Option) *v1alpha2.VirtualImage {
93+
baseOpts := []vi.Option{
94+
vi.WithGenerateName(prefix),
95+
vi.WithNamespace(namespace),
96+
vi.WithDataSourceHTTP(
97+
ImageURLAlpineUEFI, nil, nil,
4898
),
4999
vi.WithStorage(v1alpha2.StorageContainerRegistry),
50100
}

test/e2e/internal/util/sdn.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ import (
2929
)
3030

3131
const (
32-
ClusterNetworkName = "cn-1003-for-e2e-test"
33-
ClusterNetworkVLANID = 1003
32+
ClusterNetworkName = "cn-4006-for-e2e-test"
33+
ClusterNetworkVLANID = 4006
3434
ClusterNetworkCreateCommand = `kubectl apply -f - <<EOF
3535
apiVersion: network.deckhouse.io/v1alpha1
3636
kind: ClusterNetwork
3737
metadata:
38-
name: cn-1003-for-e2e-test
38+
name: cn-4006-for-e2e-test
3939
spec:
4040
parentNodeNetworkInterfaces:
4141
labelSelector:
@@ -44,7 +44,7 @@ spec:
4444
network.deckhouse.io/node-role: worker
4545
type: VLAN
4646
vlan:
47-
id: 1003
47+
id: 4006
4848
EOF`
4949
)
5050

test/e2e/vm/additional_network_interfaces.go

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,10 @@ import (
3939
"github.com/deckhouse/virtualization/test/e2e/internal/util"
4040
)
4141

42-
const (
43-
// IPs on additional network interface for connectivity check between VMs.
44-
// When VM has Main network, additional interface is eth1; otherwise it's eth0.
45-
vmFooAdditionalIP = "192.168.1.10"
46-
vmBarAdditionalIP = "192.168.1.11"
47-
)
48-
4942
type additionalNetworkTestCase struct {
5043
vmBarHasMainNetwork bool
44+
vmFooAdditionalIP string
45+
vmBarAdditionalIP string
5146
}
5247

5348
var _ = Describe("VirtualMachineAdditionalNetworkInterfaces", func() {
@@ -78,43 +73,38 @@ var _ = Describe("VirtualMachineAdditionalNetworkInterfaces", func() {
7873
By("Environment preparation", func() {
7974
ns := f.Namespace().Name
8075

81-
vdFooRoot = vd.New(
82-
vd.WithName("vd-foo-root"),
83-
vd.WithNamespace(ns),
76+
vdFooRoot = object.NewHTTPVDAlpineUEFIPerf("vd-foo-root", ns,
8477
vd.WithSize(ptr.To(resource.MustParse("512Mi"))),
85-
vd.WithDataSourceHTTP(&v1alpha2.DataSourceHTTP{
86-
URL: object.ImageURLAlpineUEFIPerf,
87-
}),
8878
)
89-
vdBarRoot = vd.New(
90-
vd.WithName("vd-bar-root"),
91-
vd.WithNamespace(ns),
79+
vdBarRoot = object.NewHTTPVDAlpineUEFIPerf("vd-bar-root", ns,
9280
vd.WithSize(ptr.To(resource.MustParse("512Mi"))),
93-
vd.WithDataSourceHTTP(&v1alpha2.DataSourceHTTP{
94-
URL: object.ImageURLAlpineUEFIPerf,
95-
}),
9681
)
9782

9883
// vm-foo always has Main + ClusterNetwork so we can SSH to it.
99-
vmFoo = buildVMWithNetworks("vm-foo", ns, vdFooRoot.Name, vmFooAdditionalIP, true)
100-
vmBar = buildVMWithNetworks("vm-bar", ns, vdBarRoot.Name, vmBarAdditionalIP, tc.vmBarHasMainNetwork)
84+
vmFoo = buildVMWithNetworks("vm-foo", ns, vdFooRoot.Name, tc.vmFooAdditionalIP, true)
85+
vmBar = buildVMWithNetworks("vm-bar", ns, vdBarRoot.Name, tc.vmBarAdditionalIP, tc.vmBarHasMainNetwork)
10186

10287
err := f.CreateWithDeferredDeletion(context.Background(), vdFooRoot, vdBarRoot, vmFoo, vmBar)
10388
Expect(err).NotTo(HaveOccurred())
10489

10590
util.UntilObjectPhase(string(v1alpha2.MachineRunning), framework.LongTimeout, vmFoo, vmBar)
106-
util.UntilVMAgentReady(crclient.ObjectKeyFromObject(vmFoo), framework.LongTimeout)
91+
util.UntilSSHReady(f, vmFoo, framework.LongTimeout)
10792
if tc.vmBarHasMainNetwork {
108-
util.UntilVMAgentReady(crclient.ObjectKeyFromObject(vmBar), framework.LongTimeout)
93+
util.UntilSSHReady(f, vmBar, framework.LongTimeout)
10994
}
95+
96+
By(fmt.Sprintf("Wait until vms %s and %s in phase running", vmFoo.GetName(), vmBar.GetName()), func() {
97+
util.UntilObjectPhase(string(v1alpha2.MachineRunning), framework.LongTimeout, vmFoo, vmBar)
98+
})
11099
})
111100

101+
// If test fail due this timeout, rollback in test waiting for agent to be ready.
112102
By("Wait for additional network interfaces to be ready", func() {
113103
util.UntilConditionStatus(vmcondition.TypeNetworkReady.String(), "True", framework.LongTimeout, vmFoo, vmBar)
114104
})
115105

116106
By("Check connectivity between VMs via additional network", func() {
117-
checkConnectivityBetweenVMs(f, vmFoo, vmBar, tc.vmBarHasMainNetwork)
107+
checkConnectivityBetweenVMs(f, vmFoo, vmBar, tc.vmBarHasMainNetwork, tc.vmBarAdditionalIP, tc.vmFooAdditionalIP)
118108
})
119109

120110
By("Create VMOPs to trigger migration", func() {
@@ -150,11 +140,11 @@ var _ = Describe("VirtualMachineAdditionalNetworkInterfaces", func() {
150140
})
151141

152142
By("Check connectivity between VMs via additional network after migration", func() {
153-
checkConnectivityBetweenVMs(f, vmFoo, vmBar, tc.vmBarHasMainNetwork)
143+
checkConnectivityBetweenVMs(f, vmFoo, vmBar, tc.vmBarHasMainNetwork, tc.vmBarAdditionalIP, tc.vmFooAdditionalIP)
154144
})
155145
},
156-
Entry("Main + additional network", additionalNetworkTestCase{vmBarHasMainNetwork: true}),
157-
Entry("Only additional network (vm-bar without Main)", additionalNetworkTestCase{vmBarHasMainNetwork: false}),
146+
Entry("Main + additional network", additionalNetworkTestCase{vmBarHasMainNetwork: true, vmFooAdditionalIP: "192.168.42.10", vmBarAdditionalIP: "192.168.42.11"}),
147+
Entry("Only additional network (vm-bar without Main)", additionalNetworkTestCase{vmBarHasMainNetwork: false, vmFooAdditionalIP: "192.168.42.12", vmBarAdditionalIP: "192.168.42.13"}),
158148
)
159149
})
160150

@@ -209,26 +199,21 @@ users:
209199
lock_passwd: False
210200
ssh_authorized_keys:
211201
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxcXHmwaGnJ8scJaEN5RzklBPZpVSic4GdaAsKjQoeA your_email@example.com
212-
packages:
213-
- qemu-guest-agent
214202
write_files:
215203
- path: /etc/network/interfaces
216204
append: true
217205
content: |
218-
219206
auto %s
220207
iface %s inet static
221208
address %s
222209
netmask 255.255.255.0
223210
runcmd:
224-
- sudo rc-update add qemu-guest-agent default
225-
- sudo rc-service qemu-guest-agent start
226-
- sudo /etc/init.d/networking restart
227-
- chown -R cloud:cloud /home/cloud
211+
- "rc-update add sshd && rc-service sshd start"
212+
- "rc-update add networking boot && rc-service networking restart"
228213
`, ifaceName, ifaceName, additionalIP)
229214
}
230215

231-
func checkConnectivityBetweenVMs(f *framework.Framework, vmFoo, vmBar *v1alpha2.VirtualMachine, vmBarHasMainNetwork bool) {
216+
func checkConnectivityBetweenVMs(f *framework.Framework, vmFoo, vmBar *v1alpha2.VirtualMachine, vmBarHasMainNetwork bool, vmBarAdditionalIP, vmFooAdditionalIP string) {
232217
GinkgoHelper()
233218

234219
pingCmd := "ping -c 2 -W 2 -w 5 -q %s 2>&1 | grep -o \"[0-9]\\+%%\\s*packet loss\"" // %% -> % in output
@@ -244,14 +229,14 @@ func checkConnectivityBetweenVMs(f *framework.Framework, vmFoo, vmBar *v1alpha2.
244229
}
245230

246231
const (
247-
Interval = 5 * time.Second
232+
Interval = 1 * time.Second
248233
Timeout = 90 * time.Second
249234
)
250235

251236
func checkResultSSHCommand(f *framework.Framework, vmName, vmNamespace, cmd, equal string) {
252237
GinkgoHelper()
253238
Eventually(func() (string, error) {
254-
res, err := f.SSHCommand(vmName, vmNamespace, cmd)
239+
res, err := f.SSHCommand(vmName, vmNamespace, cmd, framework.WithSSHTimeout(5*time.Second))
255240
if err != nil {
256241
return "", fmt.Errorf("cmd: %s\nstderr: %w", cmd, err)
257242
}

0 commit comments

Comments
 (0)