ipvs: log error if scheduler does not exist and fallback to rr

Signed-off-by: Christopher M. Luciano <cmluciano@us.ibm.com>
This commit is contained in:
Christopher M. Luciano 2020-07-23 13:58:02 -04:00
parent e2a0eddaf0
commit 65ff4e8227
No known key found for this signature in database
GPG Key ID: 5148DBB31F2843F1
5 changed files with 82 additions and 9 deletions

View File

@ -151,6 +151,14 @@ func Test_getProxyMode(t *testing.T) {
expected: proxyModeIPVS,
scheduler: "sed",
},
{ // flag says ipvs, ipset version ok, non-existent scheduler
flag: "ipvs",
kmods: []string{"ip_vs", "ip_vs_rr", "ip_vs_wrr", "ip_vs_sh", "nf_conntrack", "ip_vs_sed"},
kernelVersion: "4.19",
ipsetVersion: ipvs.MinIPSetCheckVersion,
expected: proxyModeIPVS,
scheduler: "foobar",
},
}
for i, c := range cases {
kcompater := &fakeKernelCompatTester{c.kernelCompat}

View File

@ -711,7 +711,11 @@ func CanUseIPVSProxier(handle KernelHandler, ipsetver IPSetVersioner, scheduler
}
mods = utilipvs.GetRequiredIPVSModules(kernelVersion)
wantModules := sets.NewString()
mods = append(mods, utilipvs.GetRequiredSchedulerModules(scheduler))
schedulerMod, modNotFound := utilipvs.GetRequiredSchedulerModules(scheduler)
if modNotFound != nil {
klog.Error(modNotFound)
}
mods = append(mods, schedulerMod)
wantModules.Insert(mods...)
modules := wantModules.Difference(loadModules).UnsortedList()

View File

@ -348,6 +348,14 @@ func TestCanUseIPVSProxier(t *testing.T) {
ipsetVersion: MinIPSetCheckVersion,
ok: true,
},
// case 10, non-existent scheduler, fallback to rr
{
mods: []string{"ip_vs", "ip_vs_rr", "ip_vs_wrr", "ip_vs_sh", "nf_conntrack", "ip_vs_dh"},
scheduler: "foobar",
kernelVersion: "4.19",
ipsetVersion: MinIPSetCheckVersion,
ok: true,
},
}
for i := range testCases {

View File

@ -17,6 +17,7 @@ limitations under the License.
package ipvs
import (
"fmt"
"net"
"strconv"
"strings"
@ -149,21 +150,24 @@ func IsRsGracefulTerminationNeeded(proto string) bool {
}
// GetRequiredSchedulerModules returns the required ipvs scheduler module for configured scheduler
func GetRequiredSchedulerModules(scheduler string) string {
func GetRequiredSchedulerModules(scheduler string) (string, error) {
switch s := scheduler; s {
case "rr":
return KernelModuleIPVSRR
return KernelModuleIPVSRR, nil
case "lc":
return KernelModuleIPVSLC
return KernelModuleIPVSLC, nil
case "nq":
return KernelModuleIPVSNQ
return KernelModuleIPVSNQ, nil
case "dh":
return KernelModuleIPVSDH
return KernelModuleIPVSDH, nil
case "sh":
return KernelModuleIPVSSH
return KernelModuleIPVSSH, nil
case "sed":
return KernelModuleIPVSSED
return KernelModuleIPVSSED, nil
case "":
return KernelModuleIPVSRR, nil
default:
return KernelModuleIPVSRR
notFound := fmt.Errorf("ip_vs_%s is not a supported IPVS scheduler algorithm, falling back to round-robin", scheduler)
return KernelModuleIPVSRR, notFound
}
}

View File

@ -17,6 +17,7 @@ limitations under the License.
package ipvs
import (
"fmt"
"net"
"reflect"
"sort"
@ -413,3 +414,51 @@ func TestGetRequiredIPVSModules(t *testing.T) {
})
}
}
func TestGetRequiredSchedulerModules(t *testing.T) {
Tests := []struct {
name string
scheduler string
want string
expectedErrs error
}{
{
name: "scheduler explicitly set to rr",
scheduler: "rr",
want: "ip_vs_rr",
expectedErrs: nil,
},
{
name: "scheduler set to nq",
scheduler: "nq",
want: "ip_vs_nq",
expectedErrs: nil,
},
{
name: "unset scheduler",
scheduler: "",
want: "ip_vs_rr",
expectedErrs: nil,
},
{
name: "invalid scheduler algorithm",
scheduler: "foobar",
want: "ip_vs_rr",
expectedErrs: fmt.Errorf("ip_vs_%s is not a supported IPVS scheduler algorithm, falling back to round-robin", "foobar"),
},
}
for _, test := range Tests {
t.Run(test.name, func(t *testing.T) {
got, err := GetRequiredSchedulerModules(test.scheduler)
if !reflect.DeepEqual(got, test.want) {
t.Fatalf("GetRequiredSchedulerModules() = testCase %v failed- expected: %s scheduler, but got: %s", test.name, test.want, got)
}
if err != nil {
if err.Error() != test.expectedErrs.Error() {
t.Fatalf("Expected error: %v, got: %v", test.expectedErrs, err.Error())
}
}
})
}
}