From 6b3920783f9d30843c039e2cb506ea626777e5f4 Mon Sep 17 00:00:00 2001 From: Achilleas Koutsou Date: Mon, 21 Jun 2021 13:46:59 +0200 Subject: [PATCH] rpmmd: move RPM metadata tooling to internal pkg Move the OSBuildStagesToRPMs function, associated test, and RPM type from the worker into the rpmmd subpackge. We will use this function in the cloud API to compile the NEVRAs for the new metadata endpoint. --- cmd/osbuild-koji-tests/main_test.go | 5 +- cmd/osbuild-koji/main.go | 5 +- cmd/osbuild-worker/jobimpl-koji-finalize.go | 5 +- cmd/osbuild-worker/jobimpl-osbuild.go | 33 ------------- internal/rpmmd/metadata.go | 49 +++++++++++++++++++ .../rpmmd/metadata_test.go | 12 ++--- internal/upload/koji/koji.go | 32 +++++------- 7 files changed, 75 insertions(+), 66 deletions(-) create mode 100644 internal/rpmmd/metadata.go rename cmd/osbuild-worker/main_test.go => internal/rpmmd/metadata_test.go (97%) diff --git a/cmd/osbuild-koji-tests/main_test.go b/cmd/osbuild-koji-tests/main_test.go index d759d3c13..5afb46dd8 100644 --- a/cmd/osbuild-koji-tests/main_test.go +++ b/cmd/osbuild-koji-tests/main_test.go @@ -24,6 +24,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/upload/koji" ) @@ -163,7 +164,7 @@ func TestKojiImport(t *testing.T) { Arch: "noarch", }, Tools: []koji.Tool{}, - RPMs: []koji.RPM{}, + RPMs: []rpmmd.RPM{}, }, } output := []koji.Image{ @@ -175,7 +176,7 @@ func TestKojiImport(t *testing.T) { ChecksumType: "md5", MD5: hash, Type: "image", - RPMs: []koji.RPM{}, + RPMs: []rpmmd.RPM{}, Extra: koji.ImageExtra{ Info: koji.ImageExtraInfo{ Arch: "noarch", diff --git a/cmd/osbuild-koji/main.go b/cmd/osbuild-koji/main.go index 0fb0bd1a7..a51346e58 100644 --- a/cmd/osbuild-koji/main.go +++ b/cmd/osbuild-koji/main.go @@ -10,6 +10,7 @@ import ( "time" "github.com/google/uuid" + "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/upload/koji" ) @@ -83,7 +84,7 @@ func main() { Arch: arch, }, Tools: []koji.Tool{}, - RPMs: []koji.RPM{}, + RPMs: []rpmmd.RPM{}, }, } output := []koji.Image{ @@ -95,7 +96,7 @@ func main() { ChecksumType: "md5", MD5: hash, Type: "image", - RPMs: []koji.RPM{}, + RPMs: []rpmmd.RPM{}, Extra: koji.ImageExtra{ Info: koji.ImageExtraInfo{ Arch: arch, diff --git a/cmd/osbuild-worker/jobimpl-koji-finalize.go b/cmd/osbuild-worker/jobimpl-koji-finalize.go index 59d077bef..ae953c90b 100644 --- a/cmd/osbuild-worker/jobimpl-koji-finalize.go +++ b/cmd/osbuild-worker/jobimpl-koji-finalize.go @@ -8,6 +8,7 @@ import ( "net/url" "time" + "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/upload/koji" "github.com/osbuild/osbuild-composer/internal/worker" ) @@ -146,7 +147,7 @@ func (impl *KojiFinalizeJobImpl) Run(job worker.Job) error { Arch: buildArgs.Arch, }, Tools: []koji.Tool{}, - RPMs: osbuildStagesToRPMs(buildArgs.OSBuildOutput.Build.Stages), + RPMs: rpmmd.OSBuildStagesToRPMs(buildArgs.OSBuildOutput.Build.Stages), }) images = append(images, koji.Image{ BuildRootID: uint64(i), @@ -156,7 +157,7 @@ func (impl *KojiFinalizeJobImpl) Run(job worker.Job) error { ChecksumType: "md5", MD5: buildArgs.ImageHash, Type: "image", - RPMs: osbuildStagesToRPMs(buildArgs.OSBuildOutput.Stages), + RPMs: rpmmd.OSBuildStagesToRPMs(buildArgs.OSBuildOutput.Stages), Extra: koji.ImageExtra{ Info: koji.ImageExtraInfo{ Arch: buildArgs.Arch, diff --git a/cmd/osbuild-worker/jobimpl-osbuild.go b/cmd/osbuild-worker/jobimpl-osbuild.go index 975b04359..46f7dc05c 100644 --- a/cmd/osbuild-worker/jobimpl-osbuild.go +++ b/cmd/osbuild-worker/jobimpl-osbuild.go @@ -30,39 +30,6 @@ type OSBuildJobImpl struct { AzureCreds *azure.Credentials } -func packageMetadataToSignature(pkg osbuild.RPMPackageMetadata) *string { - if pkg.SigGPG != "" { - return &pkg.SigGPG - } else if pkg.SigPGP != "" { - return &pkg.SigPGP - } - return nil -} - -func osbuildStagesToRPMs(stages []osbuild.StageResult) []koji.RPM { - rpms := make([]koji.RPM, 0) - for _, stage := range stages { - switch metadata := stage.Metadata.(type) { - case *osbuild.RPMStageMetadata: - for _, pkg := range metadata.Packages { - rpms = append(rpms, koji.RPM{ - Type: "rpm", - Name: pkg.Name, - Epoch: pkg.Epoch, - Version: pkg.Version, - Release: pkg.Release, - Arch: pkg.Arch, - Sigmd5: pkg.SigMD5, - Signature: packageMetadataToSignature(pkg), - }) - } - default: - continue - } - } - return rpms -} - func appendTargetError(res *worker.OSBuildJobResult, err error) { errStr := err.Error() log.Printf("target failed: %s", errStr) diff --git a/internal/rpmmd/metadata.go b/internal/rpmmd/metadata.go new file mode 100644 index 000000000..ac935fb8d --- /dev/null +++ b/internal/rpmmd/metadata.go @@ -0,0 +1,49 @@ +package rpmmd + +import ( + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" +) + +type RPM struct { + Type string `json:"type"` // must be 'rpm' + Name string `json:"name"` + Version string `json:"version"` + Release string `json:"release"` + Epoch *string `json:"epoch,omitempty"` + Arch string `json:"arch"` + Sigmd5 string `json:"sigmd5"` + Signature *string `json:"signature"` +} + +func OSBuildStagesToRPMs(stages []osbuild.StageResult) []RPM { + rpms := make([]RPM, 0) + for _, stage := range stages { + switch metadata := stage.Metadata.(type) { + case *osbuild.RPMStageMetadata: + for _, pkg := range metadata.Packages { + rpms = append(rpms, RPM{ + Type: "rpm", + Name: pkg.Name, + Epoch: pkg.Epoch, + Version: pkg.Version, + Release: pkg.Release, + Arch: pkg.Arch, + Sigmd5: pkg.SigMD5, + Signature: packageMetadataToSignature(pkg), + }) + } + default: + continue + } + } + return rpms +} + +func packageMetadataToSignature(pkg osbuild.RPMPackageMetadata) *string { + if pkg.SigGPG != "" { + return &pkg.SigGPG + } else if pkg.SigPGP != "" { + return &pkg.SigPGP + } + return nil +} diff --git a/cmd/osbuild-worker/main_test.go b/internal/rpmmd/metadata_test.go similarity index 97% rename from cmd/osbuild-worker/main_test.go rename to internal/rpmmd/metadata_test.go index 3d7ee1508..bf3171305 100644 --- a/cmd/osbuild-worker/main_test.go +++ b/internal/rpmmd/metadata_test.go @@ -1,11 +1,11 @@ -package main +package rpmmd import ( "encoding/json" - osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" - "github.com/osbuild/osbuild-composer/internal/upload/koji" - "github.com/stretchr/testify/require" "testing" + + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" + "github.com/stretchr/testify/require" ) func Test_osbuildStagesToRPMs(t *testing.T) { @@ -76,12 +76,12 @@ func Test_osbuildStagesToRPMs(t *testing.T) { err := json.Unmarshal([]byte(raw), &stageResults) require.NoError(t, err) - rpms := osbuildStagesToRPMs(stageResults) + rpms := OSBuildStagesToRPMs(stageResults) require.Len(t, rpms, 3) signature1 := "89023304000108001d162104963a2beb02009608fe67ea4249fd77499570ff3105025f5a272b000a091049fd77499570ff31ccdb0ffe38b95a55ebf3c021526b3cd4f2358c7e23f7767d1f5ce4b7cccef7b33653c6a96a23022313a818fbaf7abeb41837910f0d3ac15664e02838d5939d38ff459aa0076e248728a032d3ae09ddfaec955f941601081a2e3f9bbd49586fd65c1bc1b31685aeb0405687d1791471eab7359ccf00d5584ddef680e99ebc8a4846316391b9baa68ac8ed8ad696ee16fd625d847f8edd92517df3ea6920a46b77b4f119715a0f619f38835d25e0bd0eb5cfad08cd9c796eace6a2b28f4d3dee552e6068255d9748dc2a1906c951e0ba8aed9922ab24e1f659413a06083f8a0bfea56cfff14bddef23bced449f36bcd369da72f90ddf0512e7b0801ba5a0c8eaa8eb0582c630815e992192042cfb0a7c7239f76219197c2fdf18b6553260c105280806d4f037d7b04bdf3da9fd7e9a207db5c71f7e548f4288928f047c989c4cb9cbb8088eec7bd2fa5c252e693f51a3cfc660f666af6a255a5ca0fd2216d5ccd66cbd9c11afa61067d7f615ec8d0dc0c879b5fe633d8c9443f97285da597e4da8a3993af36f0be06acfa9b8058ec70bbc78b876e4c6c5d2108fb05c15a74ba48a3d7ded697cbc1748c228d77d1e0794a41fd5240fa67c3ed745fe47555a47c3d6163d8ce95fd6c2d0d6fa48f8e5b411e571e442109b1cb200d9a8117ee08bfe645f96aca34f7b7559622bbab75143dcad59f126ae0d319e6668ebba417e725638c4febf2e" - require.Equal(t, koji.RPM{ + require.Equal(t, RPM{ Type: "rpm", Name: "libgcc", Version: "10.0.1", diff --git a/internal/upload/koji/koji.go b/internal/upload/koji/koji.go index f2256571f..11fdc68d4 100644 --- a/internal/upload/koji/koji.go +++ b/internal/upload/koji/koji.go @@ -14,6 +14,7 @@ import ( "os" "github.com/kolo/xmlrpc" + "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/ubccr/kerby/khttp" ) @@ -63,24 +64,13 @@ type Tool struct { Version string `json:"version"` } -type RPM struct { - Type string `json:"type"` // must be 'rpm' - Name string `json:"name"` - Version string `json:"version"` - Release string `json:"release"` - Epoch *string `json:"epoch,omitempty"` - Arch string `json:"arch"` - Sigmd5 string `json:"sigmd5"` - Signature *string `json:"signature"` -} - type BuildRoot struct { ID uint64 `json:"id"` Host Host `json:"host"` ContentGenerator ContentGenerator `json:"content_generator"` Container Container `json:"container"` Tools []Tool `json:"tools"` - RPMs []RPM `json:"components"` + RPMs []rpmmd.RPM `json:"components"` } type ImageExtraInfo struct { @@ -93,15 +83,15 @@ type ImageExtra struct { } type Image struct { - BuildRootID uint64 `json:"buildroot_id"` - Filename string `json:"filename"` - FileSize uint64 `json:"filesize"` - Arch string `json:"arch"` - ChecksumType string `json:"checksum_type"` // must be 'md5' - MD5 string `json:"checksum"` - Type string `json:"type"` - RPMs []RPM `json:"components"` - Extra ImageExtra `json:"extra"` + BuildRootID uint64 `json:"buildroot_id"` + Filename string `json:"filename"` + FileSize uint64 `json:"filesize"` + Arch string `json:"arch"` + ChecksumType string `json:"checksum_type"` // must be 'md5' + MD5 string `json:"checksum"` + Type string `json:"type"` + RPMs []rpmmd.RPM `json:"components"` + Extra ImageExtra `json:"extra"` } type Metadata struct {