Skip to content

Commit 78bcf32

Browse files
committed
gadget: inject default netplan configuration in gadget configuration
The plan is to remove the default gadget configuration from core26. But to be able to make netplan work on gadget missing netplan configuration, we should inject the old configuration.
1 parent 6ef8a8e commit 78bcf32

5 files changed

Lines changed: 58 additions & 4 deletions

File tree

gadget/gadget.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2135,16 +2135,35 @@ func flatten(path string, cfg any, out map[string]any) {
21352135
}
21362136
}
21372137

2138+
func SetFallbackDefaults(values map[string]any) {
2139+
hasNetplan := false
2140+
for key := range values {
2141+
if key == "system.network.netplan" {
2142+
hasNetplan = true
2143+
} else if strings.HasPrefix(key, "system.network.netplan.") {
2144+
hasNetplan = true
2145+
}
2146+
}
2147+
// Also check for the configuration file. If the file exists
2148+
// already it either was already seeded or the core base contains the configuration.
2149+
if !hasNetplan && !osutil.FileExists(filepath.Join(dirs.GlobalRootDir, "etc/netplan/00-snapd-config.yaml")) {
2150+
values["system.network.netplan.network.version"] = 2
2151+
values["system.network.netplan.network.ethernets.all-en.match.name"] = "en*"
2152+
values["system.network.netplan.network.ethernets.all-en.dhcp4"] = true
2153+
}
2154+
}
2155+
21382156
// SystemDefaults returns default system configuration from gadget defaults.
21392157
func SystemDefaults(gadgetDefaults map[string]map[string]any) map[string]any {
2158+
coreDefaults := map[string]any{}
21402159
for _, systemSnap := range []string{"system", naming.WellKnownSnapID("core")} {
21412160
if defaults, ok := gadgetDefaults[systemSnap]; ok {
2142-
coreDefaults := map[string]any{}
21432161
flatten("", defaults, coreDefaults)
2144-
return coreDefaults
2162+
break
21452163
}
21462164
}
2147-
return nil
2165+
SetFallbackDefaults(coreDefaults)
2166+
return coreDefaults
21482167
}
21492168

21502169
// See https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html

gadget/gadget_test.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,14 @@ func (s *gadgetYamlTestSuite) TestFlatten(c *C) {
730730
}
731731

732732
func (s *gadgetYamlTestSuite) TestCoreConfigDefaults(c *C) {
733-
err := os.WriteFile(s.gadgetYamlPath, mockClassicGadgetCoreDefaultsYaml, 0644)
733+
netPlanConf := filepath.Join(dirs.GlobalRootDir, "etc/netplan/00-snapd-config.yaml")
734+
err := os.MkdirAll(filepath.Dir(netPlanConf), 0755)
735+
c.Assert(err, IsNil)
736+
737+
err = os.WriteFile(netPlanConf, []byte{}, 0644)
738+
c.Assert(err, IsNil)
739+
740+
err = os.WriteFile(s.gadgetYamlPath, mockClassicGadgetCoreDefaultsYaml, 0644)
734741
c.Assert(err, IsNil)
735742

736743
ginfo, err := gadget.ReadInfo(s.dir, &gadgettest.ModelCharacteristics{IsClassic: true})
@@ -756,6 +763,21 @@ func (s *gadgetYamlTestSuite) TestCoreConfigDefaults(c *C) {
756763
})
757764
}
758765

766+
func (s *gadgetYamlTestSuite) TestCoreConfigDefaultsNoNetplan(c *C) {
767+
err := os.WriteFile(s.gadgetYamlPath, mockClassicGadgetCoreDefaultsYaml, 0644)
768+
c.Assert(err, IsNil)
769+
770+
ginfo, err := gadget.ReadInfo(s.dir, &gadgettest.ModelCharacteristics{IsClassic: true})
771+
c.Assert(err, IsNil)
772+
defaults := gadget.SystemDefaults(ginfo.Defaults)
773+
c.Check(defaults, DeepEquals, map[string]any{
774+
"ssh.disable": true,
775+
"system.network.netplan.network.version": 2,
776+
"system.network.netplan.network.ethernets.all-en.match.name": "en*",
777+
"system.network.netplan.network.ethernets.all-en.dhcp4": true,
778+
})
779+
}
780+
759781
var mockGadgetWithEmptyVolumes = `device-tree-origin: kernel
760782
volumes:
761783
lun-0:

overlord/snapstate/export_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,3 +645,7 @@ var ArrangeRebootAndUpdateSeed = arrangeRebootAndUpdateSeed
645645
func MockProcessDelayedSecurityBackendEffects(f func(st *state.State, lanes []int, joinLane int) (ts *state.TaskSet)) (restore func()) {
646646
return testutil.Mock(&ProcessDelayedSecurityBackendEffects, f)
647647
}
648+
649+
func MockGadgetSetFallbackDefaults(f func(values map[string]any)) (restore func()) {
650+
return testutil.Mock(&gadgetSetFallbackDefaults, f)
651+
}

overlord/snapstate/snapstate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ var osutilCheckFreeSpace = osutil.CheckFreeSpace
9595
// See LP:#1940553
9696
var TestingLeaveOutKernelUpdateGadgetAssets bool = false
9797

98+
var gadgetSetFallbackDefaults = gadget.SetFallbackDefaults
99+
98100
type minimalInstallInfo interface {
99101
InstanceName() string
100102
Type() snap.Type
@@ -4054,6 +4056,7 @@ func ConfigDefaults(st *state.State, deviceCtx DeviceContext, snapName string) (
40544056
logger.Noticef("core snap configuration defaults found under both 'system' key and core-snap-id, preferring 'system'")
40554057
}
40564058

4059+
gadgetSetFallbackDefaults(defaults)
40574060
return defaults, nil
40584061
}
40594062
}

overlord/snapstate/snapstate_config_defaults_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ func (s *snapmgrTestSuite) TestConfigDefaults(c *C) {
5959
c.Assert(err, IsNil)
6060
c.Assert(defls, DeepEquals, map[string]any{"key": "value"})
6161

62+
snapstate.MockGadgetSetFallbackDefaults(func(values map[string]any) {})
63+
6264
snapstate.Set(s.state, "local-snap", &snapstate.SnapState{
6365
Active: true,
6466
Sequence: snapstatetest.NewSequenceFromSnapSideInfos([]*snap.SideInfo{
@@ -175,6 +177,8 @@ defaults:
175177

176178
makeInstalledMockCoreSnap(c)
177179

180+
snapstate.MockGadgetSetFallbackDefaults(func(values map[string]any) {})
181+
178182
defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "core")
179183
c.Assert(err, IsNil)
180184
c.Assert(defls, DeepEquals, map[string]any{"foo": "bar"})
@@ -223,6 +227,8 @@ defaults:
223227
Revision: snap.R(1),
224228
})
225229

230+
snapstate.MockGadgetSetFallbackDefaults(func(values map[string]any) {})
231+
226232
defls, err := snapstate.ConfigDefaults(s.state, deviceCtx, "core")
227233
c.Assert(err, IsNil)
228234
c.Assert(defls, DeepEquals, map[string]any{"foo": "bar"})

0 commit comments

Comments
 (0)