Allow processing of common 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 <abergmeier@gmx.net>
This commit is contained in:
parent
4b22fc5c20
commit
2a32f0bacd
|
|
@ -28,6 +28,7 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
|
|
@ -53,6 +54,11 @@ var (
|
|||
|
||||
// CommonBuildOptions parses the build options from the bud cli
|
||||
func CommonBuildOptions(c *cobra.Command) (*define.CommonBuildOptions, error) {
|
||||
return CommonBuildOptionsFromFlagSet(c.Flags(), c.Flag)
|
||||
}
|
||||
|
||||
// CommonBuildOptionsFromFlagSet parses the build options from the bud cli
|
||||
func CommonBuildOptionsFromFlagSet(flags *pflag.FlagSet, findFlagFunc func(name string) *pflag.Flag) (*define.CommonBuildOptions, error) {
|
||||
var (
|
||||
memoryLimit int64
|
||||
memorySwap int64
|
||||
|
|
@ -60,7 +66,7 @@ func CommonBuildOptions(c *cobra.Command) (*define.CommonBuildOptions, error) {
|
|||
err error
|
||||
)
|
||||
|
||||
memVal, _ := c.Flags().GetString("memory")
|
||||
memVal, _ := flags.GetString("memory")
|
||||
if memVal != "" {
|
||||
memoryLimit, err = units.RAMInBytes(memVal)
|
||||
if err != nil {
|
||||
|
|
@ -68,7 +74,7 @@ func CommonBuildOptions(c *cobra.Command) (*define.CommonBuildOptions, error) {
|
|||
}
|
||||
}
|
||||
|
||||
memSwapValue, _ := c.Flags().GetString("memory-swap")
|
||||
memSwapValue, _ := flags.GetString("memory-swap")
|
||||
if memSwapValue != "" {
|
||||
if memSwapValue == "-1" {
|
||||
memorySwap = -1
|
||||
|
|
@ -80,7 +86,7 @@ func CommonBuildOptions(c *cobra.Command) (*define.CommonBuildOptions, error) {
|
|||
}
|
||||
}
|
||||
|
||||
addHost, _ := c.Flags().GetStringSlice("add-host")
|
||||
addHost, _ := flags.GetStringSlice("add-host")
|
||||
if len(addHost) > 0 {
|
||||
for _, host := range addHost {
|
||||
if err := validateExtraHost(host); err != nil {
|
||||
|
|
@ -91,8 +97,8 @@ func CommonBuildOptions(c *cobra.Command) (*define.CommonBuildOptions, error) {
|
|||
|
||||
noDNS = false
|
||||
dnsServers := []string{}
|
||||
if c.Flag("dns").Changed {
|
||||
dnsServers, _ = c.Flags().GetStringSlice("dns")
|
||||
if flags.Changed("dns") {
|
||||
dnsServers, _ = flags.GetStringSlice("dns")
|
||||
for _, server := range dnsServers {
|
||||
if strings.ToLower(server) == "none" {
|
||||
noDNS = true
|
||||
|
|
@ -104,62 +110,62 @@ func CommonBuildOptions(c *cobra.Command) (*define.CommonBuildOptions, error) {
|
|||
}
|
||||
|
||||
dnsSearch := []string{}
|
||||
if c.Flag("dns-search").Changed {
|
||||
dnsSearch, _ = c.Flags().GetStringSlice("dns-search")
|
||||
if flags.Changed("dns-search") {
|
||||
dnsSearch, _ = flags.GetStringSlice("dns-search")
|
||||
if noDNS && len(dnsSearch) > 0 {
|
||||
return nil, errors.Errorf("invalid --dns-search, --dns-search may not be used with --dns=none")
|
||||
}
|
||||
}
|
||||
|
||||
dnsOptions := []string{}
|
||||
if c.Flag("dns-option").Changed {
|
||||
dnsOptions, _ = c.Flags().GetStringSlice("dns-option")
|
||||
if flags.Changed("dns-option") {
|
||||
dnsOptions, _ = flags.GetStringSlice("dns-option")
|
||||
if noDNS && len(dnsOptions) > 0 {
|
||||
return nil, errors.Errorf("invalid --dns-option, --dns-option may not be used with --dns=none")
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := units.FromHumanSize(c.Flag("shm-size").Value.String()); err != nil {
|
||||
if _, err := units.FromHumanSize(findFlagFunc("shm-size").Value.String()); err != nil {
|
||||
return nil, errors.Wrapf(err, "invalid --shm-size")
|
||||
}
|
||||
volumes, _ := c.Flags().GetStringArray("volume")
|
||||
volumes, _ := flags.GetStringArray("volume")
|
||||
if err := Volumes(volumes); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cpuPeriod, _ := c.Flags().GetUint64("cpu-period")
|
||||
cpuQuota, _ := c.Flags().GetInt64("cpu-quota")
|
||||
cpuShares, _ := c.Flags().GetUint64("cpu-shares")
|
||||
httpProxy, _ := c.Flags().GetBool("http-proxy")
|
||||
cpuPeriod, _ := flags.GetUint64("cpu-period")
|
||||
cpuQuota, _ := flags.GetInt64("cpu-quota")
|
||||
cpuShares, _ := flags.GetUint64("cpu-shares")
|
||||
httpProxy, _ := flags.GetBool("http-proxy")
|
||||
|
||||
ulimit := []string{}
|
||||
if c.Flag("ulimit").Changed {
|
||||
ulimit, _ = c.Flags().GetStringSlice("ulimit")
|
||||
if flags.Changed("ulimit") {
|
||||
ulimit, _ = flags.GetStringSlice("ulimit")
|
||||
}
|
||||
|
||||
secrets, _ := c.Flags().GetStringArray("secret")
|
||||
sshsources, _ := c.Flags().GetStringArray("ssh")
|
||||
secrets, _ := flags.GetStringArray("secret")
|
||||
sshsources, _ := flags.GetStringArray("ssh")
|
||||
|
||||
commonOpts := &define.CommonBuildOptions{
|
||||
AddHost: addHost,
|
||||
CPUPeriod: cpuPeriod,
|
||||
CPUQuota: cpuQuota,
|
||||
CPUSetCPUs: c.Flag("cpuset-cpus").Value.String(),
|
||||
CPUSetMems: c.Flag("cpuset-mems").Value.String(),
|
||||
CPUSetCPUs: findFlagFunc("cpuset-cpus").Value.String(),
|
||||
CPUSetMems: findFlagFunc("cpuset-mems").Value.String(),
|
||||
CPUShares: cpuShares,
|
||||
CgroupParent: c.Flag("cgroup-parent").Value.String(),
|
||||
CgroupParent: findFlagFunc("cgroup-parent").Value.String(),
|
||||
DNSOptions: dnsOptions,
|
||||
DNSSearch: dnsSearch,
|
||||
DNSServers: dnsServers,
|
||||
HTTPProxy: httpProxy,
|
||||
Memory: memoryLimit,
|
||||
MemorySwap: memorySwap,
|
||||
ShmSize: c.Flag("shm-size").Value.String(),
|
||||
ShmSize: findFlagFunc("shm-size").Value.String(),
|
||||
Ulimit: ulimit,
|
||||
Volumes: volumes,
|
||||
Secrets: secrets,
|
||||
SSHSources: sshsources,
|
||||
}
|
||||
securityOpts, _ := c.Flags().GetStringArray("security-opt")
|
||||
securityOpts, _ := flags.GetStringArray("security-opt")
|
||||
if err := parseSecurityOpts(securityOpts, commonOpts); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,9 +5,24 @@ import (
|
|||
"runtime"
|
||||
"testing"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestCommonBuildOptionsFromFlagSet(t *testing.T) {
|
||||
fs := pflag.NewFlagSet("testme", pflag.PanicOnError)
|
||||
fs.String("memory", "1GB", "")
|
||||
fs.String("shm-size", "5TB", "")
|
||||
fs.String("cpuset-cpus", "1", "")
|
||||
fs.String("cpuset-mems", "2", "")
|
||||
fs.String("cgroup-parent", "none", "")
|
||||
err := fs.Parse([]string{"--memory", "2GB"})
|
||||
assert.NoError(t, err)
|
||||
cbo, err := CommonBuildOptionsFromFlagSet(fs, fs.Lookup)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, cbo.Memory, int64(2147483648))
|
||||
}
|
||||
|
||||
// TestDeviceParser verifies the given device strings is parsed correctly
|
||||
func TestDeviceParser(t *testing.T) {
|
||||
if runtime.GOOS != "linux" {
|
||||
|
|
|
|||
Loading…
Reference in New Issue