summaryrefslogtreecommitdiff
diff options
authorAlfonso Sánchez-Beato <alfonso.sanchez-beato@canonical.com>2023-05-16 15:45:34 +0100
committeralfonsosanchezbeato <alfonsosanchezbeato@yahoo.es>2023-05-23 10:02:58 +0200
commit2b285f17a6549f12157c469d544f9e77374d1a5e (patch)
treebab576478b4d9c92f573d087f3504808b2dcca63
parent170b08671840d292f3937c1fe7157d5a8fe5e281 (diff)
gadget: remove offset-write from gadget structure content
Using offset-write from an image in a gadget volume structure content was never implemented by ubuntu-image and does not seem too useful. Removing it and the related checks therefore.
-rw-r--r--gadget/gadget.go16
-rw-r--r--gadget/gadget_test.go20
-rw-r--r--gadget/layout.go35
-rw-r--r--gadget/layout_test.go62
4 files changed, 10 insertions, 123 deletions
diff --git a/gadget/gadget.go b/gadget/gadget.go
index 538f9c6122..20510a52a2 100644
--- a/gadget/gadget.go
+++ b/gadget/gadget.go
@@ -353,10 +353,6 @@ type VolumeContent struct {
Image string `yaml:"image" json:"image"`
// Offset the image is written at
Offset *quantity.Offset `yaml:"offset" json:"offset"`
- // OffsetWrite describes a 32-bit address, within the volume, at which
- // the offset of current image will be written. The position may be
- // specified as a byte offset relative to the start of a named structure
- OffsetWrite *RelativeOffset `yaml:"offset-write" json:"offset-write"`
// Size of the image, when empty size is calculated by looking at the
// image
Size quantity.Size `yaml:"size" json:"size"`
@@ -1180,16 +1176,6 @@ func validateCrossVolumeStructure(structures []VolumeStructure, knownStructures
// content relative offset only possible if it's a bare structure
continue
}
- for cidx, c := range ps.Content {
- if c.OffsetWrite == nil || c.OffsetWrite.RelativeTo == "" {
- continue
- }
- relativeToStructure := knownStructures[c.OffsetWrite.RelativeTo]
- if relativeToStructure == nil {
- return fmt.Errorf("structure %q, content %v refers to an unknown structure %q",
- ps.Name, fmtIndexAndName(cidx, c.Image), c.OffsetWrite.RelativeTo)
- }
- }
}
return nil
}
@@ -1359,7 +1345,7 @@ func validateBareContent(vc *VolumeContent) error {
}
func validateFilesystemContent(vc *VolumeContent) error {
- if vc.Image != "" || vc.Offset != nil || vc.OffsetWrite != nil || vc.Size != 0 {
+ if vc.Image != "" || vc.Offset != nil || vc.Size != 0 {
return fmt.Errorf("cannot use image content for non-bare file system")
}
if vc.UnresolvedSource == "" {
diff --git a/gadget/gadget_test.go b/gadget/gadget_test.go
index 85461e8af8..17f5e57d90 100644
--- a/gadget/gadget_test.go
+++ b/gadget/gadget_test.go
@@ -1669,29 +1669,12 @@ volumes:
content:
- image: pc-core.img
`
- gadgetYamlBadContentName := gadgetYamlHeader + `
- - name: other-name
- type: DA,21686148-6449-6E6F-744E-656564454649
- size: 1M
- offset: 1M
- offset-write: my-name-is+92
- content:
- - image: pc-core.img
- offset-write: bad-name+123
-`
err := ioutil.WriteFile(s.gadgetYamlPath, []byte(gadgetYamlBadStructureName), 0644)
c.Assert(err, IsNil)
_, err = gadget.ReadInfo(s.dir, nil)
c.Check(err, ErrorMatches, `invalid volume "pc": structure "other-name" refers to an unknown structure "bad-name"`)
-
- err = ioutil.WriteFile(s.gadgetYamlPath, []byte(gadgetYamlBadContentName), 0644)
- c.Assert(err, IsNil)
-
- _, err = gadget.ReadInfo(s.dir, nil)
- c.Check(err, ErrorMatches, `invalid volume "pc": structure "other-name", content #0 \("pc-core.img"\) refers to an unknown structure "bad-name"`)
-
}
func (s *gadgetYamlTestSuite) TestValidateStructureUpdatePreserveOnlyForFs(c *C) {
@@ -4018,7 +4001,6 @@ func (s *gadgetYamlTestSuite) TestGadgetInfoVolumeStructureInternalFieldsNoJSON(
Target: "some-target",
Image: "image",
Offset: asOffsetPtr(12),
- OffsetWrite: mustParseGadgetRelativeOffset(c, "mbr+192"),
Size: 321,
Unpack: true,
},
@@ -4031,7 +4013,7 @@ func (s *gadgetYamlTestSuite) TestGadgetInfoVolumeStructureInternalFieldsNoJSON(
b, err := json.Marshal(volS)
c.Assert(err, IsNil)
// ensure the json looks json-ish
- c.Check(string(b), Equals, `{"name":"pc","filesystem-label":"ubuntu-seed","offset":123,"offset-write":{"relative-to":"mbr","offset":92},"min-size":0,"size":888,"type":"0C","role":"system-seed","id":"gpt-id","filesystem":"vfat","content":[{"source":"source","target":"some-target","image":"image","offset":12,"offset-write":{"relative-to":"mbr","offset":192},"size":321,"unpack":true}],"update":{"edition":2,"preserve":["foo"]}}`)
+ c.Check(string(b), Equals, `{"name":"pc","filesystem-label":"ubuntu-seed","offset":123,"offset-write":{"relative-to":"mbr","offset":92},"min-size":0,"size":888,"type":"0C","role":"system-seed","id":"gpt-id","filesystem":"vfat","content":[{"source":"source","target":"some-target","image":"image","offset":12,"size":321,"unpack":true}],"update":{"edition":2,"preserve":["foo"]}}`)
// check that the new structure has no volumeName
var newVolS *gadget.VolumeStructure
diff --git a/gadget/layout.go b/gadget/layout.go
index 0a0f21086b..d3214bb71d 100644
--- a/gadget/layout.go
+++ b/gadget/layout.go
@@ -150,9 +150,6 @@ type LaidOutContent struct {
// StartOffset defines the start offset of this content image
StartOffset quantity.Offset
- // AbsoluteOffsetWrite is the resolved absolute position of offset-write
- // for this content element within the enclosing volume
- AbsoluteOffsetWrite *quantity.Offset
// Size is the maximum size occupied by this image
Size quantity.Size
// Index of the content in structure declaration inside gadget YAML
@@ -178,9 +175,8 @@ type ResolvedContent struct {
KernelUpdate bool
}
-func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, byName map[string]*LaidOutStructure, err error) {
+func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, err error) {
structures = make([]LaidOutStructure, len(volume.Structure))
- byName = make(map[string]*LaidOutStructure, len(volume.Structure))
// Even although we do not have the final offset as that depends on the
// state of the installation disk and we do not know at this point, we
@@ -192,9 +188,6 @@ func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, byNa
VolumeStructure: &volume.Structure[idx],
}
- if ps.Name() != "" {
- byName[ps.Name()] = &ps
- }
if volume.Structure[idx].Offset != nil {
offset = *volume.Structure[idx].Offset
}
@@ -217,23 +210,23 @@ func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, byNa
previousEnd := quantity.Offset(0)
for idx, ps := range structures {
if ps.StartOffset < previousEnd {
- return nil, nil, fmt.Errorf("cannot lay out volume, structure %v overlaps with preceding structure %v", ps, structures[idx-1])
+ return nil, fmt.Errorf("cannot lay out volume, structure %v overlaps with preceding structure %v", ps, structures[idx-1])
}
previousEnd = ps.StartOffset + quantity.Offset(ps.VolumeStructure.Size)
offsetWrite, err := resolveOffsetWrite(ps.VolumeStructure.OffsetWrite, byName)
if err != nil {
- return nil, nil, fmt.Errorf("cannot resolve offset-write of structure %v: %v", ps, err)
+ return nil, fmt.Errorf("cannot resolve offset-write of structure %v: %v", ps, err)
}
structures[idx].AbsoluteOffsetWrite = offsetWrite
}
- return structures, byName, nil
+ return structures, nil
}
// LayoutVolumePartially attempts to lay out only the structures in the volume.
func LayoutVolumePartially(volume *Volume) (*PartiallyLaidOutVolume, error) {
- structures, _, err := layoutVolumeStructures(volume)
+ structures, err := layoutVolumeStructures(volume)
if err != nil {
return nil, err
}
@@ -283,7 +276,7 @@ func LayoutVolume(volume *Volume, opts *LayoutOptions) (*LaidOutVolume, error) {
}
}
- structures, byName, err := layoutVolumeStructures(volume)
+ structures, err := layoutVolumeStructures(volume)
if err != nil {
return nil, err
}
@@ -308,15 +301,10 @@ func LayoutVolume(volume *Volume, opts *LayoutOptions) (*LaidOutVolume, error) {
// has a size so even without the structure content the layout
// can be calculated.
if !opts.IgnoreContent {
- content, err := layOutStructureContent(opts.GadgetRootDir, &structures[idx], byName)
+ content, err := layOutStructureContent(opts.GadgetRootDir, &structures[idx])
if err != nil {
return nil, err
}
- for _, c := range content {
- if c.AbsoluteOffsetWrite != nil && *c.AbsoluteOffsetWrite > fartherstOffsetWrite {
- fartherstOffsetWrite = *c.AbsoluteOffsetWrite
- }
- }
structures[idx].LaidOutContent = content
}
@@ -448,7 +436,7 @@ func getImageSize(path string) (quantity.Size, error) {
return quantity.Size(stat.Size()), nil
}
-func layOutStructureContent(gadgetRootDir string, ps *LaidOutStructure, known map[string]*LaidOutStructure) ([]LaidOutContent, error) {
+func layOutStructureContent(gadgetRootDir string, ps *LaidOutStructure) ([]LaidOutContent, error) {
if ps.HasFilesystem() {
// structures with a filesystem do not need any extra layout
return nil, nil
@@ -482,18 +470,11 @@ func layOutStructureContent(gadgetRootDir string, ps *LaidOutStructure, known ma
actualSize = c.Size
}
- offsetWrite, err := resolveOffsetWrite(c.OffsetWrite, known)
- if err != nil {
- return nil, fmt.Errorf("cannot resolve offset-write of structure %v content %q: %v", ps, c.Image, err)
- }
-
content[idx] = LaidOutContent{
VolumeContent: &ps.VolumeStructure.Content[idx],
Size: actualSize,
StartOffset: ps.StartOffset + start,
Index: idx,
- // break for gofmt < 1.11
- AbsoluteOffsetWrite: offsetWrite,
}
previousEnd = start + quantity.Offset(actualSize)
if quantity.Size(previousEnd) > ps.VolumeStructure.Size {
diff --git a/gadget/layout_test.go b/gadget/layout_test.go
index d9df478350..4446394038 100644
--- a/gadget/layout_test.go
+++ b/gadget/layout_test.go
@@ -916,8 +916,6 @@ volumes:
VolumeContent: &vol.Structure[1].Content[0],
Size: 200 * quantity.SizeKiB,
StartOffset: 1 * quantity.OffsetMiB,
- // offset-write: bar+10
- AbsoluteOffsetWrite: asOffsetPtr(2*quantity.OffsetMiB + 10),
},
},
}, {
@@ -936,8 +934,6 @@ volumes:
VolumeContent: &vol.Structure[2].Content[0],
Size: 150 * quantity.SizeKiB,
StartOffset: 2 * quantity.OffsetMiB,
- // offset-write: bar+10
- AbsoluteOffsetWrite: asOffsetPtr(450),
},
},
},
@@ -961,25 +957,6 @@ func (p *layoutTestSuite) TestLayoutVolumeOffsetWriteBadRelativeTo(c *C) {
},
},
}
- volBadContent := gadget.Volume{
- Structure: []gadget.VolumeStructure{
- {
- Name: "foo",
- Type: "DA,21686148-6449-6E6F-744E-656564454649",
- Offset: asOffsetPtr(0),
- Size: 1 * quantity.SizeMiB,
- Content: []gadget.VolumeContent{
- {
- Image: "foo.img",
- OffsetWrite: &gadget.RelativeOffset{
- RelativeTo: "bar",
- Offset: 10,
- },
- },
- },
- },
- },
- }
makeSizedFile(c, filepath.Join(p.dir, "foo.img"), 200*quantity.SizeKiB, []byte(""))
@@ -987,10 +964,6 @@ func (p *layoutTestSuite) TestLayoutVolumeOffsetWriteBadRelativeTo(c *C) {
v, err := gadget.LayoutVolume(&volBadStructure, opts)
c.Check(v, IsNil)
c.Check(err, ErrorMatches, `cannot resolve offset-write of structure #0 \("foo"\): refers to an unknown structure "bar"`)
-
- v, err = gadget.LayoutVolume(&volBadContent, opts)
- c.Check(v, IsNil)
- c.Check(err, ErrorMatches, `cannot resolve offset-write of structure #0 \("foo"\) content "foo.img": refers to an unknown structure "bar"`)
}
func (p *layoutTestSuite) TestLayoutVolumeOffsetWriteEnlargesVolume(c *C) {
@@ -1017,41 +990,6 @@ volumes:
c.Assert(err, IsNil)
// offset-write is at 1GB
c.Check(v.Size, Equals, 1*quantity.SizeGiB+gadget.SizeLBA48Pointer)
-
- var gadgetYamlContent = `
-volumes:
- pc:
- bootloader: grub
- structure:
- - name: mbr
- type: mbr
- size: 440
- - name: foo
- type: DA,21686148-6449-6E6F-744E-656564454649
- size: 1M
- offset: 1M
- content:
- - image: foo.img
- # 2GB
- offset-write: mbr+2147483648
- - image: bar.img
- # 1GB
- offset-write: mbr+1073741824
- - image: baz.img
- # 3GB
- offset-write: mbr+3221225472
-
-`
- makeSizedFile(c, filepath.Join(p.dir, "foo.img"), 200*quantity.SizeKiB, []byte(""))
- makeSizedFile(c, filepath.Join(p.dir, "bar.img"), 150*quantity.SizeKiB, []byte(""))
- makeSizedFile(c, filepath.Join(p.dir, "baz.img"), 100*quantity.SizeKiB, []byte(""))
-
- vol = mustParseVolume(c, gadgetYamlContent, "pc")
-
- v, err = gadget.LayoutVolume(vol, opts)
- c.Assert(err, IsNil)
- // foo.img offset-write is at 3GB
- c.Check(v.Size, Equals, 3*quantity.SizeGiB+gadget.SizeLBA48Pointer)
}
func (p *layoutTestSuite) TestLayoutVolumePartialNoSuchFile(c *C) {