test: don't use fake clientset

This commit is contained in:
Marc Nuri
2025-03-30 18:57:33 +02:00
parent 61289cf1df
commit 8dc7160ff0
2 changed files with 27 additions and 18 deletions

View File

@@ -10,7 +10,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apimachinery/pkg/util/httpstream"
"k8s.io/apimachinery/pkg/util/httpstream/spdy"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"net/http"
"net/http/httptest"
@@ -21,14 +21,12 @@ type MockServer struct {
config *rest.Config
restClient *rest.RESTClient
restHandlers []http.HandlerFunc
clientSet *fake.Clientset
clientSet kubernetes.Interface
parameterCodec runtime.ParameterCodec
}
func NewMockServer() *MockServer {
ms := &MockServer{
clientSet: fake.NewClientset(),
}
ms := &MockServer{}
scheme := runtime.NewScheme()
codecs := serializer.NewCodecFactory(scheme)
ms.parameterCodec = runtime.NewParameterCodec(scheme)
@@ -48,6 +46,7 @@ func NewMockServer() *MockServer {
}
ms.restClient, _ = rest.RESTClientFor(ms.config)
ms.restHandlers = make([]http.HandlerFunc, 0)
ms.clientSet = kubernetes.NewForConfigOrDie(ms.config)
return ms
}
@@ -55,10 +54,6 @@ func (m *MockServer) Close() {
m.server.Close()
}
func (m *MockServer) ClientSet() *fake.Clientset {
return m.clientSet
}
func (m *MockServer) Handle(handler http.Handler) {
m.restHandlers = append(m.restHandlers, handler.ServeHTTP)
}
@@ -72,6 +67,14 @@ func (m *MockServer) NewKubernetes() *Kubernetes {
}
}
func writeObject(w http.ResponseWriter, obj runtime.Object) {
w.Header().Set("Content-Type", runtime.ContentTypeJSON)
if err := json.NewEncoder(w).Encode(obj); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
w.WriteHeader(http.StatusOK)
}
type streamAndReply struct {
httpstream.Stream
replySent <-chan struct{}

View File

@@ -13,14 +13,10 @@ import (
func TestPodsExec(t *testing.T) {
mockServer := NewMockServer()
defer mockServer.Close()
_ = mockServer.ClientSet().Tracker().Add(&v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "default",
Name: "pod-to-exec",
},
Spec: v1.PodSpec{Containers: []v1.Container{{Name: "container-to-exec"}}},
})
mockServer.Handle(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
if req.URL.Path != "/api/v1/namespaces/default/pods/pod-to-exec/exec" {
return
}
var stdin, stdout bytes.Buffer
ctx, err := createHTTPStreams(w, req, &StreamOptions{
Stdin: &stdin,
@@ -32,9 +28,19 @@ func TestPodsExec(t *testing.T) {
return
}
defer ctx.conn.Close()
if req.URL.Path == "/api/v1/namespaces/default/pods/pod-to-exec/exec" {
_, _ = io.WriteString(ctx.stdoutStream, "total 0\n")
_, _ = io.WriteString(ctx.stdoutStream, "total 0\n")
}))
mockServer.Handle(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
if req.URL.Path != "/api/v1/namespaces/default/pods/pod-to-exec" {
return
}
writeObject(w, &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "default",
Name: "pod-to-exec",
},
Spec: v1.PodSpec{Containers: []v1.Container{{Name: "container-to-exec"}}},
})
}))
k8s := mockServer.NewKubernetes()
out, err := k8s.PodsExec(context.Background(), "default", "pod-to-exec", "", []string{"ls", "-l"})