Skip to content

Commit d49ec51

Browse files
authored
BUG/MEDIUM: new certificates not upgraded on existing servers (#63)
Fix a bug that kept old certificates in server backends on existing servers.
1 parent 2e1ec40 commit d49ec51

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

haproxy/state/from_ha_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,6 @@ func TestFromHA(t *testing.T) {
149149
cfgDir, err := ioutil.TempDir("", fmt.Sprintf("%s_*", t.Name()))
150150
require.NoError(t, err)
151151

152-
state := GetTestHAConfig(cfgDir)
152+
state := GetTestHAConfig(cfgDir, "")
153153
testCfg(t, cfgDir, state)
154154
}

haproxy/state/snapshot_test.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func GetTestConsulConfig() consul.Config {
4141
}
4242
}
4343

44-
func GetTestHAConfig(baseCfg string) State {
44+
func GetTestHAConfig(baseCfg string, certVersion string) State {
4545
s := State{
4646
Frontends: []Frontend{
4747

@@ -59,8 +59,8 @@ func GetTestHAConfig(baseCfg string) State {
5959
Address: "127.0.0.2",
6060
Port: int64p(9999),
6161
Ssl: true,
62-
SslCafile: baseCfg + "/ca",
63-
SslCertificate: baseCfg + "/cert",
62+
SslCafile: baseCfg + "/ca" + certVersion,
63+
SslCertificate: baseCfg + "/cert" + certVersion,
6464
Verify: models.BindVerifyRequired,
6565
},
6666
LogTarget: &models.LogTarget{
@@ -160,8 +160,8 @@ func GetTestHAConfig(baseCfg string) State {
160160
Port: int64p(8080),
161161
Weight: int64p(5),
162162
Ssl: models.ServerSslEnabled,
163-
SslCafile: baseCfg + "/ca",
164-
SslCertificate: baseCfg + "/cert",
163+
SslCafile: baseCfg + "/ca" + certVersion,
164+
SslCertificate: baseCfg + "/cert" + certVersion,
165165
Verify: models.BindVerifyRequired,
166166
Maintenance: models.ServerMaintenanceDisabled,
167167
},
@@ -171,8 +171,8 @@ func GetTestHAConfig(baseCfg string) State {
171171
Port: int64p(8081),
172172
Weight: int64p(8),
173173
Ssl: models.ServerSslEnabled,
174-
SslCafile: baseCfg + "/ca",
175-
SslCertificate: baseCfg + "/cert",
174+
SslCafile: baseCfg + "/ca" + certVersion,
175+
SslCertificate: baseCfg + "/cert" + certVersion,
176176
Verify: models.BindVerifyRequired,
177177
Maintenance: models.ServerMaintenanceDisabled,
178178
},
@@ -227,17 +227,17 @@ func TestSnapshotDownstream(t *testing.T) {
227227
generated, err := Generate(TestOpts, TestCertStore, State{}, GetTestConsulConfig())
228228
require.Nil(t, err)
229229

230-
require.Equal(t, GetTestHAConfig("/"), generated)
230+
require.Equal(t, GetTestHAConfig("/", ""), generated)
231231
}
232232

233233
func TestServerUpdate(t *testing.T) {
234234
consulCfg := GetTestConsulConfig()
235235
consulCfg.Upstreams[0].Nodes = consulCfg.Upstreams[0].Nodes[1:]
236236

237-
oldState := GetTestHAConfig("/")
237+
oldState := GetTestHAConfig("/", "")
238238

239239
// remove first server
240-
expectedNewState := GetTestHAConfig("/")
240+
expectedNewState := GetTestHAConfig("/", "")
241241
expectedNewState.Backends[1].Servers[0].Maintenance = models.ServerMaintenanceEnabled
242242
expectedNewState.Backends[1].Servers[0].Address = "127.0.0.1"
243243
expectedNewState.Backends[1].Servers[0].Port = int64p(1)
@@ -250,7 +250,7 @@ func TestServerUpdate(t *testing.T) {
250250
// re-add first server
251251
generated, err = Generate(TestOpts, TestCertStore, generated, GetTestConsulConfig())
252252
require.Nil(t, err)
253-
require.Equal(t, GetTestHAConfig("/"), generated)
253+
require.Equal(t, GetTestHAConfig("/", ""), generated)
254254

255255
// add another one
256256
consulCfg = GetTestConsulConfig()
@@ -260,7 +260,7 @@ func TestServerUpdate(t *testing.T) {
260260
Weight: 10,
261261
})
262262

263-
expectedNewState = GetTestHAConfig("/")
263+
expectedNewState = GetTestHAConfig("/", "")
264264
expectedNewState.Backends[1].Servers = append(expectedNewState.Backends[1].Servers,
265265
models.Server{
266266
Name: "srv_2",
@@ -291,8 +291,22 @@ func TestServerUpdate(t *testing.T) {
291291
require.Equal(t, expectedNewState, generated)
292292
}
293293

294-
type fakeCertStore struct{}
294+
func TestCertificateUpgrade(t *testing.T) {
295+
generated, err := Generate(TestOpts, fakeCertStore{"1"}, State{}, GetTestConsulConfig())
296+
require.Nil(t, err)
297+
298+
generated, err = Generate(TestOpts, fakeCertStore{"2"}, generated, GetTestConsulConfig())
299+
require.Nil(t, err)
300+
301+
haCfg := GetTestHAConfig("/", "2")
302+
303+
require.Equal(t, haCfg, generated)
304+
}
305+
306+
type fakeCertStore struct {
307+
suffix string
308+
}
295309

296310
func (s fakeCertStore) CertsPath(t consul.TLS) (string, string, error) {
297-
return "//ca", "//cert", nil
311+
return "//ca" + s.suffix, "//cert" + s.suffix, nil
298312
}

haproxy/state/upstream.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,11 @@ func generateUpstreamServers(opts Options, certStore CertificateStore, cfg consu
130130

131131
// Add new servers
132132
for _, s := range cfg.Nodes {
133-
_, ok := serversIdx[idxConsulNode(s)]
133+
i, ok := serversIdx[idxConsulNode(s)]
134134
if ok {
135+
// if the server exists, just update its certificate in case they changed
136+
servers[i].SslCafile = caPath
137+
servers[i].SslCertificate = crtPath
135138
continue
136139
}
137140

@@ -149,7 +152,7 @@ func generateUpstreamServers(opts Options, certStore CertificateStore, cfg consu
149152
}
150153
}
151154

152-
i := emptyServerSlots[0]
155+
i = emptyServerSlots[0]
153156
emptyServerSlots = emptyServerSlots[1:]
154157

155158
servers[i].Address = s.Host

0 commit comments

Comments
 (0)