mirror of https://github.com/k3s-io/k3s
fix service hash flags
parent
01154dd3cf
commit
21b02ad574
|
@ -63,6 +63,8 @@ type ServiceFlags uint32
|
||||||
const (
|
const (
|
||||||
// FlagPersistent specify IPVS service session affinity
|
// FlagPersistent specify IPVS service session affinity
|
||||||
FlagPersistent = 0x1
|
FlagPersistent = 0x1
|
||||||
|
// FlagHashed specify IPVS service hash flag
|
||||||
|
FlagHashed = 0x2
|
||||||
)
|
)
|
||||||
|
|
||||||
// Equal check the equality of virtual server.
|
// Equal check the equality of virtual server.
|
||||||
|
|
|
@ -214,10 +214,17 @@ func toVirtualServer(svc *ipvs.Service) (*VirtualServer, error) {
|
||||||
Port: svc.Port,
|
Port: svc.Port,
|
||||||
Scheduler: svc.SchedName,
|
Scheduler: svc.SchedName,
|
||||||
Protocol: protocolNumbeToString(ProtoType(svc.Protocol)),
|
Protocol: protocolNumbeToString(ProtoType(svc.Protocol)),
|
||||||
Flags: ServiceFlags(svc.Flags),
|
|
||||||
Timeout: svc.Timeout,
|
Timeout: svc.Timeout,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test Flags >= 0x2, valid Flags ranges [0x2, 0x3]
|
||||||
|
if svc.Flags&FlagHashed == 0 {
|
||||||
|
return nil, fmt.Errorf("Flags of successfully created IPVS service should be >= %d since every service is hashed into the service table", FlagHashed)
|
||||||
|
}
|
||||||
|
// Sub Flags to 0x2
|
||||||
|
// 011 -> 001, 010 -> 000
|
||||||
|
vs.Flags = ServiceFlags(svc.Flags &^ uint32(FlagHashed))
|
||||||
|
|
||||||
if vs.Address == nil {
|
if vs.Address == nil {
|
||||||
if svc.AddressFamily == syscall.AF_INET {
|
if svc.AddressFamily == syscall.AF_INET {
|
||||||
vs.Address = net.IPv4zero
|
vs.Address = net.IPv4zero
|
||||||
|
|
|
@ -19,6 +19,7 @@ limitations under the License.
|
||||||
package ipvs
|
package ipvs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"reflect"
|
"reflect"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
@ -117,18 +118,36 @@ func TestUnbindVirtualServerAddress(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_toFrontendService(t *testing.T) {
|
func Test_toVirtualServer(t *testing.T) {
|
||||||
Tests := []struct {
|
Tests := []struct {
|
||||||
ipvsService ipvs.Service
|
ipvsService ipvs.Service
|
||||||
virtualServer VirtualServer
|
virtualServer VirtualServer
|
||||||
|
expectError bool
|
||||||
|
reason string
|
||||||
}{
|
}{
|
||||||
|
{
|
||||||
|
ipvs.Service{
|
||||||
|
Flags: 0x0,
|
||||||
|
},
|
||||||
|
VirtualServer{},
|
||||||
|
true,
|
||||||
|
fmt.Sprintf("IPVS Service Flags should be >= %d, got 0x0", FlagHashed),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ipvs.Service{
|
||||||
|
Flags: 0x1,
|
||||||
|
},
|
||||||
|
VirtualServer{},
|
||||||
|
true,
|
||||||
|
fmt.Sprintf("IPVS Service Flags should be >= %d, got 0x1", FlagHashed),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ipvs.Service{
|
ipvs.Service{
|
||||||
Protocol: syscall.IPPROTO_TCP,
|
Protocol: syscall.IPPROTO_TCP,
|
||||||
Port: 80,
|
Port: 80,
|
||||||
FWMark: 0,
|
FWMark: 0,
|
||||||
SchedName: "",
|
SchedName: "",
|
||||||
Flags: 0,
|
Flags: uint32(FlagPersistent + FlagHashed),
|
||||||
Timeout: 0,
|
Timeout: 0,
|
||||||
Netmask: 0xffffffff,
|
Netmask: 0xffffffff,
|
||||||
AddressFamily: syscall.AF_INET,
|
AddressFamily: syscall.AF_INET,
|
||||||
|
@ -140,9 +159,11 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Protocol: "TCP",
|
Protocol: "TCP",
|
||||||
Port: 80,
|
Port: 80,
|
||||||
Scheduler: "",
|
Scheduler: "",
|
||||||
Flags: 0,
|
Flags: ServiceFlags(FlagPersistent),
|
||||||
Timeout: 0,
|
Timeout: 0,
|
||||||
},
|
},
|
||||||
|
false,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ipvs.Service{
|
ipvs.Service{
|
||||||
|
@ -150,7 +171,7 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Port: 33434,
|
Port: 33434,
|
||||||
FWMark: 0,
|
FWMark: 0,
|
||||||
SchedName: "wlc",
|
SchedName: "wlc",
|
||||||
Flags: 1234,
|
Flags: uint32(0 + FlagHashed),
|
||||||
Timeout: 100,
|
Timeout: 100,
|
||||||
Netmask: 128,
|
Netmask: 128,
|
||||||
AddressFamily: syscall.AF_INET6,
|
AddressFamily: syscall.AF_INET6,
|
||||||
|
@ -162,9 +183,11 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Protocol: "UDP",
|
Protocol: "UDP",
|
||||||
Port: 33434,
|
Port: 33434,
|
||||||
Scheduler: "wlc",
|
Scheduler: "wlc",
|
||||||
Flags: 1234,
|
Flags: ServiceFlags(0),
|
||||||
Timeout: 100,
|
Timeout: 100,
|
||||||
},
|
},
|
||||||
|
false,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ipvs.Service{
|
ipvs.Service{
|
||||||
|
@ -172,7 +195,7 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Port: 0,
|
Port: 0,
|
||||||
FWMark: 0,
|
FWMark: 0,
|
||||||
SchedName: "lc",
|
SchedName: "lc",
|
||||||
Flags: 0,
|
Flags: uint32(0 + FlagHashed),
|
||||||
Timeout: 0,
|
Timeout: 0,
|
||||||
Netmask: 0xffffffff,
|
Netmask: 0xffffffff,
|
||||||
AddressFamily: syscall.AF_INET,
|
AddressFamily: syscall.AF_INET,
|
||||||
|
@ -184,9 +207,11 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Protocol: "",
|
Protocol: "",
|
||||||
Port: 0,
|
Port: 0,
|
||||||
Scheduler: "lc",
|
Scheduler: "lc",
|
||||||
Flags: 0,
|
Flags: ServiceFlags(0),
|
||||||
Timeout: 0,
|
Timeout: 0,
|
||||||
},
|
},
|
||||||
|
false,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ipvs.Service{
|
ipvs.Service{
|
||||||
|
@ -194,7 +219,7 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Port: 0,
|
Port: 0,
|
||||||
FWMark: 0,
|
FWMark: 0,
|
||||||
SchedName: "wrr",
|
SchedName: "wrr",
|
||||||
Flags: 0,
|
Flags: uint32(FlagPersistent + FlagHashed),
|
||||||
Timeout: 0,
|
Timeout: 0,
|
||||||
Netmask: 128,
|
Netmask: 128,
|
||||||
AddressFamily: syscall.AF_INET6,
|
AddressFamily: syscall.AF_INET6,
|
||||||
|
@ -206,19 +231,26 @@ func Test_toFrontendService(t *testing.T) {
|
||||||
Protocol: "",
|
Protocol: "",
|
||||||
Port: 0,
|
Port: 0,
|
||||||
Scheduler: "wrr",
|
Scheduler: "wrr",
|
||||||
Flags: 0,
|
Flags: ServiceFlags(FlagPersistent),
|
||||||
Timeout: 0,
|
Timeout: 0,
|
||||||
},
|
},
|
||||||
|
false,
|
||||||
|
"",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range Tests {
|
for i := range Tests {
|
||||||
got, err := toVirtualServer(&Tests[i].ipvsService)
|
got, err := toVirtualServer(&Tests[i].ipvsService)
|
||||||
if err != nil {
|
if Tests[i].expectError && err == nil {
|
||||||
|
t.Errorf("case: %d, expected error: %s, got nil", i, Tests[i].reason)
|
||||||
|
}
|
||||||
|
if !Tests[i].expectError && err != nil {
|
||||||
t.Errorf("case: %d, unexpected error: %v", i, err)
|
t.Errorf("case: %d, unexpected error: %v", i, err)
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(*got, Tests[i].virtualServer) {
|
if got != nil && &Tests[i].virtualServer != nil {
|
||||||
t.Errorf("case: %d, got %#v, want %#v", i, *got, Tests[i].virtualServer)
|
if !reflect.DeepEqual(*got, Tests[i].virtualServer) {
|
||||||
|
t.Errorf("case: %d, got %#v, want %#v", i, *got, Tests[i].virtualServer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue