| // 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)) |
| } |
| } |