mirror of
https://github.com/mudler/luet.git
synced 2025-07-18 09:21:13 +00:00
Support templated packages
This commit is contained in:
parent
097ea37c97
commit
74246780d4
9
go.mod
9
go.mod
@ -4,7 +4,6 @@ go 1.12
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/DataDog/zstd v1.4.4 // indirect
|
github.com/DataDog/zstd v1.4.4 // indirect
|
||||||
github.com/MottainaiCI/simplestreams-builder v0.1.0 // indirect
|
|
||||||
github.com/Sabayon/pkgs-checker v0.6.3-0.20200912135508-97c41780e9b6
|
github.com/Sabayon/pkgs-checker v0.6.3-0.20200912135508-97c41780e9b6
|
||||||
github.com/asdine/storm v0.0.0-20190418133842-e0f77eada154
|
github.com/asdine/storm v0.0.0-20190418133842-e0f77eada154
|
||||||
github.com/briandowns/spinner v1.7.0
|
github.com/briandowns/spinner v1.7.0
|
||||||
@ -14,7 +13,6 @@ require (
|
|||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
|
||||||
github.com/ecooper/qlearning v0.0.0-20160612200101-3075011a69fd
|
github.com/ecooper/qlearning v0.0.0-20160612200101-3075011a69fd
|
||||||
github.com/ghodss/yaml v1.0.0
|
github.com/ghodss/yaml v1.0.0
|
||||||
github.com/go-yaml/yaml v2.1.0+incompatible // indirect
|
|
||||||
github.com/hashicorp/go-version v1.2.0
|
github.com/hashicorp/go-version v1.2.0
|
||||||
github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3
|
github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3
|
||||||
github.com/klauspost/pgzip v1.2.1
|
github.com/klauspost/pgzip v1.2.1
|
||||||
@ -24,7 +22,6 @@ require (
|
|||||||
github.com/logrusorgru/aurora v0.0.0-20190417123914-21d75270181e
|
github.com/logrusorgru/aurora v0.0.0-20190417123914-21d75270181e
|
||||||
github.com/marcsauter/single v0.0.0-20181104081128-f8bf46f26ec0
|
github.com/marcsauter/single v0.0.0-20181104081128-f8bf46f26ec0
|
||||||
github.com/mattn/go-isatty v0.0.10 // indirect
|
github.com/mattn/go-isatty v0.0.10 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.3 // indirect
|
|
||||||
github.com/moby/sys/mount v0.1.1-0.20200320164225-6154f11e6840 // indirect
|
github.com/moby/sys/mount v0.1.1-0.20200320164225-6154f11e6840 // indirect
|
||||||
github.com/mudler/cobra-extensions v0.0.0-20200612154940-31a47105fe3d
|
github.com/mudler/cobra-extensions v0.0.0-20200612154940-31a47105fe3d
|
||||||
github.com/mudler/docker-companion v0.4.6-0.20200418093252-41846f112d87
|
github.com/mudler/docker-companion v0.4.6-0.20200418093252-41846f112d87
|
||||||
@ -34,9 +31,7 @@ require (
|
|||||||
github.com/pelletier/go-toml v1.6.0 // indirect
|
github.com/pelletier/go-toml v1.6.0 // indirect
|
||||||
github.com/philopon/go-toposort v0.0.0-20170620085441-9be86dbd762f
|
github.com/philopon/go-toposort v0.0.0-20170620085441-9be86dbd762f
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/spf13/afero v1.2.2 // indirect
|
|
||||||
github.com/spf13/cobra v1.0.0
|
github.com/spf13/cobra v1.0.0
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
|
||||||
github.com/spf13/viper v1.6.3
|
github.com/spf13/viper v1.6.3
|
||||||
github.com/stevenle/topsort v0.0.0-20130922064739-8130c1d7596b
|
github.com/stevenle/topsort v0.0.0-20130922064739-8130c1d7596b
|
||||||
go.etcd.io/bbolt v1.3.4
|
go.etcd.io/bbolt v1.3.4
|
||||||
@ -45,9 +40,9 @@ require (
|
|||||||
go.uber.org/zap v1.13.0
|
go.uber.org/zap v1.13.0
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect
|
||||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
|
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
|
||||||
golang.org/x/tools v0.0.0-20200102200121-6de373a2766c // indirect
|
gopkg.in/yaml.v2 v2.2.8
|
||||||
gopkg.in/yaml.v2 v2.2.7
|
|
||||||
gotest.tools/v3 v3.0.2 // indirect
|
gotest.tools/v3 v3.0.2 // indirect
|
||||||
|
helm.sh/helm/v3 v3.3.4
|
||||||
mvdan.cc/sh/v3 v3.0.0-beta1
|
mvdan.cc/sh/v3 v3.0.0-beta1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,9 +17,11 @@ package compiler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/ghodss/yaml"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -34,6 +36,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const BuildFile = "build.yaml"
|
const BuildFile = "build.yaml"
|
||||||
|
const DefinitionFile = "definition.yaml"
|
||||||
|
|
||||||
type LuetCompiler struct {
|
type LuetCompiler struct {
|
||||||
*tree.CompilerRecipe
|
*tree.CompilerRecipe
|
||||||
@ -641,6 +644,8 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p Compila
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type templatedata map[string]interface{}
|
||||||
|
|
||||||
func (cs *LuetCompiler) FromPackage(p pkg.Package) (CompilationSpec, error) {
|
func (cs *LuetCompiler) FromPackage(p pkg.Package) (CompilationSpec, error) {
|
||||||
|
|
||||||
pack, err := cs.Database.FindPackageCandidate(p)
|
pack, err := cs.Database.FindPackageCandidate(p)
|
||||||
@ -652,12 +657,28 @@ func (cs *LuetCompiler) FromPackage(p pkg.Package) (CompilationSpec, error) {
|
|||||||
if !helpers.Exists(buildFile) {
|
if !helpers.Exists(buildFile) {
|
||||||
return nil, errors.New("No build file present for " + p.GetFingerPrint())
|
return nil, errors.New("No build file present for " + p.GetFingerPrint())
|
||||||
}
|
}
|
||||||
|
defFile := pack.Rel(DefinitionFile)
|
||||||
dat, err := ioutil.ReadFile(buildFile)
|
if !helpers.Exists(defFile) {
|
||||||
|
return nil, errors.New("No build file present for " + p.GetFingerPrint())
|
||||||
|
}
|
||||||
|
def, err := ioutil.ReadFile(defFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return NewLuetCompilationSpec(dat, pack)
|
|
||||||
|
build, err := ioutil.ReadFile(buildFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var values templatedata
|
||||||
|
if err = yaml.Unmarshal(def, &values); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out, err := helpers.RenderHelm(string(build), values)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewLuetCompilationSpec([]byte(out), pack)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs *LuetCompiler) GetBackend() CompilerBackend {
|
func (cs *LuetCompiler) GetBackend() CompilerBackend {
|
||||||
|
@ -108,6 +108,27 @@ var _ = Describe("Compiler", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Context("Templated packages",func(){
|
||||||
|
It("Renders", func() {
|
||||||
|
generalRecipe := tree.NewCompilerRecipe(pkg.NewInMemoryDatabase(false))
|
||||||
|
tmpdir, err := ioutil.TempDir("", "package")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
defer os.RemoveAll(tmpdir) // clean up
|
||||||
|
|
||||||
|
err = generalRecipe.Load("../../tests/fixtures/templates")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
compiler := NewLuetCompiler(sd.NewSimpleDockerBackend(), generalRecipe.GetDatabase(), NewDefaultCompilerOptions())
|
||||||
|
|
||||||
|
Expect(len(generalRecipe.GetDatabase().GetPackages())).To(Equal(1))
|
||||||
|
pkg ,err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
spec, err := compiler.FromPackage(pkg)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(spec.GetImage()).To(Equal("b:bar"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
Context("Reconstruct image tree", func() {
|
Context("Reconstruct image tree", func() {
|
||||||
It("Compiles it", func() {
|
It("Compiles it", func() {
|
||||||
generalRecipe := tree.NewCompilerRecipe(pkg.NewInMemoryDatabase(false))
|
generalRecipe := tree.NewCompilerRecipe(pkg.NewInMemoryDatabase(false))
|
||||||
|
34
pkg/helpers/helm.go
Normal file
34
pkg/helpers/helm.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package helpers
|
||||||
|
|
||||||
|
import (
|
||||||
|
|
||||||
|
"helm.sh/helm/v3/pkg/chart"
|
||||||
|
"helm.sh/helm/v3/pkg/chartutil"
|
||||||
|
"helm.sh/helm/v3/pkg/engine"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RenderHelm renders the template string with helm
|
||||||
|
func RenderHelm(template string, values map[string]interface{}) (string,error) {
|
||||||
|
c := &chart.Chart{
|
||||||
|
Metadata: &chart.Metadata{
|
||||||
|
Name: "",
|
||||||
|
Version: "",
|
||||||
|
},
|
||||||
|
Templates: []*chart.File{
|
||||||
|
{Name: "templates", Data: []byte(template)},
|
||||||
|
},
|
||||||
|
Values: map[string]interface{}{"Values":values},
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := chartutil.CoalesceValues(c, map[string]interface{}{})
|
||||||
|
if err != nil {
|
||||||
|
return "",errors.Wrap(err,"while rendering template")
|
||||||
|
}
|
||||||
|
out, err := engine.Render(c, v)
|
||||||
|
if err != nil {
|
||||||
|
return "",errors.Wrap(err,"while rendering template")
|
||||||
|
}
|
||||||
|
|
||||||
|
return out["templates"],nil
|
||||||
|
}
|
32
pkg/helpers/helm_test.go
Normal file
32
pkg/helpers/helm_test.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// 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 helpers_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/mudler/luet/pkg/helpers"
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("Helpers", func() {
|
||||||
|
Context("RenderHelm", func() {
|
||||||
|
It("Renders templates", func() {
|
||||||
|
out, err := RenderHelm("{{.Values.Test}}",map[string]interface{}{"Test":"foo"})
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(out).To(Equal("foo"))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
1
tests/fixtures/templates/build.yaml
vendored
Normal file
1
tests/fixtures/templates/build.yaml
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
image: "{{.Values.name}}:{{.Values.test.foo}}"
|
5
tests/fixtures/templates/definition.yaml
vendored
Normal file
5
tests/fixtures/templates/definition.yaml
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
category: "test"
|
||||||
|
name: "b"
|
||||||
|
version: "1.0"
|
||||||
|
test:
|
||||||
|
foo: "bar"
|
Loading…
Reference in New Issue
Block a user