osbuild: rework RPM stage inputs

Rework the stage to not reimplement `FilesInput` as
`RPMStageInput`, but instead use the one common
`FilesInput` implementation and its supported
references.

Signed-off-by: Tomáš Hozza <thozza@redhat.com>
This commit is contained in:
Tomáš Hozza 2023-01-27 10:21:11 +01:00 committed by Achilleas Koutsou
parent b25e4bfa8b
commit 1667e6e859

View file

@ -1,6 +1,8 @@
package osbuild package osbuild
import ( import (
"strings"
"github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/rpmmd"
) )
@ -42,24 +44,12 @@ func (RPMStageOptions) isStageOptions() {}
// RPMStageInputs defines a collection of packages to be installed by the RPM // RPMStageInputs defines a collection of packages to be installed by the RPM
// stage. // stage.
type RPMStageInputs struct { type RPMStageInputs struct {
// Packages to install // Packages to install
Packages *RPMStageInput `json:"packages"` Packages *FilesInput `json:"packages"`
} }
func (RPMStageInputs) isStageInputs() {} func (RPMStageInputs) isStageInputs() {}
// RPMStageInput defines a single input source.
type RPMStageInput struct {
inputCommon
// Collection of references. Each reference defines a package to be
// installed, with optional metadata.
References RPMStageSourceArrayRefs `json:"references"`
}
func (RPMStageInput) isStageInput() {}
// RPM package reference metadata // RPM package reference metadata
type RPMStageReferenceMetadata struct { type RPMStageReferenceMetadata struct {
// This option defaults to `false`, therefore it does not need to be // This option defaults to `false`, therefore it does not need to be
@ -67,56 +57,7 @@ type RPMStageReferenceMetadata struct {
CheckGPG bool `json:"rpm.check_gpg,omitempty"` CheckGPG bool `json:"rpm.check_gpg,omitempty"`
} }
// RPMStageSourceOptions holds the metadata/options for a single RPM package to be func (*RPMStageReferenceMetadata) isFilesInputRefMetadata() {}
// installed.
type RPMStageSourceOptions struct {
Metadata *RPMStageReferenceMetadata `json:"metadata,omitempty"`
}
// RPMStageReferences: References to RPM packages defined in JSON as:
//
// "sha256:<...>": {
// "metadata": {
// "rpm.check_gpg": <boolean>
// }
// },
// "sha256:<...>": {
// "metadata": {
// "rpm.check_gpg": <boolean>
// }
// }
// ...
type RPMStageReferences map[string]*RPMStageSourceOptions
func (RPMStageReferences) isReferences() {}
// RPMStageSourceArrayRefs: References to RPM packages defined in JSON as an
// array of objects (preserves item order):
// [
// {
// "id": "sha256:<...>": {
// "options": {
// "rpm.check_gpg": <boolean>
// }
// }
// },
// {
// "id": "sha256:<...>": {
// "options": {
// "rpm.check_gpg": <boolean>
// }
// }
// },
// ...
// ]
type RPMStageSourceArrayRefs []*RPMStageSourceArrayRef
func (RPMStageSourceArrayRefs) isReferences() {}
type RPMStageSourceArrayRef struct {
ID string `json:"id"`
Options *RPMStageSourceOptions `json:"options,omitempty"`
}
// NewRPMStage creates a new RPM stage. // NewRPMStage creates a new RPM stage.
func NewRPMStage(options *RPMStageOptions, inputs *RPMStageInputs) *Stage { func NewRPMStage(options *RPMStageOptions, inputs *RPMStageInputs) *Stage {
@ -180,28 +121,23 @@ func RPMPackageMetadataToSignature(pkg RPMPackageMetadata) *string {
} }
func NewRpmStageSourceFilesInputs(specs []rpmmd.PackageSpec) *RPMStageInputs { func NewRpmStageSourceFilesInputs(specs []rpmmd.PackageSpec) *RPMStageInputs {
stageInput := new(RPMStageInput) input := NewFilesInput(pkgRefs(specs))
stageInput.Type = "org.osbuild.files" return &RPMStageInputs{Packages: input}
stageInput.Origin = "org.osbuild.source"
stageInput.References = pkgRefs(specs)
return &RPMStageInputs{Packages: stageInput}
} }
func pkgRefs(specs []rpmmd.PackageSpec) RPMStageSourceArrayRefs { func pkgRefs(specs []rpmmd.PackageSpec) FilesInputRef {
refs := make(RPMStageSourceArrayRefs, len(specs)) refs := make([]FilesInputSourceArrayRefEntry, len(specs))
for idx, pkg := range specs { for idx, pkg := range specs {
refs[idx] = &RPMStageSourceArrayRef{ pkgSum := strings.TrimPrefix(pkg.Checksum, "sha256:")
ID: pkg.Checksum, var pkgMetadata FilesInputRefMetadata
}
if pkg.CheckGPG { if pkg.CheckGPG {
refs[idx].Options = &RPMStageSourceOptions{ pkgMetadata = &RPMStageReferenceMetadata{
Metadata: &RPMStageReferenceMetadata{ CheckGPG: pkg.CheckGPG,
CheckGPG: pkg.CheckGPG,
},
} }
} }
refs[idx] = NewFilesInputSourceArrayRefEntry(pkgSum, pkgMetadata)
} }
return refs return NewFilesInputSourceArrayRef(refs)
} }
func NewRPMStageOptions(repos []rpmmd.RepoConfig) *RPMStageOptions { func NewRPMStageOptions(repos []rpmmd.RepoConfig) *RPMStageOptions {