| // Copyright 2022 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package kubernetes_test | |
| import ( | |
| "context" | |
| "encoding/json" | |
| "fmt" | |
| "net/http" | |
| "net/http/httptest" | |
| "testing" | |
| "golang.org/x/build/kubernetes" | |
| "golang.org/x/build/kubernetes/api" | |
| ) | |
| type handlers []func(w http.ResponseWriter, r *http.Request) error | |
| func newTestPod() *api.Pod { | |
| return &api.Pod{ | |
| TypeMeta: api.TypeMeta{ | |
| APIVersion: "v1", | |
| Kind: "Pod", | |
| }, | |
| ObjectMeta: api.ObjectMeta{ | |
| Name: "test-pod", | |
| }, | |
| Spec: api.PodSpec{ | |
| Containers: []api.Container{ | |
| { | |
| Name: "test-container", | |
| Image: "test-image:latest", | |
| }, | |
| }, | |
| }, | |
| } | |
| } | |
| func (hs *handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |
| if len(*hs) == 0 { | |
| w.WriteHeader(http.StatusInternalServerError) | |
| fmt.Fprintf(w, "unexpected request: %v", r) | |
| return | |
| } | |
| h := (*hs)[0] | |
| *hs = (*hs)[1:] | |
| if err := h(w, r); err != nil { | |
| w.WriteHeader(http.StatusInternalServerError) | |
| fmt.Fprintf(w, "unexpected error: %v", err) | |
| return | |
| } | |
| } | |
| func TestRunPod(t *testing.T) { | |
| hs := handlers{ | |
| func(w http.ResponseWriter, r *http.Request) error { | |
| if r.Method != http.MethodPost { | |
| return fmt.Errorf("expected %q, got %q", http.MethodPost, r.Method) | |
| } | |
| w.WriteHeader(http.StatusCreated) | |
| json.NewEncoder(w).Encode(newTestPod()) | |
| return nil | |
| }, | |
| func(w http.ResponseWriter, r *http.Request) error { | |
| if r.Method != http.MethodGet { | |
| return fmt.Errorf("expected %q, got %q", http.MethodGet, r.Method) | |
| } | |
| w.WriteHeader(http.StatusOK) | |
| readyPod := newTestPod() | |
| readyPod.Status.Phase = api.PodRunning | |
| json.NewEncoder(w).Encode(readyPod) | |
| return nil | |
| }, | |
| } | |
| s := httptest.NewServer(&hs) | |
| defer s.Close() | |
| c, err := kubernetes.NewClient(s.URL, "default", http.DefaultClient) | |
| if err != nil { | |
| t.Fatalf("NewClient: %v", err) | |
| } | |
| ps, err := c.RunLongLivedPod(context.Background(), newTestPod()) | |
| if err != nil { | |
| t.Fatalf("RunLongLivePod: %v", err) | |
| } | |
| if ps.Phase != api.PodRunning { | |
| t.Fatalf("Pod phase = %q; want %q", ps.Phase, api.PodRunning) | |
| } | |
| if len(hs) != 0 { | |
| t.Fatalf("failed to process all expected requests: %d left", len(hs)) | |
| } | |
| } |