...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package containerd
17
18 import (
19 "context"
20 "fmt"
21 "syscall"
22
23 "github.com/containerd/containerd"
24
25 "github.com/chaos-mesh/chaos-mesh/pkg/mock"
26 )
27
28 const (
29 containerdProtocolPrefix = "containerd://"
30 )
31
32
33 type ContainerdClientInterface interface {
34 LoadContainer(ctx context.Context, id string) (containerd.Container, error)
35 }
36
37
38 type ContainerdClient struct {
39 client ContainerdClientInterface
40 }
41
42
43 func (c ContainerdClient) FormatContainerID(ctx context.Context, containerID string) (string, error) {
44 if len(containerID) < len(containerdProtocolPrefix) {
45 return "", fmt.Errorf("container id %s is not a containerd container id", containerID)
46 }
47 if containerID[0:len(containerdProtocolPrefix)] != containerdProtocolPrefix {
48 return "", fmt.Errorf("expected %s but got %s", containerdProtocolPrefix, containerID[0:len(containerdProtocolPrefix)])
49 }
50 return containerID[len(containerdProtocolPrefix):], nil
51 }
52
53
54 func (c ContainerdClient) GetPidFromContainerID(ctx context.Context, containerID string) (uint32, error) {
55 id, err := c.FormatContainerID(ctx, containerID)
56 if err != nil {
57 return 0, err
58 }
59 container, err := c.client.LoadContainer(ctx, id)
60 if err != nil {
61 return 0, err
62 }
63 task, err := container.Task(ctx, nil)
64 if err != nil {
65 return 0, err
66 }
67 return task.Pid(), nil
68 }
69
70
71 func (c ContainerdClient) ContainerKillByContainerID(ctx context.Context, containerID string) error {
72 containerID, err := c.FormatContainerID(ctx, containerID)
73 if err != nil {
74 return err
75 }
76
77 container, err := c.client.LoadContainer(ctx, containerID)
78 if err != nil {
79 return err
80 }
81 task, err := container.Task(ctx, nil)
82 if err != nil {
83 return err
84 }
85
86 err = task.Kill(ctx, syscall.SIGKILL)
87
88 return err
89 }
90
91 func New(address string, opts ...containerd.ClientOpt) (*ContainerdClient, error) {
92
93 if err := mock.On("NewContainerdClientError"); err != nil {
94 return nil, err.(error)
95 }
96 if client := mock.On("MockContainerdClient"); client != nil {
97 return &ContainerdClient{
98 client.(ContainerdClientInterface),
99 }, nil
100 }
101
102 c, err := containerd.New(address, opts...)
103 if err != nil {
104 return nil, err
105 }
106
107 return &ContainerdClient{
108 client: c,
109 }, nil
110 }
111
112
113 var WithDefaultNamespace = containerd.WithDefaultNamespace
114