diff options
| -rw-r--r-- | pkg/api/handlers/compat/exec.go | 40 | ||||
| -rw-r--r-- | pkg/api/server/register_exec.go | 16 | 
2 files changed, 48 insertions, 8 deletions
| diff --git a/pkg/api/handlers/compat/exec.go b/pkg/api/handlers/compat/exec.go index 897f4e6bd..df4950947 100644 --- a/pkg/api/handlers/compat/exec.go +++ b/pkg/api/handlers/compat/exec.go @@ -14,6 +14,7 @@ import (  	"github.com/gorilla/schema"  	"github.com/pkg/errors"  	"github.com/sirupsen/logrus" +	"k8s.io/client-go/tools/remotecommand"  )  // ExecCreateHandler creates an exec session for a given container. @@ -107,6 +108,45 @@ func ExecInspectHandler(w http.ResponseWriter, r *http.Request) {  	utils.WriteResponse(w, http.StatusOK, inspectOut)  } +// ExecResizeHandler resizes a given exec session's TTY. +func ExecResizeHandler(w http.ResponseWriter, r *http.Request) { +	runtime := r.Context().Value("runtime").(*libpod.Runtime) +	decoder := r.Context().Value("decoder").(*schema.Decoder) + +	sessionID := mux.Vars(r)["id"] + +	query := struct { +		Height uint16 `schema:"h"` +		Width  uint16 `schema:"w"` +	}{ +		// override any golang type defaults +	} +	if err := decoder.Decode(&query, r.URL.Query()); err != nil { +		utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, +			errors.Wrapf(err, "Failed to parse parameters for %s", r.URL.String())) +		return +	} + +	sessionCtr, err := runtime.GetExecSessionContainer(sessionID) +	if err != nil { +		utils.Error(w, fmt.Sprintf("No such exec session: %s", sessionID), http.StatusNotFound, err) +		return +	} + +	newSize := remotecommand.TerminalSize{ +		Width:  query.Width, +		Height: query.Height, +	} + +	if err := sessionCtr.ExecResize(sessionID, newSize); err != nil { +		utils.InternalServerError(w, err) +		return +	} + +	// This is a 201 some reason, not a 204. +	utils.WriteResponse(w, http.StatusCreated, "") +} +  // ExecStartHandler runs a given exec session.  func ExecStartHandler(w http.ResponseWriter, r *http.Request) {  	runtime := r.Context().Value("runtime").(*libpod.Runtime) diff --git a/pkg/api/server/register_exec.go b/pkg/api/server/register_exec.go index d37c3eb11..f1f1cc7e9 100644 --- a/pkg/api/server/register_exec.go +++ b/pkg/api/server/register_exec.go @@ -114,7 +114,7 @@ func (s *APIServer) registerExecHandlers(r *mux.Router) error {  	//     $ref: "#/responses/InternalError"  	r.Handle(VersionedPath("/exec/{id}/start"), s.APIHandler(compat.ExecStartHandler)).Methods(http.MethodPost)  	// Added non version path to URI to support docker non versioned paths -	r.Handle("/exec/{id}/start", s.APIHandler(compat.UnsupportedHandler)).Methods(http.MethodPost) +	r.Handle("/exec/{id}/start", s.APIHandler(compat.ExecStartHandler)).Methods(http.MethodPost)  	// swagger:operation POST /exec/{id}/resize compat resizeExec  	// ---  	// tags: @@ -145,9 +145,9 @@ func (s *APIServer) registerExecHandlers(r *mux.Router) error {  	//     $ref: "#/responses/NoSuchExecInstance"  	//   500:  	//     $ref: "#/responses/InternalError" -	r.Handle(VersionedPath("/exec/{id}/resize"), s.APIHandler(compat.UnsupportedHandler)).Methods(http.MethodPost) +	r.Handle(VersionedPath("/exec/{id}/resize"), s.APIHandler(compat.ExecResizeHandler)).Methods(http.MethodPost)  	// Added non version path to URI to support docker non versioned paths -	r.Handle("/exec/{id}/resize", s.APIHandler(compat.UnsupportedHandler)).Methods(http.MethodPost) +	r.Handle("/exec/{id}/resize", s.APIHandler(compat.ExecResizeHandler)).Methods(http.MethodPost)  	// swagger:operation GET /exec/{id}/json compat inspectExec  	// ---  	// tags: @@ -264,10 +264,10 @@ func (s *APIServer) registerExecHandlers(r *mux.Router) error {  	//      properties:  	//        Detach:  	//          type: boolean -	//          description: Detach from the command +	//          description: Detach from the command. Not presently supported.  	//        Tty:  	//          type: boolean -	//          description: Allocate a pseudo-TTY +	//          description: Allocate a pseudo-TTY. Not presently supported.  	// produces:  	// - application/json  	// responses: @@ -276,10 +276,10 @@ func (s *APIServer) registerExecHandlers(r *mux.Router) error {  	//   404:  	//     $ref: "#/responses/NoSuchExecInstance"  	//   409: -	//	   description: container is stopped or paused +	//	   description: container is not running.  	//   500:  	//     $ref: "#/responses/InternalError" -	r.Handle(VersionedPath("/libpod/exec/{id}/start"), s.APIHandler(compat.UnsupportedHandler)).Methods(http.MethodPost) +	r.Handle(VersionedPath("/libpod/exec/{id}/start"), s.APIHandler(compat.ExecStartHandler)).Methods(http.MethodPost)  	// swagger:operation POST /libpod/exec/{id}/resize libpod libpodResizeExec  	// ---  	// tags: @@ -310,7 +310,7 @@ func (s *APIServer) registerExecHandlers(r *mux.Router) error {  	//     $ref: "#/responses/NoSuchExecInstance"  	//   500:  	//     $ref: "#/responses/InternalError" -	r.Handle(VersionedPath("/libpod/exec/{id}/resize"), s.APIHandler(compat.UnsupportedHandler)).Methods(http.MethodPost) +	r.Handle(VersionedPath("/libpod/exec/{id}/resize"), s.APIHandler(compat.ExecResizeHandler)).Methods(http.MethodPost)  	// swagger:operation GET /libpod/exec/{id}/json libpod libpodInspectExec  	// ---  	// tags: | 
