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) }
func getRequestParams(req *restful.Request) requestParams { streamOpts, err := remotecommand.NewOptions(req.Request) if err != nil { glog.Warningf("Unable to parse request stream options: %v", err) } if streamOpts == nil { streamOpts = &remotecommand.Options{} } return requestParams{ podNamespace: req.PathParameter("podNamespace"), podName: req.PathParameter("podID"), podUID: types.UID(req.PathParameter("uid")), containerName: req.PathParameter("containerName"), cmd: req.Request.URL.Query()[api.ExecCommandParamm], streamOpts: *streamOpts, } }
// getExec handles requests to run a command inside a container. func (s *Server) getExec(request *restful.Request, response *restful.Response) { params := getRequestParams(request) streamOpts, err := remotecommand.NewOptions(request.Request) if err != nil { utilruntime.HandleError(err) response.WriteError(http.StatusBadRequest, err) return } 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.GetExec(podFullName, params.podUID, params.containerName, params.cmd, *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.ServeExec(response.ResponseWriter, request.Request, s.host, podFullName, params.podUID, params.containerName, params.cmd, streamOpts, s.host.StreamingConnectionIdleTimeout(), remotecommand.DefaultStreamCreationTimeout, remotecommand.SupportedStreamingProtocols) }