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