Skip to content

Commit 9ded938

Browse files
committed
ENH: Better handling of proxy.Instance
1 parent 4674140 commit 9ded938

File tree

9 files changed

+87
-23
lines changed

9 files changed

+87
-23
lines changed

actions/reconfigure.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ var NewReconfigure = func(baseData BaseReconfigure, serviceData proxy.Service) R
4949
func (m *Reconfigure) Execute(reloadAfter bool) error {
5050
if strings.EqualFold(os.Getenv("FILTER_PROXY_INSTANCE_NAME"), "true") &&
5151
!strings.EqualFold(m.InstanceName, m.Service.ProxyInstanceName) {
52+
logPrintf("Filtering %s configuration, with proxyInstanceName: %s", m.ServiceName, m.Service.ProxyInstanceName)
5253
return nil
5354
}
54-
mu.Lock()
55-
defer mu.Unlock()
5655
if strings.EqualFold(os.Getenv("SKIP_ADDRESS_VALIDATION"), "false") {
5756
host := m.ServiceName
5857
if len(m.ServiceDest) > 0 && len(m.ServiceDest[0].OutboundHostname) > 0 {
@@ -63,12 +62,9 @@ func (m *Reconfigure) Execute(reloadAfter bool) error {
6362
return err
6463
}
6564
}
66-
if err := m.createConfigs(); err != nil {
65+
if err := m.createConfigsAddService(); err != nil {
6766
return err
6867
}
69-
if !m.hasTemplate() {
70-
proxy.Instance.AddService(m.Service)
71-
}
7268
if reloadAfter {
7369
reload := reload{}
7470
if err := reload.Execute(true); err != nil {
@@ -87,6 +83,19 @@ func (m *Reconfigure) Execute(reloadAfter bool) error {
8783
return nil
8884
}
8985

86+
func (m *Reconfigure) createConfigsAddService() error {
87+
configProxyMu.Lock()
88+
defer configProxyMu.Unlock()
89+
90+
if err := m.createConfigs(); err != nil {
91+
return err
92+
}
93+
if !m.hasTemplate() {
94+
proxy.Instance.AddService(m.Service)
95+
}
96+
return nil
97+
}
98+
9099
// GetData returns structure with reconfiguration data and the service
91100
func (m *Reconfigure) GetData() (BaseReconfigure, proxy.Service) {
92101
return m.BaseReconfigure, m.Service

actions/reconfigure_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,8 +1260,9 @@ func (m *ProxyMock) AddService(service proxy.Service) {
12601260
m.Called(service)
12611261
}
12621262

1263-
func (m *ProxyMock) RemoveService(service string) {
1264-
m.Called(service)
1263+
func (m *ProxyMock) RemoveService(service string) bool {
1264+
params := m.Called(service)
1265+
return params.Bool(0)
12651266
}
12661267

12671268
func (m *ProxyMock) GetServices() map[string]proxy.Service {
@@ -1298,7 +1299,7 @@ func getProxyMock(skipMethod string) *ProxyMock {
12981299
mockObj.On("AddService", mock.Anything)
12991300
}
13001301
if skipMethod != "RemoveService" {
1301-
mockObj.On("RemoveService", mock.Anything)
1302+
mockObj.On("RemoveService", mock.Anything).Return(true)
13021303
}
13031304
if skipMethod != "GetServices" {
13041305
mockObj.On("GetServices")

actions/remove.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package actions
22

33
import (
4-
"../proxy"
54
"fmt"
5+
6+
"../proxy"
67
)
78

89
// Removable defines functions that must be implemented by any struct in charge of removing services from the proxy.
@@ -33,11 +34,14 @@ var NewRemove = func(serviceName, aclName, configsPath, templatesPath string, in
3334
// Execute initiates the removal of a service
3435
func (m *Remove) Execute(args []string) error {
3536
logPrintf("Removing %s configuration", m.ServiceName)
36-
if err := m.removeFiles(m.TemplatesPath, m.ServiceName, m.AclName); err != nil {
37-
logPrintf(err.Error())
37+
didRemove, err := m.removeConfigsAndService()
38+
if err != nil {
3839
return err
3940
}
40-
proxy.Instance.RemoveService(m.ServiceName)
41+
if !didRemove {
42+
logPrintf("%s was not configured, no reload required", m.ServiceName)
43+
return nil
44+
}
4145
reload := reload{}
4246
if err := reload.Execute(true); err != nil {
4347
logPrintf(err.Error())
@@ -46,6 +50,21 @@ func (m *Remove) Execute(args []string) error {
4650
return nil
4751
}
4852

53+
func (m *Remove) removeConfigsAndService() (bool, error) {
54+
configProxyMu.Lock()
55+
defer configProxyMu.Unlock()
56+
didRemove := proxy.Instance.RemoveService(m.ServiceName)
57+
if !didRemove {
58+
return didRemove, nil
59+
}
60+
61+
if err := m.removeFiles(m.TemplatesPath, m.ServiceName, m.AclName); err != nil {
62+
logPrintf(err.Error())
63+
return false, err
64+
}
65+
return didRemove, nil
66+
}
67+
4968
func (m *Remove) removeFiles(templatesPath, serviceName, aclName string) error {
5069
logPrintf("Removing the %s configuration files", serviceName)
5170
if len(aclName) == 0 {
@@ -55,8 +74,6 @@ func (m *Remove) removeFiles(templatesPath, serviceName, aclName string) error {
5574
fmt.Sprintf("%s/%s-fe.cfg", templatesPath, aclName),
5675
fmt.Sprintf("%s/%s-be.cfg", templatesPath, aclName),
5776
}
58-
// mu.Lock()
59-
// defer mu.Unlock()
6077
for _, path := range paths {
6178
osRemove(path)
6279
}

actions/remove_test.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
package actions
44

55
import (
6-
"../proxy"
76
"fmt"
7+
"testing"
8+
9+
"../proxy"
810
"github.com/stretchr/testify/mock"
911
"github.com/stretchr/testify/suite"
10-
"testing"
1112
)
1213

1314
type RemoveTestSuite struct {
@@ -112,6 +113,18 @@ func (s RemoveTestSuite) Test_Execute_Invokes_HaProxyReload() {
112113
mockObj.AssertCalled(s.T(), "Reload")
113114
}
114115

116+
func (s RemoveTestSuite) Test_Execute_If_RemoveService_Does_Not_Invokes_HaProxyReload() {
117+
proxyOrig := proxy.Instance
118+
defer func() { proxy.Instance = proxyOrig }()
119+
mockObj := getProxyMock("RemoveService")
120+
mockObj.On("RemoveService", mock.Anything).Return(false)
121+
proxy.Instance = mockObj
122+
123+
s.remove.Execute([]string{})
124+
125+
mockObj.AssertNotCalled(s.T(), "Reload")
126+
}
127+
115128
func (s RemoveTestSuite) Test_Execute_ReturnsError_WhenHaProxyReloadFails() {
116129
proxyOrig := proxy.Instance
117130
defer func() { proxy.Instance = proxyOrig }()

actions/util.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net"
77
"net/http"
88
"os"
9+
"sync"
910
)
1011

1112
type executable interface {
@@ -19,3 +20,5 @@ var writeFeTemplate = ioutil.WriteFile
1920
var writeBeTemplate = ioutil.WriteFile
2021
var readTemplateFile = ioutil.ReadFile
2122
var osRemove = os.Remove
23+
24+
var configProxyMu = &sync.Mutex{}

proxy/ha_proxy.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,14 @@ func (m HaProxy) AddService(service Service) {
201201
}
202202

203203
// RemoveService deletes a service from the `dataInstance` map using `ServiceName` as the key
204-
func (m HaProxy) RemoveService(service string) {
204+
// Returns false if there are no services to remove
205+
func (m HaProxy) RemoveService(service string) bool {
206+
_, ok := dataInstance.Services[service]
207+
if !ok {
208+
return false
209+
}
205210
delete(dataInstance.Services, service)
211+
return true
206212
}
207213

208214
// GetServices returns a map with all the services used by the proxy.

proxy/ha_proxy_test.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2890,11 +2890,25 @@ func (s *HaProxyTestSuite) Test_AddService_RemovesService() {
28902890

28912891
p.AddService(s1)
28922892
p.AddService(s2)
2893-
p.RemoveService("my-service-1")
2893+
didRemove := p.RemoveService("my-service-1")
28942894

2895+
s.True(didRemove)
28952896
s.Len(dataInstance.Services, 1)
28962897
}
28972898

2899+
func (s *HaProxyTestSuite) Test_RemovesService_Does_Not_Exist() {
2900+
s1 := Service{ServiceName: "my-service-1"}
2901+
s2 := Service{ServiceName: "my-service-2"}
2902+
p := NewHaProxy("anything", "doesn't").(HaProxy)
2903+
2904+
p.AddService(s1)
2905+
p.AddService(s2)
2906+
didRemove := p.RemoveService("my-service-3")
2907+
2908+
s.False(didRemove)
2909+
s.Len(dataInstance.Services, 2)
2910+
}
2911+
28982912
// Util
28992913

29002914
func (s *HaProxyTestSuite) getTemplateWithLogs() string {

proxy/proxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ type proxy interface {
1717
GetCertPaths() []string
1818
GetCerts() map[string]string
1919
AddService(service Service)
20-
RemoveService(service string)
20+
RemoveService(service string) bool
2121
GetServices() map[string]Service
2222
}

server/cert_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -719,8 +719,9 @@ func (m *ProxyMock) AddService(service proxy.Service) {
719719
m.Called(service)
720720
}
721721

722-
func (m *ProxyMock) RemoveService(service string) {
723-
m.Called(service)
722+
func (m *ProxyMock) RemoveService(service string) bool {
723+
params := m.Called(service)
724+
return params.Bool(0)
724725
}
725726

726727
func (m *ProxyMock) GetServices() map[string]proxy.Service {
@@ -757,7 +758,7 @@ func getProxyMock(skipMethod string) *ProxyMock {
757758
mockObj.On("AddService", mock.Anything)
758759
}
759760
if skipMethod != "RemoveService" {
760-
mockObj.On("RemoveService", mock.Anything)
761+
mockObj.On("RemoveService", mock.Anything).Return(true)
761762
}
762763
if skipMethod != "GetServices" {
763764
mockObj.On("GetServices").Return(map[string]proxy.Service{})

0 commit comments

Comments
 (0)