// Find all sibling pods in the service and post to their /write handler. func contactOthers(state *State) { defer state.doneContactingPeers() masterRO := url.URL{ Scheme: "http", Host: os.Getenv("KUBERNETES_RO_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_RO_SERVICE_PORT"), Path: "/api/v1beta1", } client := &client.Client{client.NewRESTClient(&masterRO, latest.Codec)} // Do this repeatedly, in case there's some propagation delay with getting // newly started pods into the endpoints list. for i := 0; i < 15; i++ { endpoints, err := client.Endpoints(*namespace).Get(*service) if err != nil { state.Logf("Unable to read endpoints for %v/%v: %v; will try again.", *namespace, *service, err) time.Sleep(time.Duration(1+rand.Intn(10)) * time.Second) } for _, e := range endpoints.Endpoints { contactSingle("http://"+e, state) } time.Sleep(5 * time.Second) } }
// New creates and returns a new Client. func New(host string, auth *kubeclient.AuthInfo) (*Client, error) { restClient, err := kubeclient.NewRESTClient(host, auth, "/osapi/v1beta1") if err != nil { return nil, err } return &Client{restClient}, nil }
// Find all sibling pods in the service and post to their /write handler. func contactOthers(state *State) { defer state.doneContactingPeers() masterRO := url.URL{ Scheme: "http", Host: os.Getenv("KUBERNETES_RO_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_RO_SERVICE_PORT"), Path: "/api/v1beta1", } client := &client.Client{client.NewRESTClient(&masterRO, "v1beta1", latest.Codec, true, 5, 10)} // Do this repeatedly, in case there's some propagation delay with getting // newly started pods into the endpoints list. for i := 0; i < 15; i++ { endpoints, err := client.Endpoints(*namespace).Get(*service) if err != nil { state.Logf("Unable to read the endpoints for %v/%v: %v; will try again.", *namespace, *service, err) time.Sleep(time.Duration(1+rand.Intn(10)) * time.Second) } eps := util.StringSet{} for _, ss := range endpoints.Subsets { for _, a := range ss.Addresses { for _, p := range ss.Ports { eps.Insert(fmt.Sprintf("http://%s:%d", a.IP, p.Port)) } } } for ep := range eps { state.Logf("Attempting to contact %s", ep) contactSingle(ep, state) } time.Sleep(5 * time.Second) } }
func getFakeClient(t *testing.T, validURLs []string) (ClientFunc, *httptest.Server) { handlerFunc := func(w http.ResponseWriter, r *http.Request) { for _, u := range validURLs { if u == r.RequestURI { return } } t.Errorf("Unexpected HTTP request: %s, expected %v", r.RequestURI, validURLs) } server := httptest.NewServer(http.HandlerFunc(handlerFunc)) return func(mapping *meta.RESTMapping) (*client.RESTClient, error) { fakeCodec := runtime.CodecFor(api.Scheme, "v1beta1") fakeUri, _ := url.Parse(server.URL + "/api/v1beta1") return client.NewRESTClient(fakeUri, fakeCodec), nil }, server }
func getFakeClient(t *testing.T, validURLs []string) (ClientPosterFunc, *httptest.Server) { handlerFunc := func(w http.ResponseWriter, r *http.Request) { for _, u := range validURLs { if u == r.RequestURI { return } } t.Errorf("Unexpected HTTP request: %s, expected %v", r.RequestURI, validURLs) } server := httptest.NewServer(http.HandlerFunc(handlerFunc)) return func(mapping *meta.RESTMapping) (RESTClientPoster, error) { fakeCodec := testapi.Codec() fakeUri, _ := url.Parse(server.URL + "/api/" + testapi.Version()) legacyBehavior := api.PreV1Beta3(testapi.Version()) return client.NewRESTClient(fakeUri, testapi.Version(), fakeCodec, legacyBehavior, 5, 10), nil }, server }
func TestRequestExecuteRemoteCommand(t *testing.T) { testCases := []struct { Stdin string Stdout string Stderr string Error string Tty bool }{ { Error: "bail", }, { Stdin: "a", Stdout: "b", Stderr: "c", }, { Stdin: "a", Stdout: "b", Tty: true, }, } for i, testCase := range testCases { localOut := &bytes.Buffer{} localErr := &bytes.Buffer{} server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty)) url, _ := url.ParseRequestURI(server.URL) c := client.NewRESTClient(url, "x", nil, -1, -1) req := c.Post().Resource("testing") conf := &client.Config{ Host: server.URL, } e := New(req, conf, []string{"ls", "/"}, strings.NewReader(testCase.Stdin), localOut, localErr, testCase.Tty) //e.upgrader = testCase.Upgrader err := e.Execute() hasErr := err != nil if len(testCase.Error) > 0 { if !hasErr { t.Errorf("%d: expected an error", i) } else { if e, a := testCase.Error, err.Error(); !strings.Contains(a, e) { t.Errorf("%d: expected error stream read '%v', got '%v'", i, e, a) } } server.Close() continue } if hasErr { t.Errorf("%d: unexpected error: %v", i, err) server.Close() continue } if len(testCase.Stdout) > 0 { if e, a := testCase.Stdout, localOut; e != a.String() { t.Errorf("%d: expected stdout data '%s', got '%s'", i, e, a) } } if testCase.Stderr != "" { if e, a := testCase.Stderr, localErr; e != a.String() { t.Errorf("%d: expected stderr data '%s', got '%s'", i, e, a) } } server.Close() } }