Add Exec IDs

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby
2017-06-28 12:54:10 -07:00
parent e283b3802d
commit f93bfb6233
36 changed files with 1441 additions and 2055 deletions

59
task.go
View File

@@ -51,8 +51,8 @@ type Task interface {
Start(context.Context) error
Status(context.Context) (TaskStatus, error)
Wait(context.Context) (uint32, error)
Exec(context.Context, *specs.Process, IOCreation) (Process, error)
Processes(context.Context) ([]uint32, error)
Exec(context.Context, string, *specs.Process, IOCreation) (Process, error)
Pids(context.Context) ([]uint32, error)
CloseIO(context.Context, ...IOCloserOpts) error
Resize(ctx context.Context, w, h uint32) error
IO() *IO
@@ -76,12 +76,11 @@ var _ = (Task)(&task{})
type task struct {
client *Client
io *IO
containerID string
pid uint32
io *IO
id string
pid uint32
deferred *tasks.CreateTaskRequest
pidSync chan struct{}
}
// Pid returns the pid or process id for the task
@@ -97,11 +96,10 @@ func (t *task) Start(ctx context.Context) error {
return err
}
t.pid = response.Pid
close(t.pidSync)
return nil
}
_, err := t.client.TaskService().Start(ctx, &tasks.StartTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
})
return err
}
@@ -109,10 +107,7 @@ func (t *task) Start(ctx context.Context) error {
func (t *task) Kill(ctx context.Context, s syscall.Signal) error {
_, err := t.client.TaskService().Kill(ctx, &tasks.KillRequest{
Signal: uint32(s),
ContainerID: t.containerID,
PidOrAll: &tasks.KillRequest_Pid{
Pid: t.pid,
},
ContainerID: t.id,
})
if err != nil {
if strings.Contains(grpc.ErrorDesc(err), runtime.ErrProcessExited.Error()) {
@@ -125,21 +120,21 @@ func (t *task) Kill(ctx context.Context, s syscall.Signal) error {
func (t *task) Pause(ctx context.Context) error {
_, err := t.client.TaskService().Pause(ctx, &tasks.PauseTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
})
return err
}
func (t *task) Resume(ctx context.Context) error {
_, err := t.client.TaskService().Resume(ctx, &tasks.ResumeTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
})
return err
}
func (t *task) Status(ctx context.Context) (TaskStatus, error) {
r, err := t.client.TaskService().Get(ctx, &tasks.GetTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
})
if err != nil {
return "", err
@@ -153,8 +148,6 @@ func (t *task) Wait(ctx context.Context) (uint32, error) {
if err != nil {
return UnknownExitStatus, err
}
<-t.pidSync
for {
evt, err := eventstream.Recv()
if err != nil {
@@ -169,7 +162,7 @@ func (t *task) Wait(ctx context.Context) (uint32, error) {
if e.Type != eventsapi.RuntimeEvent_EXIT {
continue
}
if e.ID == t.containerID && e.Pid == t.pid {
if e.ID == t.id && e.Pid == t.pid {
return e.ExitStatus, nil
}
}
@@ -185,7 +178,7 @@ func (t *task) Delete(ctx context.Context) (uint32, error) {
cerr = t.io.Close()
}
r, err := t.client.TaskService().Delete(ctx, &tasks.DeleteTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
})
if err != nil {
return UnknownExitStatus, err
@@ -193,22 +186,22 @@ func (t *task) Delete(ctx context.Context) (uint32, error) {
return r.ExitStatus, cerr
}
func (t *task) Exec(ctx context.Context, spec *specs.Process, ioCreate IOCreation) (Process, error) {
func (t *task) Exec(ctx context.Context, id string, spec *specs.Process, ioCreate IOCreation) (Process, error) {
i, err := ioCreate()
if err != nil {
return nil, err
}
return &process{
task: t,
io: i,
spec: spec,
pidSync: make(chan struct{}),
id: id,
task: t,
io: i,
spec: spec,
}, nil
}
func (t *task) Processes(ctx context.Context) ([]uint32, error) {
func (t *task) Pids(ctx context.Context) ([]uint32, error) {
response, err := t.client.TaskService().ListPids(ctx, &tasks.ListPidsRequest{
ContainerID: t.containerID,
ContainerID: t.id,
})
if err != nil {
return nil, err
@@ -218,8 +211,7 @@ func (t *task) Processes(ctx context.Context) ([]uint32, error) {
func (t *task) CloseIO(ctx context.Context, opts ...IOCloserOpts) error {
r := &tasks.CloseIORequest{
ContainerID: t.containerID,
Pid: t.pid,
ContainerID: t.id,
}
for _, o := range opts {
o(r)
@@ -234,17 +226,16 @@ func (t *task) IO() *IO {
func (t *task) Resize(ctx context.Context, w, h uint32) error {
_, err := t.client.TaskService().ResizePty(ctx, &tasks.ResizePtyRequest{
ContainerID: t.containerID,
ContainerID: t.id,
Width: w,
Height: h,
Pid: t.pid,
})
return err
}
func (t *task) Checkpoint(ctx context.Context, opts ...CheckpointOpts) (d v1.Descriptor, err error) {
request := &tasks.CheckpointTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
}
for _, o := range opts {
if err := o(request); err != nil {
@@ -257,7 +248,7 @@ func (t *task) Checkpoint(ctx context.Context, opts ...CheckpointOpts) (d v1.Des
}
defer t.Resume(ctx)
cr, err := t.client.ContainerService().Get(ctx, &containers.GetContainerRequest{
ID: t.containerID,
ID: t.id,
})
if err != nil {
return d, err
@@ -281,7 +272,7 @@ type UpdateTaskOpts func(context.Context, *Client, *tasks.UpdateTaskRequest) err
func (t *task) Update(ctx context.Context, opts ...UpdateTaskOpts) error {
request := &tasks.UpdateTaskRequest{
ContainerID: t.containerID,
ContainerID: t.id,
}
for _, o := range opts {
if err := o(ctx, t.client, request); err != nil {
@@ -342,7 +333,7 @@ func (t *task) writeIndex(ctx context.Context, index *v1.Index) (v1.Descriptor,
if err := json.NewEncoder(buf).Encode(index); err != nil {
return v1.Descriptor{}, err
}
return writeContent(ctx, t.client.ContentStore(), v1.MediaTypeImageIndex, t.containerID, buf)
return writeContent(ctx, t.client.ContentStore(), v1.MediaTypeImageIndex, t.id, buf)
}
func writeContent(ctx context.Context, store content.Store, mediaType, ref string, r io.Reader) (d v1.Descriptor, err error) {