-
Notifications
You must be signed in to change notification settings - Fork 62
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rules API: Add e2e test #198
Changes from all commits
e392176
23cf4d3
9b1403a
d536281
3907da5
9e4bc8d
9afa2be
58502d2
6a91a73
e0353b3
be5c99f
b51cc81
063a88e
7d50a67
0b60005
c27ab99
ccd9a59
ec05d23
79a0937
01485e6
7b543e0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
// +build integration | ||
|
||
package e2e | ||
|
||
import ( | ||
"bytes" | ||
"io/ioutil" | ||
"net/http" | ||
"testing" | ||
|
||
"github.com/efficientgo/e2e" | ||
"github.com/efficientgo/tools/core/pkg/testutil" | ||
) | ||
|
||
func TestRulesAPI(t *testing.T) { | ||
t.Parallel() | ||
|
||
e, err := e2e.NewDockerEnvironment(envRulesAPIName) | ||
testutil.Ok(t, err) | ||
t.Cleanup(e.Close) | ||
|
||
prepareConfigsAndCerts(t, rules, e) | ||
_, token, rateLimiterAddr := startBaseServices(t, e, rules) | ||
rulesEndpoint := startServicesForRules(t, e) | ||
|
||
api, err := newObservatoriumAPIService( | ||
e, | ||
withRulesEndpoint("http://"+rulesEndpoint), | ||
withRateLimiter(rateLimiterAddr), | ||
) | ||
testutil.Ok(t, err) | ||
testutil.Ok(t, e2e.StartAndWaitReady(api)) | ||
|
||
rulesEndpointURL := "https://" + api.Endpoint("https") + "/api/metrics/v1/"+defaultTenantName+"/api/v1/rules/raw" | ||
tr := &http.Transport{ | ||
TLSClientConfig: getTLSClientConfig(t, e), | ||
} | ||
|
||
client := &http.Client{ | ||
Transport: &tokenRoundTripper{rt: tr, token: token}, | ||
} | ||
|
||
t.Run("write-then-read-recording-rules", func(t *testing.T) { | ||
// Try to list rules | ||
r, err := http.NewRequest( | ||
http.MethodGet, | ||
rulesEndpointURL, | ||
nil, | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err := client.Do(r) | ||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusNotFound, res.StatusCode) | ||
|
||
// Set a file containing a recording rule | ||
recordingRule := []byte(recordingRuleYamlTpl) | ||
r, err = http.NewRequest( | ||
http.MethodPut, | ||
rulesEndpointURL, | ||
bytes.NewReader(recordingRule), | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err = client.Do(r) | ||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusOK, res.StatusCode) | ||
|
||
// Check if recording rule is listed | ||
r, err = http.NewRequest( | ||
http.MethodGet, | ||
rulesEndpointURL, | ||
nil, | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err = client.Do(r) | ||
defer res.Body.Close() | ||
|
||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusOK, res.StatusCode) | ||
|
||
body, err := ioutil.ReadAll(res.Body) | ||
bodyStr := string(body) | ||
|
||
assertResponse(t, bodyStr, "sum by (job) (http_inprogress_requests)") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It might be a good idea to check for tenant labels here? 🙂 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good idea! added here: 7d50a67 |
||
assertResponse(t, bodyStr, "tenant_id: "+defaultTenantID) | ||
}) | ||
|
||
t.Run("write-then-read-alerting-rules", func(t *testing.T) { | ||
// Set a file containing an alerting rule | ||
alertingRule := []byte(alertingRuleYamlTpl) | ||
r, err := http.NewRequest( | ||
http.MethodPut, | ||
rulesEndpointURL, | ||
bytes.NewReader(alertingRule), | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err := client.Do(r) | ||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusOK, res.StatusCode) | ||
|
||
// Check if the alerting rule is listed | ||
r, err = http.NewRequest( | ||
http.MethodGet, | ||
rulesEndpointURL, | ||
nil, | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err = client.Do(r) | ||
defer res.Body.Close() | ||
|
||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusOK, res.StatusCode) | ||
|
||
body, err := ioutil.ReadAll(res.Body) | ||
bodyStr := string(body) | ||
assertResponse(t, bodyStr, "alert: HighRequestLatency") | ||
assertResponse(t, bodyStr, "tenant_id: "+defaultTenantID) | ||
}) | ||
|
||
t.Run("write-then-read-recording-and-alerting-rules", func(t *testing.T) { | ||
// Set a file containing both recording and alerting rules | ||
recordAndAlertingRules := []byte(recordAndAlertingRulesYamlTpl) | ||
r, err := http.NewRequest( | ||
http.MethodPut, | ||
rulesEndpointURL, | ||
bytes.NewReader(recordAndAlertingRules), | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err := client.Do(r) | ||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusOK, res.StatusCode) | ||
|
||
// Check if both recording and alerting rules are listed | ||
r, err = http.NewRequest( | ||
http.MethodGet, | ||
rulesEndpointURL, | ||
nil, | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err = client.Do(r) | ||
defer res.Body.Close() | ||
|
||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusOK, res.StatusCode) | ||
|
||
body, err := ioutil.ReadAll(res.Body) | ||
bodyStr := string(body) | ||
assertResponse(t, bodyStr, "record: job:up:avg") | ||
assertResponse(t, bodyStr, "alert: ManyInstancesDown") | ||
assertResponse(t, bodyStr, "tenant_id: "+defaultTenantID) | ||
}) | ||
t.Run("write-invalid-rules", func(t *testing.T) { | ||
// Set an invalid rules file | ||
invalidRules := []byte(invalidRulesYamlTpl) | ||
r, err := http.NewRequest( | ||
http.MethodPut, | ||
rulesEndpointURL, | ||
bytes.NewReader(invalidRules), | ||
) | ||
testutil.Ok(t, err) | ||
|
||
res, err := client.Do(r) | ||
testutil.Ok(t, err) | ||
testutil.Equals(t, http.StatusBadRequest, res.StatusCode) | ||
}) | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 👍 👍