Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
ec87d22d
Unverified
Commit
ec87d22d
authored
Oct 17, 2018
by
k8s-ci-robot
Committed by
GitHub
Oct 17, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #66057 from xujieasd/cleanLeacyBindAddr-test
add UT code for cleanLegacyBindAddr
parents
399cade8
4eab9406
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
159 additions
and
3 deletions
+159
-3
proxier_test.go
pkg/proxy/ipvs/proxier_test.go
+107
-0
fake.go
pkg/proxy/ipvs/testing/fake.go
+52
-3
No files found.
pkg/proxy/ipvs/proxier_test.go
View file @
ec87d22d
...
@@ -2708,6 +2708,7 @@ func Test_syncService(t *testing.T) {
...
@@ -2708,6 +2708,7 @@ func Test_syncService(t *testing.T) {
ipset
:=
ipsettest
.
NewFake
(
testIPSetVersion
)
ipset
:=
ipsettest
.
NewFake
(
testIPSetVersion
)
proxier
:=
NewFakeProxier
(
ipt
,
ipvs
,
ipset
,
nil
)
proxier
:=
NewFakeProxier
(
ipt
,
ipvs
,
ipset
,
nil
)
proxier
.
netlinkHandle
.
EnsureDummyDevice
(
DefaultDummyDevice
)
if
testCases
[
i
]
.
oldVirtualServer
!=
nil
{
if
testCases
[
i
]
.
oldVirtualServer
!=
nil
{
if
err
:=
proxier
.
ipvs
.
AddVirtualServer
(
testCases
[
i
]
.
oldVirtualServer
);
err
!=
nil
{
if
err
:=
proxier
.
ipvs
.
AddVirtualServer
(
testCases
[
i
]
.
oldVirtualServer
);
err
!=
nil
{
t
.
Errorf
(
"Case [%d], unexpected add IPVS virtual server error: %v"
,
i
,
err
)
t
.
Errorf
(
"Case [%d], unexpected add IPVS virtual server error: %v"
,
i
,
err
)
...
@@ -2906,3 +2907,109 @@ func TestCleanLegacyService(t *testing.T) {
...
@@ -2906,3 +2907,109 @@ func TestCleanLegacyService(t *testing.T) {
}
}
}
}
}
}
func
TestCleanLegacyBindAddr
(
t
*
testing
.
T
)
{
ipt
:=
iptablestest
.
NewFake
()
ipvs
:=
ipvstest
.
NewFake
()
ipset
:=
ipsettest
.
NewFake
(
testIPSetVersion
)
fp
:=
NewFakeProxier
(
ipt
,
ipvs
,
ipset
,
nil
)
// All ipvs service addresses that were bound to ipvs0 in the latest sync loop.
activeBindAddrs
:=
map
[
string
]
bool
{
"1.2.3.4"
:
true
,
"1002:ab8::2:1"
:
true
}
// All service addresses that were bound to ipvs0 in system
currentBindAddrs
:=
[]
string
{
"1.2.3.4"
,
"1.2.3.5"
,
"1.2.3.6"
,
"1002:ab8::2:1"
,
"1002:ab8::2:2"
}
fp
.
netlinkHandle
.
EnsureDummyDevice
(
DefaultDummyDevice
)
for
i
:=
range
currentBindAddrs
{
fp
.
netlinkHandle
.
EnsureAddressBind
(
currentBindAddrs
[
i
],
DefaultDummyDevice
)
}
fp
.
cleanLegacyBindAddr
(
activeBindAddrs
,
currentBindAddrs
)
remainingAddrs
,
_
:=
fp
.
netlinkHandle
.
ListBindAddress
(
DefaultDummyDevice
)
// should only remain "1.2.3.4" and "1002:ab8::2:1"
if
len
(
remainingAddrs
)
!=
2
{
t
.
Errorf
(
"Expected number of remaining bound addrs after cleanup to be %v. Got %v"
,
2
,
len
(
remainingAddrs
))
}
// check that address "1.2.3.4" and "1002:ab8::2:1" remain
remainingAddrsMap
:=
make
(
map
[
string
]
bool
)
for
i
:=
range
remainingAddrs
{
remainingAddrsMap
[
remainingAddrs
[
i
]]
=
true
}
if
!
reflect
.
DeepEqual
(
activeBindAddrs
,
remainingAddrsMap
)
{
t
.
Errorf
(
"Expected remainingAddrsMap %v, got %v"
,
activeBindAddrs
,
remainingAddrsMap
)
}
}
func
TestMultiPortServiceBindAddr
(
t
*
testing
.
T
)
{
ipt
:=
iptablestest
.
NewFake
()
ipvs
:=
ipvstest
.
NewFake
()
ipset
:=
ipsettest
.
NewFake
(
testIPSetVersion
)
fp
:=
NewFakeProxier
(
ipt
,
ipvs
,
ipset
,
nil
)
service1
:=
makeTestService
(
"ns1"
,
"svc1"
,
func
(
svc
*
v1
.
Service
)
{
svc
.
Spec
.
Type
=
v1
.
ServiceTypeClusterIP
svc
.
Spec
.
ClusterIP
=
"172.16.55.4"
svc
.
Spec
.
Ports
=
addTestPort
(
svc
.
Spec
.
Ports
,
"port1"
,
"TCP"
,
1234
,
0
,
0
)
svc
.
Spec
.
Ports
=
addTestPort
(
svc
.
Spec
.
Ports
,
"port2"
,
"TCP"
,
1235
,
0
,
0
)
})
service2
:=
makeTestService
(
"ns1"
,
"svc1"
,
func
(
svc
*
v1
.
Service
)
{
svc
.
Spec
.
Type
=
v1
.
ServiceTypeClusterIP
svc
.
Spec
.
ClusterIP
=
"172.16.55.4"
svc
.
Spec
.
Ports
=
addTestPort
(
svc
.
Spec
.
Ports
,
"port1"
,
"TCP"
,
1234
,
0
,
0
)
})
service3
:=
makeTestService
(
"ns1"
,
"svc1"
,
func
(
svc
*
v1
.
Service
)
{
svc
.
Spec
.
Type
=
v1
.
ServiceTypeClusterIP
svc
.
Spec
.
ClusterIP
=
"172.16.55.4"
svc
.
Spec
.
Ports
=
addTestPort
(
svc
.
Spec
.
Ports
,
"port1"
,
"TCP"
,
1234
,
0
,
0
)
svc
.
Spec
.
Ports
=
addTestPort
(
svc
.
Spec
.
Ports
,
"port2"
,
"TCP"
,
1235
,
0
,
0
)
svc
.
Spec
.
Ports
=
addTestPort
(
svc
.
Spec
.
Ports
,
"port3"
,
"UDP"
,
1236
,
0
,
0
)
})
fp
.
servicesSynced
=
true
fp
.
endpointsSynced
=
true
// first, add multi-port service1
fp
.
OnServiceAdd
(
service1
)
fp
.
syncProxyRules
()
remainingAddrs
,
_
:=
fp
.
netlinkHandle
.
ListBindAddress
(
DefaultDummyDevice
)
// should only remain address "172.16.55.4"
if
len
(
remainingAddrs
)
!=
1
{
t
.
Errorf
(
"Expected number of remaining bound addrs after cleanup to be %v. Got %v"
,
1
,
len
(
remainingAddrs
))
}
if
remainingAddrs
[
0
]
!=
"172.16.55.4"
{
t
.
Errorf
(
"Expected remaining address should be %s, got %s"
,
"172.16.55.4"
,
remainingAddrs
[
0
])
}
// update multi-port service1 to single-port service2
fp
.
OnServiceUpdate
(
service1
,
service2
)
fp
.
syncProxyRules
()
remainingAddrs
,
_
=
fp
.
netlinkHandle
.
ListBindAddress
(
DefaultDummyDevice
)
// should still only remain address "172.16.55.4"
if
len
(
remainingAddrs
)
!=
1
{
t
.
Errorf
(
"Expected number of remaining bound addrs after cleanup to be %v. Got %v"
,
1
,
len
(
remainingAddrs
))
}
else
if
remainingAddrs
[
0
]
!=
"172.16.55.4"
{
t
.
Errorf
(
"Expected remaining address should be %s, got %s"
,
"172.16.55.4"
,
remainingAddrs
[
0
])
}
// update single-port service2 to multi-port service3
fp
.
OnServiceUpdate
(
service2
,
service3
)
fp
.
syncProxyRules
()
remainingAddrs
,
_
=
fp
.
netlinkHandle
.
ListBindAddress
(
DefaultDummyDevice
)
// should still only remain address "172.16.55.4"
if
len
(
remainingAddrs
)
!=
1
{
t
.
Errorf
(
"Expected number of remaining bound addrs after cleanup to be %v. Got %v"
,
1
,
len
(
remainingAddrs
))
}
else
if
remainingAddrs
[
0
]
!=
"172.16.55.4"
{
t
.
Errorf
(
"Expected remaining address should be %s, got %s"
,
"172.16.55.4"
,
remainingAddrs
[
0
])
}
// delete multi-port service3
fp
.
OnServiceDelete
(
service3
)
fp
.
syncProxyRules
()
remainingAddrs
,
_
=
fp
.
netlinkHandle
.
ListBindAddress
(
DefaultDummyDevice
)
// all addresses should be unbound
if
len
(
remainingAddrs
)
!=
0
{
t
.
Errorf
(
"Expected number of remaining bound addrs after cleanup to be %v. Got %v"
,
0
,
len
(
remainingAddrs
))
}
}
pkg/proxy/ipvs/testing/fake.go
View file @
ec87d22d
...
@@ -39,27 +39,76 @@ func NewFakeNetlinkHandle() *FakeNetlinkHandle {
...
@@ -39,27 +39,76 @@ func NewFakeNetlinkHandle() *FakeNetlinkHandle {
// EnsureAddressBind is a mock implementation
// EnsureAddressBind is a mock implementation
func
(
h
*
FakeNetlinkHandle
)
EnsureAddressBind
(
address
,
devName
string
)
(
exist
bool
,
err
error
)
{
func
(
h
*
FakeNetlinkHandle
)
EnsureAddressBind
(
address
,
devName
string
)
(
exist
bool
,
err
error
)
{
if
len
(
devName
)
==
0
{
return
false
,
fmt
.
Errorf
(
"Device name can't be empty"
)
}
if
_
,
ok
:=
h
.
localAddresses
[
devName
];
!
ok
{
return
false
,
fmt
.
Errorf
(
"Error bind address: %s to a non-exist interface: %s"
,
address
,
devName
)
}
for
_
,
addr
:=
range
h
.
localAddresses
[
devName
]
{
if
addr
==
address
{
// return true if the address is already bound to device
return
true
,
nil
}
}
h
.
localAddresses
[
devName
]
=
append
(
h
.
localAddresses
[
devName
],
address
)
return
false
,
nil
return
false
,
nil
}
}
// UnbindAddress is a mock implementation
// UnbindAddress is a mock implementation
func
(
h
*
FakeNetlinkHandle
)
UnbindAddress
(
address
,
devName
string
)
error
{
func
(
h
*
FakeNetlinkHandle
)
UnbindAddress
(
address
,
devName
string
)
error
{
return
nil
if
len
(
devName
)
==
0
{
return
fmt
.
Errorf
(
"Device name can't be empty"
)
}
if
_
,
ok
:=
h
.
localAddresses
[
devName
];
!
ok
{
return
fmt
.
Errorf
(
"Error unbind address: %s from a non-exist interface: %s"
,
address
,
devName
)
}
for
i
,
addr
:=
range
h
.
localAddresses
[
devName
]
{
if
addr
==
address
{
// delete address from slice h.localAddresses[devName]
h
.
localAddresses
[
devName
]
=
append
(
h
.
localAddresses
[
devName
][
:
i
],
h
.
localAddresses
[
devName
][
i
+
1
:
]
...
)
return
nil
}
}
// return error message if address is not found in slice h.localAddresses[devName]
return
fmt
.
Errorf
(
"Address: %s is not found in interface: %s"
,
address
,
devName
)
}
}
// EnsureDummyDevice is a mock implementation
// EnsureDummyDevice is a mock implementation
func
(
h
*
FakeNetlinkHandle
)
EnsureDummyDevice
(
devName
string
)
(
bool
,
error
)
{
func
(
h
*
FakeNetlinkHandle
)
EnsureDummyDevice
(
devName
string
)
(
bool
,
error
)
{
return
false
,
nil
if
len
(
devName
)
==
0
{
return
false
,
fmt
.
Errorf
(
"Device name can't be empty"
)
}
if
_
,
ok
:=
h
.
localAddresses
[
devName
];
!
ok
{
// create dummy interface if devName is not found in localAddress map
h
.
localAddresses
[
devName
]
=
make
([]
string
,
0
)
return
false
,
nil
}
// return true if devName is already created in localAddress map
return
true
,
nil
}
}
// DeleteDummyDevice is a mock implementation
// DeleteDummyDevice is a mock implementation
func
(
h
*
FakeNetlinkHandle
)
DeleteDummyDevice
(
devName
string
)
error
{
func
(
h
*
FakeNetlinkHandle
)
DeleteDummyDevice
(
devName
string
)
error
{
if
len
(
devName
)
==
0
{
return
fmt
.
Errorf
(
"Device name can't be empty"
)
}
if
_
,
ok
:=
h
.
localAddresses
[
devName
];
!
ok
{
return
fmt
.
Errorf
(
"Error deleting a non-exist interface: %s"
,
devName
)
}
delete
(
h
.
localAddresses
,
devName
)
return
nil
return
nil
}
}
// ListBindAddress is a mock implementation
// ListBindAddress is a mock implementation
func
(
h
*
FakeNetlinkHandle
)
ListBindAddress
(
devName
string
)
([]
string
,
error
)
{
func
(
h
*
FakeNetlinkHandle
)
ListBindAddress
(
devName
string
)
([]
string
,
error
)
{
return
nil
,
nil
if
len
(
devName
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"Device name can't be empty"
)
}
if
_
,
ok
:=
h
.
localAddresses
[
devName
];
!
ok
{
return
nil
,
fmt
.
Errorf
(
"Error list addresses from a non-exist interface: %s"
,
devName
)
}
return
h
.
localAddresses
[
devName
],
nil
}
}
// GetLocalAddresses is a mock implementation
// GetLocalAddresses is a mock implementation
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment