Merge pull request #57651 from Lion-Wei/ipvs-3

Automatic merge from submit-queue (batch tested with PRs 57651, 56411, 56779, 57523, 57624). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Fix fake IPVS Real Server delete

**What this PR does / why we need it**:

Delete `Weight` equal in identify ipvs Realservice equal, since `Address` + `port` can indetify an unique `Realservice`.

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #57674

**Special notes for your reviewer**:

**Release note**:
```release-note
NONE
```
This commit is contained in:
Kubernetes Submit Queue 2018-01-02 14:09:40 -08:00 committed by GitHub
commit 2df01488fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 39 deletions

View File

@ -18,6 +18,8 @@ package testing
import ( import (
"fmt" "fmt"
"net"
"strconv"
utilipvs "k8s.io/kubernetes/pkg/util/ipvs" utilipvs "k8s.io/kubernetes/pkg/util/ipvs"
) )
@ -39,6 +41,15 @@ func (s *serviceKey) String() string {
return fmt.Sprintf("%s:%d/%s", s.IP, s.Port, s.Protocol) return fmt.Sprintf("%s:%d/%s", s.IP, s.Port, s.Protocol)
} }
type realServerKey struct {
Address net.IP
Port uint16
}
func (r *realServerKey) String() string {
return net.JoinHostPort(r.Address.String(), strconv.Itoa(int(r.Port)))
}
//NewFake creates a fake ipvs implementation - a cache store. //NewFake creates a fake ipvs implementation - a cache store.
func NewFake() *FakeIPVS { func NewFake() *FakeIPVS {
return &FakeIPVS{ return &FakeIPVS{
@ -55,6 +66,13 @@ func toServiceKey(serv *utilipvs.VirtualServer) serviceKey {
} }
} }
func toRealServerKey(rs *utilipvs.RealServer) *realServerKey {
return &realServerKey{
Address: rs.Address,
Port: rs.Port,
}
}
//AddVirtualServer is a fake implementation, it simply adds the VirtualServer into the cache store. //AddVirtualServer is a fake implementation, it simply adds the VirtualServer into the cache store.
func (f *FakeIPVS) AddVirtualServer(serv *utilipvs.VirtualServer) error { func (f *FakeIPVS) AddVirtualServer(serv *utilipvs.VirtualServer) error {
if serv == nil { if serv == nil {
@ -159,18 +177,19 @@ func (f *FakeIPVS) DeleteRealServer(serv *utilipvs.VirtualServer, dest *utilipvs
return fmt.Errorf("Failed to delete destination for service %v, service not found", key.String()) return fmt.Errorf("Failed to delete destination for service %v, service not found", key.String())
} }
dests := f.Destinations[key] dests := f.Destinations[key]
var i int exist := false
for i = range dests { for i := range dests {
if dests[i].Equal(dest) { if toRealServerKey(dests[i]).String() == toRealServerKey(dest).String() {
// Delete one element
f.Destinations[key] = append(f.Destinations[key][:i], f.Destinations[key][i+1:]...)
exist = true
break break
} }
} }
// Not Found // Not Found
if i >= len(f.Destinations[key]) { if !exist {
return fmt.Errorf("Failed to delete real server for service %v, real server not found", key.String()) return fmt.Errorf("Failed to delete real server for service %v, real server not found", key.String())
} }
// Delete one element
f.Destinations[key] = append(f.Destinations[key][:i], f.Destinations[key][i+1:]...)
return nil return nil
} }

View File

@ -113,46 +113,59 @@ func TestRealServer(t *testing.T) {
Port: uint16(80), Port: uint16(80),
Protocol: string("TCP"), Protocol: string("TCP"),
} }
rss := []*utilipvs.RealServer{
{net.ParseIP("172.16.2.1"), 8080, 1},
{net.ParseIP("172.16.2.2"), 8080, 2},
{net.ParseIP("172.16.2.3"), 8080, 3},
}
err := fake.AddVirtualServer(vs) err := fake.AddVirtualServer(vs)
if err != nil { if err != nil {
t.Errorf("Fail to add virutal server, error: %v", err) t.Errorf("Fail to add virutal server, error: %v", err)
} }
// Add a real server to the virtual server // Add real server to the virtual server
rs1 := &utilipvs.RealServer{ for i := range rss {
Address: net.ParseIP("172.16.2.1"), if err = fake.AddRealServer(vs, rss[i]); err != nil {
t.Errorf("Fail to add real server, error: %v", err)
}
}
// Delete a real server of the virtual server
// Make sure any position of the list can be real deleted
rssLen := len(rss)
for i := range rss {
// List all real servers of the virtual server
list, err := fake.GetRealServers(vs)
if err != nil {
t.Errorf("Fail to get real servers of the virtual server, error: %v", err)
}
if len(list) != rssLen {
t.Errorf("Expect %d virutal servers, got: %d", len(rss), len(list))
}
rsToDel := list[i]
if err = fake.DeleteRealServer(vs, rsToDel); err != nil {
t.Errorf("Fail to delete real server of the virtual server, error: %v", err)
} else {
dests, err := fake.GetRealServers(vs)
if err != nil {
t.Errorf("Fail to get real servers of the virtual server, error: %v", err)
}
for _, dest := range dests {
if toRealServerKey(dest).String() == toRealServerKey(rsToDel).String() {
t.Errorf("Expect real server %q be deleted.", rsToDel.String())
}
}
if err = fake.AddRealServer(vs, rsToDel); err != nil {
t.Errorf("Fail to add real server, error: %v", err)
}
}
}
// Test delete real server that not exist
rs := &utilipvs.RealServer{
Address: net.ParseIP("172.16.2.4"),
Port: uint16(8080), Port: uint16(8080),
Weight: 1, Weight: 1,
} }
err = fake.AddRealServer(vs, rs1) if err = fake.DeleteRealServer(vs, rs); err == nil {
if err != nil { t.Errorf("Delete real server that not exist, Expect error, got nil")
t.Errorf("Fail to add real server, error: %v", err)
}
// Add another real server to the virtual server
rs2 := &utilipvs.RealServer{
Address: net.ParseIP("172.16.3.2"),
Port: uint16(8080),
Weight: 2,
}
err = fake.AddRealServer(vs, rs2)
if err != nil {
t.Errorf("Fail to add real server, error: %v", err)
}
// List all real servers of the virtual server
list, err := fake.GetRealServers(vs)
if err != nil {
t.Errorf("Fail to get real servers of the virtual server, error: %v", err)
}
if len(list) != 2 {
t.Errorf("Expect 2 virutal servers, got: %d", len(list))
}
// Delete a real server of the virtual server
err = fake.DeleteRealServer(vs, rs2)
list, err = fake.GetRealServers(vs)
if err != nil {
t.Errorf("Fail to get real servers of the virtual server, error: %v", err)
}
if len(list) != 1 {
t.Errorf("Expect 1 real server, got: %d", len(list))
} }
// Delete the virtual server // Delete the virtual server
err = fake.DeleteVirtualServer(vs) err = fake.DeleteVirtualServer(vs)