[lxc-devel] [distrobuilder/master] distrobuilder: Support image variant "cloud"
monstermunchkin on Github
lxc-bot at linuxcontainers.org
Fri Aug 9 13:12:43 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190809/3084c54d/attachment.bin>
-------------- next part --------------
From 7728cf802964be59e0369f7f5767fb0a88dba64a Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Fri, 9 Aug 2019 14:54:49 +0200
Subject: [PATCH] distrobuilder: Support image variant "cloud"
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
distrobuilder/main.go | 21 ++++++++++++++++++++
distrobuilder/main_lxc.go | 11 +++++++++++
distrobuilder/main_lxd.go | 40 +++++++++++++++++++++++++++++++++++++++
3 files changed, 72 insertions(+)
diff --git a/distrobuilder/main.go b/distrobuilder/main.go
index 2cb49d5..29793ff 100644
--- a/distrobuilder/main.go
+++ b/distrobuilder/main.go
@@ -63,6 +63,7 @@ import (
"strings"
"time"
+ lxd "github.com/lxc/lxd/shared"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
@@ -229,6 +230,26 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
}
}
+ if c.definition.Image.Variant == "cloud" {
+ // Make sure to install cloud-init if we're building a cloud image
+ foundCloudInit := false
+
+ for _, set := range c.definition.Packages.Sets {
+ if lxd.StringInSlice("cloud-init", set.Packages) && lxd.StringInSlice(c.definition.Image.Release, set.Releases) && lxd.StringInSlice(c.definition.Image.ArchitectureMapped, set.Architectures) {
+ foundCloudInit = true
+ break
+ }
+ }
+
+ if !foundCloudInit {
+ c.definition.Packages.Sets = append(c.definition.Packages.Sets,
+ shared.DefinitionPackagesSet{
+ Action: "install",
+ Packages: []string{"cloud-init"},
+ })
+ }
+ }
+
// Install/remove/update packages
err = managePackages(c.definition.Packages,
c.definition.GetRunnableActions("post-update"), c.definition.Image.Release,
diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index fa966cc..34e5708 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -54,6 +54,11 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string) error {
return fmt.Errorf("Unknown generator '%s'", file.Generator)
}
+ if file.Generator == "cloud-init" {
+ // Ignore for now and disable cloud-init once all files have been processed
+ continue
+ }
+
if len(file.Releases) > 0 && !lxd.StringInSlice(
c.global.definition.Image.Release, file.Releases) {
continue
@@ -66,6 +71,12 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string) error {
}
}
+ // Disable cloud-init
+ err := generators.Get("cloud-init").RunLXC(c.global.flagCacheDir, c.global.sourceDir, img, shared.DefinitionFile{})
+ if err != nil {
+ return err
+ }
+
exitChroot, err := shared.SetupChroot(c.global.sourceDir,
c.global.definition.Environment)
if err != nil {
diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go
index 921d578..47964ee 100644
--- a/distrobuilder/main_lxd.go
+++ b/distrobuilder/main_lxd.go
@@ -67,6 +67,13 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string) error {
img := image.NewLXDImage(c.global.sourceDir, c.global.targetDir,
c.global.flagCacheDir, *c.global.definition)
+ definedCloudInitFiles := map[string]bool{
+ "user-data": false,
+ "meta-data": false,
+ "vendor-data": false,
+ "network-config": false,
+ }
+
for _, file := range c.global.definition.Files {
if len(file.Releases) > 0 && !lxd.StringInSlice(c.global.definition.Image.Release,
file.Releases) {
@@ -78,6 +85,16 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string) error {
return fmt.Errorf("Unknown generator '%s'", file.Generator)
}
+ if c.global.definition.Image.Variant == "cloud" && file.Generator == "cloud-init" {
+ _, ok := definedCloudInitFiles[file.Name]
+ if !ok {
+ // Skip unknown cloud-init configuration files
+ continue
+ }
+
+ definedCloudInitFiles[file.Name] = true
+ }
+
err := generator.RunLXD(c.global.flagCacheDir, c.global.sourceDir,
img, file)
if err != nil {
@@ -85,6 +102,29 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string) error {
}
}
+ // Make sure all cloud-init config files are present if we're building
+ // a cloud image.
+ if c.global.definition.Image.Variant == "cloud" {
+ generator := generators.Get("cloud-init")
+
+ for configFile, ok := range definedCloudInitFiles {
+ if ok {
+ // The cloud-init config file has already been defined, possibly
+ // with custom content. Nothing to do here.
+ continue
+ }
+
+ err := generator.RunLXD(c.global.flagCacheDir, c.global.sourceDir, img,
+ shared.DefinitionFile{
+ Generator: "cloud-init",
+ Name: configFile,
+ })
+ if err != nil {
+ return err
+ }
+ }
+ }
+
exitChroot, err := shared.SetupChroot(c.global.sourceDir,
c.global.definition.Environment)
if err != nil {
More information about the lxc-devel
mailing list