mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
Merge pull request #956 from brendandburns/service
Fix the proxier when a service with the same port is re-created after being deleted.
This commit is contained in:
commit
b4973bbac4
@ -199,10 +199,10 @@ func (proxier *Proxier) OnUpdate(services []api.Service) {
|
|||||||
for _, service := range services {
|
for _, service := range services {
|
||||||
activeServices.Insert(service.ID)
|
activeServices.Insert(service.ID)
|
||||||
info, exists := proxier.getServiceInfo(service.ID)
|
info, exists := proxier.getServiceInfo(service.ID)
|
||||||
if exists && info.port == service.Port {
|
if exists && info.active && info.port == service.Port {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if exists {
|
if exists && info.port != service.Port {
|
||||||
proxier.StopProxy(service.ID)
|
proxier.StopProxy(service.ID)
|
||||||
}
|
}
|
||||||
glog.Infof("Adding a new service %s on port %d", service.ID, service.Port)
|
glog.Infof("Adding a new service %s on port %d", service.ID, service.Port)
|
||||||
|
@ -133,6 +133,33 @@ func TestProxyUpdateDelete(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProxyUpdateDeleteUpdate(t *testing.T) {
|
||||||
|
lb := NewLoadBalancerRR()
|
||||||
|
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
|
||||||
|
|
||||||
|
p := NewProxier(lb)
|
||||||
|
|
||||||
|
proxyPort, err := p.addServiceOnUnusedPort("echo")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error adding new service: %#v", err)
|
||||||
|
}
|
||||||
|
conn, err := net.Dial("tcp", net.JoinHostPort("127.0.0.1", proxyPort))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error connecting to proxy: %v", err)
|
||||||
|
}
|
||||||
|
conn.Close()
|
||||||
|
|
||||||
|
p.OnUpdate([]api.Service{})
|
||||||
|
if err := waitForClosedPort(p, proxyPort); err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
proxyPortNum, _ := strconv.Atoi(proxyPort)
|
||||||
|
p.OnUpdate([]api.Service{
|
||||||
|
{JSONBase: api.JSONBase{ID: "echo"}, Port: proxyPortNum},
|
||||||
|
})
|
||||||
|
testEchoConnection(t, "127.0.0.1", proxyPort)
|
||||||
|
}
|
||||||
|
|
||||||
func TestProxyUpdatePort(t *testing.T) {
|
func TestProxyUpdatePort(t *testing.T) {
|
||||||
lb := NewLoadBalancerRR()
|
lb := NewLoadBalancerRR()
|
||||||
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
|
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
|
||||||
@ -165,3 +192,44 @@ func TestProxyUpdatePort(t *testing.T) {
|
|||||||
}
|
}
|
||||||
testEchoConnection(t, "127.0.0.1", newPort)
|
testEchoConnection(t, "127.0.0.1", newPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestProxyUpdatePortLetsGoOfOldPort(t *testing.T) {
|
||||||
|
lb := NewLoadBalancerRR()
|
||||||
|
lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}})
|
||||||
|
|
||||||
|
p := NewProxier(lb)
|
||||||
|
|
||||||
|
proxyPort, err := p.addServiceOnUnusedPort("echo")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error adding new service: %#v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a new dummy listener in order to get a port that is free
|
||||||
|
l, _ := net.Listen("tcp", ":0")
|
||||||
|
_, newPort, _ := net.SplitHostPort(l.Addr().String())
|
||||||
|
portNum, _ := strconv.Atoi(newPort)
|
||||||
|
l.Close()
|
||||||
|
|
||||||
|
// Wait for the socket to actually get free.
|
||||||
|
if err := waitForClosedPort(p, newPort); err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
if proxyPort == newPort {
|
||||||
|
t.Errorf("expected difference, got %s %s", newPort, proxyPort)
|
||||||
|
}
|
||||||
|
p.OnUpdate([]api.Service{
|
||||||
|
{JSONBase: api.JSONBase{ID: "echo"}, Port: portNum},
|
||||||
|
})
|
||||||
|
if err := waitForClosedPort(p, proxyPort); err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
testEchoConnection(t, "127.0.0.1", newPort)
|
||||||
|
proxyPortNum, _ := strconv.Atoi(proxyPort)
|
||||||
|
p.OnUpdate([]api.Service{
|
||||||
|
{JSONBase: api.JSONBase{ID: "echo"}, Port: proxyPortNum},
|
||||||
|
})
|
||||||
|
if err := waitForClosedPort(p, newPort); err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
testEchoConnection(t, "127.0.0.1", proxyPort)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user