[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