Hotfix: Frontend creation failing - use_backend_rules JSON serialization

🐛 Critical Bug Fix:
- Fixed frontend creation error: 'invalid input for query argument $15: [] (expected str, got list)'
- use_backend_rules field was not JSON serialized in INSERT/UPDATE queries

🔧 Technical Details:
- Changed use_backend_rules from str to list type in model
- BUT forgot to json.dumps() when saving to database
- Database expects JSONB string, not Python list

Fixed in 2 places:
1. CREATE frontend (Line 344): Added json.dumps(frontend.use_backend_rules or [])
2. UPDATE frontend (Line 591): Added json.dumps(frontend.use_backend_rules or [])

 Before:
  acl_rules = json.dumps([...])
  redirect_rules = json.dumps([...])
  use_backend_rules = [...]  (raw list)

 After:
  acl_rules = json.dumps([...])
  redirect_rules = json.dumps([...])
  use_backend_rules = json.dumps([...])  (JSON string)

Error was:
  POST /api/frontends - 500
  invalid input for query argument $15: [] (expected str, got list)

Fix applied:
  Both CREATE and UPDATE now serialize use_backend_rules to JSON
This commit is contained in:
taylanbakircioglu
2025-11-07 11:51:14 +03:00
parent 3cb3f53200
commit faaf484f7f
+2 -2
View File
@@ -341,7 +341,7 @@ async def create_frontend(frontend: FrontendConfig, request: Request, authorizat
""", frontend.name, frontend.bind_address, frontend.bind_port,
frontend.default_backend, frontend.mode, frontend.ssl_enabled,
frontend.ssl_certificate_id, ssl_cert_ids_json, frontend.ssl_port, frontend.ssl_cert_path, frontend.ssl_cert, frontend.ssl_verify,
json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), frontend.use_backend_rules,
json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), json.dumps(frontend.use_backend_rules or []),
frontend.request_headers, frontend.response_headers, frontend.tcp_request_rules, frontend.timeout_client, frontend.timeout_http_request,
frontend.rate_limit, frontend.compression, frontend.log_separate, frontend.monitor_uri,
frontend.cluster_id, frontend.maxconn)
@@ -588,7 +588,7 @@ async def update_frontend(frontend_id: int, frontend: FrontendConfig, request: R
""", frontend.name, frontend.bind_address, frontend.bind_port,
frontend.default_backend, frontend.mode, ssl_enabled,
ssl_certificate_id, ssl_cert_ids_json, ssl_port, ssl_cert_path, ssl_cert, ssl_verify,
json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), frontend.use_backend_rules,
json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), json.dumps(frontend.use_backend_rules or []),
frontend.request_headers, frontend.response_headers, frontend.tcp_request_rules, frontend.timeout_client, frontend.timeout_http_request,
frontend.rate_limit, frontend.compression, frontend.log_separate, frontend.monitor_uri,
frontend.cluster_id, frontend.maxconn, frontend_id)