api/service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package api
import (
"bytes"
"encoding/json"
"fmt"
"io"
)
// AgentService describes a service registered on an agent. The JSON shape
// mirrors Consul's so existing SDKs round-trip cleanly.
type AgentService struct {
ID string
Service string
Tags []string
Address string
Port int
Meta map[string]string
}
// ServiceRegister registers a service with the local agent. The agent owns
// the entry and gossips it to the rest of the cluster.
func (a *Agent) ServiceRegister(svc *AgentService) error {
body, err := json.Marshal(svc)
if err != nil {
return err
}
r := a.c.newRequest("PUT", "/v1/agent/service/register")
r.body = bytes.NewReader(body)
r.header.Set("Content-Type", "application/json")
_, resp, err := requireOK(a.c.doRequest(r))
if err != nil {
return err
}
defer closeResponseBody(resp)
return nil
}
// ServiceDeregister removes a service the local agent owns.
func (a *Agent) ServiceDeregister(id string) error {
r := a.c.newRequest("PUT", fmt.Sprintf("/v1/agent/service/deregister/%s", id))
_, resp, err := requireOK(a.c.doRequest(r))
if err != nil {
return err
}
defer closeResponseBody(resp)
return nil
}
// Services lists services registered on the local agent.
func (a *Agent) Services() (map[string]*AgentService, error) {
r := a.c.newRequest("GET", "/v1/agent/services")
_, resp, err := requireOK(a.c.doRequest(r))
if err != nil {
return nil, err
}
defer closeResponseBody(resp)
var out map[string]*AgentService
if err := decodeJSONBody(resp.Body, &out); err != nil {
return nil, err
}
return out, nil
}
func decodeJSONBody(body io.Reader, out interface{}) error {
return json.NewDecoder(body).Decode(out)
}