Files
podman/pkg/bindings/containers/exec.go
Valentin Rothberg 8489dc4345 move go module to v2
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>
2020-07-06 15:50:12 +02:00

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)
}