Tizen_4.0 base
[platform/upstream/docker-engine.git] / vendor / github.com / containerd / containerd / supervisor / add_process.go
1 package supervisor
2
3 import (
4         "os"
5         "time"
6
7         "github.com/containerd/containerd/runtime"
8         "github.com/containerd/containerd/specs"
9         "golang.org/x/net/context"
10 )
11
12 // AddProcessTask holds everything necessary to add a process to a
13 // container
14 type AddProcessTask struct {
15         baseTask
16         ID            string
17         PID           string
18         Stdout        string
19         Stderr        string
20         Stdin         string
21         ProcessSpec   *specs.ProcessSpec
22         StartResponse chan StartResponse
23         Ctx           context.Context
24 }
25
26 func (s *Supervisor) addProcess(t *AddProcessTask) error {
27         start := time.Now()
28         ci, ok := s.containers[t.ID]
29         if !ok {
30                 return ErrContainerNotFound
31         }
32         process, err := ci.container.Exec(t.Ctx, t.PID, *t.ProcessSpec, runtime.NewStdio(t.Stdin, t.Stdout, t.Stderr))
33         if err != nil {
34                 return err
35         }
36         s.newExecSyncChannel(t.ID, t.PID)
37         if err := s.monitorProcess(process); err != nil {
38                 s.deleteExecSyncChannel(t.ID, t.PID)
39                 // Kill process
40                 process.Signal(os.Kill)
41                 ci.container.RemoveProcess(t.PID)
42                 return err
43         }
44         ExecProcessTimer.UpdateSince(start)
45         t.StartResponse <- StartResponse{ExecPid: process.SystemPid()}
46         s.notifySubscribers(Event{
47                 Timestamp: time.Now(),
48                 Type:      StateStartProcess,
49                 PID:       t.PID,
50                 ID:        t.ID,
51         })
52         return nil
53 }