mirror of https://github.com/k3s-io/k3s.git
Handle multiple arguments with StringSlice flags (#7380)
* Add helper function for multiple arguments in stringslice Signed-off-by: Derek Nola <derek.nola@suse.com> * Cleanup server setup with util function Signed-off-by: Derek Nola <derek.nola@suse.com>pull/7417/head
parent
a3ddff2f29
commit
d5f560360e
|
@ -116,7 +116,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
|
|||
serverConfig.ControlConfig.KubeConfigMode = cfg.KubeConfigMode
|
||||
serverConfig.ControlConfig.Rootless = cfg.Rootless
|
||||
serverConfig.ControlConfig.ServiceLBNamespace = cfg.ServiceLBNamespace
|
||||
serverConfig.ControlConfig.SANs = cfg.TLSSan
|
||||
serverConfig.ControlConfig.SANs = util.SplitStringSlice(cfg.TLSSan)
|
||||
serverConfig.ControlConfig.BindAddress = cfg.BindAddress
|
||||
serverConfig.ControlConfig.SupervisorPort = cfg.SupervisorPort
|
||||
serverConfig.ControlConfig.HTTPSPort = cfg.HTTPSPort
|
||||
|
@ -247,15 +247,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
|
|||
}
|
||||
cmds.ServerConfig.ClusterCIDR.Set(clusterCIDR)
|
||||
}
|
||||
for _, cidr := range cmds.ServerConfig.ClusterCIDR {
|
||||
for _, v := range strings.Split(cidr, ",") {
|
||||
_, parsed, err := net.ParseCIDR(v)
|
||||
for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ClusterCIDR) {
|
||||
_, parsed, err := net.ParseCIDR(cidr)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "invalid cluster-cidr %s", v)
|
||||
return errors.Wrapf(err, "invalid cluster-cidr %s", cidr)
|
||||
}
|
||||
serverConfig.ControlConfig.ClusterIPRanges = append(serverConfig.ControlConfig.ClusterIPRanges, parsed)
|
||||
}
|
||||
}
|
||||
|
||||
// set ClusterIPRange to the first IPv4 block, for legacy clients
|
||||
// unless only IPv6 range given
|
||||
|
@ -273,15 +271,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
|
|||
}
|
||||
cmds.ServerConfig.ServiceCIDR.Set(serviceCIDR)
|
||||
}
|
||||
for _, cidr := range cmds.ServerConfig.ServiceCIDR {
|
||||
for _, v := range strings.Split(cidr, ",") {
|
||||
_, parsed, err := net.ParseCIDR(v)
|
||||
for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ServiceCIDR) {
|
||||
_, parsed, err := net.ParseCIDR(cidr)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "invalid service-cidr %s", v)
|
||||
return errors.Wrapf(err, "invalid service-cidr %s", cidr)
|
||||
}
|
||||
serverConfig.ControlConfig.ServiceIPRanges = append(serverConfig.ControlConfig.ServiceIPRanges, parsed)
|
||||
}
|
||||
}
|
||||
|
||||
// set ServiceIPRange to the first IPv4 block, for legacy clients
|
||||
// unless only IPv6 range given
|
||||
|
@ -315,15 +311,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
|
|||
serverConfig.ControlConfig.ClusterDNS = clusterDNS
|
||||
serverConfig.ControlConfig.ClusterDNSs = []net.IP{serverConfig.ControlConfig.ClusterDNS}
|
||||
} else {
|
||||
for _, ip := range cmds.ServerConfig.ClusterDNS {
|
||||
for _, v := range strings.Split(ip, ",") {
|
||||
parsed := net.ParseIP(v)
|
||||
for _, ip := range util.SplitStringSlice(cmds.ServerConfig.ClusterDNS) {
|
||||
parsed := net.ParseIP(ip)
|
||||
if parsed == nil {
|
||||
return fmt.Errorf("invalid cluster-dns address %s", v)
|
||||
return fmt.Errorf("invalid cluster-dns address %s", ip)
|
||||
}
|
||||
serverConfig.ControlConfig.ClusterDNSs = append(serverConfig.ControlConfig.ClusterDNSs, parsed)
|
||||
}
|
||||
}
|
||||
// Set ClusterDNS to the first IPv4 address, for legacy clients
|
||||
// unless only IPv6 range given
|
||||
clusterDNS, _, _, err := util.GetFirstIP(serverConfig.ControlConfig.ClusterDNSs)
|
||||
|
@ -349,12 +343,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
|
|||
|
||||
serverConfig.ControlConfig.Skips = map[string]bool{}
|
||||
serverConfig.ControlConfig.Disables = map[string]bool{}
|
||||
for _, disable := range app.StringSlice("disable") {
|
||||
for _, v := range strings.Split(disable, ",") {
|
||||
v = strings.TrimSpace(v)
|
||||
serverConfig.ControlConfig.Skips[v] = true
|
||||
serverConfig.ControlConfig.Disables[v] = true
|
||||
}
|
||||
for _, disable := range util.SplitStringSlice(app.StringSlice("disable")) {
|
||||
disable = strings.TrimSpace(disable)
|
||||
serverConfig.ControlConfig.Skips[disable] = true
|
||||
serverConfig.ControlConfig.Disables[disable] = true
|
||||
}
|
||||
if serverConfig.ControlConfig.Skips["servicelb"] {
|
||||
serverConfig.ControlConfig.DisableServiceLB = true
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
package deps
|
||||
|
||||
import (
|
||||
"net"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
certutil "github.com/rancher/dynamiclistener/cert"
|
||||
)
|
||||
|
||||
func Test_UnitAddSANs(t *testing.T) {
|
||||
type args struct {
|
||||
altNames *certutil.AltNames
|
||||
sans []string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want certutil.AltNames
|
||||
}{
|
||||
{
|
||||
name: "One IP, One DNS",
|
||||
args: args{
|
||||
altNames: &certutil.AltNames{},
|
||||
sans: []string{"192.168.205.10", "192.168.205.10.nip.io"},
|
||||
},
|
||||
want: certutil.AltNames{
|
||||
IPs: []net.IP{net.ParseIP("192.168.205.10")},
|
||||
DNSNames: []string{"192.168.205.10.nip.io"},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Two IP, No DNS",
|
||||
args: args{
|
||||
altNames: &certutil.AltNames{},
|
||||
sans: []string{"192.168.205.10", "10.168.21.15"},
|
||||
},
|
||||
want: certutil.AltNames{
|
||||
IPs: []net.IP{net.ParseIP("192.168.205.10"), net.ParseIP("10.168.21.15")},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
addSANs(tt.args.altNames, tt.args.sans)
|
||||
if !reflect.DeepEqual(*tt.args.altNames, tt.want) {
|
||||
t.Errorf("addSANs() = %v, want %v", *tt.args.altNames, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
package util
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/k3s-io/k3s/pkg/datadir"
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
|
@ -27,3 +29,14 @@ func GetClientSet(file string) (clientset.Interface, error) {
|
|||
|
||||
return clientset.NewForConfig(restConfig)
|
||||
}
|
||||
|
||||
// SplitStringSlice is a helper function to handle StringSliceFlag containing multiple values
|
||||
// By default, StringSliceFlag only supports repeated values, not multiple values
|
||||
// e.g. --foo="bar,car" --foo=baz will result in []string{"bar", "car". "baz"}
|
||||
func SplitStringSlice(ss []string) []string {
|
||||
result := []string{}
|
||||
for _, s := range ss {
|
||||
result = append(result, strings.Split(s, ",")...)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
package util
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
func Test_UnitSplitSliceString(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
arg cli.StringSlice
|
||||
want []string
|
||||
}{
|
||||
{
|
||||
name: "Single Argument",
|
||||
arg: cli.StringSlice{"foo"},
|
||||
want: []string{"foo"},
|
||||
},
|
||||
{
|
||||
name: "Repeated Arguments",
|
||||
arg: cli.StringSlice{"foo", "bar", "baz"},
|
||||
want: []string{"foo", "bar", "baz"},
|
||||
},
|
||||
{
|
||||
name: "Multiple Arguments and Repeated Arguments",
|
||||
arg: cli.StringSlice{"foo,bar", "zoo,clar", "baz"},
|
||||
want: []string{"foo", "bar", "zoo", "clar", "baz"},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := SplitStringSlice(tt.arg); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("SplitSliceString() = %+v\nWant = %+v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue