@@ -301,7 +301,8 @@ struct MatchRules {
301301/// Intermediate serde struct for deserializing upstream GTS entity content.
302302#[ derive( Deserialize ) ]
303303struct UpstreamPayload {
304- tenant_id : Uuid ,
304+ #[ serde( default ) ]
305+ tenant_id : Option < Uuid > ,
305306 server : Server ,
306307 protocol : String ,
307308 #[ serde( default ) ]
@@ -325,7 +326,8 @@ struct UpstreamPayload {
325326/// Intermediate serde struct for deserializing route GTS entity content.
326327#[ derive( Deserialize ) ]
327328struct RoutePayload {
328- tenant_id : Uuid ,
329+ #[ serde( default ) ]
330+ tenant_id : Option < Uuid > ,
329331 upstream_id : String ,
330332 #[ serde( rename = "match" ) ]
331333 match_rules : MatchRules ,
@@ -832,7 +834,7 @@ mod tests {
832834
833835 let upstreams = svc. list_upstreams ( ) . await . unwrap ( ) ;
834836 assert_eq ! ( upstreams. len( ) , 1 ) ;
835- assert_eq ! ( upstreams[ 0 ] . tenant_id, tenant) ;
837+ assert_eq ! ( upstreams[ 0 ] . tenant_id, Some ( tenant) ) ;
836838 assert_eq ! ( upstreams[ 0 ] . request. id, Some ( instance_id) ) ;
837839 assert ! ( upstreams[ 0 ] . request. enabled) ;
838840 }
@@ -913,7 +915,7 @@ mod tests {
913915
914916 let routes = svc. list_routes ( ) . await . unwrap ( ) ;
915917 assert_eq ! ( routes. len( ) , 1 ) ;
916- assert_eq ! ( routes[ 0 ] . tenant_id, tenant) ;
918+ assert_eq ! ( routes[ 0 ] . tenant_id, Some ( tenant) ) ;
917919 assert_eq ! ( routes[ 0 ] . request. id, Some ( route_instance_id) ) ;
918920 assert_eq ! ( routes[ 0 ] . request. upstream_id, upstream_id) ;
919921 assert ! ( routes[ 0 ] . request. enabled) ;
@@ -1033,7 +1035,7 @@ mod tests {
10331035 let payload: UpstreamPayload = serde_json:: from_value ( json) . unwrap ( ) ;
10341036 let provisioned = payload. into_provisioned ( None ) ;
10351037
1036- assert_eq ! ( provisioned. tenant_id, tenant) ;
1038+ assert_eq ! ( provisioned. tenant_id, Some ( tenant) ) ;
10371039 let req = & provisioned. request ;
10381040 assert_eq ! ( req. server. endpoints. len( ) , 2 ) ;
10391041 assert_eq ! ( req. server. endpoints[ 0 ] . scheme, domain:: Scheme :: Https ) ;
@@ -1098,7 +1100,7 @@ mod tests {
10981100 . into_provisioned ( "gts.cf.core.oagw.route.v1~cf.core.oagw.test.v1" , route_uuid)
10991101 . expect ( "upstream_id should parse" ) ;
11001102
1101- assert_eq ! ( provisioned. tenant_id, tenant) ;
1103+ assert_eq ! ( provisioned. tenant_id, Some ( tenant) ) ;
11021104 let req = & provisioned. request ;
11031105 assert_eq ! ( req. upstream_id, upstream_id) ;
11041106 assert_eq ! ( req. priority, 10 ) ;
@@ -1128,6 +1130,67 @@ mod tests {
11281130 assert_eq ! ( rl. cost, 2 ) ;
11291131 }
11301132
1133+ #[ test]
1134+ fn deserialize_upstream_without_tenant_id_produces_none ( ) {
1135+ let json = serde_json:: json!( {
1136+ "server" : {
1137+ "endpoints" : [ { "host" : "api.example.com" , "port" : 443 , "scheme" : "https" } ]
1138+ } ,
1139+ "protocol" : "http"
1140+ } ) ;
1141+ let payload: UpstreamPayload = serde_json:: from_value ( json) . unwrap ( ) ;
1142+ let provisioned = payload. into_provisioned ( None ) ;
1143+ assert_eq ! ( provisioned. tenant_id, None ) ;
1144+ }
1145+
1146+ #[ test]
1147+ fn deserialize_route_without_tenant_id_produces_none ( ) {
1148+ let upstream_id = Uuid :: new_v4 ( ) ;
1149+ let json = serde_json:: json!( {
1150+ "upstream_id" : upstream_id,
1151+ "match" : {
1152+ "http" : {
1153+ "methods" : [ "GET" ] ,
1154+ "path" : "/api/test"
1155+ }
1156+ } ,
1157+ "enabled" : true ,
1158+ "tags" : [ ] ,
1159+ "priority" : 0
1160+ } ) ;
1161+ let payload: RoutePayload = serde_json:: from_value ( json) . unwrap ( ) ;
1162+ let route_uuid = Uuid :: new_v4 ( ) ;
1163+ let provisioned = payload
1164+ . into_provisioned ( "gts.cf.core.oagw.route.v1~cf.core.oagw.test.v1" , route_uuid)
1165+ . unwrap ( ) ;
1166+ assert_eq ! ( provisioned. tenant_id, None ) ;
1167+ }
1168+
1169+ #[ tokio:: test]
1170+ async fn list_upstreams_without_tenant_id_returns_none ( ) {
1171+ let instance_id = Uuid :: new_v4 ( ) ;
1172+ let content = serde_json:: json!( {
1173+ "server" : {
1174+ "endpoints" : [ { "host" : "127.0.0.1" , "port" : 8080 , "scheme" : "http" } ]
1175+ } ,
1176+ "protocol" : "gts.cf.core.oagw.protocol.v1~cf.core.oagw.http.v1" ,
1177+ "enabled" : true ,
1178+ "tags" : [ ]
1179+ } ) ;
1180+ let gts_id = format ! ( "gts.cf.core.oagw.upstream.v1~{instance_id}" ) ;
1181+
1182+ let registry = Arc :: new (
1183+ MockTypesRegistryClient :: new ( )
1184+ . with_instances ( [ make_upstream_instance ( & gts_id, content) ] ) ,
1185+ ) ;
1186+ let svc = TypeProvisioningServiceImpl :: new ( registry) ;
1187+
1188+ let upstreams = svc. list_upstreams ( ) . await . unwrap ( ) ;
1189+ assert_eq ! ( upstreams. len( ) , 1 ) ;
1190+ assert_eq ! ( upstreams[ 0 ] . tenant_id, None ) ;
1191+ assert_eq ! ( upstreams[ 0 ] . request. id, Some ( instance_id) ) ;
1192+ }
1193+
11311194 #[ test]
11321195 fn deserialize_missing_field_returns_error ( ) {
11331196 // Missing required "server" field.
0 commit comments