[lxc-devel] [distrobuilder/master] shared: Differentiate between build-dir and others

monstermunchkin on Github lxc-bot at linuxcontainers.org
Tue Mar 3 13:20:27 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 490 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200303/c26f5bb7/attachment.bin>
-------------- next part --------------
From 1b3f6ec78d7e17ed7a5f3c674d5ff8c8f2fb9de5 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Tue, 3 Mar 2020 14:19:41 +0100
Subject: [PATCH] shared: Differentiate between build-dir and others

This changes the types filtering behaviour.
When running build-dir, only section with no types filter will be
processed.

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 distrobuilder/main.go           | 16 +++++++---
 distrobuilder/main_build-dir.go |  2 +-
 distrobuilder/main_lxc.go       |  2 +-
 distrobuilder/main_lxd.go       |  2 +-
 shared/definition.go            | 10 ++++--
 shared/definition_test.go       | 54 +++++++++++++++++++++++----------
 6 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/distrobuilder/main.go b/distrobuilder/main.go
index 6fba06a..55ffd83 100644
--- a/distrobuilder/main.go
+++ b/distrobuilder/main.go
@@ -259,15 +259,23 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
 	// Unmount everything and exit the chroot
 	defer exitChroot()
 
-	// If we're running build-dir, only process sections which are meant for both
-	// containers and VMs.
-	imageTargets := shared.ImageTargetAll
+	var imageTargets shared.ImageTarget
+
+	// If we're running either build-lxc or build-lxd, include types which are
+	// meant for all.
+	// If we're running build-dir, only process section which DO NOT specify
+	// a types filter.
+	if !isRunningBuildDir {
+		imageTargets = shared.ImageTargetAll
+	}
 
-	// If we call build-lxc or build-lxd, also process container-only sections.
 	switch cmd.CalledAs() {
 	case "build-lxc":
+		// If we're running build-lxc, also process container-only sections.
 		imageTargets |= shared.ImageTargetContainer
 	case "build-lxd":
+		// Include either container-specific or vm-specific sections when
+		// running build-lxd.
 		ok, err := cmd.Flags().GetBool("vm")
 		if err != nil {
 			return err
diff --git a/distrobuilder/main_build-dir.go b/distrobuilder/main_build-dir.go
index c9994bb..fedc6c5 100644
--- a/distrobuilder/main_build-dir.go
+++ b/distrobuilder/main_build-dir.go
@@ -28,7 +28,7 @@ func (c *cmdBuildDir) command() *cobra.Command {
 					return fmt.Errorf("Unknown generator '%s'", file.Generator)
 				}
 
-				if !shared.ApplyFilter(&file, c.global.definition.Image.Release, c.global.definition.Image.ArchitectureMapped, c.global.definition.Image.Variant, c.global.definition.Targets.Type, shared.ImageTargetAll) {
+				if !shared.ApplyFilter(&file, c.global.definition.Image.Release, c.global.definition.Image.ArchitectureMapped, c.global.definition.Image.Variant, c.global.definition.Targets.Type, 0) {
 					continue
 				}
 
diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index 950a3cb..0384066 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -71,7 +71,7 @@ func (c *cmdLXC) runPack(cmd *cobra.Command, args []string, overlayDir string) e
 	defer exitChroot()
 
 	var manager *managers.Manager
-	imageTargets := shared.ImageTargetContainer
+	imageTargets := shared.ImageTargetAll | shared.ImageTargetContainer
 
 	if c.global.definition.Packages.Manager != "" {
 		manager = managers.Get(c.global.definition.Packages.Manager)
diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go
index 2fa2648..c4bd98d 100644
--- a/distrobuilder/main_lxd.go
+++ b/distrobuilder/main_lxd.go
@@ -121,7 +121,7 @@ func (c *cmdLXD) runPack(cmd *cobra.Command, args []string, overlayDir string) e
 	defer exitChroot()
 
 	var manager *managers.Manager
-	var imageTargets shared.ImageTarget
+	imageTargets := shared.ImageTargetAll
 
 	if c.flagVM {
 		imageTargets = shared.ImageTargetVM
diff --git a/shared/definition.go b/shared/definition.go
index a61e4d3..b8fa7eb 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -594,20 +594,24 @@ func ApplyFilter(filter Filter, release string, architecture string, variant str
 
 	types := filter.GetTypes()
 
+	if acceptedImageTargets == 0 && len(types) == 0 {
+		return true
+	}
+
 	if acceptedImageTargets&ImageTargetAll > 0 {
-		if len(types) == 0 || len(types) == 2 && shared.StringInSlice(targetType, types) {
+		if len(types) == 2 && shared.StringInSlice(targetType, types) {
 			return true
 		}
 	}
 
 	if acceptedImageTargets&ImageTargetContainer > 0 {
-		if targetType == "container" && len(types) == 1 && types[0] == targetType {
+		if targetType == "container" && shared.StringInSlice(targetType, types) {
 			return true
 		}
 	}
 
 	if acceptedImageTargets&ImageTargetVM > 0 {
-		if targetType == "vm" && len(types) == 1 && types[0] == targetType {
+		if targetType == "vm" && shared.StringInSlice(targetType, types) {
 			return true
 		}
 	}
diff --git a/shared/definition_test.go b/shared/definition_test.go
index eeace7b..4810b8c 100644
--- a/shared/definition_test.go
+++ b/shared/definition_test.go
@@ -507,33 +507,55 @@ func TestDefinitionFilter(t *testing.T) {
 func TestApplyFilter(t *testing.T) {
 	repo := DefinitionPackagesRepository{}
 
+	// Variants
 	repo.Variants = []string{"default"}
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", 0))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "cloud", "vm", 0))
+
+	// Architectures
 	repo.Architectures = []string{"amd64", "i386"}
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", 0))
+	require.True(t, ApplyFilter(&repo, "foo", "i386", "default", "vm", 0))
+	require.False(t, ApplyFilter(&repo, "foo", "s390", "default", "vm", 0))
+
+	// Releases
 	repo.Releases = []string{"foo"}
-	repo.Types = []string{"vm"}
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", 0))
+	require.False(t, ApplyFilter(&repo, "bar", "amd64", "default", "vm", 0))
 
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll))
+	// Targets
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", 0))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", 0))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll|ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer|ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll|ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetContainer|ImageTargetVM))
+
+	repo.Types = []string{"vm"}
 	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetVM))
 	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll|ImageTargetVM))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer|ImageTargetVM))
 	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetVM))
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetVM))
-	require.False(t, ApplyFilter(&repo, "", "arm64", "default", "vm", ImageTargetAll))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll|ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetContainer|ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", 0))
 
 	repo.Types = []string{"container"}
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer))
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll))
 	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetContainer))
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll|ImageTargetVM))
-
-	repo.Types = []string{"container", "vm"}
-	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll))
-	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll))
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetVM))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll|ImageTargetContainer))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetContainer|ImageTargetVM))
 	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll|ImageTargetContainer))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer|ImageTargetVM))
+	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", 0))
 
-	repo.Types = []string{}
-	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll))
-	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll))
-	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetVM))
+	repo.Types = []string{"container", "vm"}
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetContainer))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetAll|ImageTargetContainer))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "container", ImageTargetContainer|ImageTargetVM))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetAll|ImageTargetContainer))
+	require.True(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer|ImageTargetVM))
 	require.False(t, ApplyFilter(&repo, "foo", "amd64", "default", "vm", ImageTargetContainer))
 }


More information about the lxc-devel mailing list