From 7934759ac24479ac420d6f7148eb004ad411c66b Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Sat, 5 Aug 2017 03:32:16 +0530 Subject: [PATCH] Randomize service endpoint addition when configuring destination on ipvs service Fixes #99 --- app/controllers/network_services_controller.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/controllers/network_services_controller.go b/app/controllers/network_services_controller.go index 8765f90e..e1d851a9 100644 --- a/app/controllers/network_services_controller.go +++ b/app/controllers/network_services_controller.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io/ioutil" + "math/rand" "net" "net/http" "reflect" @@ -422,6 +423,14 @@ func buildServicesInfo() serviceInfoMap { return serviceMap } +func shuffle(endPoints []endpointsInfo) []endpointsInfo { + for index1 := range endPoints { + index2 := rand.Intn(index1 + 1) + endPoints[index1], endPoints[index2] = endPoints[index2], endPoints[index1] + } + return endPoints +} + func buildEndpointsInfo() endpointsInfoMap { endpointsMap := make(endpointsInfoMap) for _, ep := range watchers.EndpointsWatcher.List() { @@ -432,7 +441,7 @@ func buildEndpointsInfo() endpointsInfoMap { for _, addr := range ep_subset.Addresses { endpoints = append(endpoints, endpointsInfo{ip: addr.IP, port: int(port.Port)}) } - endpointsMap[svcId] = endpoints + endpointsMap[svcId] = shuffle(endpoints) } } } @@ -856,5 +865,7 @@ func NewNetworkServicesController(clientset *kubernetes.Clientset, config *optio watchers.EndpointsWatcher.RegisterHandler(&nsc) watchers.ServiceWatcher.RegisterHandler(&nsc) + rand.Seed(time.Now().UnixNano()) + return &nsc, nil }