59
task.go
59
task.go
@@ -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) {
|
||||
|
Reference in New Issue
Block a user