summaryrefslogtreecommitdiff
diff options
authorMichael Vogt <mvo@ubuntu.com>2020-08-07 17:03:19 +0200
committerMichael Vogt <mvo@ubuntu.com>2020-08-07 20:06:40 +0200
commitbd0b6317b600e8561fc5e77f967054d59c8086c1 (patch)
tree8529d5b06b1c0c29ca7798d8a8f981a523c98a48
parent1bd5fed8636fffd3b707dbfb196baebd3ae93d76 (diff)
-rw-r--r--gadget/gadget.go8
-rw-r--r--gadget/gadget_test.go42
-rw-r--r--gadget/install/content.go10
-rw-r--r--gadget/install/content_test.go4
-rw-r--r--gadget/install/install.go6
-rw-r--r--gadget/install/install_test.go4
-rw-r--r--gadget/install/partition_test.go2
-rw-r--r--gadget/mountedfilesystem.go1
-rw-r--r--gadget/ondisk_test.go2
-rw-r--r--overlord/devicestate/devicestate_install_mode_test.go6
-rw-r--r--overlord/devicestate/export_test.go2
-rw-r--r--overlord/devicestate/handlers_install.go2
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)