@@ -6,7 +6,7 @@ defmodule SentinelCp.Services.KdlGenerator do
66 """
77
88 alias SentinelCp.Services
9- alias SentinelCp.Services . { Service , ProjectConfig , UpstreamGroup , Certificate }
9+ alias SentinelCp.Services . { Service , ProjectConfig , UpstreamGroup , Certificate , AuthPolicy }
1010
1111 @ doc """
1212 Generates KDL configuration for a project from its services and config.
@@ -22,7 +22,8 @@ defmodule SentinelCp.Services.KdlGenerator do
2222 { :ok , config } = Services . get_or_create_project_config ( project_id )
2323 upstream_groups = Services . list_upstream_groups ( project_id )
2424 certificates = Services . list_certificates ( project_id )
25- kdl = build_kdl ( services , config , upstream_groups , certificates )
25+ auth_policies = Services . list_auth_policies ( project_id )
26+ kdl = build_kdl ( services , config , upstream_groups , certificates , auth_policies )
2627 { :ok , kdl }
2728 end
2829 end
@@ -31,7 +32,7 @@ defmodule SentinelCp.Services.KdlGenerator do
3132 Generates KDL from provided services, config, and upstream groups (no DB access).
3233 Useful for testing.
3334 """
34- def build_kdl ( services , % ProjectConfig { } = config , upstream_groups \\ [ ] , certificates \\ [ ] ) do
35+ def build_kdl ( services , % ProjectConfig { } = config , upstream_groups \\ [ ] , certificates \\ [ ] , auth_policies \\ [ ] ) do
3536 # Build lookup maps
3637 group_map =
3738 upstream_groups
@@ -41,6 +42,10 @@ defmodule SentinelCp.Services.KdlGenerator do
4142 certificates
4243 |> Enum . into ( % { } , fn c -> { c . id , c } end )
4344
45+ auth_policy_map =
46+ auth_policies
47+ |> Enum . into ( % { } , fn a -> { a . id , a } end )
48+
4449 # Determine which certificates are used by services
4550 used_cert_ids =
4651 services
@@ -58,7 +63,7 @@ defmodule SentinelCp.Services.KdlGenerator do
5863 "" ,
5964 build_tls_certificates ( used_certs ) ,
6065 build_upstream_groups ( upstream_groups ) ,
61- build_routes ( services , group_map , cert_map ) ,
66+ build_routes ( services , group_map , cert_map , auth_policy_map ) ,
6267 build_rate_limits ( services )
6368 ]
6469
@@ -85,6 +90,7 @@ defmodule SentinelCp.Services.KdlGenerator do
8590
8691 lines = lines ++ build_global_compression ( config )
8792 lines = lines ++ build_global_access_control ( config )
93+ lines = lines ++ build_global_security ( config )
8894
8995 lines ++ [ "}" ]
9096 end
@@ -97,6 +103,10 @@ defmodule SentinelCp.Services.KdlGenerator do
97103 build_nested_map_block ( config . global_access_control , "access_control" , " " )
98104 end
99105
106+ defp build_global_security ( % ProjectConfig { } = config ) do
107+ build_nested_map_block ( config . default_security , "security" , " " )
108+ end
109+
100110 defp build_upstream_groups ( [ ] ) , do: [ ]
101111
102112 defp build_upstream_groups ( groups ) do
@@ -136,16 +146,16 @@ defmodule SentinelCp.Services.KdlGenerator do
136146 lines ++ [ " }" ]
137147 end
138148
139- defp build_routes ( services , group_map , cert_map ) do
149+ defp build_routes ( services , group_map , cert_map , auth_policy_map ) do
140150 route_blocks =
141151 services
142- |> Enum . map ( & build_route ( & 1 , group_map , cert_map ) )
152+ |> Enum . map ( & build_route ( & 1 , group_map , cert_map , auth_policy_map ) )
143153 |> Enum . intersperse ( [ "" ] )
144154
145155 [ "routes {" ] ++ List . flatten ( route_blocks ) ++ [ "}" ]
146156 end
147157
148- defp build_route ( % Service { } = service , group_map , cert_map ) do
158+ defp build_route ( % Service { } = service , group_map , cert_map , auth_policy_map ) do
149159 lines = [ " route #{ inspect ( service . route_path ) } {" ]
150160
151161 lines =
@@ -182,6 +192,10 @@ defmodule SentinelCp.Services.KdlGenerator do
182192 lines = lines ++ build_compression_block ( service . compression )
183193 lines = lines ++ build_path_rewrite_block ( service . path_rewrite )
184194 lines = lines ++ build_tls_ref ( service . certificate_id , cert_map )
195+ lines = lines ++ build_auth_block ( service . auth_policy_id , auth_policy_map )
196+ lines = lines ++ build_security_block ( service . security )
197+ lines = lines ++ build_request_transform_block ( service . request_transform )
198+ lines = lines ++ build_response_transform_block ( service . response_transform )
185199
186200 lines ++ [ " }" ]
187201 end
@@ -293,6 +307,45 @@ defmodule SentinelCp.Services.KdlGenerator do
293307 end
294308 end
295309
310+ defp build_security_block ( sec ) when sec == % { } or sec == nil , do: [ ]
311+
312+ defp build_security_block ( sec ) do
313+ build_nested_map_block ( sec , "security" , " " )
314+ end
315+
316+ defp build_request_transform_block ( rt ) when rt == % { } or rt == nil , do: [ ]
317+
318+ defp build_request_transform_block ( rt ) do
319+ build_nested_map_block ( rt , "request_transform" , " " )
320+ end
321+
322+ defp build_response_transform_block ( rt ) when rt == % { } or rt == nil , do: [ ]
323+
324+ defp build_response_transform_block ( rt ) do
325+ build_nested_map_block ( rt , "response_transform" , " " )
326+ end
327+
328+ defp build_auth_block ( nil , _auth_policy_map ) , do: [ ]
329+
330+ defp build_auth_block ( auth_policy_id , auth_policy_map ) do
331+ case Map . get ( auth_policy_map , auth_policy_id ) do
332+ nil ->
333+ [ ]
334+
335+ % AuthPolicy { } = policy ->
336+ lines = [ " auth {" ]
337+ lines = lines ++ [ " type #{ inspect ( policy . auth_type ) } " ]
338+
339+ config_lines =
340+ ( policy . config || % { } )
341+ |> Enum . sort_by ( fn { k , _ } -> k end )
342+ |> Enum . map ( fn { key , value } -> " #{ key } #{ format_value ( value ) } " end )
343+
344+ lines = lines ++ config_lines
345+ lines ++ [ " }" ]
346+ end
347+ end
348+
296349 defp build_rate_limits ( services ) do
297350 rate_limited =
298351 services
0 commit comments