forked from openshift/origin
/
via_route.go
88 lines (77 loc) · 2.63 KB
/
via_route.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
package client
import (
"context"
"crypto/tls"
"fmt"
"net"
"net/http"
"strings"
"time"
"github.com/prometheus/client_golang/api"
prometheusv1 "github.com/prometheus/client_golang/api/prometheus/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/transport"
routev1 "github.com/openshift/api/route/v1"
"github.com/openshift/origin/test/extended/util"
)
// NewE2EPrometheusRouterClient returns a Prometheus HTTP API client configured to
// use the Prometheus route host, a bearer token, and no certificate verification.
func NewE2EPrometheusRouterClient(oc *util.CLI) (prometheusv1.API, error) {
kubeClient := oc.AdminKubeClient()
routeClient := oc.AdminRouteClient()
// wait for prometheus service to exist
err := wait.PollImmediate(time.Minute, time.Second, func() (bool, error) {
_, err := kubeClient.CoreV1().Services("openshift-monitoring").Get(context.Background(), "prometheus-k8s", metav1.GetOptions{})
return err == nil, nil
})
if err != nil {
return nil, err
}
// wait for the prometheus route to exist
var route *routev1.Route
err = wait.PollImmediate(time.Minute, time.Second, func() (bool, error) {
route, err = routeClient.RouteV1().Routes("openshift-monitoring").Get(context.Background(), "prometheus-k8s", metav1.GetOptions{})
return err == nil, nil
})
if err != nil {
return nil, err
}
// retrieve an openshift-monitoring service account secret
var secret *corev1.Secret
secrets, err := kubeClient.CoreV1().Secrets("openshift-monitoring").List(context.Background(), metav1.ListOptions{})
if err != nil {
return nil, err
}
for _, currSecret := range secrets.Items {
if currSecret.Type == corev1.SecretTypeServiceAccountToken && strings.HasPrefix(currSecret.Name, "prometheus-") {
secret = &currSecret
break
}
}
if secret == nil {
return nil, fmt.Errorf("unable to locate service prometheus service account secret")
}
// prometheus API client, configured for route host and bearer token auth, and no cert verification
client, err := api.NewClient(api.Config{
Address: "https://" + route.Status.Ingress[0].Host,
RoundTripper: transport.NewBearerAuthRoundTripper(
string(secret.Data[corev1.ServiceAccountTokenKey]),
&http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
TLSHandshakeTimeout: 10 * time.Second,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
),
})
if err != nil {
return nil, err
}
// return prometheus API
return prometheusv1.NewAPI(client), nil
}