Unverified Commit d5f56036 authored by Derek Nola's avatar Derek Nola Committed by GitHub

Handle multiple arguments with StringSlice flags (#7380)

* Add helper function for multiple arguments in stringslice Signed-off-by: 's avatarDerek Nola <derek.nola@suse.com> * Cleanup server setup with util function Signed-off-by: 's avatarDerek Nola <derek.nola@suse.com>
parent a3ddff2f
...@@ -116,7 +116,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -116,7 +116,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.KubeConfigMode = cfg.KubeConfigMode serverConfig.ControlConfig.KubeConfigMode = cfg.KubeConfigMode
serverConfig.ControlConfig.Rootless = cfg.Rootless serverConfig.ControlConfig.Rootless = cfg.Rootless
serverConfig.ControlConfig.ServiceLBNamespace = cfg.ServiceLBNamespace serverConfig.ControlConfig.ServiceLBNamespace = cfg.ServiceLBNamespace
serverConfig.ControlConfig.SANs = cfg.TLSSan serverConfig.ControlConfig.SANs = util.SplitStringSlice(cfg.TLSSan)
serverConfig.ControlConfig.BindAddress = cfg.BindAddress serverConfig.ControlConfig.BindAddress = cfg.BindAddress
serverConfig.ControlConfig.SupervisorPort = cfg.SupervisorPort serverConfig.ControlConfig.SupervisorPort = cfg.SupervisorPort
serverConfig.ControlConfig.HTTPSPort = cfg.HTTPSPort serverConfig.ControlConfig.HTTPSPort = cfg.HTTPSPort
...@@ -247,15 +247,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -247,15 +247,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
} }
cmds.ServerConfig.ClusterCIDR.Set(clusterCIDR) cmds.ServerConfig.ClusterCIDR.Set(clusterCIDR)
} }
for _, cidr := range cmds.ServerConfig.ClusterCIDR { for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ClusterCIDR) {
for _, v := range strings.Split(cidr, ",") { _, parsed, err := net.ParseCIDR(cidr)
_, parsed, err := net.ParseCIDR(v)
if err != nil { 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) serverConfig.ControlConfig.ClusterIPRanges = append(serverConfig.ControlConfig.ClusterIPRanges, parsed)
} }
}
// set ClusterIPRange to the first IPv4 block, for legacy clients // set ClusterIPRange to the first IPv4 block, for legacy clients
// unless only IPv6 range given // unless only IPv6 range given
...@@ -273,15 +271,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -273,15 +271,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
} }
cmds.ServerConfig.ServiceCIDR.Set(serviceCIDR) cmds.ServerConfig.ServiceCIDR.Set(serviceCIDR)
} }
for _, cidr := range cmds.ServerConfig.ServiceCIDR { for _, cidr := range util.SplitStringSlice(cmds.ServerConfig.ServiceCIDR) {
for _, v := range strings.Split(cidr, ",") { _, parsed, err := net.ParseCIDR(cidr)
_, parsed, err := net.ParseCIDR(v)
if err != nil { 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) serverConfig.ControlConfig.ServiceIPRanges = append(serverConfig.ControlConfig.ServiceIPRanges, parsed)
} }
}
// set ServiceIPRange to the first IPv4 block, for legacy clients // set ServiceIPRange to the first IPv4 block, for legacy clients
// unless only IPv6 range given // unless only IPv6 range given
...@@ -315,15 +311,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -315,15 +311,13 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.ClusterDNS = clusterDNS serverConfig.ControlConfig.ClusterDNS = clusterDNS
serverConfig.ControlConfig.ClusterDNSs = []net.IP{serverConfig.ControlConfig.ClusterDNS} serverConfig.ControlConfig.ClusterDNSs = []net.IP{serverConfig.ControlConfig.ClusterDNS}
} else { } else {
for _, ip := range cmds.ServerConfig.ClusterDNS { for _, ip := range util.SplitStringSlice(cmds.ServerConfig.ClusterDNS) {
for _, v := range strings.Split(ip, ",") { parsed := net.ParseIP(ip)
parsed := net.ParseIP(v)
if parsed == nil { 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) serverConfig.ControlConfig.ClusterDNSs = append(serverConfig.ControlConfig.ClusterDNSs, parsed)
} }
}
// Set ClusterDNS to the first IPv4 address, for legacy clients // Set ClusterDNS to the first IPv4 address, for legacy clients
// unless only IPv6 range given // unless only IPv6 range given
clusterDNS, _, _, err := util.GetFirstIP(serverConfig.ControlConfig.ClusterDNSs) clusterDNS, _, _, err := util.GetFirstIP(serverConfig.ControlConfig.ClusterDNSs)
...@@ -349,12 +343,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont ...@@ -349,12 +343,10 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont
serverConfig.ControlConfig.Skips = map[string]bool{} serverConfig.ControlConfig.Skips = map[string]bool{}
serverConfig.ControlConfig.Disables = map[string]bool{} serverConfig.ControlConfig.Disables = map[string]bool{}
for _, disable := range app.StringSlice("disable") { for _, disable := range util.SplitStringSlice(app.StringSlice("disable")) {
for _, v := range strings.Split(disable, ",") { disable = strings.TrimSpace(disable)
v = strings.TrimSpace(v) serverConfig.ControlConfig.Skips[disable] = true
serverConfig.ControlConfig.Skips[v] = true serverConfig.ControlConfig.Disables[disable] = true
serverConfig.ControlConfig.Disables[v] = true
}
} }
if serverConfig.ControlConfig.Skips["servicelb"] { if serverConfig.ControlConfig.Skips["servicelb"] {
serverConfig.ControlConfig.DisableServiceLB = true serverConfig.ControlConfig.DisableServiceLB = true
......
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)
}
})
}
}
package util package util
import ( import (
"strings"
"github.com/k3s-io/k3s/pkg/datadir" "github.com/k3s-io/k3s/pkg/datadir"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
...@@ -27,3 +29,14 @@ func GetClientSet(file string) (clientset.Interface, error) { ...@@ -27,3 +29,14 @@ func GetClientSet(file string) (clientset.Interface, error) {
return clientset.NewForConfig(restConfig) 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
}
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)
}
})
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment