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