diff options
| author | Michael Vogt <mvo@ubuntu.com> | 2020-08-07 17:03:19 +0200 |
|---|---|---|
| committer | Michael Vogt <mvo@ubuntu.com> | 2020-08-07 20:06:40 +0200 |
| commit | bd0b6317b600e8561fc5e77f967054d59c8086c1 (patch) | |
| tree | 8529d5b06b1c0c29ca7798d8a8f981a523c98a48 | |
| parent | 1bd5fed8636fffd3b707dbfb196baebd3ae93d76 (diff) | |
WIPkernel-yaml
| -rw-r--r-- | gadget/gadget.go | 8 | ||||
| -rw-r--r-- | gadget/gadget_test.go | 42 | ||||
| -rw-r--r-- | gadget/install/content.go | 10 | ||||
| -rw-r--r-- | gadget/install/content_test.go | 4 | ||||
| -rw-r--r-- | gadget/install/install.go | 6 | ||||
| -rw-r--r-- | gadget/install/install_test.go | 4 | ||||
| -rw-r--r-- | gadget/install/partition_test.go | 2 | ||||
| -rw-r--r-- | gadget/mountedfilesystem.go | 1 | ||||
| -rw-r--r-- | gadget/ondisk_test.go | 2 | ||||
| -rw-r--r-- | overlord/devicestate/devicestate_install_mode_test.go | 6 | ||||
| -rw-r--r-- | overlord/devicestate/export_test.go | 2 | ||||
| -rw-r--r-- | overlord/devicestate/handlers_install.go | 2 |
12 files changed, 67 insertions, 22 deletions
diff --git a/gadget/gadget.go b/gadget/gadget.go index 54415a0fff..460da265a0 100644 --- a/gadget/gadget.go +++ b/gadget/gadget.go @@ -176,6 +176,12 @@ func (vs *VolumeStructure) EffectiveFilesystemLabel() string { // either files within a filesystem described by the structure or raw images // written into the area of a bare structure. type VolumeContent struct { + // XXX: make this abolute to avoid having to juggle gadget/kernel + // roots + // XXX2: add something like "ResolveAllVolumeSources()" or similar. + // E.g. gadget.Info(gadget.KernelInfo) would resolves all + // $kernel + // // Source is the data of the partition relative to the gadget base // directory Source string `yaml:"source"` @@ -988,7 +994,7 @@ func IsCompatible(current, new *Info) error { // PositionedVolumeFromGadget takes a gadget rootdir and positions the // partitions as specified. -func PositionedVolumeFromGadget(gadgetRoot string) (*LaidOutVolume, error) { +func PositionedVolumeFromGadget(gadgetRoot, kernelRoot string) (*LaidOutVolume, error) { // TODO:UC20: since this is unconstrained via the model, it returns an // err == nil and an empty info when the gadgetRoot does not // actually contain the required gadget.yaml file (for example diff --git a/gadget/gadget_test.go b/gadget/gadget_test.go index 01f03def3a..05d4fb0fbf 100644 --- a/gadget/gadget_test.go +++ b/gadget/gadget_test.go @@ -1701,7 +1701,7 @@ func (s *gadgetYamlTestSuite) TestPositionedVolumeFromGadgetMultiVolume(c *C) { err := ioutil.WriteFile(s.gadgetYamlPath, mockMultiVolumeGadgetYaml, 0644) c.Assert(err, IsNil) - _, err = gadget.PositionedVolumeFromGadget(s.dir) + _, err = gadget.PositionedVolumeFromGadget(s.dir, "") c.Assert(err, ErrorMatches, "cannot position multiple volumes yet") } @@ -1713,7 +1713,7 @@ func (s *gadgetYamlTestSuite) TestPositionedVolumeFromGadgetHappy(c *C) { c.Assert(err, IsNil) } - lv, err := gadget.PositionedVolumeFromGadget(s.dir) + lv, err := gadget.PositionedVolumeFromGadget(s.dir, "") c.Assert(err, IsNil) c.Assert(lv.Volume.Bootloader, Equals, "grub") // mbr, bios-boot, efi-system @@ -1800,6 +1800,44 @@ func (s *gadgetYamlTestSuite) TestReadGadgetYamlFromSnapFileValid(c *C) { }) } +var gadgetYamlRPiFromKernel = []byte(` +device-tree: bcm2709-rpi-2-b +volumes: + pi: + schema: mbr + bootloader: u-boot + structure: + - type: 0C + filesystem: vfat + filesystem-label: system-boot + size: 128M + content: + - source: $kernel:pi-dtbs/boot-assets/ + target: / +`) + +// XXX: ensure this matches the real kernel yaml +var kernelYamlRPi = []byte(` +assets: + pi-dtbs: + edition: 1 + content: + - boot-assets/ +`) + +func (s *gadgetYamlTestSuite) TestMergeKernelYaml(c *C) { + gi, err := gadget.InfoFromGadgetYaml(gadgetYamlRPiFromKernel, coreConstraints) + c.Assert(err, IsNil) + ki, err := gadget.KernelInfoFromKernelYaml(kernelYamlRPi) + c.Assert(err, IsNil) + + c.Check(gi.Volumes["pi"].Structure[0].Content, DeepEquals, []gadget.VolumeContent{ + {Source: "$kernel:pi-dtbs/boot-assets/", Target: "/"}, + }) + // XXX: test doing stuff with kernel refs + fmt.Println(gi, ki) +} + type gadgetCompatibilityTestSuite struct{} var _ = Suite(&gadgetCompatibilityTestSuite{}) diff --git a/gadget/install/content.go b/gadget/install/content.go index cd4e883ee2..159750c535 100644 --- a/gadget/install/content.go +++ b/gadget/install/content.go @@ -52,16 +52,16 @@ func makeFilesystem(ds *gadget.OnDiskStructure) error { // writeContent populates the given on-disk structure, according to the contents // defined in the gadget. -func writeContent(ds *gadget.OnDiskStructure, gadgetRoot string, observer gadget.ContentObserver) error { +func writeContent(ds *gadget.OnDiskStructure, gadgetRoot, kernelRoot string, observer gadget.ContentObserver) error { switch { case !ds.IsPartition(): return fmt.Errorf("cannot write non-partitions yet") case !ds.HasFilesystem(): - if err := writeNonFSContent(ds, gadgetRoot); err != nil { + if err := writeNonFSContent(ds, gadgetRoot, kernelRoot); err != nil { return err } case ds.HasFilesystem(): - if err := writeFilesystemContent(ds, gadgetRoot, observer); err != nil { + if err := writeFilesystemContent(ds, gadgetRoot, kernelRoot, observer); err != nil { return err } } @@ -90,7 +90,7 @@ func mountFilesystem(ds *gadget.OnDiskStructure, baseMntPoint string) error { return nil } -func writeFilesystemContent(ds *gadget.OnDiskStructure, gadgetRoot string, observer gadget.ContentObserver) (err error) { +func writeFilesystemContent(ds *gadget.OnDiskStructure, gadgetRoot, kernelRoot string, observer gadget.ContentObserver) (err error) { mountpoint := filepath.Join(contentMountpoint, strconv.Itoa(ds.Index)) if err := os.MkdirAll(mountpoint, 0755); err != nil { return err @@ -119,7 +119,7 @@ func writeFilesystemContent(ds *gadget.OnDiskStructure, gadgetRoot string, obser return nil } -func writeNonFSContent(ds *gadget.OnDiskStructure, gadgetRoot string) error { +func writeNonFSContent(ds *gadget.OnDiskStructure, gadgetRoot, kernelRoot string) error { f, err := os.OpenFile(ds.Node, os.O_RDWR, 0644) if err != nil { return fmt.Errorf("cannot write bare content for %q: %v", ds.Node, err) diff --git a/gadget/install/content_test.go b/gadget/install/content_test.go index 6a4be107f1..b290f7b837 100644 --- a/gadget/install/content_test.go +++ b/gadget/install/content_test.go @@ -244,7 +244,7 @@ func (s *contentTestSuite) TestWriteFilesystemContent(c *C) { observeErr: tc.observeErr, expectedStruct: &m.LaidOutStructure, } - err := install.WriteContent(&m, s.gadgetRoot, obs) + err := install.WriteContent(&m, s.gadgetRoot, "", obs) if tc.err == "" { c.Assert(err, IsNil) } else { @@ -283,7 +283,7 @@ func (s *contentTestSuite) TestWriteRawContent(c *C) { }, } - err = install.WriteContent(&m, s.gadgetRoot, nil) + err = install.WriteContent(&m, s.gadgetRoot, "", nil) c.Assert(err, IsNil) content, err := ioutil.ReadFile(m.Node) diff --git a/gadget/install/install.go b/gadget/install/install.go index bb0633ca1f..54f24740c4 100644 --- a/gadget/install/install.go +++ b/gadget/install/install.go @@ -51,7 +51,7 @@ func deviceFromRole(lv *gadget.LaidOutVolume, role string) (device string, err e // Run bootstraps the partitions of a device, by either creating // missing ones or recreating installed ones. -func Run(gadgetRoot, device string, options Options, observer gadget.ContentObserver) error { +func Run(gadgetRoot, kernelRoot, device string, options Options, observer gadget.ContentObserver) error { if options.Encrypt && (options.KeyFile == "" || options.RecoveryKeyFile == "") { return fmt.Errorf("key file and recovery key file must be specified when encrypting") } @@ -60,7 +60,7 @@ func Run(gadgetRoot, device string, options Options, observer gadget.ContentObse return fmt.Errorf("cannot use empty gadget root directory") } - lv, err := gadget.PositionedVolumeFromGadget(gadgetRoot) + lv, err := gadget.PositionedVolumeFromGadget(gadgetRoot, kernelRoot) if err != nil { return fmt.Errorf("cannot layout the volume: %v", err) } @@ -142,7 +142,7 @@ func Run(gadgetRoot, device string, options Options, observer gadget.ContentObse return err } - if err := writeContent(&part, gadgetRoot, observer); err != nil { + if err := writeContent(&part, gadgetRoot, kernelRoot, observer); err != nil { return err } diff --git a/gadget/install/install_test.go b/gadget/install/install_test.go index c03f91592c..bb740354e5 100644 --- a/gadget/install/install_test.go +++ b/gadget/install/install_test.go @@ -57,7 +57,7 @@ func (s *installSuite) SetUpTest(c *C) { } func (s *installSuite) TestInstallRunError(c *C) { - err := install.Run("", "", install.Options{}, nil) + err := install.Run("", "", "", install.Options{}, nil) c.Assert(err, ErrorMatches, "cannot use empty gadget root directory") } @@ -347,7 +347,7 @@ func layoutFromYaml(c *C, gadgetYaml string) *gadget.LaidOutVolume { c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(gadgetRoot, "meta", "gadget.yaml"), []byte(gadgetYaml), 0644) c.Assert(err, IsNil) - pv, err := gadget.PositionedVolumeFromGadget(gadgetRoot) + pv, err := gadget.PositionedVolumeFromGadget(gadgetRoot, "") c.Assert(err, IsNil) return pv } diff --git a/gadget/install/partition_test.go b/gadget/install/partition_test.go index f46a721a57..824b8d2865 100644 --- a/gadget/install/partition_test.go +++ b/gadget/install/partition_test.go @@ -188,7 +188,7 @@ func (s *partitionTestSuite) TestCreatePartitions(c *C) { gadgetRoot := filepath.Join(c.MkDir(), "gadget") err := makeMockGadget(gadgetRoot, gadgetContent) c.Assert(err, IsNil) - pv, err := gadget.PositionedVolumeFromGadget(gadgetRoot) + pv, err := gadget.PositionedVolumeFromGadget(gadgetRoot, "") c.Assert(err, IsNil) dl, err := gadget.OnDiskVolumeFromDevice("/dev/node") diff --git a/gadget/mountedfilesystem.go b/gadget/mountedfilesystem.go index 389898f9c4..445a75ac1f 100644 --- a/gadget/mountedfilesystem.go +++ b/gadget/mountedfilesystem.go @@ -62,6 +62,7 @@ func checkContent(content *VolumeContent) error { // MountedFilesystemWriter assists in writing contents of a structure to a // mounted filesystem. type MountedFilesystemWriter struct { + // split into gadgetContentDIr, kernelContentDir contentDir string ps *LaidOutStructure observer ContentObserver diff --git a/gadget/ondisk_test.go b/gadget/ondisk_test.go index 28db2c25e8..c42a6176be 100644 --- a/gadget/ondisk_test.go +++ b/gadget/ondisk_test.go @@ -414,7 +414,7 @@ func (s *ondiskTestSuite) TestBuildPartitionList(c *C) { }, } - pv, err := gadget.PositionedVolumeFromGadget(s.gadgetRoot) + pv, err := gadget.PositionedVolumeFromGadget(s.gadgetRoot, "") c.Assert(err, IsNil) dl, err := gadget.OnDiskVolumeFromPartitionTable(ptable) diff --git a/overlord/devicestate/devicestate_install_mode_test.go b/overlord/devicestate/devicestate_install_mode_test.go index 5f4d5fca44..063c67e3b5 100644 --- a/overlord/devicestate/devicestate_install_mode_test.go +++ b/overlord/devicestate/devicestate_install_mode_test.go @@ -177,7 +177,7 @@ func (s *deviceMgrInstallModeSuite) doRunChangeTestWithEncryption(c *C, grade st var brOpts install.Options var installRunCalled int var sealingObserver gadget.ContentObserver - restore = devicestate.MockInstallRun(func(gadgetRoot, device string, options install.Options, obs gadget.ContentObserver) error { + restore = devicestate.MockInstallRun(func(gadgetRoot, kernelRoot, device string, options install.Options, obs gadget.ContentObserver) error { // ensure we can grab the lock here, i.e. that it's not taken s.state.Lock() s.state.Unlock() @@ -296,7 +296,7 @@ func (s *deviceMgrInstallModeSuite) TestInstallTaskErrors(c *C) { restore := release.MockOnClassic(false) defer restore() - restore = devicestate.MockInstallRun(func(gadgetRoot, device string, options install.Options, _ gadget.ContentObserver) error { + restore = devicestate.MockInstallRun(func(gadgetRoot, kernelRoot, device string, options install.Options, _ gadget.ContentObserver) error { return fmt.Errorf("The horror, The horror") }) defer restore() @@ -412,7 +412,7 @@ func (s *deviceMgrInstallModeSuite) mockInstallModeChange(c *C, modelGrade, gadg restore := release.MockOnClassic(false) defer restore() - restore = devicestate.MockInstallRun(func(gadgetRoot, device string, options install.Options, _ gadget.ContentObserver) error { + restore = devicestate.MockInstallRun(func(gadgetRoot, kernelRoot, device string, options install.Options, _ gadget.ContentObserver) error { return nil }) defer restore() diff --git a/overlord/devicestate/export_test.go b/overlord/devicestate/export_test.go index e58754d6e4..8b2f95707b 100644 --- a/overlord/devicestate/export_test.go +++ b/overlord/devicestate/export_test.go @@ -248,7 +248,7 @@ func MockSysconfigConfigureRunSystem(f func(opts *sysconfig.Options) error) (res } } -func MockInstallRun(f func(gadgetRoot, device string, options install.Options, observer gadget.ContentObserver) error) (restore func()) { +func MockInstallRun(f func(gadgetRoot, kernelRoot, device string, options install.Options, observer gadget.ContentObserver) error) (restore func()) { old := installRun installRun = f return func() { diff --git a/overlord/devicestate/handlers_install.go b/overlord/devicestate/handlers_install.go index 6ca4db1b95..012bc71133 100644 --- a/overlord/devicestate/handlers_install.go +++ b/overlord/devicestate/handlers_install.go @@ -139,7 +139,7 @@ func (m *DeviceManager) doSetupRunSystem(t *state.Task, _ *tomb.Tomb) error { func() { st.Unlock() defer st.Lock() - err = installRun(gadgetDir, "", bopts, sealingContentObserver) + err = installRun(gadgetDir, kernelDir, "", bopts, sealingContentObserver) }() if err != nil { return fmt.Errorf("cannot create partitions: %v", err) |
