mirror of
https://github.com/containers/podman.git
synced 2026-03-14 20:56:59 -04:00
With the advent of Podman 2.0.0 we crossed the magical barrier of go modules. While we were able to continue importing all packages inside of the project, the project could not be vendored anymore from the outside. Move the go module to new major version and change all imports to `github.com/containers/libpod/v2`. The renaming of the imports was done via `gomove` [1]. [1] https://github.com/KSubedi/gomove Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
package containers
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/containers/libpod/v2/libpod/define"
|
|
"github.com/containers/libpod/v2/pkg/api/handlers"
|
|
"github.com/containers/libpod/v2/pkg/bindings"
|
|
jsoniter "github.com/json-iterator/go"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
|
|
|
// ExecCreate creates a new exec session in an existing container.
|
|
// The exec session will not be started; that is done with ExecStart.
|
|
// Returns ID of new exec session, or an error if one occurred.
|
|
func ExecCreate(ctx context.Context, nameOrID string, config *handlers.ExecCreateConfig) (string, error) {
|
|
conn, err := bindings.GetClient(ctx)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if config == nil {
|
|
return "", errors.Errorf("must provide a configuration for exec session")
|
|
}
|
|
|
|
requestJSON, err := json.Marshal(config)
|
|
if err != nil {
|
|
return "", errors.Wrapf(err, "error marshalling exec config to JSON")
|
|
}
|
|
jsonReader := strings.NewReader(string(requestJSON))
|
|
|
|
resp, err := conn.DoRequest(jsonReader, http.MethodPost, "/containers/%s/exec", nil, nil, nameOrID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
respStruct := new(handlers.ExecCreateResponse)
|
|
if err := resp.Process(respStruct); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return respStruct.ID, nil
|
|
}
|
|
|
|
// ExecInspect inspects an existing exec session, returning detailed information
|
|
// about it.
|
|
func ExecInspect(ctx context.Context, sessionID string) (*define.InspectExecSession, error) {
|
|
conn, err := bindings.GetClient(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
logrus.Debugf("Inspecting session ID %q", sessionID)
|
|
|
|
resp, err := conn.DoRequest(nil, http.MethodGet, "/exec/%s/json", nil, nil, sessionID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
respStruct := new(define.InspectExecSession)
|
|
if err := resp.Process(respStruct); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return respStruct, nil
|
|
}
|
|
|
|
// ExecStart starts (but does not attach to) a given exec session.
|
|
func ExecStart(ctx context.Context, sessionID string) error {
|
|
conn, err := bindings.GetClient(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
logrus.Debugf("Starting exec session ID %q", sessionID)
|
|
|
|
// We force Detach to true
|
|
body := struct {
|
|
Detach bool `json:"Detach"`
|
|
}{
|
|
Detach: true,
|
|
}
|
|
bodyJSON, err := json.Marshal(body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
resp, err := conn.DoRequest(bytes.NewReader(bodyJSON), http.MethodPost, "/exec/%s/start", nil, nil, sessionID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return resp.Process(nil)
|
|
}
|