[lxc-devel] [distrobuilder/master] make actions more flexible
monstermunchkin on Github
lxc-bot at linuxcontainers.org
Thu Mar 8 13:57:27 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 309 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180308/de593be2/attachment.bin>
-------------- next part --------------
From 78262d4ddebf8fb7bceab718345f1480dab1a790 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Thu, 8 Mar 2018 13:31:36 +0100
Subject: [PATCH 1/2] main: Run all post actions inside chroot
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
distrobuilder/main.go | 19 ++++++++++---------
distrobuilder/main_lxc.go | 17 ++++++++++++-----
distrobuilder/main_lxd.go | 18 +++++++++++++-----
3 files changed, 35 insertions(+), 19 deletions(-)
diff --git a/distrobuilder/main.go b/distrobuilder/main.go
index 5761a26..8d4d7f3 100644
--- a/distrobuilder/main.go
+++ b/distrobuilder/main.go
@@ -172,6 +172,12 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
return fmt.Errorf("Error while downloading source: %s", err)
}
+ // Setup the mounts and chroot into the rootfs
+ exitChroot, err := setupChroot(c.rootfsDir)
+ if err != nil {
+ return fmt.Errorf("Failed to setup chroot: %s", err)
+ }
+
// Run post unpack hook
if c.definition.Actions.PostUnpack != "" {
err := shared.RunScript(c.definition.Actions.PostUnpack)
@@ -180,12 +186,6 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
}
}
- // Setup the mounts and chroot into the rootfs
- exitChroot, err := setupChroot(c.rootfsDir)
- if err != nil {
- return fmt.Errorf("Failed to setup chroot: %s", err)
- }
-
// Install/remove/update packages
err = managePackages(c.definition.Packages, c.definition.Actions.PostUpdate)
if err != nil {
@@ -193,17 +193,18 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
return fmt.Errorf("Failed to manage packages: %s", err)
}
- // Unmount everything and exit the chroot
- exitChroot()
-
// Run post packages hook
if c.definition.Actions.PostPackages != "" {
err := shared.RunScript(c.definition.Actions.PostPackages)
if err != nil {
+ exitChroot()
return fmt.Errorf("Failed to run post-packages: %s", err)
}
}
+ // Unmount everything and exit the chroot
+ exitChroot()
+
return nil
}
diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index 537abcf..ac596e5 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -65,18 +65,25 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string) error {
if err != nil {
continue
}
+ }
+ exitChroot, err := setupChroot(c.global.sourceDir)
+ if err != nil {
+ return err
}
- // Run post packages hook
- if c.global.definition.Actions.PostPackages != "" {
- err := shared.RunScript(c.global.definition.Actions.PostPackages)
+ // Run post files hook
+ if c.global.definition.Actions.PostFiles != "" {
+ err := shared.RunScript(c.global.definition.Actions.PostFiles)
if err != nil {
- return fmt.Errorf("Failed to run post-packages: %s", err)
+ exitChroot()
+ return fmt.Errorf("Failed to run post-files: %s", err)
}
}
- err := img.Build()
+ exitChroot()
+
+ err = img.Build()
if err != nil {
return fmt.Errorf("Failed to create LXC image: %s", err)
}
diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go
index 6e2776f..6be3515 100644
--- a/distrobuilder/main_lxd.go
+++ b/distrobuilder/main_lxd.go
@@ -85,15 +85,23 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string) error {
}
}
- // Run post packages hook
- if c.global.definition.Actions.PostPackages != "" {
- err := shared.RunScript(c.global.definition.Actions.PostPackages)
+ exitChroot, err := setupChroot(c.global.sourceDir)
+ if err != nil {
+ return err
+ }
+
+ // Run post files hook
+ if c.global.definition.Actions.PostFiles != "" {
+ err := shared.RunScript(c.global.definition.Actions.PostFiles)
if err != nil {
- return fmt.Errorf("Failed to run post-packages: %s", err)
+ exitChroot()
+ return fmt.Errorf("Failed to run post-files: %s", err)
}
}
- err := img.Build(c.flagType == "unified", c.flagCompression)
+ exitChroot()
+
+ err = img.Build(c.flagType == "unified", c.flagCompression)
if err != nil {
return fmt.Errorf("Failed to create LXD image: %s", err)
}
From f4d8b692ffd4de7a0eba2979bb2484eeda0d8a8c Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Thu, 8 Mar 2018 14:36:36 +0100
Subject: [PATCH 2/2] main: Make actions more flexible
Resolves #44
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
distrobuilder/main.go | 23 ++++++++++++++++++-----
distrobuilder/main_lxc.go | 6 ++++--
distrobuilder/main_lxd.go | 6 ++++--
shared/definition.go | 26 ++++++++++++--------------
4 files changed, 38 insertions(+), 23 deletions(-)
diff --git a/distrobuilder/main.go b/distrobuilder/main.go
index 8d4d7f3..c190651 100644
--- a/distrobuilder/main.go
+++ b/distrobuilder/main.go
@@ -53,6 +53,7 @@ import (
"os"
"path/filepath"
+ lxd "github.com/lxc/lxd/shared"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
@@ -179,23 +180,35 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
}
// Run post unpack hook
- if c.definition.Actions.PostUnpack != "" {
- err := shared.RunScript(c.definition.Actions.PostUnpack)
+ hook, ok := c.definition.Actions["post-unpack"]
+ if ok && (len(hook.Releases) == 0 ||
+ lxd.StringInSlice(c.definition.Image.Release, hook.Releases)) {
+ err := shared.RunScript(hook.Action)
if err != nil {
return fmt.Errorf("Failed to run post-unpack: %s", err)
}
}
+ //
+ hook, ok = c.definition.Actions["post-update"]
+ if len(hook.Releases) > 0 &&
+ !lxd.StringInSlice(c.definition.Image.Release, hook.Releases) {
+ // Set empty action to prevent if from running
+ hook.Action = ""
+ }
+
// Install/remove/update packages
- err = managePackages(c.definition.Packages, c.definition.Actions.PostUpdate)
+ err = managePackages(c.definition.Packages, hook.Action)
if err != nil {
exitChroot()
return fmt.Errorf("Failed to manage packages: %s", err)
}
// Run post packages hook
- if c.definition.Actions.PostPackages != "" {
- err := shared.RunScript(c.definition.Actions.PostPackages)
+ hook, ok = c.definition.Actions["post-packages"]
+ if ok && (len(hook.Releases) == 0 ||
+ lxd.StringInSlice(c.definition.Image.Release, hook.Releases)) {
+ err := shared.RunScript(hook.Action)
if err != nil {
exitChroot()
return fmt.Errorf("Failed to run post-packages: %s", err)
diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index ac596e5..a6912e8 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -73,8 +73,10 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string) error {
}
// Run post files hook
- if c.global.definition.Actions.PostFiles != "" {
- err := shared.RunScript(c.global.definition.Actions.PostFiles)
+ hook, ok := c.global.definition.Actions["post-files"]
+ if ok && (len(hook.Releases) == 0 ||
+ lxd.StringInSlice(c.global.definition.Image.Release, hook.Releases)) {
+ err := shared.RunScript(hook.Action)
if err != nil {
exitChroot()
return fmt.Errorf("Failed to run post-files: %s", err)
diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go
index 6be3515..167899a 100644
--- a/distrobuilder/main_lxd.go
+++ b/distrobuilder/main_lxd.go
@@ -91,8 +91,10 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string) error {
}
// Run post files hook
- if c.global.definition.Actions.PostFiles != "" {
- err := shared.RunScript(c.global.definition.Actions.PostFiles)
+ hook, ok := c.global.definition.Actions["post-files"]
+ if ok && (len(hook.Releases) == 0 ||
+ lxd.StringInSlice(c.global.definition.Image.Release, hook.Releases)) {
+ err := shared.RunScript(hook.Action)
if err != nil {
exitChroot()
return fmt.Errorf("Failed to run post-files: %s", err)
diff --git a/shared/definition.go b/shared/definition.go
index e47c4af..721af66 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -67,13 +67,11 @@ type DefinitionFile struct {
Releases []string `yaml:"releases,omitempty"`
}
-// DefinitionActions specifies custom actions (scripts) which are to be run after
-// certain actions.
-type DefinitionActions struct {
- PostUnpack string `yaml:"post-unpack,omitempty"`
- PostUpdate string `yaml:"post-update,omitempty"`
- PostPackages string `yaml:"post-packages,omitempty"`
- PostFiles string `yaml:"post-files,omitempty"`
+// A DefinitionAction specifies a custom action (script) which is to be run after
+// a certain action.
+type DefinitionAction struct {
+ Action string `yaml:"action"`
+ Releases []string `yaml:"releases,omitempty"`
}
// DefinitionMappings defines custom mappings.
@@ -84,13 +82,13 @@ type DefinitionMappings struct {
// A Definition a definition.
type Definition struct {
- Image DefinitionImage `yaml:"image"`
- Source DefinitionSource `yaml:"source"`
- Targets DefinitionTarget `yaml:"targets,omitempty"`
- Files []DefinitionFile `yaml:"files,omitempty"`
- Packages DefinitionPackages `yaml:"packages,omitempty"`
- Actions DefinitionActions `yaml:"actions,omitempty"`
- Mappings DefinitionMappings `yaml:"mappings,omitempty"`
+ Image DefinitionImage `yaml:"image"`
+ Source DefinitionSource `yaml:"source"`
+ Targets DefinitionTarget `yaml:"targets,omitempty"`
+ Files []DefinitionFile `yaml:"files,omitempty"`
+ Packages DefinitionPackages `yaml:"packages,omitempty"`
+ Actions map[string]DefinitionAction `yaml:"actions,omitempty"`
+ Mappings DefinitionMappings `yaml:"mappings,omitempty"`
}
// SetDefinitionDefaults sets some default values for the given Definition.
More information about the lxc-devel
mailing list