Files
kubesphere/pkg/kapis/servicemesh/metrics/v1alpha2/handler_test.go

143 lines
3.6 KiB
Go

package v1alpha2
import (
"context"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/emicklei/go-restful/v3"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fakek8s "k8s.io/client-go/kubernetes/fake"
"k8s.io/klog/v2"
"kubesphere.io/kubesphere/pkg/simple/client/kiali"
"kubesphere.io/kubesphere/pkg/simple/client/servicemesh"
"kubesphere.io/kubesphere/pkg/utils/reflectutils"
)
func prepare() (*Handler, error) {
var namespaceName = "kubesphere-system"
var serviceAccountName = "kubesphere"
var secretName = "kiali"
clientset := fakek8s.NewSimpleClientset()
ctx := context.Background()
namespacesClient := clientset.CoreV1().Namespaces()
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: namespaceName,
},
}
_, err := namespacesClient.Create(ctx, ns, metav1.CreateOptions{})
if err != nil {
klog.Errorf("create namespace failed ")
return nil, err
}
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: secretName,
Namespace: namespaceName,
},
}
object := &corev1.ObjectReference{
Name: secretName,
}
sa := &corev1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{
Name: serviceAccountName,
Namespace: namespaceName,
},
Secrets: []corev1.ObjectReference{*object},
}
serviceAccountClient := clientset.CoreV1().ServiceAccounts(namespaceName)
_, err = serviceAccountClient.Create(ctx, sa, metav1.CreateOptions{})
if err != nil {
klog.Errorf("create serviceAccount failed ")
return nil, err
}
secretClient := clientset.CoreV1().Secrets(namespaceName)
_, err = secretClient.Create(ctx, secret, metav1.CreateOptions{})
if err != nil {
klog.Errorf("create secret failed ")
return nil, err
}
// mock jaeger server
ts := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusOK)
}))
options := &servicemesh.Options{
IstioPilotHost: "",
KialiQueryHost: "",
JaegerQueryHost: ts.URL,
ServicemeshPrometheusHost: "",
}
handler := NewHandler(options, clientset, nil)
token, _ := json.Marshal(
&kiali.TokenResponse{
Username: "test",
Token: "test",
},
)
mc := &kiali.MockClient{
TokenResult: token,
RequestResult: "fake",
}
client := kiali.NewClient("token", nil, mc, "token", options.KialiQueryHost)
err = reflectutils.SetUnExportedField(handler, "client", client)
if err != nil {
klog.Errorf("apply mock client failed")
return nil, err
}
return handler, nil
}
func TestGetServiceTracing(t *testing.T) {
handler, err := prepare()
if err != nil {
t.Fatalf("init handler failed")
}
namespaceName := "namespace-test"
serviceName := "service-test"
url := fmt.Sprintf("/namespaces/%s/services/%s/traces", namespaceName, serviceName)
request, _ := http.NewRequest("GET", url, nil)
query := request.URL.Query()
query.Add("start", "1650167872000000")
query.Add("end", "1650211072000000")
query.Add("limit", "10")
request.URL.RawQuery = query.Encode()
restfulRequest := restful.NewRequest(request)
pathMap := make(map[string]string)
pathMap["namespace"] = namespaceName
pathMap["service"] = serviceName
if err := reflectutils.SetUnExportedField(restfulRequest, "pathParameters", pathMap); err != nil {
t.Fatalf("set pathParameters failed")
}
recorder := httptest.NewRecorder()
restfulResponse := restful.NewResponse(recorder)
restfulResponse.SetRequestAccepts("application/json")
handler.GetServiceTracing(restfulRequest, restfulResponse)
if status := restfulResponse.StatusCode(); status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK)
}
}