Return client from repository and install packages in the workers

This commit is contained in:
Ettore Di Giacinto
2019-11-22 23:12:03 +01:00
parent 75c1b66ae3
commit e664f4f2cf
6 changed files with 137 additions and 26 deletions

View File

@@ -0,0 +1,20 @@
// Copyright © 2019 Ettore Di Giacinto <mudler@gentoo.org>
//
// 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 <http://www.gnu.org/licenses/>.
package client
type RepoData struct {
Uri string
}

View File

@@ -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
}

View File

@@ -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 }

View File

@@ -0,0 +1,87 @@
// Copyright © 2019 Ettore Di Giacinto <mudler@gentoo.org>
//
// 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 <http://www.gnu.org/licenses/>.
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())
})
})
})

View File

@@ -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
}

View File

@@ -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 {