From 85372d9c19beaf119b6cd867d3f3f57b6eb87930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Sun, 21 Mar 2021 13:45:14 +0000 Subject: [PATCH] fix(tests): add tests for proxy_url --- cmd/karma/main.go | 6 +- .../testscript/049_invalid_proxy_url.txt | 15 ++ ...proxy_url.txt => 097_proxy_url_config.txt} | 0 .../testscript/098_proxy_url_request.txt | 135 ++++++++++++++++++ 4 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 cmd/karma/tests/testscript/049_invalid_proxy_url.txt rename cmd/karma/tests/testscript/{097_proxy_url.txt => 097_proxy_url_config.txt} (100%) create mode 100644 cmd/karma/tests/testscript/098_proxy_url_request.txt diff --git a/cmd/karma/main.go b/cmd/karma/main.go index 687773af3..5d2d8ccef 100644 --- a/cmd/karma/main.go +++ b/cmd/karma/main.go @@ -193,11 +193,7 @@ func setupUpstreams() error { if err != nil { return fmt.Errorf("failed to parse provided proxy url %q: %w", s.ProxyURL, err) } - if transport, ok := httpTransport.(*http.Transport); ok { - transport.Proxy = http.ProxyURL(proxyURL) - } else { - return fmt.Errorf("failed to set ProxyURL for Alertmanager '%s' with URL '%s': %s", s.Name, s.ProxyURL, err) - } + httpTransport.(*http.Transport).Proxy = http.ProxyURL(proxyURL) } am, err := alertmanager.NewAlertmanager( diff --git a/cmd/karma/tests/testscript/049_invalid_proxy_url.txt b/cmd/karma/tests/testscript/049_invalid_proxy_url.txt new file mode 100644 index 000000000..7176a5cf8 --- /dev/null +++ b/cmd/karma/tests/testscript/049_invalid_proxy_url.txt @@ -0,0 +1,15 @@ +# Raises an error if proxy_url is invalid +karma.bin-should-fail --config.file=karma.yaml +! stdout . +cmp stderr stderr.txt + +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to parse provided proxy url \"%gh&%ij\": parse \"%gh&%ij\": invalid URL escape \"%gh\"" +-- karma.yaml -- +alertmanager: + servers: + - name: with_proxy + uri: http://127.0.0.1:9093 + proxy_url: '%gh&%ij' diff --git a/cmd/karma/tests/testscript/097_proxy_url.txt b/cmd/karma/tests/testscript/097_proxy_url_config.txt similarity index 100% rename from cmd/karma/tests/testscript/097_proxy_url.txt rename to cmd/karma/tests/testscript/097_proxy_url_config.txt diff --git a/cmd/karma/tests/testscript/098_proxy_url_request.txt b/cmd/karma/tests/testscript/098_proxy_url_request.txt new file mode 100644 index 000000000..a6da6a1b1 --- /dev/null +++ b/cmd/karma/tests/testscript/098_proxy_url_request.txt @@ -0,0 +1,135 @@ +# Uses proxy_url to connect to upstream + +exec bash -x ./test.sh & +exec bash -c 'I=0 ; while [ ! -f alertmanager.pid ] && [ $I -lt 30 ]; do sleep 1; I=$((I+1)); done' +karma.bin-should-work --pid-file=karma.pid +! stdout . +stderr 'level=info msg="Configured Alertmanager source" name=proxy-url proxy=false readonly=false uri=http://am.example.com' +stderr 'level=info msg="GET request" timeout=10 uri=http://am.example.com/metrics' +stderr 'level=info msg="Upstream version" alertmanager=proxy-url version=0.21.0' +stderr 'level=info msg="Got silences" alertmanager=proxy-url duration=.+ silences=0' +stderr 'level=info msg="Collected alert groups" alertmanager=proxy-url duration=.+ groups=0' +stderr 'level=info msg="Deduplicating alert groups" alertmanager=proxy-url groups=0' +stderr 'level=info msg="Processing deduplicated alert groups" alertmanager=proxy-url groups=0' +stderr 'level=info msg="Merging autocomplete hints" alertmanager=proxy-url hints=0' +stderr 'level=info msg="Collection completed"' + +-- test.sh -- +env GOCACHE=$TMPDIR go run alertmanager.go & + +I=0 +while [ ! -f karma.pid ] && [ $I -lt 30 ]; do sleep 1; I=$((I+1)); done + +sleep 5 +cat karma.pid | xargs kill +cat alertmanager.pid | xargs kill + +-- karma.yaml -- +alertmanager: + interval: 1h + servers: + - name: proxy-url + uri: http://am.example.com + timeout: 10s + proxy_url: http://127.0.0.1:9098 +listen: + address: 127.0.0.1 + port: 8098 + +-- alertmanager.go -- +package main + +import ( + "context" + "io" + "log" + "net" + "net/http" + "os" + "os/signal" + "strconv" + "syscall" + "time" +) + +func metrics(w http.ResponseWriter, r *http.Request) { + if r.Host != "am.example.com" { + w.WriteHeader(400) + return + } + + w.Header().Set("Content-Type", "text/plain; version=0.0.4; charset=utf-8") + io.WriteString(w, `alertmanager_build_info{version="0.21.0"} 1 +`) +} + +func status(w http.ResponseWriter, r *http.Request) { + if r.Host != "am.example.com" { + w.WriteHeader(400) + return + } + + w.Header().Set("Content-Type", "application/json") + io.WriteString(w, ` +{ + "cluster": { + "name": "01EB67XCFES27NAFAGSW48NAHC", + "peers": [ + { + "address": "172.17.0.2:9094", + "name": "01EB67XCFES27NAFAGSW48NAHC" + } + ], + "status": "ready" + }, + "versionInfo": { + "version": "0.21.0" + } +}`) +} + +func empty(w http.ResponseWriter, r *http.Request) { + if r.Host != "am.example.com" { + w.WriteHeader(400) + return + } + + w.Header().Set("Content-Type", "application/json") + io.WriteString(w, "[]") +} + +func main() { + pid := os.Getpid() + err := os.WriteFile("alertmanager.pid", []byte(strconv.Itoa(pid)), 0644) + if err != nil { + log.Fatal(err) + } + + http.HandleFunc("/metrics", metrics) + http.HandleFunc("/api/v2/status", status) + http.HandleFunc("/api/v2/silences", empty) + http.HandleFunc("/api/v2/alerts/groups", empty) + + listener, err := net.Listen("tcp", "127.0.0.1:9098") + if err != nil { + log.Fatal(err) + } + + server := &http.Server{ + Addr: "127.0.0.1:9098", + } + + go func() { + err := server.Serve(listener) + if err != nil { + log.Printf("Serve returned error: %v", err) + } + }() + + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + <-stop + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + server.Shutdown(ctx) +}