Skip to content

Commit

Permalink
fixup! many: compute snapd versions in loadSystemAndEssentialSnaps
Browse files Browse the repository at this point in the history
Signed-off-by: Zeyad Gouda <zeyad.gouda@canonical.com>
  • Loading branch information
ZeyadYasser committed Feb 10, 2025
1 parent 3b10964 commit 310cede
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 69 deletions.
10 changes: 10 additions & 0 deletions daemon/api_systems_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@ func (s *systemsSuite) mockSystemSeeds(c *check.C) (restore func()) {
"architecture": "amd64",
"base": "core20",
"snaps": []interface{}{
map[string]interface{}{
"name": "snapd",
"id": seed20.AssertedSnapID("snapd"),
"type": "snapd",
},
map[string]interface{}{
"name": "pc-kernel",
"id": seed20.AssertedSnapID("pc-kernel"),
Expand All @@ -170,6 +175,11 @@ func (s *systemsSuite) mockSystemSeeds(c *check.C) (restore func()) {
"architecture": "amd64",
"base": "core20",
"snaps": []interface{}{
map[string]interface{}{
"name": "snapd",
"id": seed20.AssertedSnapID("snapd"),
"type": "snapd",
},
map[string]interface{}{
"name": "pc-kernel",
"id": seed20.AssertedSnapID("pc-kernel"),
Expand Down
74 changes: 26 additions & 48 deletions overlord/devicestate/devicemgr.go
Original file line number Diff line number Diff line change
Expand Up @@ -2194,31 +2194,6 @@ func (m *DeviceManager) systems() ([]*System, error) {
return systems, nil
}

func snapdVersionByTypeFromSeed20(s seed.Seed, types []snap.Type) (systemSnapdVersions *install.SystemSnapdVersions, err error) {
perf := &timings.Timings{}
if err := s.LoadEssentialMeta(types, perf); err != nil {
return nil, fmt.Errorf("cannot load essential snaps metadata: %v", err)
}
systemSnapdVersions = &install.SystemSnapdVersions{}
for _, snapSeed := range s.EssentialSnaps() {
snapf, err := snapfile.Open(snapSeed.Path)
if err != nil {
return nil, err
}
snapdVersion, _, err := snap.SnapdInfoFromSnapFile(snapf, snapSeed.EssentialType)
if err != nil {
return nil, err
}
switch snapSeed.EssentialType {
case snap.TypeSnapd:
systemSnapdVersions.SnapdVersion = snapdVersion
case snap.TypeKernel:
systemSnapdVersions.SnapdInitramfsVersion = snapdVersion
}
}
return systemSnapdVersions, nil
}

// SystemAndGadgetAndEncryptionInfo return the system details
// including the model assertion, gadget details and encryption info
// for the given system label.
Expand All @@ -2227,7 +2202,7 @@ func (m *DeviceManager) SystemAndGadgetAndEncryptionInfo(wantedSystemLabel strin
// installer is not anymore.

// System information
systemAndSnaps, err := m.loadSystemAndEssentialSnaps(wantedSystemLabel, []snap.Type{snap.TypeKernel, snap.TypeGadget}, seed.AllModes)
systemAndSnaps, err := m.loadSystemAndEssentialSnaps(wantedSystemLabel, []snap.Type{snap.TypeSnapd, snap.TypeKernel, snap.TypeGadget}, seed.AllModes)
if err != nil {
return nil, nil, nil, err
}
Expand All @@ -2242,20 +2217,8 @@ func (m *DeviceManager) SystemAndGadgetAndEncryptionInfo(wantedSystemLabel strin
return nil, nil, nil, fmt.Errorf("reading gadget information: %v", err)
}

var systemSnapdVersions *install.SystemSnapdVersions
// Find snapd versions for snapd and kernel snaps in the seed for
// the passphrase/PINs auth checks.
// FDE is only supported in UC20+ (i.e. Model grade is set).
if systemAndSnaps.Model.Grade() != asserts.ModelGradeUnset {
// Snapd snap should exist in UC20+.
systemSnapdVersions, err = snapdVersionByTypeFromSeed20(systemAndSnaps.Seed, []snap.Type{snap.TypeSnapd, snap.TypeKernel})
if err != nil {
return nil, nil, nil, err
}
}

// Encryption details
encInfo, err := m.encryptionSupportInfo(systemAndSnaps.Model, secboot.TPMProvisionFull, systemAndSnaps.InfosByType[snap.TypeKernel], gadgetInfo, systemSnapdVersions)
encInfo, err := m.encryptionSupportInfo(systemAndSnaps.Model, secboot.TPMProvisionFull, systemAndSnaps.InfosByType[snap.TypeKernel], gadgetInfo, &systemAndSnaps.SystemSnapdVersions)
if err != nil {
return nil, nil, nil, err
}
Expand All @@ -2273,10 +2236,11 @@ func (m *DeviceManager) SystemAndGadgetAndEncryptionInfo(wantedSystemLabel strin

type systemAndEssentialSnaps struct {
*System
Seed seed.Seed
InfosByType map[snap.Type]*snap.Info
CompsByType map[snap.Type][]install.ComponentSeedInfo
SeedSnapsByType map[snap.Type]*seed.Snap
Seed seed.Seed
SystemSnapdVersions install.SystemSnapdVersions
InfosByType map[snap.Type]*snap.Info
CompsByType map[snap.Type][]install.ComponentSeedInfo
SeedSnapsByType map[snap.Type]*seed.Snap
}

// DefaultRecoverySystem returns the default recovery system, if there is one.
Expand Down Expand Up @@ -2334,6 +2298,7 @@ func (m *DeviceManager) loadSystemAndEssentialSnaps(wantedSystemLabel string, ty
snapInfos := make(map[snap.Type]*snap.Info)
compInfos := make(map[snap.Type][]install.ComponentSeedInfo)
seedSnaps := make(map[snap.Type]*seed.Snap)
systemSnapdVersions := install.SystemSnapdVersions{}
for _, seedSnap := range s.EssentialSnaps() {
typ := seedSnap.EssentialType
if seedSnap.Path == "" {
Expand Down Expand Up @@ -2376,6 +2341,18 @@ func (m *DeviceManager) loadSystemAndEssentialSnaps(wantedSystemLabel string, ty
})
}
}
if typ == snap.TypeSnapd || typ == snap.TypeKernel {
snapdVersion, _, err := snap.SnapdInfoFromSnapFile(snapf, typ)
if err != nil {
return nil, err
}

Check warning on line 2348 in overlord/devicestate/devicemgr.go

View check run for this annotation

Codecov / codecov/patch

overlord/devicestate/devicemgr.go#L2347-L2348

Added lines #L2347 - L2348 were not covered by tests
switch typ {
case snap.TypeSnapd:
systemSnapdVersions.SnapdVersion = snapdVersion
case snap.TypeKernel:
systemSnapdVersions.SnapdInitramfsVersion = snapdVersion
}
}
seedSnaps[typ] = snapForMode
snapInfos[typ] = snapInfo
compInfos[typ] = compInfosForType
Expand All @@ -2385,11 +2362,12 @@ func (m *DeviceManager) loadSystemAndEssentialSnaps(wantedSystemLabel string, ty
}

return &systemAndEssentialSnaps{
System: sys,
Seed: s,
InfosByType: snapInfos,
CompsByType: compInfos,
SeedSnapsByType: seedSnaps,
System: sys,
Seed: s,
SystemSnapdVersions: systemSnapdVersions,
InfosByType: snapInfos,
CompsByType: compInfos,
SeedSnapsByType: seedSnaps,
}, nil
}

Expand Down
13 changes: 6 additions & 7 deletions overlord/devicestate/devicestate_install_mode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,15 +112,14 @@ func (s *deviceMgrInstallSuite) setupSystemSeed(c *C, sysLabel, gadgetYaml strin
{"pc-boot.img", ""}, {"pc-core.img", ""}, {"grubx64.efi", ""},
{"shim.efi.signed", ""}, {"grub.conf", ""}},
snap.R(1), "my-brand", s.StoreSigning.Database)
kernelFiles := [][]string{{"kernel.efi", ""}}
if _, ok := snapdVersionByType[snap.TypeKernel]; ok {
kernelFiles = append(kernelFiles, []string{"snapd-info", fmt.Sprintf("VERSION=%s", snapdVersionByType[snap.TypeKernel])})
}
if len(kModsRevs) > 0 {
s.MakeAssertedSnapWithComps(c,
seedtest.SampleSnapYaml["pc-kernel=24+kmods"],
[][]string{{"kernel.efi", ""}, {"snapd-info", fmt.Sprintf("VERSION=%s", snapdVersionByType[snap.TypeKernel])}},
snap.R(1), kModsRevs, "my-brand", s.StoreSigning.Database)
s.MakeAssertedSnapWithComps(c, seedtest.SampleSnapYaml["pc-kernel=24+kmods"], kernelFiles, snap.R(1), kModsRevs, "my-brand", s.StoreSigning.Database)
} else {
s.MakeAssertedSnap(c, seedtest.SampleSnapYaml["pc-kernel=24"],
[][]string{{"kernel.efi", ""}, {"snapd-info", fmt.Sprintf("VERSION=%s", snapdVersionByType[snap.TypeKernel])}},
snap.R(1), "my-brand", s.StoreSigning.Database)
s.MakeAssertedSnap(c, seedtest.SampleSnapYaml["pc-kernel=24"], kernelFiles, snap.R(1), "my-brand", s.StoreSigning.Database)
}

s.MakeAssertedSnapWithComps(c, seedtest.SampleSnapYaml["optional24"], nil, snap.R(1), nil, "my-brand", s.StoreSigning.Database)
Expand Down
5 changes: 5 additions & 0 deletions overlord/devicestate/devicestate_systems_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2907,6 +2907,11 @@ func (s *modelAndGadgetInfoSuite) makeMockUC20SeedWithGadgetYaml(c *C, label, ga
"architecture": "amd64",
"base": "core20",
"snaps": []interface{}{
map[string]interface{}{
"name": "snapd",
"id": seed20.AssertedSnapID("snapd"),
"type": "snapd",
},
map[string]interface{}{
"name": "pc-kernel",
"id": seed20.AssertedSnapID("pc-kernel"),
Expand Down
16 changes: 2 additions & 14 deletions overlord/devicestate/handlers_install.go
Original file line number Diff line number Diff line change
Expand Up @@ -1287,7 +1287,7 @@ func (m *DeviceManager) doInstallSetupStorageEncryption(t *state.Task, _ *tomb.T
}

systemAndSeeds, mntPtForType, _, unmount, err := m.loadAndMountSystemLabelSnapsUnlock(
st, systemLabel, []snap.Type{snap.TypeKernel, snap.TypeBase, snap.TypeGadget})
st, systemLabel, []snap.Type{snap.TypeSnapd, snap.TypeKernel, snap.TypeBase, snap.TypeGadget})
if err != nil {
return err
}
Expand All @@ -1303,19 +1303,7 @@ func (m *DeviceManager) doInstallSetupStorageEncryption(t *state.Task, _ *tomb.T
return fmt.Errorf("reading gadget information: %v", err)
}

var systemSnapdVersions *installLogic.SystemSnapdVersions
// Find snapd versions for snapd and kernel snaps in the seed for
// the passphrase/PINs auth checks.
// FDE is only supported in UC20+ (i.e. Model grade is set).
if systemAndSeeds.Model.Grade() != asserts.ModelGradeUnset {
// Snapd and kernel snaps are expected to exist in UC20+.
systemSnapdVersions, err = snapdVersionByTypeFromSeed20(systemAndSeeds.Seed, []snap.Type{snap.TypeSnapd, snap.TypeKernel})
if err != nil {
return err
}
}

encryptInfo, err := m.encryptionSupportInfo(systemAndSeeds.Model, secboot.TPMProvisionFull, systemAndSeeds.InfosByType[snap.TypeKernel], gadgetInfo, systemSnapdVersions)
encryptInfo, err := m.encryptionSupportInfo(systemAndSeeds.Model, secboot.TPMProvisionFull, systemAndSeeds.InfosByType[snap.TypeKernel], gadgetInfo, &systemAndSeeds.SystemSnapdVersions)
if err != nil {
return err
}
Expand Down

0 comments on commit 310cede

Please sign in to comment.