Skip to content
This repository was archived by the owner on Dec 13, 2018. It is now read-only.

Commit 4800bc0

Browse files
Feng Honglinbernardopericacho
authored andcommitted
add a default frontend when EXTRA_FRONTEND_SETTING is used (#196)
1 parent abfcf83 commit 4800bc0

File tree

3 files changed

+71
-41
lines changed

3 files changed

+71
-41
lines changed

haproxy/haproxycfg.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,10 @@ def _config_frontend_sections(self):
373373
port_str = "frontend port_%s" % port
374374
if port_str in cfg:
375375
del cfg[port_str]
376-
377376
else:
378377
self.require_default_route = FrontendHelper.check_require_default_route(self.specs.get_routes(),
379378
self.routes_added)
380-
if self.require_default_route:
379+
if self.require_default_route or EXTRA_FRONTEND_SETTINGS:
381380
cfg, monitor_uri_configured = FrontendHelper.config_default_frontend(ssl_bind_string)
382381
else:
383382
cfg = OrderedDict()

haproxy/helper/frontend_helper.py

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -137,48 +137,50 @@ def get_bind_string(port, ssl_bind_string, vhosts):
137137
def config_default_frontend(ssl_bind_string):
138138
cfg = OrderedDict()
139139
monitor_uri_configured = False
140-
frontend = [("bind :80 %s" % EXTRA_BIND_SETTINGS.get('80', "")).strip()]
141-
142-
# add x-forwarded-porto header if not skipped
143-
if not SKIP_FORWARDED_PROTO:
144-
frontend.append("reqadd X-Forwarded-Proto:\ http")
145-
146-
frontend.append("maxconn %s" % MAXCONN)
147-
148-
if MONITOR_URI and MONITOR_PORT == '80':
149-
frontend.append("monitor-uri %s" % MONITOR_URI)
150-
monitor_uri_configured = True
151-
152-
if "80" in EXTRA_FRONTEND_SETTINGS:
153-
frontend.extend(EXTRA_FRONTEND_SETTINGS["80"])
140+
monitor_uri_configured_80 = False
141+
monitor_uri_configured_443 = False
142+
monitor_uri_configured_port = False
143+
if EXTRA_FRONTEND_SETTINGS:
144+
is_monitor_uri_configured = False
145+
for port in EXTRA_FRONTEND_SETTINGS.keys():
146+
frontend, is_monitor_uri_configured_port = config_default_frontend_by_port(port, ssl_bind_string)
147+
cfg["frontend default_port_%s" % port] = frontend
148+
is_monitor_uri_configured = is_monitor_uri_configured or is_monitor_uri_configured_port
149+
monitor_uri_configured_port = monitor_uri_configured_port or is_monitor_uri_configured
150+
else:
151+
frontend, monitor_uri_configured_80 = config_default_frontend_by_port("80", "")
152+
cfg["frontend default_port_80"] = frontend
153+
if ssl_bind_string:
154+
frontend_ssl, monitor_uri_configured_443 = config_default_frontend_by_port("443", ssl_bind_string)
155+
cfg["frontend default_port_443"] = frontend_ssl
154156

155-
if "True" in FORCE_DEFAULT_BACKEND:
156-
frontend.append("default_backend default_service")
157+
return cfg, monitor_uri_configured or monitor_uri_configured_80 or monitor_uri_configured_443 or monitor_uri_configured_port
157158

158-
cfg["frontend default_port_80"] = frontend
159159

160+
def config_default_frontend_by_port(port, ssl_bind_string):
161+
monitor_uri_configured = False
160162
if ssl_bind_string:
161-
ssl_frontend = [("bind :443 %s %s" % (ssl_bind_string, EXTRA_BIND_SETTINGS.get('443', ""))).strip()]
162-
163+
frontend = [("bind :%s %s %s" % (port, ssl_bind_string, EXTRA_BIND_SETTINGS.get(port, ""))).strip()]
163164
# add x-forwarded-porto header if not skipped
164165
if not SKIP_FORWARDED_PROTO:
165-
ssl_frontend.append("reqadd X-Forwarded-Proto:\ https")
166-
167-
ssl_frontend.append("maxconn %s" % MAXCONN)
168-
169-
if MONITOR_URI and (MONITOR_PORT == '443'):
170-
ssl_frontend.append("monitor-uri %s" % MONITOR_URI)
171-
monitor_uri_configured = True
166+
frontend.append("reqadd X-Forwarded-Proto:\ https")
167+
else:
168+
frontend = [("bind :%s %s" % (port, EXTRA_BIND_SETTINGS.get(port, ""))).strip()]
169+
if not SKIP_FORWARDED_PROTO:
170+
frontend.append("reqadd X-Forwarded-Proto:\ http")
172171

173-
if "443" in EXTRA_FRONTEND_SETTINGS:
174-
ssl_frontend.extend(EXTRA_FRONTEND_SETTINGS["443"])
172+
frontend.append("maxconn %s" % MAXCONN)
175173

176-
if "True" in FORCE_DEFAULT_BACKEND:
177-
ssl_frontend.append("default_backend default_service")
174+
if MONITOR_URI and MONITOR_PORT == port:
175+
frontend.append("monitor-uri %s" % MONITOR_URI)
176+
monitor_uri_configured = True
178177

179-
cfg["frontend default_port_443"] = ssl_frontend
178+
if port in EXTRA_FRONTEND_SETTINGS:
179+
frontend.extend(EXTRA_FRONTEND_SETTINGS[port])
180180

181-
return cfg, monitor_uri_configured
181+
if "True" in FORCE_DEFAULT_BACKEND:
182+
frontend.append("default_backend default_service")
183+
return frontend, monitor_uri_configured
182184

183185

184186
def config_monitor_frontend(monitor_uri_configured):

tests/unit/helper/test_frontend_helper.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,11 @@ def test_config_common_part_with_monitor_uri(self, mock_get_bind_string):
168168
mock_get_bind_string.return_value = ("9999", False)
169169
frontend_section, monitor_uri_configured = config_common_part("9999", "ssl crt /certs/", [])
170170
self.assertEqual(
171-
["bind :9999", 'reqadd X-Forwarded-Proto:\\ http', "acl is_websocket hdr(Upgrade) -i WebSocket",
172-
"monitor-uri %s" % frontend_helper.MONITOR_URI],
171+
["bind :9999",
172+
'reqadd X-Forwarded-Proto:\\ http',
173+
'maxconn 55555',
174+
"monitor-uri %s" % frontend_helper.MONITOR_URI,
175+
"acl is_websocket hdr(Upgrade) -i WebSocket"],
173176
frontend_section)
174177
self.assertTrue(monitor_uri_configured)
175178

@@ -283,11 +286,13 @@ def test_config_default_front(self):
283286
'default_backend default_service'])]), cfg)
284287
self.assertTrue(monitor_uri_configured)
285288

286-
frontend_helper.EXTRA_FRONTEND_SETTINGS = {'80': ["reqadd header1 value1"], '443': ["reqadd header2 value2"]}
289+
frontend_helper.EXTRA_FRONTEND_SETTINGS = OrderedDict()
290+
frontend_helper.EXTRA_FRONTEND_SETTINGS['80'] = ["reqadd header1 value1"]
291+
frontend_helper.EXTRA_FRONTEND_SETTINGS['443'] = ["reqadd header2 value2"]
287292
cfg, monitor_uri_configured = config_default_frontend("ssl crt /certs/")
288293
self.assertEqual(OrderedDict([('frontend default_port_80',
289-
['bind :80',
290-
'reqadd X-Forwarded-Proto:\\ http',
294+
['bind :80 ssl crt /certs/',
295+
'reqadd X-Forwarded-Proto:\\ https',
291296
'maxconn 55555',
292297
'reqadd header1 value1',
293298
'default_backend default_service']),
@@ -303,7 +308,7 @@ def test_config_default_front(self):
303308
frontend_helper.SKIP_FORWARDED_PROTO = 'true'
304309
cfg, monitor_uri_configured = config_default_frontend("ssl crt /certs/")
305310
self.assertEqual(OrderedDict([('frontend default_port_80',
306-
['bind :80',
311+
['bind :80 ssl crt /certs/',
307312
'maxconn 55555',
308313
'reqadd header1 value1',
309314
'default_backend default_service']),
@@ -315,7 +320,31 @@ def test_config_default_front(self):
315320
'default_backend default_service'])]), cfg)
316321
self.assertTrue(monitor_uri_configured)
317322

318-
def test_config_common_part_with_monitor_uri(self):
323+
frontend_helper.SKIP_FORWARDED_PROTO = ""
324+
frontend_helper.EXTRA_FRONTEND_SETTINGS = OrderedDict()
325+
frontend_helper.EXTRA_FRONTEND_SETTINGS['2376'] = ["reqadd header1 value1"]
326+
cfg, monitor_uri_configured = config_default_frontend("ssl crt /certs/")
327+
self.assertEqual(OrderedDict([('frontend default_port_2376',
328+
['bind :2376 ssl crt /certs/',
329+
'reqadd X-Forwarded-Proto:\\ https',
330+
'maxconn 55555',
331+
'reqadd header1 value1',
332+
'default_backend default_service'])]), cfg)
333+
self.assertFalse(monitor_uri_configured)
334+
335+
frontend_helper.SKIP_FORWARDED_PROTO = ""
336+
frontend_helper.EXTRA_FRONTEND_SETTINGS = OrderedDict()
337+
frontend_helper.EXTRA_FRONTEND_SETTINGS['2375'] = ["reqadd header1 value1"]
338+
cfg, monitor_uri_configured = config_default_frontend("")
339+
self.assertEqual(OrderedDict([('frontend default_port_2375',
340+
['bind :2375',
341+
'reqadd X-Forwarded-Proto:\\ http',
342+
'maxconn 55555',
343+
'reqadd header1 value1',
344+
'default_backend default_service'])]), cfg)
345+
self.assertFalse(monitor_uri_configured)
346+
347+
def test_config_with_monitor_uri(self):
319348
self.assertEqual(OrderedDict(), config_monitor_frontend(True))
320349
self.assertEqual(OrderedDict([('frontend monitor', ['bind :9999', 'monitor-uri /ping'])]),
321350
config_monitor_frontend(False))

0 commit comments

Comments
 (0)