From ba3bd6ccec028a6e6e2a5000e8f7f6698775f14f Mon Sep 17 00:00:00 2001 From: Andreas Bergmeier Date: Tue, 11 Jan 2022 21:29:28 +0100 Subject: [PATCH] Allow processing of network options from FlagSet In situations where you don't want/need Cobra climbing behavior nor Cobra at all using FlagSet is the easier sell. Signed-off-by: Andreas Bergmeier --- pkg/parse/parse.go | 9 +++++++-- pkg/parse/parse_test.go | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pkg/parse/parse.go b/pkg/parse/parse.go index 658ce1c608..fb1aea2eec 100644 --- a/pkg/parse/parse.go +++ b/pkg/parse/parse.go @@ -803,11 +803,16 @@ func parseIDMap(spec []string) (m [][3]uint32, err error) { // NamespaceOptions parses the build options for all namespaces except for user namespace. func NamespaceOptions(c *cobra.Command) (namespaceOptions define.NamespaceOptions, networkPolicy define.NetworkConfigurationPolicy, err error) { + return NamespaceOptionsFromFlagSet(c.Flags(), c.Flag) +} + +// NamespaceOptionsFromFlagSet parses the build options for all namespaces except for user namespace. +func NamespaceOptionsFromFlagSet(flags *pflag.FlagSet, findFlagFunc func(name string) *pflag.Flag) (namespaceOptions define.NamespaceOptions, networkPolicy define.NetworkConfigurationPolicy, err error) { options := make(define.NamespaceOptions, 0, 7) policy := define.NetworkDefault for _, what := range []string{"cgroupns", string(specs.IPCNamespace), "network", string(specs.PIDNamespace), string(specs.UTSNamespace)} { - if c.Flags().Lookup(what) != nil && c.Flag(what).Changed { - how := c.Flag(what).Value.String() + if flags.Lookup(what) != nil && findFlagFunc(what).Changed { + how := findFlagFunc(what).Value.String() switch what { case "network": what = string(specs.NetworkNamespace) diff --git a/pkg/parse/parse_test.go b/pkg/parse/parse_test.go index 55b848f268..73b98eb6be 100644 --- a/pkg/parse/parse_test.go +++ b/pkg/parse/parse_test.go @@ -5,6 +5,8 @@ import ( "runtime" "testing" + "github.com/containers/buildah/define" + specs "github.com/opencontainers/runtime-spec/specs-go" "github.com/spf13/pflag" "github.com/stretchr/testify/assert" ) @@ -138,6 +140,20 @@ func TestIsolation(t *testing.T) { } } +func TestNamespaceOptions(t *testing.T) { + fs := pflag.NewFlagSet("testme", pflag.PanicOnError) + fs.String("cgroupns", "", "") + err := fs.Parse([]string{"--cgroupns", "private"}) + assert.NoError(t, err) + nsos, np, err := NamespaceOptionsFromFlagSet(fs, fs.Lookup) + assert.NoError(t, err) + assert.Equal(t, np, define.NetworkEnabled) + nso := nsos.Find(string(specs.CgroupNamespace)) + assert.Equal(t, *nso, define.NamespaceOption{ + Name: string(specs.CgroupNamespace), + }) +} + func TestParsePlatform(t *testing.T) { os, arch, variant, err := Platform("a/b/c") assert.NoError(t, err)