1package dependency 2 3import ( 4 "fmt" 5 "log" 6 "net/url" 7 8 "github.com/pkg/errors" 9) 10 11var ( 12 // Ensure implements 13 _ Dependency = (*ConnectLeafQuery)(nil) 14) 15 16type ConnectLeafQuery struct { 17 stopCh chan struct{} 18 19 service string 20} 21 22func NewConnectLeafQuery(service string) *ConnectLeafQuery { 23 return &ConnectLeafQuery{ 24 stopCh: make(chan struct{}, 1), 25 service: service, 26 } 27} 28 29func (d *ConnectLeafQuery) Fetch(clients *ClientSet, opts *QueryOptions) ( 30 interface{}, *ResponseMetadata, error, 31) { 32 select { 33 case <-d.stopCh: 34 return nil, nil, ErrStopped 35 default: 36 } 37 opts = opts.Merge(nil) 38 log.Printf("[TRACE] %s: GET %s", d, &url.URL{ 39 Path: "/v1/agent/connect/ca/leaf/" + d.service, 40 RawQuery: opts.String(), 41 }) 42 43 cert, md, err := clients.Consul().Agent().ConnectCALeaf(d.service, 44 opts.ToConsulOpts()) 45 if err != nil { 46 return nil, nil, errors.Wrap(err, d.String()) 47 } 48 49 log.Printf("[TRACE] %s: returned response", d) 50 51 rm := &ResponseMetadata{ 52 LastIndex: md.LastIndex, 53 LastContact: md.LastContact, 54 Block: true, 55 } 56 57 return cert, rm, nil 58} 59 60func (d *ConnectLeafQuery) Stop() { 61 close(d.stopCh) 62} 63 64func (d *ConnectLeafQuery) CanShare() bool { 65 return false 66} 67 68func (d *ConnectLeafQuery) Type() Type { 69 return TypeConsul 70} 71 72func (d *ConnectLeafQuery) String() string { 73 if d.service != "" { 74 return fmt.Sprintf("connect.caleaf(%s)", d.service) 75 } 76 return "connect.caleaf" 77} 78