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
Derek Nola 2023-05-02 09:55:48 -07:00 committed by GitHub
parent a3ddff2f29
commit d5f560360e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 123 additions and 28 deletions

View File

@ -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

View File

@ -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)
}
})
}
}

View File

@ -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
}

39
pkg/util/client_test.go Normal file
View File

@ -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)
}
})
}
}