Skip to content

Commit 8631167

Browse files
committed
distro: add tests for PodmanDefaultNetBackend
Verify the podman default network backend behavior at multiple levels: - YAML loading: fake distro YAML with podman_default_net_backend loads correctly into ImageConfig - osCustomizations: the backend file is generated only when both containers are present and the option is set - Real distro cross-check: RHEL 9 has it set to netavark, while Fedora and RHEL 10 leave it unset Signed-off-by: Tomáš Hozza <thozza@redhat.com>
1 parent fcf099e commit 8631167

5 files changed

Lines changed: 234 additions & 0 deletions

File tree

pkg/distro/defs/loader_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/osbuild/images/internal/common"
1616
"github.com/osbuild/images/pkg/arch"
17+
"github.com/osbuild/images/pkg/container"
1718
"github.com/osbuild/images/pkg/customizations/oscap"
1819
"github.com/osbuild/images/pkg/customizations/users"
1920
"github.com/osbuild/images/pkg/datasizes"
@@ -702,6 +703,76 @@ image_types:
702703
})
703704
}
704705

706+
func TestDefsDistroImageConfigPodmanDefaultNetBackend(t *testing.T) {
707+
netavark := container.NetworkBackendNetavark
708+
709+
fakeImageTypeYaml := `
710+
image_types:
711+
test_type:
712+
filename: foo
713+
`
714+
tests := []struct {
715+
name string
716+
distroYaml string
717+
expected *container.NetworkBackend
718+
nilImgCfg bool
719+
}{
720+
{
721+
name: "podman_default_net_backend is loaded",
722+
distroYaml: `
723+
distros:
724+
- name: test-distro-1
725+
vendor: test-vendor
726+
defs_path: test-distro-1/
727+
image_config:
728+
default:
729+
podman_default_net_backend: "netavark"
730+
`,
731+
expected: &netavark,
732+
},
733+
{
734+
name: "podman_default_net_backend absent is nil",
735+
distroYaml: `
736+
distros:
737+
- name: test-distro-1
738+
vendor: test-vendor
739+
defs_path: test-distro-1/
740+
image_config:
741+
default:
742+
locale: "C.UTF-8"
743+
`,
744+
expected: nil,
745+
},
746+
{
747+
name: "no image_config at all",
748+
distroYaml: `
749+
distros:
750+
- name: test-distro-1
751+
vendor: test-vendor
752+
defs_path: test-distro-1/
753+
`,
754+
nilImgCfg: true,
755+
},
756+
}
757+
758+
for _, tt := range tests {
759+
t.Run(tt.name, func(t *testing.T) {
760+
baseDir := makeFakeDistrosYAML(t, tt.distroYaml, fakeImageTypeYaml)
761+
restore := defs.MockDataFS(baseDir)
762+
t.Cleanup(restore)
763+
764+
dist, err := defs.NewDistroYAML("test-distro-1")
765+
require.NoError(t, err)
766+
if tt.nilImgCfg {
767+
assert.Nil(t, dist.ImageConfig())
768+
} else {
769+
require.NotNil(t, dist.ImageConfig())
770+
assert.Equal(t, tt.expected, dist.ImageConfig().PodmanDefaultNetBackend)
771+
}
772+
})
773+
}
774+
}
775+
705776
func TestDefsPartitionTableErrorsNotForImageType(t *testing.T) {
706777
badDistroYamlMissingPartitionTable := `
707778
image_types:

pkg/distro/generic/fedora_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,3 +775,18 @@ func TestFedoraDistroBootstrapRef(t *testing.T) {
775775
}
776776
}
777777
}
778+
779+
func TestFedora_PodmanDefaultNetBackendIsNil(t *testing.T) {
780+
for _, d := range fedoraFamilyDistros {
781+
t.Run(d.Name(), func(t *testing.T) {
782+
a, err := d.GetArch("x86_64")
783+
require.NoError(t, err)
784+
785+
it, err := a.GetImageType("qcow2")
786+
require.NoError(t, err)
787+
788+
cfg := it.(*generic.ImageType).GetDefaultImageConfig()
789+
assert.Nil(t, cfg.PodmanDefaultNetBackend, "Fedora should not set PodmanDefaultNetBackend")
790+
})
791+
}
792+
}

pkg/distro/generic/images_test.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import (
1010
"github.com/osbuild/blueprint/pkg/blueprint"
1111
"github.com/osbuild/images/internal/common"
1212
"github.com/osbuild/images/pkg/arch"
13+
"github.com/osbuild/images/pkg/container"
1314
"github.com/osbuild/images/pkg/distro"
1415
"github.com/osbuild/images/pkg/distro/defs"
16+
"github.com/osbuild/images/pkg/rpmmd"
1517
)
1618

1719
func isoTestImageType() *imageType {
@@ -134,3 +136,118 @@ func TestReplaceBasictemplate(t *testing.T) {
134136
assert.Equal(t, replaceBasicTemplate(tc.input, tc.arch), tc.expected)
135137
}
136138
}
139+
140+
func diskTestImageType() *imageType {
141+
return &imageType{
142+
arch: &architecture{
143+
distro: &distribution{},
144+
},
145+
ImageTypeYAML: defs.ImageTypeYAML{},
146+
}
147+
}
148+
149+
func ostreeTestImageType() *imageType {
150+
it := diskTestImageType()
151+
it.ImageTypeYAML.OSTree.Ref = "rhel/9/x86_64/edge"
152+
return it
153+
}
154+
155+
func TestOSCustomizationsPodmanDefaultNetBackend(t *testing.T) {
156+
netavark := container.NetworkBackendNetavark
157+
158+
tests := []struct {
159+
name string
160+
imageType func() *imageType
161+
backend *container.NetworkBackend
162+
containers []container.SourceSpec
163+
expectFile bool
164+
expectedPath string
165+
expectedVal string
166+
}{
167+
{
168+
name: "disk: backend set with containers creates file",
169+
imageType: diskTestImageType,
170+
backend: &netavark,
171+
containers: []container.SourceSpec{
172+
{Source: "registry.example.com/test:latest"},
173+
},
174+
expectFile: true,
175+
expectedPath: "/var/lib/containers/storage/defaultNetworkBackend",
176+
expectedVal: "netavark",
177+
},
178+
{
179+
name: "disk: nil backend with containers does not create file",
180+
imageType: diskTestImageType,
181+
backend: nil,
182+
containers: []container.SourceSpec{
183+
{Source: "registry.example.com/test:latest"},
184+
},
185+
expectFile: false,
186+
},
187+
{
188+
name: "disk: backend set without containers does not create file",
189+
imageType: diskTestImageType,
190+
backend: &netavark,
191+
containers: nil,
192+
expectFile: false,
193+
},
194+
{
195+
name: "disk: nil backend without containers does not create file",
196+
imageType: diskTestImageType,
197+
backend: nil,
198+
containers: nil,
199+
expectFile: false,
200+
},
201+
{
202+
name: "ostree: backend set with containers creates file in relocated path",
203+
imageType: ostreeTestImageType,
204+
backend: &netavark,
205+
containers: []container.SourceSpec{
206+
{Source: "registry.example.com/test:latest"},
207+
},
208+
expectFile: true,
209+
expectedPath: "/usr/share/containers/storage/defaultNetworkBackend",
210+
expectedVal: "netavark",
211+
},
212+
{
213+
name: "ostree: nil backend with containers does not create file",
214+
imageType: ostreeTestImageType,
215+
backend: nil,
216+
containers: []container.SourceSpec{
217+
{Source: "registry.example.com/test:latest"},
218+
},
219+
expectFile: false,
220+
},
221+
}
222+
223+
for _, tt := range tests {
224+
t.Run(tt.name, func(t *testing.T) {
225+
it := tt.imageType()
226+
it.ImageConfigYAML.ImageConfig = &distro.ImageConfig{
227+
PodmanDefaultNetBackend: tt.backend,
228+
}
229+
230+
bp := &blueprint.Blueprint{}
231+
osc, err := osCustomizations(it, rpmmd.PackageSet{}, distro.ImageOptions{}, tt.containers, bp)
232+
require.NoError(t, err)
233+
234+
if !tt.expectFile {
235+
for _, f := range osc.Files {
236+
assert.NotContains(t, f.Path(), "defaultNetworkBackend",
237+
"unexpected defaultNetworkBackend file found at %s", f.Path())
238+
}
239+
return
240+
}
241+
242+
var found bool
243+
for _, f := range osc.Files {
244+
if f.Path() == tt.expectedPath {
245+
found = true
246+
assert.Equal(t, []byte(tt.expectedVal), f.Data())
247+
break
248+
}
249+
}
250+
assert.True(t, found, "expected file at %s", tt.expectedPath)
251+
})
252+
}
253+
}

pkg/distro/generic/rhel10_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,18 @@ func TestRH10Rhel10_KernelOption_NoIfnames(t *testing.T) {
401401
}
402402
}
403403
}
404+
405+
func TestRhel10_PodmanDefaultNetBackendIsNil(t *testing.T) {
406+
for _, fd := range rhel10FamilyDistros {
407+
t.Run(fd.name, func(t *testing.T) {
408+
a, err := fd.distro.GetArch("x86_64")
409+
require.NoError(t, err)
410+
411+
it, err := a.GetImageType("qcow2")
412+
require.NoError(t, err)
413+
414+
cfg := it.(*generic.ImageType).GetDefaultImageConfig()
415+
assert.Nil(t, cfg.PodmanDefaultNetBackend, "RHEL 10 should not set PodmanDefaultNetBackend")
416+
})
417+
}
418+
}

pkg/distro/generic/rhel9_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/osbuild/blueprint/pkg/blueprint"
1111
"github.com/osbuild/images/pkg/arch"
12+
"github.com/osbuild/images/pkg/container"
1213
"github.com/osbuild/images/pkg/distro"
1314
"github.com/osbuild/images/pkg/distro/distro_test_common"
1415
"github.com/osbuild/images/pkg/distro/generic"
@@ -667,3 +668,18 @@ func TestRhel9_DistroFactory(t *testing.T) {
667668
})
668669
}
669670
}
671+
672+
func TestRhel9_PodmanDefaultNetBackendIsSet(t *testing.T) {
673+
d := generic.DistroFactory("rhel-94")
674+
require.NotNil(t, d)
675+
676+
a, err := d.GetArch("x86_64")
677+
require.NoError(t, err)
678+
679+
it, err := a.GetImageType("qcow2")
680+
require.NoError(t, err)
681+
682+
cfg := it.(*generic.ImageType).GetDefaultImageConfig()
683+
require.NotNil(t, cfg.PodmanDefaultNetBackend, "RHEL 9 should set PodmanDefaultNetBackend to work around the cni fallback")
684+
assert.Equal(t, container.NetworkBackendNetavark, *cfg.PodmanDefaultNetBackend)
685+
}

0 commit comments

Comments
 (0)