From e664f4f2cf7600c668fc51304aea32032900f43a Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Fri, 22 Nov 2019 23:12:03 +0100 Subject: [PATCH] Return client from repository and install packages in the workers --- pkg/installer/client/interface.go | 20 +++++++ pkg/installer/client/local.go | 20 +++---- pkg/installer/installer.go | 14 +++-- pkg/installer/installer_test.go | 87 +++++++++++++++++++++++++++++++ pkg/installer/interface.go | 7 +-- pkg/installer/repository.go | 15 ++++-- 6 files changed, 137 insertions(+), 26 deletions(-) create mode 100644 pkg/installer/client/interface.go create mode 100644 pkg/installer/installer_test.go diff --git a/pkg/installer/client/interface.go b/pkg/installer/client/interface.go new file mode 100644 index 00000000..7085b3af --- /dev/null +++ b/pkg/installer/client/interface.go @@ -0,0 +1,20 @@ +// Copyright © 2019 Ettore Di Giacinto +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, see . + +package client + +type RepoData struct { + Uri string +} \ No newline at end of file diff --git a/pkg/installer/client/local.go b/pkg/installer/client/local.go index be2fa4b8..ac4dc561 100644 --- a/pkg/installer/client/local.go +++ b/pkg/installer/client/local.go @@ -22,33 +22,25 @@ import ( "github.com/mudler/luet/pkg/compiler" "github.com/mudler/luet/pkg/helpers" - "github.com/mudler/luet/pkg/installer" ) type LocalClient struct { - Repository installer.Repository + RepoData RepoData } -func NewLocalClient(r installer.Repository) installer.Client { - return &LocalClient{Repository: r} +func NewLocalClient(r RepoData) *LocalClient { + return &LocalClient{RepoData: r} } -func (c *LocalClient) GetRepository() installer.Repository { - return c.Repository -} - -func (c *LocalClient) SetRepository(r installer.Repository) { - c.Repository = r -} func (c *LocalClient) DownloadArtifact(artifact compiler.Artifact) (compiler.Artifact, error) { file, err := ioutil.TempFile(os.TempDir(), "localclient") if err != nil { - return "", err + return nil, err } //defer os.Remove(file.Name()) - err = helpers.CopyFile(filepath.Join(repo.GetUri(), artifact.GetPath()), file.Name()) + err = helpers.CopyFile(filepath.Join(c.RepoData.Uri, artifact.GetPath()), file.Name()) return compiler.NewPackageArtifact(file.Name()), nil } @@ -60,7 +52,7 @@ func (c *LocalClient) DownloadFile(name string) (string, error) { } //defer os.Remove(file.Name()) - err = helpers.CopyFile(filepath.Join(r.GetUri(), name), file.Name()) + err = helpers.CopyFile(filepath.Join(c.RepoData.Uri, name), file.Name()) return file.Name(), err } diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index 5d1d14af..ce8bbbde 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -17,12 +17,14 @@ package installer import ( "io/ioutil" + "os" "os/exec" "sort" "sync" "github.com/ghodss/yaml" compiler "github.com/mudler/luet/pkg/compiler" + "github.com/mudler/luet/pkg/helpers" . "github.com/mudler/luet/pkg/logger" pkg "github.com/mudler/luet/pkg/package" "github.com/mudler/luet/pkg/solver" @@ -31,7 +33,6 @@ import ( ) type LuetInstaller struct { - PackageClient Client PackageRepositories Repositories Concurrency int } @@ -94,7 +95,7 @@ func (l *LuetInstaller) Install(p []pkg.Package, s *System) error { defer SpinnerStop() syncedRepos := Repositories{} for _, r := range l.PackageRepositories { - repo, err := r.Sync(l.PackageClient) + repo, err := r.Sync() if err != nil { return errors.Wrap(err, "Failed syncing repository"+r.GetName()) } @@ -245,6 +246,14 @@ func (l *LuetInstaller) Install(p []pkg.Package, s *System) error { func (l *LuetInstaller) installPackage(a ArtifactMatch, s *System) error { // FIXME: Implement + artifact, err := a.Repository.Client().DownloadArtifact(a.Artifact) + defer os.Remove(artifact.GetPath()) + err = helpers.Untar(artifact.GetPath(), s.Target, true) + if err != nil { + return errors.Wrap(err, "Error met while unpacking rootfs") + } + // First create client and download + // Then unpack to system return nil } @@ -268,5 +277,4 @@ func (l *LuetInstaller) Uninstall(p []pkg.Package, s *System) error { } -func (l *LuetInstaller) Client(c Client) { l.PackageClient = c } func (l *LuetInstaller) Repositories(r []Repository) { l.PackageRepositories = r } diff --git a/pkg/installer/installer_test.go b/pkg/installer/installer_test.go new file mode 100644 index 00000000..fa2e3fcd --- /dev/null +++ b/pkg/installer/installer_test.go @@ -0,0 +1,87 @@ +// Copyright © 2019 Ettore Di Giacinto +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, see . + +package installer_test + +import ( + "io/ioutil" + "os" + + // . "github.com/mudler/luet/pkg/installer" + backend "github.com/mudler/luet/pkg/compiler/backend" + + compiler "github.com/mudler/luet/pkg/compiler" + "github.com/mudler/luet/pkg/helpers" + pkg "github.com/mudler/luet/pkg/package" + "github.com/mudler/luet/pkg/tree" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Installer", func() { + Context("Writes a repository definition", func() { + It("Writes a repo", func() { + //repo:=NewLuetRepository() + + tmpdir, err := ioutil.TempDir("", "tree") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(tmpdir) // clean up + + generalRecipe := tree.NewCompilerRecipe(pkg.NewInMemoryDatabase(false)) + + err = generalRecipe.Load("../../tests/fixtures/buildable") + Expect(err).ToNot(HaveOccurred()) + Expect(generalRecipe.Tree()).ToNot(BeNil()) // It should be populated back at this point + + Expect(len(generalRecipe.Tree().GetPackageSet().GetPackages())).To(Equal(3)) + + compiler := compiler.NewLuetCompiler(backend.NewSimpleDockerBackend(), generalRecipe.Tree(), generalRecipe.Tree().GetPackageSet()) + err = compiler.Prepare(1) + Expect(err).ToNot(HaveOccurred()) + + spec, err := compiler.FromPackage(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"}) + Expect(err).ToNot(HaveOccurred()) + + Expect(spec.GetPackage().GetPath()).ToNot(Equal("")) + + tmpdir, err = ioutil.TempDir("", "tree") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(tmpdir) // clean up + + Expect(spec.BuildSteps()).To(Equal([]string{"echo artifact5 > /test5", "echo artifact6 > /test6", "./generate.sh"})) + Expect(spec.GetPreBuildSteps()).To(Equal([]string{"echo foo > /test", "echo bar > /test2", "chmod +x generate.sh"})) + + spec.SetOutputPath(tmpdir) + artifact, err := compiler.Compile(2, false, spec) + Expect(err).ToNot(HaveOccurred()) + Expect(helpers.Exists(artifact.GetPath())).To(BeTrue()) + Expect(helpers.Untar(artifact.GetPath(), tmpdir, false)).ToNot(HaveOccurred()) + + Expect(helpers.Exists(spec.Rel("test5"))).To(BeTrue()) + Expect(helpers.Exists(spec.Rel("test6"))).To(BeTrue()) + + content1, err := helpers.Read(spec.Rel("test5")) + Expect(err).ToNot(HaveOccurred()) + content2, err := helpers.Read(spec.Rel("test6")) + Expect(err).ToNot(HaveOccurred()) + Expect(content1).To(Equal("artifact5\n")) + Expect(content2).To(Equal("artifact6\n")) + + Expect(helpers.Exists(spec.Rel("b-test-1.0.package.tar"))).To(BeTrue()) + + }) + + }) +}) diff --git a/pkg/installer/interface.go b/pkg/installer/interface.go index 53c36acb..3696a1bf 100644 --- a/pkg/installer/interface.go +++ b/pkg/installer/interface.go @@ -25,16 +25,12 @@ import ( type Installer interface { Install([]pkg.Package, *System) error Uninstall([]pkg.Package, *System) error - Client(Client) Repositories([]Repository) } type Client interface { DownloadArtifact(compiler.Artifact) (compiler.Artifact, error) DownloadFile(string) (string, error) - - GetRepository() Repository - SetRepository(Repository) } type Repositories []Repository @@ -46,9 +42,10 @@ type Repository interface { GetIndex() compiler.ArtifactIndex GetTree() tree.Builder Write(path string) error - Sync(Client) (Repository, error) + Sync() (Repository, error) GetTreePath() string SetTreePath(string) GetType() string SetType(string) + Client() Client } diff --git a/pkg/installer/repository.go b/pkg/installer/repository.go index 0d988b03..e82e06b9 100644 --- a/pkg/installer/repository.go +++ b/pkg/installer/repository.go @@ -22,6 +22,7 @@ import ( "sort" "strings" + "github.com/mudler/luet/pkg/installer/client" . "github.com/mudler/luet/pkg/logger" "github.com/ghodss/yaml" @@ -153,8 +154,16 @@ func (r *LuetRepository) Write(dst string) error { return nil } -func (r *LuetRepository) Sync(c Client) (Repository, error) { - c.SetRepository(r) +func (r *LuetRepository) Client() Client { + switch r.GetType() { + case "local": + return client.NewLocalClient(client.RepoData{Uri: r.GetUri()}) + } + + return nil +} +func (r *LuetRepository) Sync() (Repository, error) { + c := r.Client() file, err := c.DownloadFile("repository.yaml") if err != nil { @@ -206,8 +215,6 @@ func (r *LuetRepository) Sync(c Client) (Repository, error) { return repo, nil } -// TODO: - func (r Repositories) Len() int { return len(r) } func (r Repositories) Swap(i, j int) { r[i], r[j] = r[j], r[i] } func (r Repositories) Less(i, j int) bool {