Use well defined structure for serializing, fixups to make test green

This commit is contained in:
Ettore Di Giacinto 2019-11-23 15:42:05 +01:00
parent a879411c54
commit e9c01b46a7
No known key found for this signature in database
GPG Key ID: 1ADA699B145A2D1C
7 changed files with 57 additions and 14 deletions

View File

@ -91,7 +91,7 @@ type LuetCompilationSpec struct {
Prelude []string `json:"prelude"` // Are run inside the image which will be our builder Prelude []string `json:"prelude"` // Are run inside the image which will be our builder
Image string `json:"image"` Image string `json:"image"`
Seed string `json:"seed"` Seed string `json:"seed"`
Package *pkg.DefaultPackage `json:"-"` Package *pkg.DefaultPackage `json:"package"`
SourceAssertion solver.PackagesAssertions `json:"-"` SourceAssertion solver.PackagesAssertions `json:"-"`
OutputPath string `json:"-"` // Where the build processfiles go OutputPath string `json:"-"` // Where the build processfiles go

View File

@ -18,8 +18,11 @@ package client
import ( import (
"io/ioutil" "io/ioutil"
"os" "os"
"path"
"path/filepath" "path/filepath"
. "github.com/mudler/luet/pkg/logger"
"github.com/mudler/luet/pkg/compiler" "github.com/mudler/luet/pkg/compiler"
"github.com/mudler/luet/pkg/helpers" "github.com/mudler/luet/pkg/helpers"
) )
@ -33,18 +36,20 @@ func NewLocalClient(r RepoData) *LocalClient {
} }
func (c *LocalClient) DownloadArtifact(artifact compiler.Artifact) (compiler.Artifact, error) { func (c *LocalClient) DownloadArtifact(artifact compiler.Artifact) (compiler.Artifact, error) {
artifactName := path.Base(artifact.GetPath())
Info("Downloading artifact", artifactName, "from", c.RepoData.Uri)
file, err := ioutil.TempFile(os.TempDir(), "localclient") file, err := ioutil.TempFile(os.TempDir(), "localclient")
if err != nil { if err != nil {
return nil, err return nil, err
} }
//defer os.Remove(file.Name()) //defer os.Remove(file.Name())
err = helpers.CopyFile(filepath.Join(c.RepoData.Uri, artifact.GetPath()), file.Name()) err = helpers.CopyFile(filepath.Join(c.RepoData.Uri, artifactName), file.Name())
return compiler.NewPackageArtifact(file.Name()), nil return compiler.NewPackageArtifact(file.Name()), nil
} }
func (c *LocalClient) DownloadFile(name string) (string, error) { func (c *LocalClient) DownloadFile(name string) (string, error) {
Info("Downloading file", name, "from", c.RepoData.Uri)
file, err := ioutil.TempFile(os.TempDir(), "localclient") file, err := ioutil.TempFile(os.TempDir(), "localclient")
if err != nil { if err != nil {

View File

@ -98,7 +98,7 @@ func (l *LuetInstaller) Install(p []pkg.Package, s *System) error {
for _, r := range l.PackageRepositories { for _, r := range l.PackageRepositories {
repo, err := r.Sync() repo, err := r.Sync()
if err != nil { if err != nil {
return errors.Wrap(err, "Failed syncing repository"+r.GetName()) return errors.Wrap(err, "Failed syncing repository: "+r.GetName())
} }
syncedRepos = append(syncedRepos, repo) syncedRepos = append(syncedRepos, repo)
} }
@ -171,6 +171,10 @@ func (l *LuetInstaller) Install(p []pkg.Package, s *System) error {
} }
A: A:
for _, artefact := range matches[0].Repo.GetIndex() { for _, artefact := range matches[0].Repo.GetIndex() {
if artefact.GetCompileSpec().GetPackage() == nil {
return errors.New("Package in compilespec empty")
}
if matches[0].Package.Matches(artefact.GetCompileSpec().GetPackage()) { if matches[0].Package.Matches(artefact.GetCompileSpec().GetPackage()) {
// TODO: Filter out already installed? // TODO: Filter out already installed?
toInstall[assertion.Package.GetFingerPrint()] = ArtifactMatch{Package: assertion.Package, Artifact: artefact, Repository: matches[0].Repo} toInstall[assertion.Package.GetFingerPrint()] = ArtifactMatch{Package: assertion.Package, Artifact: artefact, Repository: matches[0].Repo}

View File

@ -104,8 +104,8 @@ var _ = Describe("Installer", func() {
repo2, err := NewLuetRepositoryFromYaml([]byte(` repo2, err := NewLuetRepositoryFromYaml([]byte(`
name: "test" name: "test"
type: "local" type: "local"
uri: "` + tmpdir + `" uri: "`+tmpdir+`"
`)) `), pkg.NewInMemoryDatabase(false))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
inst.Repositories(Repositories{repo2}) inst.Repositories(Repositories{repo2})

View File

@ -41,6 +41,7 @@ type Repository interface {
GetPriority() int GetPriority() int
GetIndex() compiler.ArtifactIndex GetIndex() compiler.ArtifactIndex
GetTree() tree.Builder GetTree() tree.Builder
SetTree(tree.Builder)
Write(path string) error Write(path string) error
Sync() (Repository, error) Sync() (Repository, error)
GetTreePath() string GetTreePath() string

View File

@ -43,6 +43,14 @@ type LuetRepository struct {
Type string `json:"type"` Type string `json:"type"`
} }
type LuetRepositorySerialized struct {
Name string `json:"name"`
Uri string `json:"uri"`
Priority int `json:"priority"`
Index []*compiler.PackageArtifact `json:"index"`
Type string `json:"type"`
}
func GenerateRepository(name, uri, t string, priority int, src, treeDir string, db pkg.PackageDatabase) (Repository, error) { func GenerateRepository(name, uri, t string, priority int, src, treeDir string, db pkg.PackageDatabase) (Repository, error) {
art, err := buildPackageIndex(src) art, err := buildPackageIndex(src)
@ -62,13 +70,25 @@ func NewLuetRepository(name, uri, t string, priority int, art []compiler.Artifac
return &LuetRepository{Index: art, Type: t, Tree: builder, Name: name, Uri: uri, Priority: priority} return &LuetRepository{Index: art, Type: t, Tree: builder, Name: name, Uri: uri, Priority: priority}
} }
func NewLuetRepositoryFromYaml(data []byte) (Repository, error) { func NewLuetRepositoryFromYaml(data []byte, db pkg.PackageDatabase) (Repository, error) {
var p LuetRepository var p *LuetRepositorySerialized
r := &LuetRepository{}
err := yaml.Unmarshal(data, &p) err := yaml.Unmarshal(data, &p)
if err != nil { if err != nil {
return &p, err return nil, err
} }
return &p, err r.Name = p.Name
r.Uri = p.Uri
r.Priority = p.Priority
r.Type = p.Type
i := compiler.ArtifactIndex{}
for _, ii := range p.Index {
i = append(i, ii)
}
r.Index = i
r.Tree = tree.NewInstallerRecipe(db)
return r, err
} }
func buildPackageIndex(path string) ([]compiler.Artifact, error) { func buildPackageIndex(path string) ([]compiler.Artifact, error) {
@ -114,6 +134,10 @@ func (r *LuetRepository) SetTreePath(p string) {
r.TreePath = p r.TreePath = p
} }
func (r *LuetRepository) SetTree(b tree.Builder) {
r.Tree = b
}
func (r *LuetRepository) GetType() string { func (r *LuetRepository) GetType() string {
return r.Type return r.Type
} }
@ -141,6 +165,7 @@ func (r *LuetRepository) Write(dst string) error {
if err != nil { if err != nil {
return err return err
} }
r.Index = r.Index.CleanPath()
err = ioutil.WriteFile(filepath.Join(dst, "repository.yaml"), data, os.ModePerm) err = ioutil.WriteFile(filepath.Join(dst, "repository.yaml"), data, os.ModePerm)
if err != nil { if err != nil {
return err return err
@ -171,7 +196,9 @@ func (r *LuetRepository) Client() Client {
} }
func (r *LuetRepository) Sync() (Repository, error) { func (r *LuetRepository) Sync() (Repository, error) {
c := r.Client() c := r.Client()
if c == nil {
return nil, errors.New("No client could be generated from repository.")
}
file, err := c.DownloadFile("repository.yaml") file, err := c.DownloadFile("repository.yaml")
if err != nil { if err != nil {
return nil, errors.Wrap(err, "While downloading repository.yaml from "+r.GetUri()) return nil, errors.Wrap(err, "While downloading repository.yaml from "+r.GetUri())
@ -182,7 +209,8 @@ func (r *LuetRepository) Sync() (Repository, error) {
} }
defer os.Remove(file) defer os.Remove(file)
repo, err := NewLuetRepositoryFromYaml(dat) // TODO: make it swappable
repo, err := NewLuetRepositoryFromYaml(dat, pkg.NewInMemoryDatabase(false))
if err != nil { if err != nil {
return nil, errors.Wrap(err, "Error reading repository from file "+file) return nil, errors.Wrap(err, "Error reading repository from file "+file)
@ -212,11 +240,12 @@ func (r *LuetRepository) Sync() (Repository, error) {
return nil, errors.Wrap(err, "Error met while unpacking rootfs") return nil, errors.Wrap(err, "Error met while unpacking rootfs")
} }
reciper := tree.NewInstallerRecipe(r.GetTree().Tree().GetPackageSet()) reciper := tree.NewInstallerRecipe(pkg.NewInMemoryDatabase(false))
err = reciper.Load(treefs) err = reciper.Load(treefs)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "Error met while unpacking rootfs") return nil, errors.Wrap(err, "Error met while unpacking rootfs")
} }
repo.SetTree(reciper)
repo.SetTreePath(treefs) repo.SetTreePath(treefs)
return repo, nil return repo, nil

View File

@ -34,7 +34,11 @@ const (
FinalizerFile = "finalize.yaml" FinalizerFile = "finalize.yaml"
) )
func NewInstallerRecipe(db pkg.PackageDatabase) Builder { return &InstallerRecipe{Database: db} } func NewInstallerRecipe(db pkg.PackageDatabase) Builder {
tree := NewDefaultTree()
tree.SetPackageSet(db)
return &InstallerRecipe{Database: db, PackageTree: tree}
}
// InstallerRecipe is the "general" reciper for Trees // InstallerRecipe is the "general" reciper for Trees
type InstallerRecipe struct { type InstallerRecipe struct {