debian-forge-composer/internal/mocks/rpmmd/fixtures.go
Lars Karlitski d3a0b788a2 distro: set the repository checksum dynamically
Instead of having a static repository checksum, set it dynamically from
the metadata that osbuild-composer last saw. This is implemented in
dnf-json, which returns the checksums for each repository on every call.

This enables the use of repositories that change over time, such as
fedora-updates. Note that the osbuild pipeline will break when such a
repository changes. This is intentional: pipelines have to be
reproducible.
2019-12-10 20:38:22 +01:00

267 lines
6.4 KiB
Go

package rpmmd_mock
import (
"fmt"
"sort"
"time"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/blueprint"
"github.com/osbuild/osbuild-composer/internal/distro"
"github.com/osbuild/osbuild-composer/internal/rpmmd"
"github.com/osbuild/osbuild-composer/internal/store"
"github.com/osbuild/osbuild-composer/internal/target"
)
type FixtureGenerator func() Fixture
func generatePackageList() rpmmd.PackageList {
baseTime, err := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z")
if err != nil {
panic(err)
}
var packageList rpmmd.PackageList
for i := 0; i < 22; i++ {
basePackage := rpmmd.Package{
Name: fmt.Sprintf("package%d", i),
Summary: fmt.Sprintf("pkg%d sum", i),
Description: fmt.Sprintf("pkg%d desc", i),
URL: fmt.Sprintf("https://pkg%d.example.com", i),
Epoch: 0,
Version: fmt.Sprintf("%d.0", i),
Release: fmt.Sprintf("%d.fc30", i),
Arch: "x86_64",
BuildTime: baseTime.AddDate(0, i, 0),
License: "MIT",
}
secondBuild := basePackage
secondBuild.Version = fmt.Sprintf("%d.1", i)
secondBuild.BuildTime = basePackage.BuildTime.AddDate(0, 0, 1)
packageList = append(packageList, basePackage, secondBuild)
}
sort.Slice(packageList, func(i, j int) bool {
return packageList[i].Name < packageList[j].Name
})
return packageList
}
func createBaseStoreFixture() *store.Store {
var bName = "test"
var b = blueprint.Blueprint{
Name: bName,
Version: "0.0.0",
Packages: []blueprint.Package{},
Modules: []blueprint.Package{},
Groups: []blueprint.Group{},
Customizations: nil,
}
var date = time.Date(2019, 11, 27, 13, 19, 0, 0, time.FixedZone("UTC+1", 60*60))
var localTarget = &target.Target{
Uuid: uuid.MustParse("20000000-0000-0000-0000-000000000000"),
Name: "org.osbuild.local",
ImageName: "localimage",
Created: date,
Status: "WAITING",
Options: &target.LocalTargetOptions{
Location: "/tmp/localimage",
},
}
var awsTarget = &target.Target{
Uuid: uuid.MustParse("10000000-0000-0000-0000-000000000000"),
Name: "org.osbuild.aws",
ImageName: "awsimage",
Created: date,
Status: "WAITING",
Options: &target.AWSTargetOptions{
Region: "frankfurt",
AccessKeyID: "accesskey",
SecretAccessKey: "secretkey",
Bucket: "clay",
Key: "imagekey",
},
}
d := distro.New("fedora-30")
s := store.New(nil, d)
s.Blueprints[bName] = b
s.Composes = map[uuid.UUID]store.Compose{
uuid.MustParse("30000000-0000-0000-0000-000000000000"): store.Compose{
QueueStatus: "WAITING",
Blueprint: &b,
OutputType: "tar",
Targets: []*target.Target{localTarget, awsTarget},
JobCreated: date,
},
uuid.MustParse("30000000-0000-0000-0000-000000000001"): store.Compose{
QueueStatus: "RUNNING",
Blueprint: &b,
OutputType: "tar",
Targets: []*target.Target{localTarget},
JobCreated: date,
JobStarted: date,
},
uuid.MustParse("30000000-0000-0000-0000-000000000002"): store.Compose{
QueueStatus: "FINISHED",
Blueprint: &b,
OutputType: "tar",
Targets: []*target.Target{localTarget, awsTarget},
JobCreated: date,
JobStarted: date,
JobFinished: date,
},
uuid.MustParse("30000000-0000-0000-0000-000000000003"): store.Compose{
QueueStatus: "FAILED",
Blueprint: &b,
OutputType: "tar",
Targets: []*target.Target{localTarget, awsTarget},
JobCreated: date,
JobStarted: date,
JobFinished: date,
},
}
return s
}
func createBaseDepsolveFixture() []rpmmd.PackageSpec {
return []rpmmd.PackageSpec{
{
Name: "dep-package1",
Epoch: 0,
Version: "1.33",
Release: "2.fc30",
Arch: "x86_64",
},
{
Name: "dep-package2",
Epoch: 0,
Version: "2.9",
Release: "1.fc30",
Arch: "x86_64",
},
}
}
func createStoreWithoutComposesFixture() *store.Store {
var bName = "test"
var b = blueprint.Blueprint{
Name: bName,
Version: "0.0.0",
Packages: []blueprint.Package{},
Modules: []blueprint.Package{},
Groups: []blueprint.Group{},
Customizations: nil,
}
d := distro.New("fedora-30")
s := store.New(nil, d)
s.Blueprints[bName] = b
return s
}
func BaseFixture() Fixture {
return Fixture{
fetchPackageList{
generatePackageList(),
map[string]string{"base": "sha256:f34848ca92665c342abd5816c9e3eda0e82180671195362bcd0080544a3bc2ac"},
nil,
},
depsolve{
createBaseDepsolveFixture(),
map[string]string{"base": "sha256:f34848ca92665c342abd5816c9e3eda0e82180671195362bcd0080544a3bc2ac"},
nil,
},
createBaseStoreFixture(),
}
}
func NoComposesFixture() Fixture {
return Fixture{
fetchPackageList{
generatePackageList(),
map[string]string{"base": "sha256:f34848ca92665c342abd5816c9e3eda0e82180671195362bcd0080544a3bc2ac"},
nil,
},
depsolve{
createBaseDepsolveFixture(),
map[string]string{"base": "sha256:f34848ca92665c342abd5816c9e3eda0e82180671195362bcd0080544a3bc2ac"},
nil,
},
createStoreWithoutComposesFixture(),
}
}
func NonExistingPackage() Fixture {
return Fixture{
fetchPackageList{
generatePackageList(),
map[string]string{"base": "sha256:f34848ca92665c342abd5816c9e3eda0e82180671195362bcd0080544a3bc2ac"},
nil,
},
depsolve{
nil,
nil,
&rpmmd.DNFError{
Kind: "MarkingErrors",
Reason: "Error occurred when marking packages for installation: Problems in request:\nmissing packages: fash",
},
},
createBaseStoreFixture(),
}
}
func BadDepsolve() Fixture {
return Fixture{
fetchPackageList{
generatePackageList(),
map[string]string{"base": "sha256:f34848ca92665c342abd5816c9e3eda0e82180671195362bcd0080544a3bc2ac"},
nil,
},
depsolve{
nil,
nil,
&rpmmd.DNFError{
Kind: "DepsolveError",
Reason: "There was a problem depsolving ['go2rpm']: \n Problem: conflicting requests\n - nothing provides askalono-cli needed by go2rpm-1-4.fc31.noarch",
},
},
createBaseStoreFixture(),
}
}
func BadFetch() Fixture {
return Fixture{
fetchPackageList{
ret: nil,
checksums: nil,
err: &rpmmd.DNFError{
Kind: "FetchError",
Reason: "There was a problem when fetching packages.",
},
},
depsolve{
nil,
nil,
&rpmmd.DNFError{
Kind: "DepsolveError",
Reason: "There was a problem depsolving ['go2rpm']: \n Problem: conflicting requests\n - nothing provides askalono-cli needed by go2rpm-1-4.fc31.noarch",
},
},
createBaseStoreFixture(),
}
}