forked from DataDog/datadog-agent
/
client.go
107 lines (93 loc) · 3.17 KB
/
client.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package http
import (
"bytes"
"encoding/json"
"fmt"
"html"
"net/http"
"github.com/StackVista/stackstate-agent/pkg/api/util"
"github.com/StackVista/stackstate-agent/pkg/config/settings"
)
type runtimeSettingsHTTPClient struct {
c *http.Client
baseURL string
targetProcessName string
}
// NewClient returns a client setup to interact with the standard runtime settings HTTP API
func NewClient(c *http.Client, baseURL string, targetProcessName string) settings.Client {
return &runtimeSettingsHTTPClient{c, baseURL, targetProcessName}
}
func (rc *runtimeSettingsHTTPClient) FullConfig() (string, error) {
r, err := util.DoGet(rc.c, rc.baseURL)
if err != nil {
var errMap = make(map[string]string)
_ = json.Unmarshal(r, &errMap)
// If the error has been marshalled into a json object, check it and return it properly
if e, found := errMap["error"]; found {
return "", fmt.Errorf(e)
}
return "", fmt.Errorf("Could not reach %s: %v \nMake sure the %s is running before requesting the runtime configuration and contact support if you continue having issues", rc.targetProcessName, err, rc.targetProcessName)
}
return string(r), nil
}
func (rc *runtimeSettingsHTTPClient) List() (map[string]settings.RuntimeSettingResponse, error) {
r, err := util.DoGet(rc.c, fmt.Sprintf("%s/%s", rc.baseURL, "list-runtime"))
if err != nil {
var errMap = make(map[string]string)
_ = json.Unmarshal(r, &errMap)
// If the error has been marshalled into a json object, check it and return it properly
if e, found := errMap["error"]; found {
return nil, fmt.Errorf(e)
}
return nil, err
}
var settingsList = make(map[string]settings.RuntimeSettingResponse)
err = json.Unmarshal(r, &settingsList)
if err != nil {
return nil, err
}
return settingsList, nil
}
func (rc *runtimeSettingsHTTPClient) Get(key string) (interface{}, error) {
r, err := util.DoGet(rc.c, fmt.Sprintf("%s/%s", rc.baseURL, key))
if err != nil {
var errMap = make(map[string]string)
_ = json.Unmarshal(r, &errMap)
// If the error has been marshalled into a json object, check it and return it properly
if e, found := errMap["error"]; found {
return nil, fmt.Errorf(e)
}
return nil, err
}
var setting = make(map[string]interface{})
err = json.Unmarshal(r, &setting)
if err != nil {
return nil, err
}
if value, found := setting["value"]; found {
return value, nil
}
return nil, fmt.Errorf("unable to get value for this setting: %v", key)
}
func (rc *runtimeSettingsHTTPClient) Set(key string, value string) (bool, error) {
settingsList, err := rc.List()
if err != nil {
return false, err
}
body := fmt.Sprintf("value=%s", html.EscapeString(value))
r, err := util.DoPost(rc.c, fmt.Sprintf("%s/%s", rc.baseURL, key), "application/x-www-form-urlencoded", bytes.NewBuffer([]byte(body)))
if err != nil {
var errMap = make(map[string]string)
_ = json.Unmarshal(r, &errMap)
// If the error has been marshalled into a json object, check it and return it properly
if e, found := errMap["error"]; found {
return false, fmt.Errorf(e)
}
return false, err
}
hidden := false
if setting, ok := settingsList[key]; ok {
hidden = setting.Hidden
}
return hidden, nil
}