func fakeServer(t *testing.T, testName string, exec bool, stdinData, stdoutData, stderrData, errorData string, tty bool, messageCount int, serverProtocols []string) http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { executor := &fakeExecutor{ t: t, testName: testName, errorData: errorData, stdoutData: stdoutData, stderrData: stderrData, expectStdin: len(stdinData) > 0, tty: tty, messageCount: messageCount, exec: exec, } opts, err := remotecommand.NewOptions(req) require.NoError(t, err) if exec { cmd := req.URL.Query()[api.ExecCommandParamm] remotecommand.ServeExec(w, req, executor, "pod", "uid", "container", cmd, opts, 0, 10*time.Second, serverProtocols) } else { remotecommand.ServeAttach(w, req, executor, "pod", "uid", "container", opts, 0, 10*time.Second, serverProtocols) } if e, a := strings.Repeat(stdinData, messageCount), executor.stdinReceived.String(); e != a { t.Errorf("%s: stdin: expected %q, got %q", testName, e, a) } }) }
func (s *server) serveAttach(req *restful.Request, resp *restful.Response) { containerID := req.PathParameter("containerID") if containerID == "" { resp.WriteError(http.StatusBadRequest, errors.New("missing required containerID path parameter")) return } streamOpts, err := remotecommand.NewOptions(req.Request) if err != nil { resp.WriteError(http.StatusBadRequest, err) return } remotecommand.ServeAttach( resp.ResponseWriter, req.Request, s.runtime, "", // unused: podName "", // unusued: podUID containerID, streamOpts, s.config.StreamIdleTimeout, s.config.StreamCreationTimeout, s.config.SupportedProtocols) }
// getAttach handles requests to attach to a container. func (s *Server) getAttach(request *restful.Request, response *restful.Response) { params := getRequestParams(request) pod, ok := s.host.GetPodByName(params.podNamespace, params.podName) if !ok { response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) return } podFullName := kubecontainer.GetPodFullName(pod) redirect, err := s.host.GetAttach(podFullName, params.podUID, params.containerName, params.streamOpts) if err != nil { response.WriteError(streaming.HTTPStatus(err), err) return } if redirect != nil { http.Redirect(response.ResponseWriter, request.Request, redirect.String(), http.StatusFound) return } remotecommand.ServeAttach(response.ResponseWriter, request.Request, s.host, podFullName, params.podUID, params.containerName, s.host.StreamingConnectionIdleTimeout(), remotecommand.DefaultStreamCreationTimeout, remotecommand.SupportedStreamingProtocols) }
func (s *server) serveAttach(req *restful.Request, resp *restful.Response) { token := req.PathParameter("token") cachedRequest, ok := s.cache.Consume(token) if !ok { http.NotFound(resp.ResponseWriter, req.Request) return } attach, ok := cachedRequest.(*runtimeapi.AttachRequest) if !ok { http.NotFound(resp.ResponseWriter, req.Request) return } streamOpts := &remotecommand.Options{ Stdin: attach.GetStdin(), Stdout: true, Stderr: !attach.GetTty(), TTY: attach.GetTty(), } remotecommand.ServeAttach( resp.ResponseWriter, req.Request, s.runtime, "", // unused: podName "", // unusued: podUID attach.GetContainerId(), streamOpts, s.config.StreamIdleTimeout, s.config.StreamCreationTimeout, s.config.SupportedProtocols) }
// getAttach handles requests to attach to a container. func (s *Server) getAttach(request *restful.Request, response *restful.Response) { podNamespace, podID, uid, container := getContainerCoordinates(request) pod, ok := s.host.GetPodByName(podNamespace, podID) if !ok { response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) return } remotecommand.ServeAttach(response.ResponseWriter, request.Request, s.host, kubecontainer.GetPodFullName(pod), uid, container, s.host.StreamingConnectionIdleTimeout(), remotecommand.DefaultStreamCreationTimeout, remotecommand.SupportedStreamingProtocols) }