From 60301df8f7596bfbce2081bf38d65f6062ce0cd2 Mon Sep 17 00:00:00 2001 From: Lars Karlitski Date: Mon, 2 Mar 2020 20:17:16 +0100 Subject: [PATCH] rpmmd: pass in cache directory explicitly rpmmd looked at the CACHE_DIRECTORY environment variable to set a path for the dnf repository cache. Aside from being a smelly thing to do from a library, this breaks osbuild-pipeline and osbuild-dnf-json-tests, which don't run as systemd services and thus don't have CACHE_DIRECTORY set. Explicitly pass the cache directory to rpmmd. Keep using a path based on CACHE_DIRECTORY for osbuild-composer. Use the user's `.cache` directory for osbuild-pipeline and a temporary directory for the tests. --- cmd/osbuild-composer/main.go | 8 +++++++- cmd/osbuild-dnf-json-tests/main.go | 2 +- cmd/osbuild-pipeline/main.go | 8 +++++++- internal/rpmmd/repository.go | 27 +++++++++++---------------- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/cmd/osbuild-composer/main.go b/cmd/osbuild-composer/main.go index dd1bf5201..4aadf84f2 100644 --- a/cmd/osbuild-composer/main.go +++ b/cmd/osbuild-composer/main.go @@ -7,6 +7,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/rcm" "io/ioutil" "log" + "path" "os" "github.com/osbuild/osbuild-composer/internal/common" @@ -73,7 +74,12 @@ func main() { weldrListener := composerListeners[0] jobListener := composerListeners[1] - rpm := rpmmd.NewRPMMD() + cacheDirectory, ok := os.LookupEnv("CACHE_DIRECTORY") + if !ok { + log.Fatal("CACHE_DIRECTORY is not set. Is the service file missing CacheDirectory=?") + } + + rpm := rpmmd.NewRPMMD(path.Join(cacheDirectory, "rpmmd")) distros := distro.NewRegistry([]string{"/etc/osbuild-composer", "/usr/share/osbuild-composer"}) distribution, err := distros.FromHost() diff --git a/cmd/osbuild-dnf-json-tests/main.go b/cmd/osbuild-dnf-json-tests/main.go index 4c56b1845..1b58a9c42 100644 --- a/cmd/osbuild-dnf-json-tests/main.go +++ b/cmd/osbuild-dnf-json-tests/main.go @@ -57,7 +57,7 @@ func TestFetchChecksum(quiet bool, dir string) { if !quiet { log.Println("Running TestFetchChecksum on:", dir) } - rpmMetadata := rpmmd.NewRPMMD() + rpmMetadata := rpmmd.NewRPMMD(path.Join(dir, "rpmmd")) _, c, err := rpmMetadata.FetchMetadata([]rpmmd.RepoConfig{repoCfg}, "platform:f31") if err != nil { log.Panic("Failed to fetch checksum:", err) diff --git a/cmd/osbuild-pipeline/main.go b/cmd/osbuild-pipeline/main.go index 467882b6e..b95343d2d 100644 --- a/cmd/osbuild-pipeline/main.go +++ b/cmd/osbuild-pipeline/main.go @@ -6,6 +6,7 @@ import ( "fmt" "io/ioutil" "os" + "path" "github.com/osbuild/osbuild-composer/internal/common" @@ -87,7 +88,12 @@ func main() { } packages = append(pkgs, packages...) - rpmmd := rpmmd.NewRPMMD() + home, err := os.UserHomeDir() + if err != nil { + panic("os.UserHomeDir(): " + err.Error()) + } + + rpmmd := rpmmd.NewRPMMD(path.Join(home, ".cache/osbuild-composer/rpmmd")) packageSpecs, checksums, err := rpmmd.Depsolve(packages, exclude_pkgs, d.Repositories(archArg), d.ModulePlatformID(), false) if err != nil { panic("Could not depsolve: " + err.Error()) diff --git a/internal/rpmmd/repository.go b/internal/rpmmd/repository.go index c417fba44..baff1b53c 100644 --- a/internal/rpmmd/repository.go +++ b/internal/rpmmd/repository.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "os" "os/exec" - "path" "sort" "time" @@ -211,22 +210,22 @@ func runDNF(command string, arguments interface{}, result interface{}) error { return nil } -type rpmmdImpl struct{} - -func NewRPMMD() RPMMD { - return &rpmmdImpl{} +type rpmmdImpl struct { + CacheDir string } -func (*rpmmdImpl) FetchMetadata(repos []RepoConfig, modulePlatformID string) (PackageList, map[string]string, error) { - cacheDirectory, ok := os.LookupEnv("CACHE_DIRECTORY") - if !ok { - panic("CACHE_DIRECTORY is not set. Is the service file missing CacheDirectory=?") +func NewRPMMD(cacheDir string) RPMMD { + return &rpmmdImpl{ + CacheDir: cacheDir, } +} + +func (r *rpmmdImpl) FetchMetadata(repos []RepoConfig, modulePlatformID string) (PackageList, map[string]string, error) { var arguments = struct { Repos []RepoConfig `json:"repos"` CacheDir string `json:"cachedir"` ModulePlatformID string `json:"module_platform_id"` - }{repos, path.Join(cacheDirectory, "rpmmd"), modulePlatformID} + }{repos, r.CacheDir, modulePlatformID} var reply struct { Checksums map[string]string `json:"checksums"` Packages PackageList `json:"packages"` @@ -238,11 +237,7 @@ func (*rpmmdImpl) FetchMetadata(repos []RepoConfig, modulePlatformID string) (Pa return reply.Packages, reply.Checksums, err } -func (*rpmmdImpl) Depsolve(specs, excludeSpecs []string, repos []RepoConfig, modulePlatformID string, clean bool) ([]PackageSpec, map[string]string, error) { - cacheDirectory, ok := os.LookupEnv("CACHE_DIRECTORY") - if !ok { - panic("CACHE_DIRECTORY is not set. Is the service file missing CacheDirectory=?") - } +func (r *rpmmdImpl) Depsolve(specs, excludeSpecs []string, repos []RepoConfig, modulePlatformID string, clean bool) ([]PackageSpec, map[string]string, error) { var arguments = struct { PackageSpecs []string `json:"package-specs"` ExcludSpecs []string `json:"exclude-specs"` @@ -250,7 +245,7 @@ func (*rpmmdImpl) Depsolve(specs, excludeSpecs []string, repos []RepoConfig, mod CacheDir string `json:"cachedir"` ModulePlatformID string `json:"module_platform_id"` Clean bool `json:"clean,omitempty"` - }{specs, excludeSpecs, repos, path.Join(cacheDirectory, "rpmmd"), modulePlatformID, clean} + }{specs, excludeSpecs, repos, r.CacheDir, modulePlatformID, clean} var reply struct { Checksums map[string]string `json:"checksums"` Dependencies []PackageSpec `json:"dependencies"`