@@ -46,37 +46,79 @@ impl MockDiscoveryClient {
4646/// Helper function to check if an instance matches a discovery key query
4747fn matches_key ( instance : & DiscoveryInstance , key : & DiscoveryKey ) -> bool {
4848 match ( instance, key) {
49- ( DiscoveryInstance :: Endpoint { .. } , DiscoveryKey :: AllEndpoints ) => true ,
49+ // Endpoint matching
50+ ( DiscoveryInstance :: Endpoint ( _) , DiscoveryKey :: AllEndpoints ) => true ,
51+ ( DiscoveryInstance :: Endpoint ( inst) , DiscoveryKey :: NamespacedEndpoints { namespace } ) => {
52+ & inst. namespace == namespace
53+ }
54+ (
55+ DiscoveryInstance :: Endpoint ( inst) ,
56+ DiscoveryKey :: ComponentEndpoints {
57+ namespace,
58+ component,
59+ } ,
60+ ) => & inst. namespace == namespace && & inst. component == component,
61+ (
62+ DiscoveryInstance :: Endpoint ( inst) ,
63+ DiscoveryKey :: Endpoint {
64+ namespace,
65+ component,
66+ endpoint,
67+ } ,
68+ ) => {
69+ & inst. namespace == namespace
70+ && & inst. component == component
71+ && & inst. endpoint == endpoint
72+ }
73+
74+ // ModelCard matching
75+ ( DiscoveryInstance :: ModelCard { .. } , DiscoveryKey :: AllModelCards ) => true ,
5076 (
51- DiscoveryInstance :: Endpoint {
52- namespace : ins_ns , ..
77+ DiscoveryInstance :: ModelCard {
78+ namespace : inst_ns , ..
5379 } ,
54- DiscoveryKey :: NamespacedEndpoints { namespace } ,
55- ) => ins_ns == namespace,
80+ DiscoveryKey :: NamespacedModelCards { namespace } ,
81+ ) => inst_ns == namespace,
5682 (
57- DiscoveryInstance :: Endpoint {
58- namespace : ins_ns ,
59- component : ins_comp ,
83+ DiscoveryInstance :: ModelCard {
84+ namespace : inst_ns ,
85+ component : inst_comp ,
6086 ..
6187 } ,
62- DiscoveryKey :: ComponentEndpoints {
88+ DiscoveryKey :: ComponentModelCards {
6389 namespace,
6490 component,
6591 } ,
66- ) => ins_ns == namespace && ins_comp == component,
92+ ) => inst_ns == namespace && inst_comp == component,
6793 (
68- DiscoveryInstance :: Endpoint {
69- namespace : ins_ns ,
70- component : ins_comp ,
71- endpoint : ins_ep ,
94+ DiscoveryInstance :: ModelCard {
95+ namespace : inst_ns ,
96+ component : inst_comp ,
97+ endpoint : inst_ep ,
7298 ..
7399 } ,
74- DiscoveryKey :: Endpoint {
100+ DiscoveryKey :: EndpointModelCards {
75101 namespace,
76102 component,
77103 endpoint,
78104 } ,
79- ) => ins_ns == namespace && ins_comp == component && ins_ep == endpoint,
105+ ) => inst_ns == namespace && inst_comp == component && inst_ep == endpoint,
106+
107+ // Cross-type matches return false
108+ (
109+ DiscoveryInstance :: Endpoint ( _) ,
110+ DiscoveryKey :: AllModelCards
111+ | DiscoveryKey :: NamespacedModelCards { .. }
112+ | DiscoveryKey :: ComponentModelCards { .. }
113+ | DiscoveryKey :: EndpointModelCards { .. } ,
114+ ) => false ,
115+ (
116+ DiscoveryInstance :: ModelCard { .. } ,
117+ DiscoveryKey :: AllEndpoints
118+ | DiscoveryKey :: NamespacedEndpoints { .. }
119+ | DiscoveryKey :: ComponentEndpoints { .. }
120+ | DiscoveryKey :: Endpoint { .. } ,
121+ ) => false ,
80122 }
81123}
82124
@@ -98,6 +140,15 @@ impl DiscoveryClient for MockDiscoveryClient {
98140 Ok ( instance)
99141 }
100142
143+ async fn list ( & self , key : DiscoveryKey ) -> Result < Vec < DiscoveryInstance > > {
144+ let instances = self . registry . instances . lock ( ) . unwrap ( ) ;
145+ Ok ( instances
146+ . iter ( )
147+ . filter ( |instance| matches_key ( instance, & key) )
148+ . cloned ( )
149+ . collect ( ) )
150+ }
151+
101152 async fn list_and_watch ( & self , key : DiscoveryKey ) -> Result < DiscoveryStream > {
102153 use std:: collections:: HashSet ;
103154
@@ -118,14 +169,16 @@ impl DiscoveryClient for MockDiscoveryClient {
118169
119170 let current_ids: HashSet <_> = current. iter( ) . map( |i| {
120171 match i {
121- DiscoveryInstance :: Endpoint { instance_id, .. } => * instance_id,
172+ DiscoveryInstance :: Endpoint ( inst) => inst. instance_id,
173+ DiscoveryInstance :: ModelCard { instance_id, .. } => * instance_id,
122174 }
123175 } ) . collect( ) ;
124176
125177 // Emit Added events for new instances
126178 for instance in current {
127179 let id = match & instance {
128- DiscoveryInstance :: Endpoint { instance_id, .. } => * instance_id,
180+ DiscoveryInstance :: Endpoint ( inst) => inst. instance_id,
181+ DiscoveryInstance :: ModelCard { instance_id, .. } => * instance_id,
129182 } ;
130183 if known_instances. insert( id) {
131184 yield Ok ( DiscoveryEvent :: Added ( instance) ) ;
@@ -161,6 +214,7 @@ mod tests {
161214 namespace : "test-ns" . to_string ( ) ,
162215 component : "test-comp" . to_string ( ) ,
163216 endpoint : "test-ep" . to_string ( ) ,
217+ transport : crate :: component:: TransportType :: NatsTcp ( "test-subject" . to_string ( ) ) ,
164218 } ;
165219
166220 let key = DiscoveryKey :: Endpoint {
@@ -177,8 +231,8 @@ mod tests {
177231
178232 let event = stream. next ( ) . await . unwrap ( ) . unwrap ( ) ;
179233 match event {
180- DiscoveryEvent :: Added ( DiscoveryInstance :: Endpoint { instance_id , .. } ) => {
181- assert_eq ! ( instance_id, 1 ) ;
234+ DiscoveryEvent :: Added ( DiscoveryInstance :: Endpoint ( inst ) ) => {
235+ assert_eq ! ( inst . instance_id, 1 ) ;
182236 }
183237 _ => panic ! ( "Expected Added event for instance-1" ) ,
184238 }
@@ -188,15 +242,16 @@ mod tests {
188242
189243 let event = stream. next ( ) . await . unwrap ( ) . unwrap ( ) ;
190244 match event {
191- DiscoveryEvent :: Added ( DiscoveryInstance :: Endpoint { instance_id , .. } ) => {
192- assert_eq ! ( instance_id, 2 ) ;
245+ DiscoveryEvent :: Added ( DiscoveryInstance :: Endpoint ( inst ) ) => {
246+ assert_eq ! ( inst . instance_id, 2 ) ;
193247 }
194248 _ => panic ! ( "Expected Added event for instance-2" ) ,
195249 }
196250
197251 // Remove first instance
198252 registry. instances . lock ( ) . unwrap ( ) . retain ( |i| match i {
199- DiscoveryInstance :: Endpoint { instance_id, .. } => * instance_id != 1 ,
253+ DiscoveryInstance :: Endpoint ( inst) => inst. instance_id != 1 ,
254+ DiscoveryInstance :: ModelCard { instance_id, .. } => * instance_id != 1 ,
200255 } ) ;
201256
202257 let event = stream. next ( ) . await . unwrap ( ) . unwrap ( ) ;
0 commit comments