...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package graph
17
18 import (
19 "context"
20 "fmt"
21
22 "github.com/pkg/errors"
23 v1 "k8s.io/api/core/v1"
24
25 "github.com/chaos-mesh/chaos-mesh/controllers/utils/chaosdaemon"
26 "github.com/chaos-mesh/chaos-mesh/pkg/chaosdaemon/pb"
27 )
28
29 type DaemonHelper struct {
30 Builder *chaosdaemon.ChaosDaemonClientBuilder
31 }
32
33
34 func (h *DaemonHelper) GetPidFromPod(ctx context.Context, pod *v1.Pod) (uint32, error) {
35 daemonClient, err := h.Builder.Build(ctx, pod, nil)
36 if err != nil {
37 return 0, errors.Wrapf(err, "failed to craete new chaos daemon client of pod(%s/%s)", pod.Namespace, pod.Name)
38 }
39 defer daemonClient.Close()
40
41 if len(pod.Status.ContainerStatuses) == 0 {
42 return 0, fmt.Errorf("%s %s can't get the state of container", pod.Namespace, pod.Name)
43 }
44
45 res, err := daemonClient.ContainerGetPid(ctx, &pb.ContainerRequest{
46 Action: &pb.ContainerAction{
47 Action: pb.ContainerAction_GETPID,
48 },
49 ContainerId: pod.Status.ContainerStatuses[0].ContainerID,
50 })
51 if err != nil {
52 return 0, errors.Wrapf(err, "failed get pid from pod %s/%s", pod.GetNamespace(), pod.GetName())
53 }
54 return res.Pid, nil
55 }
56