Skip to content

Commit cfd7146

Browse files
committed
MINOR: add force_reload query parameter to SSL certificate resource paths
This option will force haproxy to reload, also causing haproxy to re-read any new or updated SSL certificates.
1 parent f4f80db commit cfd7146

File tree

8 files changed

+229
-8
lines changed

8 files changed

+229
-8
lines changed

configure_data_plane.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,8 @@ func configureAPI(api *operations.DataPlaneAPI) http.Handler {
528528
api.StorageGetAllStorageSSLCertificatesHandler = &handlers.StorageGetAllStorageSSLCertificatesHandlerImpl{Client: client}
529529
api.StorageGetOneStorageSSLCertificateHandler = &handlers.StorageGetOneStorageSSLCertificateHandlerImpl{Client: client}
530530
api.StorageDeleteStorageSSLCertificateHandler = &handlers.StorageDeleteStorageSSLCertificateHandlerImpl{Client: client}
531-
api.StorageReplaceStorageSSLCertificateHandler = &handlers.StorageReplaceStorageSSLCertificateHandlerImpl{Client: client}
532-
api.StorageCreateStorageSSLCertificateHandler = &handlers.StorageCreateStorageSSLCertificateHandlerImpl{Client: client}
531+
api.StorageReplaceStorageSSLCertificateHandler = &handlers.StorageReplaceStorageSSLCertificateHandlerImpl{Client: client, ReloadAgent: ra}
532+
api.StorageCreateStorageSSLCertificateHandler = &handlers.StorageCreateStorageSSLCertificateHandlerImpl{Client: client, ReloadAgent: ra}
533533

534534
// setup OpenAPI v3 specification handler
535535
api.SpecificationOpenapiv3GetOpenapiv3SpecificationHandler = specification_openapiv3.GetOpenapiv3SpecificationHandlerFunc(func(params specification_openapiv3.GetOpenapiv3SpecificationParams, principal interface{}) middleware.Responder {

e2e/tests/storage_ssl_certificates/test.bats

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ load '../../libs/version'
2222
@test "Add a ssl certificate file" {
2323

2424
refute dpa_docker_exec 'ls /etc/haproxy/ssl/1.pem'
25+
pre_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
2526

2627
run dpa_curl_file_upload POST "/services/haproxy/storage/ssl_certificates" "@${BATS_TEST_DIRNAME}/1.pem;filename=1.pem"
2728
assert_success
@@ -32,6 +33,11 @@ load '../../libs/version'
3233
assert_equal $(get_json_path "$BODY" '.storage_name') "1.pem"
3334

3435
assert dpa_docker_exec 'ls /etc/haproxy/ssl/1.pem'
36+
37+
# confirm haproxy wasn't reloaded or restarted
38+
post_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
39+
new_logs_count=$(( $pre_logs_count - $post_logs_count ))
40+
assert [ $new_logs_count = 0 ]
3541
}
3642

3743
@test "Get a list of managed ssl certificate files" {
@@ -61,11 +67,19 @@ load '../../libs/version'
6167
}
6268

6369
@test "Replace a ssl certificate file contents" {
70+
71+
pre_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
72+
6473
run dpa_curl_text_plain PUT "/services/haproxy/storage/ssl_certificates/1.pem" "@${BATS_TEST_DIRNAME}/2.pem"
6574
assert_success
6675

6776
dpa_curl_status_body '$output'
6877
assert_equal $SC 202
78+
79+
# confirm haproxy wasn't reloaded or restarted
80+
post_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
81+
new_logs_count=$(( $pre_logs_count - $post_logs_count ))
82+
assert [ $new_logs_count = 0 ]
6983
}
7084

7185
@test "Delete a ssl certificate file" {
@@ -77,3 +91,50 @@ load '../../libs/version'
7791

7892
refute dpa_docker_exec 'ls /etc/haproxy/ssl/1.pem'
7993
}
94+
95+
@test "Add a ssl certificate file and reload HAProxy" {
96+
97+
refute dpa_docker_exec 'ls /etc/haproxy/ssl/1.pem'
98+
99+
pre_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
100+
101+
run dpa_curl_file_upload POST "/services/haproxy/storage/ssl_certificates?force_reload=true" "@${BATS_TEST_DIRNAME}/1.pem;filename=1.pem"
102+
assert_success
103+
104+
dpa_curl_status_body '$output'
105+
assert_equal $SC 201
106+
107+
assert_equal $(get_json_path "$BODY" '.storage_name') "1.pem"
108+
109+
assert dpa_docker_exec 'ls /etc/haproxy/ssl/1.pem'
110+
111+
post_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
112+
new_logs_count=$(( $pre_logs_count - $post_logs_count ))
113+
114+
new_logs=$(docker logs dataplaneapi-e2e 2>&1 | tail -n $new_logs_count)
115+
116+
echo -e "$new_logs" # this will help debugging if the test fails
117+
assert echo -e "$new_logs" | head -n 1 | grep -q "Reexecuting Master process"
118+
}
119+
120+
@test "Replace a ssl certificate file contents and reload HAPRoxy" {
121+
122+
pre_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
123+
124+
run dpa_curl_text_plain PUT "/services/haproxy/storage/ssl_certificates/1.pem?force_reload=true" "@${BATS_TEST_DIRNAME}/2.pem"
125+
assert_success
126+
127+
dpa_curl_status_body '$output'
128+
assert_equal $SC 202
129+
130+
post_logs_count=$(docker logs dataplaneapi-e2e 2>&1 | wc -l)
131+
new_logs_count=$(( $pre_logs_count - $post_logs_count ))
132+
133+
new_logs=$(docker logs dataplaneapi-e2e 2>&1 | tail -n $new_logs_count)
134+
135+
echo -e "$new_logs" # this will help debugging if the test fails
136+
assert echo -e "$new_logs" | head -n 1 | grep -q "Reexecuting Master process"
137+
138+
# clean up after the test
139+
dpa_docker_exec 'rm /etc/haproxy/ssl/1.pem'
140+
}

embedded_spec.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

handlers/ssl_cert_storage.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/go-openapi/runtime"
2222
"github.com/go-openapi/runtime/middleware"
2323
client_native "github.com/haproxytech/client-native/v2"
24+
"github.com/haproxytech/dataplaneapi/haproxy"
2425
"github.com/haproxytech/dataplaneapi/misc"
2526
"github.com/haproxytech/dataplaneapi/operations/storage"
2627
models "github.com/haproxytech/models/v2"
@@ -88,7 +89,8 @@ func (h *StorageDeleteStorageSSLCertificateHandlerImpl) Handle(params storage.De
8889

8990
// StorageReplaceStorageSSLCertificateHandlerImpl implementation of the StorageReplaceStorageSSLCertificateHandler interface
9091
type StorageReplaceStorageSSLCertificateHandlerImpl struct {
91-
Client *client_native.HAProxyClient
92+
Client *client_native.HAProxyClient
93+
ReloadAgent haproxy.IReloadAgent
9294
}
9395

9496
func (h *StorageReplaceStorageSSLCertificateHandlerImpl) Handle(params storage.ReplaceStorageSSLCertificateParams, principal interface{}) middleware.Responder {
@@ -102,12 +104,20 @@ func (h *StorageReplaceStorageSSLCertificateHandlerImpl) Handle(params storage.R
102104
Description: "managed SSL file",
103105
StorageName: filepath.Base(filename),
104106
}
107+
if *params.ForceReload {
108+
err := h.ReloadAgent.ForceReload()
109+
if err != nil {
110+
e := misc.HandleError(err)
111+
return storage.NewReplaceStorageMapFileDefault(int(*e.Code)).WithPayload(e)
112+
}
113+
}
105114
return storage.NewReplaceStorageSSLCertificateAccepted().WithPayload(retf)
106115
}
107116

108117
// StorageCreateStorageSSLCertificateHandlerImpl implementation of the StorageCreateStorageSSLCertificateHandler interface
109118
type StorageCreateStorageSSLCertificateHandlerImpl struct {
110-
Client *client_native.HAProxyClient
119+
Client *client_native.HAProxyClient
120+
ReloadAgent haproxy.IReloadAgent
111121
}
112122

113123
func (h *StorageCreateStorageSSLCertificateHandlerImpl) Handle(params storage.CreateStorageSSLCertificateParams, principal interface{}) middleware.Responder {
@@ -125,5 +135,12 @@ func (h *StorageCreateStorageSSLCertificateHandlerImpl) Handle(params storage.Cr
125135
Description: "managed SSL file",
126136
StorageName: filepath.Base(filename),
127137
}
138+
if *params.ForceReload {
139+
err := h.ReloadAgent.ForceReload()
140+
if err != nil {
141+
e := misc.HandleError(err)
142+
return storage.NewReplaceStorageMapFileDefault(int(*e.Code)).WithPayload(e)
143+
}
144+
}
128145
return storage.NewCreateStorageSSLCertificateCreated().WithPayload(retf)
129146
}

operations/storage/create_storage_s_s_l_certificate_parameters.go

Lines changed: 47 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

operations/storage/create_storage_s_s_l_certificate_urlbuilder.go

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)