forked from joeholley/supergloo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
testrunner_curl.go
113 lines (103 loc) · 3.01 KB
/
testrunner_curl.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
108
109
110
111
112
113
package utils
import (
"context"
"fmt"
"strings"
"time"
"github.com/solo-io/go-utils/testutils"
sgtestutils "github.com/solo-io/supergloo/test/testutils"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"github.com/solo-io/go-utils/contextutils"
"github.com/onsi/gomega"
"github.com/solo-io/go-utils/log"
"github.com/solo-io/solo-kit/test/setup"
)
func TestRunnerCurlEventuallyShouldRespond(ctx context.Context, testrunnerNamespace string, opts setup.CurlOpts, substr string, timeout time.Duration) {
// for some useful-ish output
tick := time.Tick(timeout / 10)
gomega.EventuallyWithOffset(1, func() string {
res, err := TestRunnerCurl(testrunnerNamespace, opts)
if err != nil {
res = err.Error()
}
select {
default:
break
case <-tick:
contextutils.LoggerFrom(ctx).Infof("running: %v\nwant %v\nhave: %s", opts, substr, res)
case <-ctx.Done():
return ""
}
if strings.Contains(res, substr) {
contextutils.LoggerFrom(ctx).Infof("success: %v", res)
}
return res
}, timeout, "2s").Should(gomega.ContainSubstring(substr))
}
func CurlArgs(opts setup.CurlOpts) []string {
args := []string{"curl", "-v", "--connect-timeout", "10", "--max-time", "10"}
if opts.ReturnHeaders {
args = append(args, "-I")
}
if opts.Method != "GET" && opts.Method != "" {
args = append(args, "-X"+opts.Method)
}
if opts.Host != "" {
args = append(args, "-H", "Host: "+opts.Host)
}
if opts.CaFile != "" {
args = append(args, "--cacert", opts.CaFile)
}
if opts.Body != "" {
args = append(args, "-H", "Content-Type: application/json")
args = append(args, "-d", opts.Body)
}
for h, v := range opts.Headers {
args = append(args, "-H", fmt.Sprintf("%v: %v", h, v))
}
port := opts.Port
if port == 0 {
port = 8080
}
protocol := opts.Protocol
if protocol == "" {
protocol = "http"
}
service := opts.Service
if service == "" {
service = "test-ingress"
}
args = append(args, fmt.Sprintf("%v://%s:%v%s", protocol, service, port, opts.Path))
log.Debugf("running: curl %v", strings.Join(args, " "))
return args
}
func TestRunnerCurl(namespace string, opts setup.CurlOpts) (string, error) {
args := CurlArgs(opts)
return PodExec(map[string]string{"supergloo": "testrunner"}, namespace, args...)
}
// TestRunner executes a command inside the TestRunner container
func PodExec(podLabels map[string]string, namespace string, command ...string) (string, error) {
name, err := func() (string, error) {
pods, err := sgtestutils.MustKubeClient().CoreV1().Pods(namespace).List(v1.ListOptions{
LabelSelector: labels.SelectorFromSet(podLabels).String(),
})
if err != nil {
return "", err
}
if len(pods.Items) < 1 {
return "", fmt.Errorf("no pods found with labels %v in ns %v", podLabels, namespace)
}
return pods.Items[0].Name, nil
}()
if err != nil {
return "", err
}
args := []string{"exec", "-i", name}
if namespace != "" {
args = append(args, "-n", namespace)
}
args = append(args, "--")
args = append(args, command...)
return testutils.KubectlOut(args...)
}