...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package rest
18
19 import (
20 "context"
21 "errors"
22 discovery "github.com/datawire/ambassador/v2/pkg/api/envoy/service/discovery/v3"
23 "github.com/datawire/ambassador/v2/pkg/envoy-control-plane/cache/v3"
24 )
25
26 type Server interface {
27 Fetch(context.Context, *discovery.DiscoveryRequest) (*discovery.DiscoveryResponse, error)
28 }
29
30 type Callbacks interface {
31
32
33 OnFetchRequest(context.Context, *discovery.DiscoveryRequest) error
34
35 OnFetchResponse(*discovery.DiscoveryRequest, *discovery.DiscoveryResponse)
36 }
37
38 func NewServer(config cache.ConfigFetcher, callbacks Callbacks) Server {
39 return &server{cache: config, callbacks: callbacks}
40 }
41
42 type server struct {
43 cache cache.ConfigFetcher
44 callbacks Callbacks
45 }
46
47 func (s *server) Fetch(ctx context.Context, req *discovery.DiscoveryRequest) (*discovery.DiscoveryResponse, error) {
48 if s.callbacks != nil {
49 if err := s.callbacks.OnFetchRequest(ctx, req); err != nil {
50 return nil, err
51 }
52 }
53 resp, err := s.cache.Fetch(ctx, req)
54 if err != nil {
55 return nil, err
56 }
57 if resp == nil {
58 return nil, errors.New("missing response")
59 }
60 out, err := resp.GetDiscoveryResponse()
61 if s.callbacks != nil {
62 s.callbacks.OnFetchResponse(req, out)
63 }
64 return out, err
65 }
66
View as plain text