From dd59ce6a167c5c7c4f7692d74615408859909ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Thu, 26 Jan 2023 22:17:45 +0100 Subject: [PATCH] osbuild: rework XZ stage inputs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `FilesInputs` was since the beginning an XZ-specific implementation of the input, but it was implemented in the `files_input.go` in a false hope that it could be used as a generic stage inputs by any stages. It turned out that various stages require different implementation of its input. Specifically there is usually a stage-specific key, which has assigned a common input type. For XZ stage, the key is `file`. Remove `FilesInputs` and instead implement `XzStageInputs` which is now accepted by the XZ stage. Fix all affected pipeline implementations that use XZ stage. Signed-off-by: Tomáš Hozza --- internal/manifest/coi_iso_tree.go | 2 +- internal/manifest/xz.go | 2 +- internal/osbuild/files_input.go | 19 ------------------ internal/osbuild/files_input_test.go | 29 ---------------------------- internal/osbuild/xz_stage.go | 16 +++++++++++---- internal/osbuild/xz_stage_test.go | 4 ++-- 6 files changed, 16 insertions(+), 56 deletions(-) diff --git a/internal/manifest/coi_iso_tree.go b/internal/manifest/coi_iso_tree.go index 0f9ad72fa..0ef5e0b23 100644 --- a/internal/manifest/coi_iso_tree.go +++ b/internal/manifest/coi_iso_tree.go @@ -64,7 +64,7 @@ func (p *CoreOSISOTree) serialize() osbuild.Pipeline { }, }, }, - osbuild.NewFilesInputs(osbuild.NewFilesInputPipelineObjectRef(p.payloadPipeline.Name(), p.payloadPipeline.Filename, nil)), + osbuild.NewXzStageInputs(osbuild.NewFilesInputPipelineObjectRef(p.payloadPipeline.Name(), p.payloadPipeline.Filename, nil)), )) if p.coiPipeline.Ignition != nil { diff --git a/internal/manifest/xz.go b/internal/manifest/xz.go index b45f10755..2c9bea16e 100644 --- a/internal/manifest/xz.go +++ b/internal/manifest/xz.go @@ -33,7 +33,7 @@ func (p *XZ) serialize() osbuild.Pipeline { pipeline.AddStage(osbuild.NewXzStage( osbuild.NewXzStageOptions(p.Filename), - osbuild.NewFilesInputs(osbuild.NewFilesInputPipelineObjectRef(p.imgPipeline.Name(), p.imgPipeline.Export().Filename(), nil)), + osbuild.NewXzStageInputs(osbuild.NewFilesInputPipelineObjectRef(p.imgPipeline.Name(), p.imgPipeline.Export().Filename(), nil)), )) return pipeline diff --git a/internal/osbuild/files_input.go b/internal/osbuild/files_input.go index f845570ad..64f685bf4 100644 --- a/internal/osbuild/files_input.go +++ b/internal/osbuild/files_input.go @@ -5,25 +5,6 @@ import ( "fmt" ) -// Inputs for individual files - -type FilesInputs struct { - File *FilesInput `json:"file"` -} - -func (FilesInputs) isStageInputs() {} - -func NewFilesInputs(references FilesInputRef) *FilesInputs { - return &FilesInputs{ - File: NewFilesInput(references), - } -} - -// IMPLEMENTED INTERFACES OF STAGES ACCEPTING THIS INPUTS TYPE - -// inputs accepted by the XZ stage -func (FilesInputs) isXzStageInputs() {} - // SPECIFIC INPUT STRUCTURE type FilesInput struct { diff --git a/internal/osbuild/files_input_test.go b/internal/osbuild/files_input_test.go index 563d3ef5b..72f84c8aa 100644 --- a/internal/osbuild/files_input_test.go +++ b/internal/osbuild/files_input_test.go @@ -2,40 +2,11 @@ package osbuild import ( "encoding/json" - "fmt" "testing" "github.com/stretchr/testify/assert" ) -type fakeFilesInputRef struct{} - -func (f *fakeFilesInputRef) isFilesInputRef() {} - -func TestNewFilesInputs(t *testing.T) { - inputFilename := "image.raw" - pipeline := "os" - - expectedInput := &FilesInputs{ - File: &FilesInput{ - inputCommon: inputCommon{ - Type: InputTypeFiles, - Origin: InputOriginPipeline, - }, - References: &FilesInputPipelineObjectRef{ - fmt.Sprintf("name:%s", pipeline): FilesInputPipelineOptions{File: inputFilename}, - }, - }, - } - - actualInput := NewFilesInputs(NewFilesInputPipelineObjectRef(pipeline, inputFilename, nil)) - assert.Equal(t, expectedInput, actualInput) - - assert.Panics(t, func() { - NewFilesInputs(&fakeFilesInputRef{}) - }) -} - func TestFilesInput_UnmarshalJSON(t *testing.T) { testCases := []struct { name string diff --git a/internal/osbuild/xz_stage.go b/internal/osbuild/xz_stage.go index 9c8ccbedb..bd9c6d991 100644 --- a/internal/osbuild/xz_stage.go +++ b/internal/osbuild/xz_stage.go @@ -13,15 +13,23 @@ func NewXzStageOptions(filename string) *XzStageOptions { } } -type XzStageInputs interface { - isXzStageInputs() +type XzStageInputs struct { + File *FilesInput `json:"file"` +} + +func (*XzStageInputs) isStageInputs() {} + +func NewXzStageInputs(references FilesInputRef) *XzStageInputs { + return &XzStageInputs{ + File: NewFilesInput(references), + } } // Compresses a file into a xz archive. -func NewXzStage(options *XzStageOptions, inputs XzStageInputs) *Stage { +func NewXzStage(options *XzStageOptions, inputs *XzStageInputs) *Stage { var stageInputs Inputs if inputs != nil { - stageInputs = inputs.(Inputs) + stageInputs = inputs } return &Stage{ diff --git a/internal/osbuild/xz_stage_test.go b/internal/osbuild/xz_stage_test.go index 3b1760252..ff7e94f33 100644 --- a/internal/osbuild/xz_stage_test.go +++ b/internal/osbuild/xz_stage_test.go @@ -25,11 +25,11 @@ func TestNewXzStage(t *testing.T) { expectedStage := &Stage{ Type: "org.osbuild.xz", Options: NewXzStageOptions(filename), - Inputs: NewFilesInputs(NewFilesInputPipelineObjectRef(pipeline, inputFilename, nil)), + Inputs: NewXzStageInputs(NewFilesInputPipelineObjectRef(pipeline, inputFilename, nil)), } actualStage := NewXzStage(NewXzStageOptions(filename), - NewFilesInputs(NewFilesInputPipelineObjectRef(pipeline, inputFilename, nil))) + NewXzStageInputs(NewFilesInputPipelineObjectRef(pipeline, inputFilename, nil))) assert.Equal(t, expectedStage, actualStage) }