diff --git a/pkg/compiler/artifact.go b/pkg/compiler/artifact.go new file mode 100644 index 00000000..b978c664 --- /dev/null +++ b/pkg/compiler/artifact.go @@ -0,0 +1,18 @@ +// 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 compiler + +type Artifact struct{} diff --git a/pkg/compiler/compiler.go b/pkg/compiler/compiler.go new file mode 100644 index 00000000..6bb5e740 --- /dev/null +++ b/pkg/compiler/compiler.go @@ -0,0 +1,58 @@ +// 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 compiler + +import ( + "errors" + "io/ioutil" + + "github.com/mudler/luet/pkg/helpers" + pkg "github.com/mudler/luet/pkg/package" + "github.com/mudler/luet/pkg/tree" +) + +const BuildFile = "build.yaml" + +type LuetCompiler struct { + *tree.Recipe + Backend CompilerBackend +} + +func NewLuetCompiler(backend CompilerBackend, t pkg.Tree) Compiler { + return &LuetCompiler{Backend: backend, Recipe: &tree.Recipe{PackageTree: t}} +} + +func (cs *LuetCompiler) Compile(p CompilationSpec) (*Artifact, error) { + return nil, errors.New("Not implemented yet") +} + +func (cs *LuetCompiler) FromPackage(p pkg.Package) (CompilationSpec, error) { + + pack, err := cs.Tree().GetPackageSet().FindPackage(p) + if err != nil { + return nil, err + } + buildFile := pack.Rel(BuildFile) + if !helpers.Exists(buildFile) { + return nil, errors.New("No build file present for " + p.GetFingerPrint()) + } + + dat, err := ioutil.ReadFile(buildFile) + if err != nil { + return nil, err + } + return NewLuetCompilationSpec(dat) +} diff --git a/pkg/compiler/compiler_suite_test.go b/pkg/compiler/compiler_suite_test.go new file mode 100644 index 00000000..242f57fd --- /dev/null +++ b/pkg/compiler/compiler_suite_test.go @@ -0,0 +1,28 @@ +// 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 compiler_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestSolver(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Compiler Suite") +} diff --git a/pkg/compiler/interface.go b/pkg/compiler/interface.go new file mode 100644 index 00000000..48c2adda --- /dev/null +++ b/pkg/compiler/interface.go @@ -0,0 +1,33 @@ +// 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 compiler + +import pkg "github.com/mudler/luet/pkg/package" + +type Compiler interface { + Compile(CompilationSpec) (*Artifact, error) + FromPackage(pkg.Package) (CompilationSpec, error) +} + +type CompilerBackend interface { + Tree() pkg.Tree + WithTree(pkg.Tree) +} + +// CompilationSpec represent a compilation specification derived from a package +type CompilationSpec interface { + ToDocker() (string, error) +} diff --git a/pkg/compiler/spec.go b/pkg/compiler/spec.go new file mode 100644 index 00000000..660b05ab --- /dev/null +++ b/pkg/compiler/spec.go @@ -0,0 +1,38 @@ +// 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 compiler + +import ( + yaml "gopkg.in/yaml.v2" +) + +type LuetCompilationSpec struct { + Steps []string `json:"steps"` + Image string `json:"image"` +} + +func NewLuetCompilationSpec(b []byte) (CompilationSpec, error) { + var spec LuetCompilationSpec + err := yaml.Unmarshal(b, &spec) + if err != nil { + return &spec, err + } + return &spec, nil +} + +func (cs *LuetCompilationSpec) ToDocker() (string, error) { + return "", nil +} diff --git a/pkg/compiler/spec_test.go b/pkg/compiler/spec_test.go new file mode 100644 index 00000000..9aca79fb --- /dev/null +++ b/pkg/compiler/spec_test.go @@ -0,0 +1,49 @@ +// 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 compiler_test + +import ( + . "github.com/mudler/luet/pkg/compiler" + pkg "github.com/mudler/luet/pkg/package" + "github.com/mudler/luet/pkg/tree" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Spec", func() { + Context("Simple package build definition", func() { + It("Loads it correctly", func() { + generalRecipe := tree.NewGeneralRecipe() + + err := generalRecipe.Load("../../tests/fixtures/buildtree") + 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(1)) + + compiler := NewLuetCompiler(nil, generalRecipe.Tree()) + spec, err := compiler.FromPackage(&pkg.DefaultPackage{Name: "enman", Category: "app-admin", Version: "1.4.0"}) + Expect(err).ToNot(HaveOccurred()) + + lspec, ok := spec.(*LuetCompilationSpec) + Expect(ok).To(BeTrue()) + + Expect(lspec.Steps).To(Equal([]string{"echo foo", "bar"})) + Expect(lspec.Image).To(Equal("luet/base")) + }) + + }) +}) diff --git a/pkg/helpers/file.go b/pkg/helpers/file.go new file mode 100644 index 00000000..c1313e46 --- /dev/null +++ b/pkg/helpers/file.go @@ -0,0 +1,28 @@ +// 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 helpers + +import "os" + +// Exists reports whether the named file or directory exists. +func Exists(name string) bool { + if _, err := os.Stat(name); err != nil { + if os.IsNotExist(err) { + return false + } + } + return true +} diff --git a/tests/fixtures/buildtree/app-admin/enman/1.4.0/build.yaml b/tests/fixtures/buildtree/app-admin/enman/1.4.0/build.yaml new file mode 100644 index 00000000..88556826 --- /dev/null +++ b/tests/fixtures/buildtree/app-admin/enman/1.4.0/build.yaml @@ -0,0 +1,4 @@ +image: "luet/base" +steps: + - echo foo + - bar \ No newline at end of file diff --git a/tests/fixtures/buildtree/app-admin/enman/1.4.0/definition.yaml b/tests/fixtures/buildtree/app-admin/enman/1.4.0/definition.yaml new file mode 100644 index 00000000..d2e0993e --- /dev/null +++ b/tests/fixtures/buildtree/app-admin/enman/1.4.0/definition.yaml @@ -0,0 +1,8 @@ +State: "" +category: app-admin +conflicts: null +name: enman +requires: null +set: false +use_flags: null +version: 1.4.0