...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package server
17
18 import (
19 "context"
20
21 "github.com/pkg/errors"
22 v1 "k8s.io/api/core/v1"
23
24 "github.com/chaos-mesh/chaos-mesh/controllers/chaosimpl/utils"
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 err = errors.Wrapf(utils.ErrContainerNotFound, "pod %s/%s has empty container status", pod.Namespace, pod.Name)
43 return 0, err
44 }
45
46 res, err := daemonClient.ContainerGetPid(ctx, &pb.ContainerRequest{
47 Action: &pb.ContainerAction{
48 Action: pb.ContainerAction_GETPID,
49 },
50 ContainerId: pod.Status.ContainerStatuses[0].ContainerID,
51 })
52 if err != nil {
53 return 0, errors.Wrapf(err, "failed get pid from pod %s/%s", pod.GetNamespace(), pod.GetName())
54 }
55 return res.Pid, nil
56 }
57