From 86118960b9a3ced310236ab5e8b01897c3cb3b04 Mon Sep 17 00:00:00 2001 From: Achilleas Koutsou Date: Tue, 8 Feb 2022 20:51:26 +0100 Subject: [PATCH] osbuild2: deduplicate mkfsStages() function Use a single GenMkfsStages() function from osbuild2 instead of implementing it multiple times in distros. Co-Authored-By: Christian Kellner --- internal/distro/rhel85/pipelines.go | 62 +----------------------- internal/distro/rhel86/pipelines.go | 62 +----------------------- internal/distro/rhel90/pipelines.go | 62 +----------------------- internal/distro/rhel90beta/pipelines.go | 60 +---------------------- internal/osbuild2/mkfs_stage.go | 64 +++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 239 deletions(-) create mode 100644 internal/osbuild2/mkfs_stage.go diff --git a/internal/distro/rhel85/pipelines.go b/internal/distro/rhel85/pipelines.go index 012b6a011..637b4d9ea 100644 --- a/internal/distro/rhel85/pipelines.go +++ b/internal/distro/rhel85/pipelines.go @@ -5,7 +5,6 @@ import ( "math/rand" "path" "path/filepath" - "strings" "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/common" @@ -973,7 +972,7 @@ func simplifiedInstallerBootISOTreePipeline(archivePipelineName, kver string) *o loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: filename}) p.AddStage(osbuild.NewTruncateStage(&osbuild.TruncateStageOptions{Filename: filename, Size: fmt.Sprintf("%d", pt.Size)})) - for _, stage := range mkfsStages(&pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(&pt, loopback) { p.AddStage(stage) } @@ -1228,7 +1227,7 @@ func liveImagePipeline(inputPipelineName string, outputFilename string, pt *disk loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: outputFilename}) p.AddStage(osbuild.NewSfdiskStage(sfOptions, loopback)) - for _, stage := range mkfsStages(pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(pt, loopback) { p.AddStage(stage) } @@ -1253,63 +1252,6 @@ func xzArchivePipeline(inputPipelineName, inputFilename, outputFilename string) return p } -// mkfsStages generates a list of org.osbuild.mkfs.* stages based on a -// partition table description for a single device node -func mkfsStages(pt *disk.PartitionTable, device *osbuild.Device) []*osbuild2.Stage { - stages := make([]*osbuild2.Stage, 0, len(pt.Partitions)) - - // assume loopback device for simplicity since it's the only one currently supported - // panic if the conversion fails - devOptions, ok := device.Options.(*osbuild.LoopbackDeviceOptions) - if !ok { - panic("mkfsStages: failed to convert device options to loopback options") - } - - for _, p := range pt.Partitions { - if p.Payload == nil { - // no filesystem for partition (e.g., BIOS boot) - continue - } - var stage *osbuild.Stage - stageDevice := osbuild.NewLoopbackDevice( - &osbuild.LoopbackDeviceOptions{ - Filename: devOptions.Filename, - Start: pt.BytesToSectors(p.Start), - Size: pt.BytesToSectors(p.Size), - }, - ) - switch p.Payload.Type { - case "xfs": - options := &osbuild.MkfsXfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsXfsStage(options, stageDevice) - case "vfat": - options := &osbuild.MkfsFATStageOptions{ - VolID: strings.Replace(p.Payload.UUID, "-", "", -1), - } - stage = osbuild.NewMkfsFATStage(options, stageDevice) - case "btrfs": - options := &osbuild.MkfsBtrfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsBtrfsStage(options, stageDevice) - case "ext4": - options := &osbuild.MkfsExt4StageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsExt4Stage(options, stageDevice) - default: - panic("unknown fs type " + p.Type) - } - stages = append(stages, stage) - } - return stages -} - func qemuPipeline(inputPipelineName, inputFilename, outputFilename, format, qcow2Compat string) *osbuild.Pipeline { p := new(osbuild.Pipeline) p.Name = format diff --git a/internal/distro/rhel86/pipelines.go b/internal/distro/rhel86/pipelines.go index 2b58ffad2..d99d639a9 100644 --- a/internal/distro/rhel86/pipelines.go +++ b/internal/distro/rhel86/pipelines.go @@ -5,7 +5,6 @@ import ( "math/rand" "path" "path/filepath" - "strings" "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/common" @@ -711,7 +710,7 @@ func simplifiedInstallerBootISOTreePipeline(archivePipelineName, kver string) *o loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: filename}) p.AddStage(osbuild.NewTruncateStage(&osbuild.TruncateStageOptions{Filename: filename, Size: fmt.Sprintf("%d", pt.Size)})) - for _, stage := range mkfsStages(&pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(&pt, loopback) { p.AddStage(stage) } @@ -952,7 +951,7 @@ func liveImagePipeline(inputPipelineName string, outputFilename string, pt *disk loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: outputFilename}) p.AddStage(osbuild.NewSfdiskStage(sfOptions, loopback)) - for _, stage := range mkfsStages(pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(pt, loopback) { p.AddStage(stage) } @@ -977,63 +976,6 @@ func xzArchivePipeline(inputPipelineName, inputFilename, outputFilename string) return p } -// mkfsStages generates a list of org.osbuild.mkfs.* stages based on a -// partition table description for a single device node -func mkfsStages(pt *disk.PartitionTable, device *osbuild.Device) []*osbuild.Stage { - stages := make([]*osbuild.Stage, 0, len(pt.Partitions)) - - // assume loopback device for simplicity since it's the only one currently supported - // panic if the conversion fails - devOptions, ok := device.Options.(*osbuild.LoopbackDeviceOptions) - if !ok { - panic("mkfsStages: failed to convert device options to loopback options") - } - - for _, p := range pt.Partitions { - if p.Payload == nil { - // no filesystem for partition (e.g., BIOS boot) - continue - } - var stage *osbuild.Stage - stageDevice := osbuild.NewLoopbackDevice( - &osbuild.LoopbackDeviceOptions{ - Filename: devOptions.Filename, - Start: pt.BytesToSectors(p.Start), - Size: pt.BytesToSectors(p.Size), - }, - ) - switch p.Payload.Type { - case "xfs": - options := &osbuild.MkfsXfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsXfsStage(options, stageDevice) - case "vfat": - options := &osbuild.MkfsFATStageOptions{ - VolID: strings.Replace(p.Payload.UUID, "-", "", -1), - } - stage = osbuild.NewMkfsFATStage(options, stageDevice) - case "btrfs": - options := &osbuild.MkfsBtrfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsBtrfsStage(options, stageDevice) - case "ext4": - options := &osbuild.MkfsExt4StageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsExt4Stage(options, stageDevice) - default: - panic("unknown fs type " + p.Type) - } - stages = append(stages, stage) - } - return stages -} - func qemuPipeline(inputPipelineName, inputFilename, outputFilename, format, qcow2Compat string) *osbuild.Pipeline { p := new(osbuild.Pipeline) p.Name = format diff --git a/internal/distro/rhel90/pipelines.go b/internal/distro/rhel90/pipelines.go index a085ed0c0..a7e5f0d41 100644 --- a/internal/distro/rhel90/pipelines.go +++ b/internal/distro/rhel90/pipelines.go @@ -5,7 +5,6 @@ import ( "math/rand" "path" "path/filepath" - "strings" "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/common" @@ -707,7 +706,7 @@ func simplifiedInstallerBootISOTreePipeline(archivePipelineName, kver string, rn loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: filename}) p.AddStage(osbuild.NewTruncateStage(&osbuild.TruncateStageOptions{Filename: filename, Size: fmt.Sprintf("%d", pt.Size)})) - for _, stage := range mkfsStages(&pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(&pt, loopback) { p.AddStage(stage) } @@ -948,7 +947,7 @@ func liveImagePipeline(inputPipelineName string, outputFilename string, pt *disk loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: outputFilename}) p.AddStage(osbuild.NewSfdiskStage(sfOptions, loopback)) - for _, stage := range mkfsStages(pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(pt, loopback) { p.AddStage(stage) } @@ -973,63 +972,6 @@ func xzArchivePipeline(inputPipelineName, inputFilename, outputFilename string) return p } -// mkfsStages generates a list of org.osbuild.mkfs.* stages based on a -// partition table description for a single device node -func mkfsStages(pt *disk.PartitionTable, device *osbuild.Device) []*osbuild.Stage { - stages := make([]*osbuild.Stage, 0, len(pt.Partitions)) - - // assume loopback device for simplicity since it's the only one currently supported - // panic if the conversion fails - devOptions, ok := device.Options.(*osbuild.LoopbackDeviceOptions) - if !ok { - panic("mkfsStages: failed to convert device options to loopback options") - } - - for _, p := range pt.Partitions { - if p.Payload == nil { - // no filesystem for partition (e.g., BIOS boot) - continue - } - var stage *osbuild.Stage - stageDevice := osbuild.NewLoopbackDevice( - &osbuild.LoopbackDeviceOptions{ - Filename: devOptions.Filename, - Start: pt.BytesToSectors(p.Start), - Size: pt.BytesToSectors(p.Size), - }, - ) - switch p.Payload.Type { - case "xfs": - options := &osbuild.MkfsXfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsXfsStage(options, stageDevice) - case "vfat": - options := &osbuild.MkfsFATStageOptions{ - VolID: strings.Replace(p.Payload.UUID, "-", "", -1), - } - stage = osbuild.NewMkfsFATStage(options, stageDevice) - case "btrfs": - options := &osbuild.MkfsBtrfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsBtrfsStage(options, stageDevice) - case "ext4": - options := &osbuild.MkfsExt4StageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsExt4Stage(options, stageDevice) - default: - panic("unknown fs type " + p.Type) - } - stages = append(stages, stage) - } - return stages -} - func qemuPipeline(inputPipelineName, inputFilename, outputFilename, format, qcow2Compat string) *osbuild.Pipeline { p := new(osbuild.Pipeline) p.Name = format diff --git a/internal/distro/rhel90beta/pipelines.go b/internal/distro/rhel90beta/pipelines.go index dc3504265..03765253a 100644 --- a/internal/distro/rhel90beta/pipelines.go +++ b/internal/distro/rhel90beta/pipelines.go @@ -3,7 +3,6 @@ package rhel90beta import ( "fmt" "math/rand" - "strings" "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/common" @@ -1039,7 +1038,7 @@ func liveImagePipeline(inputPipelineName string, outputFilename string, pt *disk loopback := osbuild.NewLoopbackDevice(&osbuild.LoopbackDeviceOptions{Filename: outputFilename}) p.AddStage(osbuild.NewSfdiskStage(sfOptions, loopback)) - for _, stage := range mkfsStages(pt, loopback) { + for _, stage := range osbuild.GenMkfsStages(pt, loopback) { p.AddStage(stage) } @@ -1064,63 +1063,6 @@ func xzArchivePipeline(inputPipelineName, inputFilename, outputFilename string) return p } -// mkfsStages generates a list of org.osbuild.mkfs.* stages based on a -// partition table description for a single device node -func mkfsStages(pt *disk.PartitionTable, device *osbuild.Device) []*osbuild.Stage { - stages := make([]*osbuild.Stage, 0, len(pt.Partitions)) - - // assume loopback device for simplicity since it's the only one currently supported - // panic if the conversion fails - devOptions, ok := device.Options.(*osbuild.LoopbackDeviceOptions) - if !ok { - panic("mkfsStages: failed to convert device options to loopback options") - } - - for _, p := range pt.Partitions { - if p.Payload == nil { - // no filesystem for partition (e.g., BIOS boot) - continue - } - var stage *osbuild.Stage - stageDevice := osbuild.NewLoopbackDevice( - &osbuild.LoopbackDeviceOptions{ - Filename: devOptions.Filename, - Start: pt.BytesToSectors(p.Start), - Size: pt.BytesToSectors(p.Size), - }, - ) - switch p.Payload.Type { - case "xfs": - options := &osbuild.MkfsXfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsXfsStage(options, stageDevice) - case "vfat": - options := &osbuild.MkfsFATStageOptions{ - VolID: strings.Replace(p.Payload.UUID, "-", "", -1), - } - stage = osbuild.NewMkfsFATStage(options, stageDevice) - case "btrfs": - options := &osbuild.MkfsBtrfsStageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsBtrfsStage(options, stageDevice) - case "ext4": - options := &osbuild.MkfsExt4StageOptions{ - UUID: p.Payload.UUID, - Label: p.Payload.Label, - } - stage = osbuild.NewMkfsExt4Stage(options, stageDevice) - default: - panic("unknown fs type " + p.Type) - } - stages = append(stages, stage) - } - return stages -} - func qemuPipeline(inputPipelineName, inputFilename, outputFilename, format, qcow2Compat string) *osbuild.Pipeline { p := new(osbuild.Pipeline) p.Name = format diff --git a/internal/osbuild2/mkfs_stage.go b/internal/osbuild2/mkfs_stage.go new file mode 100644 index 000000000..38de5b794 --- /dev/null +++ b/internal/osbuild2/mkfs_stage.go @@ -0,0 +1,64 @@ +package osbuild2 + +import ( + "strings" + + "github.com/osbuild/osbuild-composer/internal/disk" +) + +// GenMkfsStages generates a list of org.mkfs.* stages based on a +// partition table description for a single device node +func GenMkfsStages(pt *disk.PartitionTable, device *Device) []*Stage { + stages := make([]*Stage, 0, len(pt.Partitions)) + + // assume loopback device for simplicity since it's the only one currently supported + // panic if the conversion fails + devOptions, ok := device.Options.(*LoopbackDeviceOptions) + if !ok { + panic("GenMkfsStages: failed to convert device options to loopback options") + } + + for _, p := range pt.Partitions { + if p.Payload == nil { + // no filesystem for partition (e.g., BIOS boot) + continue + } + var stage *Stage + stageDevice := NewLoopbackDevice( + &LoopbackDeviceOptions{ + Filename: devOptions.Filename, + Start: pt.BytesToSectors(p.Start), + Size: pt.BytesToSectors(p.Size), + }, + ) + switch p.Payload.Type { + case "xfs": + options := &MkfsXfsStageOptions{ + UUID: p.Payload.UUID, + Label: p.Payload.Label, + } + stage = NewMkfsXfsStage(options, stageDevice) + case "vfat": + options := &MkfsFATStageOptions{ + VolID: strings.Replace(p.Payload.UUID, "-", "", -1), + } + stage = NewMkfsFATStage(options, stageDevice) + case "btrfs": + options := &MkfsBtrfsStageOptions{ + UUID: p.Payload.UUID, + Label: p.Payload.Label, + } + stage = NewMkfsBtrfsStage(options, stageDevice) + case "ext4": + options := &MkfsExt4StageOptions{ + UUID: p.Payload.UUID, + Label: p.Payload.Label, + } + stage = NewMkfsExt4Stage(options, stageDevice) + default: + panic("unknown fs type " + p.Type) + } + stages = append(stages, stage) + } + return stages +}