1 package server
2
3
4
5
6 import (
7 "bufio"
8 "context"
9 "encoding/json"
10 "errors"
11 "fmt"
12 "io"
13 "time"
14
15 v1 "k8s.io/api/core/v1"
16 v11 "k8s.io/apimachinery/pkg/apis/meta/v1"
17 "k8s.io/apimachinery/pkg/types"
18 "sigs.k8s.io/controller-runtime/pkg/client"
19
20 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
21 "github.com/chaos-mesh/chaos-mesh/pkg/ctrl/server/generated"
22 "github.com/chaos-mesh/chaos-mesh/pkg/ctrl/server/model"
23 podSelector "github.com/chaos-mesh/chaos-mesh/pkg/selector/pod"
24 )
25
26 func (r *attrOverrideSpecResolver) Ino(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
27 if obj.Ino == nil {
28 return nil, nil
29 }
30 ino := (int)(*obj.Ino)
31 return &ino, nil
32 }
33
34 func (r *attrOverrideSpecResolver) Size(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
35 if obj.Size == nil {
36 return nil, nil
37 }
38 size := (int)(*obj.Size)
39 return &size, nil
40 }
41
42 func (r *attrOverrideSpecResolver) Blocks(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
43 if obj.Blocks == nil {
44 return nil, nil
45 }
46 blocks := (int)(*obj.Blocks)
47 return &blocks, nil
48 }
49
50 func (r *attrOverrideSpecResolver) Kind(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*string, error) {
51 if obj.Kind == nil {
52 return nil, nil
53 }
54 kind := (string)(*obj.Kind)
55 return &kind, nil
56 }
57
58 func (r *attrOverrideSpecResolver) Perm(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
59 if obj.Perm == nil {
60 return nil, nil
61 }
62 perm := (int)(*obj.Perm)
63 return &perm, nil
64 }
65
66 func (r *attrOverrideSpecResolver) Nlink(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
67 if obj.Nlink == nil {
68 return nil, nil
69 }
70 nlink := (int)(*obj.Nlink)
71 return &nlink, nil
72 }
73
74 func (r *attrOverrideSpecResolver) UID(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
75 if obj.UID == nil {
76 return nil, nil
77 }
78 uid := (int)(*obj.UID)
79 return &uid, nil
80 }
81
82 func (r *attrOverrideSpecResolver) Gid(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
83 if obj.GID == nil {
84 return nil, nil
85 }
86 gid := (int)(*obj.GID)
87 return &gid, nil
88 }
89
90 func (r *attrOverrideSpecResolver) Rdev(ctx context.Context, obj *v1alpha1.AttrOverrideSpec) (*int, error) {
91 if obj.Rdev == nil {
92 return nil, nil
93 }
94 rdev := (int)(*obj.Rdev)
95 return &rdev, nil
96 }
97
98 func (r *bandwidthSpecResolver) Limit(ctx context.Context, obj *v1alpha1.BandwidthSpec) (int, error) {
99 return int(obj.Limit), nil
100 }
101
102 func (r *bandwidthSpecResolver) Buffer(ctx context.Context, obj *v1alpha1.BandwidthSpec) (int, error) {
103 return int(obj.Buffer), nil
104 }
105
106 func (r *bandwidthSpecResolver) Peakrate(ctx context.Context, obj *v1alpha1.BandwidthSpec) (*int, error) {
107 if obj.Peakrate == nil {
108 return nil, nil
109 }
110 value := int(*obj.Peakrate)
111 return &value, nil
112 }
113
114 func (r *bandwidthSpecResolver) Minburst(ctx context.Context, obj *v1alpha1.BandwidthSpec) (*int, error) {
115 if obj.Minburst == nil {
116 return nil, nil
117 }
118 value := int(*obj.Minburst)
119 return &value, nil
120 }
121
122 func (r *chaosConditionResolver) Type(ctx context.Context, obj *v1alpha1.ChaosCondition) (string, error) {
123 return string(obj.Type), nil
124 }
125
126 func (r *chaosConditionResolver) Status(ctx context.Context, obj *v1alpha1.ChaosCondition) (string, error) {
127 return string(obj.Status), nil
128 }
129
130 func (r *cidrAndPortResolver) Port(ctx context.Context, obj *v1alpha1.CidrAndPort) (int, error) {
131 return int(obj.Port), nil
132 }
133
134 func (r *containerStateRunningResolver) StartedAt(ctx context.Context, obj *v1.ContainerStateRunning) (*time.Time, error) {
135 return &obj.StartedAt.Time, nil
136 }
137
138 func (r *containerStateTerminatedResolver) StartedAt(ctx context.Context, obj *v1.ContainerStateTerminated) (*time.Time, error) {
139 return &obj.StartedAt.Time, nil
140 }
141
142 func (r *containerStateTerminatedResolver) FinishedAt(ctx context.Context, obj *v1.ContainerStateTerminated) (*time.Time, error) {
143 return &obj.FinishedAt.Time, nil
144 }
145
146 func (r *experimentStatusResolver) DesiredPhase(ctx context.Context, obj *v1alpha1.ExperimentStatus) (string, error) {
147 return string(obj.DesiredPhase), nil
148 }
149
150 func (r *hTTPChaosResolver) UID(ctx context.Context, obj *v1alpha1.HTTPChaos) (string, error) {
151 return string(obj.UID), nil
152 }
153
154 func (r *hTTPChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.HTTPChaos) (*time.Time, error) {
155 return &obj.CreationTimestamp.Time, nil
156 }
157
158 func (r *hTTPChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.HTTPChaos) (*time.Time, error) {
159 return &obj.DeletionTimestamp.Time, nil
160 }
161
162 func (r *hTTPChaosResolver) Labels(ctx context.Context, obj *v1alpha1.HTTPChaos) (map[string]interface{}, error) {
163 labels := make(map[string]interface{})
164 for k, v := range obj.Labels {
165 labels[k] = v
166 }
167 return labels, nil
168 }
169
170 func (r *hTTPChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.HTTPChaos) (map[string]interface{}, error) {
171 annotations := make(map[string]interface{})
172 for k, v := range obj.Annotations {
173 annotations[k] = v
174 }
175 return annotations, nil
176 }
177
178 func (r *hTTPChaosResolver) Podhttp(ctx context.Context, obj *v1alpha1.HTTPChaos) ([]*v1alpha1.PodHttpChaos, error) {
179 podhttps := make([]*v1alpha1.PodHttpChaos, 0, len(obj.Status.Instances))
180 for id := range obj.Status.Instances {
181 podhttp := new(v1alpha1.PodHttpChaos)
182 if err := r.Client.Get(ctx, parseNamespacedName(id), podhttp); err != nil {
183 return nil, err
184 }
185 podhttps = append(podhttps, podhttp)
186 }
187 return podhttps, nil
188 }
189
190 func (r *hTTPChaosSpecResolver) Mode(ctx context.Context, obj *v1alpha1.HTTPChaosSpec) (string, error) {
191 return string(obj.Mode), nil
192 }
193
194 func (r *hTTPChaosSpecResolver) Target(ctx context.Context, obj *v1alpha1.HTTPChaosSpec) (string, error) {
195 return string(obj.Target), nil
196 }
197
198 func (r *hTTPChaosSpecResolver) RequestHeaders(ctx context.Context, obj *v1alpha1.HTTPChaosSpec) (map[string]interface{}, error) {
199 headers := make(map[string]interface{})
200 for k, v := range obj.RequestHeaders {
201 headers[k] = v
202 }
203 return headers, nil
204 }
205
206 func (r *hTTPChaosSpecResolver) ResponseHeaders(ctx context.Context, obj *v1alpha1.HTTPChaosSpec) (map[string]interface{}, error) {
207 headers := make(map[string]interface{})
208 for k, v := range obj.ResponseHeaders {
209 headers[k] = v
210 }
211 return headers, nil
212 }
213
214 func (r *hTTPChaosStatusResolver) Instances(ctx context.Context, obj *v1alpha1.HTTPChaosStatus) (map[string]interface{}, error) {
215 instances := make(map[string]interface{})
216 for k, v := range obj.Instances {
217 instances[k] = v
218 }
219 return instances, nil
220 }
221
222 func (r *iOChaosResolver) UID(ctx context.Context, obj *v1alpha1.IOChaos) (string, error) {
223 return string(obj.UID), nil
224 }
225
226 func (r *iOChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.IOChaos) (*time.Time, error) {
227 return &obj.CreationTimestamp.Time, nil
228 }
229
230 func (r *iOChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.IOChaos) (*time.Time, error) {
231 return &obj.DeletionTimestamp.Time, nil
232 }
233
234 func (r *iOChaosResolver) Labels(ctx context.Context, obj *v1alpha1.IOChaos) (map[string]interface{}, error) {
235 labels := make(map[string]interface{})
236 for k, v := range obj.Labels {
237 labels[k] = v
238 }
239 return labels, nil
240 }
241
242 func (r *iOChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.IOChaos) (map[string]interface{}, error) {
243 annotations := make(map[string]interface{})
244 for k, v := range obj.Annotations {
245 annotations[k] = v
246 }
247 return annotations, nil
248 }
249
250 func (r *iOChaosResolver) Podios(ctx context.Context, obj *v1alpha1.IOChaos) ([]*v1alpha1.PodIOChaos, error) {
251 podios := make([]*v1alpha1.PodIOChaos, 0, len(obj.Status.Instances))
252 for id := range obj.Status.Instances {
253 podio := new(v1alpha1.PodIOChaos)
254 if err := r.Client.Get(ctx, parseNamespacedName(id), podio); err != nil {
255 return nil, err
256 }
257 podios = append(podios, podio)
258 }
259 return podios, nil
260 }
261
262 func (r *iOChaosActionResolver) Type(ctx context.Context, obj *v1alpha1.IOChaosAction) (string, error) {
263 return string(obj.Type), nil
264 }
265
266 func (r *iOChaosActionResolver) Methods(ctx context.Context, obj *v1alpha1.IOChaosAction) ([]string, error) {
267 methods := make([]string, 0, len(obj.Methods))
268 for k, v := range obj.Methods {
269 methods[k] = string(v)
270 }
271 return methods, nil
272 }
273
274 func (r *iOChaosActionResolver) Ino(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
275 if obj.AttrOverrideSpec == nil || obj.Ino == nil {
276 return nil, nil
277 }
278 ino := (int64)(*obj.Ino)
279 return &ino, nil
280 }
281
282 func (r *iOChaosActionResolver) Size(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
283 if obj.AttrOverrideSpec == nil || obj.Size == nil {
284 return nil, nil
285 }
286 size := (int64)(*obj.Size)
287 return &size, nil
288 }
289
290 func (r *iOChaosActionResolver) Blocks(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
291 if obj.AttrOverrideSpec == nil || obj.Blocks == nil {
292 return nil, nil
293 }
294 blocks := (int64)(*obj.Blocks)
295 return &blocks, nil
296 }
297
298 func (r *iOChaosActionResolver) Atime(ctx context.Context, obj *v1alpha1.IOChaosAction) (*v1alpha1.Timespec, error) {
299 if obj.AttrOverrideSpec == nil {
300 return nil, nil
301 }
302 return obj.Atime, nil
303 }
304
305 func (r *iOChaosActionResolver) Mtime(ctx context.Context, obj *v1alpha1.IOChaosAction) (*v1alpha1.Timespec, error) {
306 if obj.AttrOverrideSpec == nil {
307 return nil, nil
308 }
309 return obj.Mtime, nil
310 }
311
312 func (r *iOChaosActionResolver) Ctime(ctx context.Context, obj *v1alpha1.IOChaosAction) (*v1alpha1.Timespec, error) {
313 if obj.AttrOverrideSpec == nil {
314 return nil, nil
315 }
316 return obj.Ctime, nil
317 }
318
319 func (r *iOChaosActionResolver) Kind(ctx context.Context, obj *v1alpha1.IOChaosAction) (*string, error) {
320 if obj.AttrOverrideSpec == nil || obj.Kind == nil {
321 return nil, nil
322 }
323 kind := (string)(*obj.Kind)
324 return &kind, nil
325 }
326
327 func (r *iOChaosActionResolver) Perm(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int, error) {
328 if obj.AttrOverrideSpec == nil || obj.Perm == nil {
329 return nil, nil
330 }
331 perm := (int)(*obj.Perm)
332 return &perm, nil
333 }
334
335 func (r *iOChaosActionResolver) Nlink(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
336 if obj.AttrOverrideSpec == nil || obj.Nlink == nil {
337 return nil, nil
338 }
339 nlink := (int64)(*obj.Nlink)
340 return &nlink, nil
341 }
342
343 func (r *iOChaosActionResolver) UID(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
344 if obj.AttrOverrideSpec == nil || obj.UID == nil {
345 return nil, nil
346 }
347 uid := (int64)(*obj.UID)
348 return &uid, nil
349 }
350
351 func (r *iOChaosActionResolver) Gid(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
352 if obj.AttrOverrideSpec == nil || obj.GID == nil {
353 return nil, nil
354 }
355 gid := (int64)(*obj.GID)
356 return &gid, nil
357 }
358
359 func (r *iOChaosActionResolver) Rdev(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
360 if obj.AttrOverrideSpec == nil || obj.Rdev == nil {
361 return nil, nil
362 }
363 rdev := (int64)(*obj.Rdev)
364 return &rdev, nil
365 }
366
367 func (r *iOChaosActionResolver) Filling(ctx context.Context, obj *v1alpha1.IOChaosAction) (*string, error) {
368 if obj.MistakeSpec == nil {
369 return nil, nil
370 }
371 filling := string(obj.Filling)
372 return &filling, nil
373 }
374
375 func (r *iOChaosActionResolver) MaxOccurrences(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
376 if obj.MistakeSpec == nil {
377 return nil, nil
378 }
379 return &obj.MaxOccurrences, nil
380 }
381
382 func (r *iOChaosActionResolver) MaxLength(ctx context.Context, obj *v1alpha1.IOChaosAction) (*int64, error) {
383 if obj.MistakeSpec == nil {
384 return nil, nil
385 }
386 return &obj.MaxLength, nil
387 }
388
389 func (r *iOChaosSpecResolver) Mode(ctx context.Context, obj *v1alpha1.IOChaosSpec) (string, error) {
390 return string(obj.Mode), nil
391 }
392
393 func (r *iOChaosSpecResolver) Action(ctx context.Context, obj *v1alpha1.IOChaosSpec) (string, error) {
394 return string(obj.Action), nil
395 }
396
397 func (r *iOChaosSpecResolver) Errno(ctx context.Context, obj *v1alpha1.IOChaosSpec) (*int, error) {
398 errno := int(obj.Errno)
399 return &errno, nil
400 }
401
402 func (r *iOChaosSpecResolver) Methods(ctx context.Context, obj *v1alpha1.IOChaosSpec) ([]string, error) {
403 methods := make([]string, 0, len(obj.Methods))
404 for _, method := range obj.Methods {
405 methods = append(methods, string(method))
406 }
407 return methods, nil
408 }
409
410 func (r *iOChaosStatusResolver) Instances(ctx context.Context, obj *v1alpha1.IOChaosStatus) (map[string]interface{}, error) {
411 instances := make(map[string]interface{})
412 for k, v := range obj.Instances {
413 instances[k] = v
414 }
415 return instances, nil
416 }
417
418 func (r *ioFaultResolver) Errno(ctx context.Context, obj *v1alpha1.IoFault) (int, error) {
419 return int(obj.Errno), nil
420 }
421
422 func (r *loggerResolver) Component(ctx context.Context, ns string, component model.Component) (<-chan string, error) {
423 var list v1.PodList
424 if err := r.Client.List(ctx, &list, client.MatchingLabels(componentLabels(component)), client.InNamespace(ns)); err != nil {
425 return nil, err
426 }
427
428 if len(list.Items) == 0 {
429 return nil, fmt.Errorf("instance of %s not found", component)
430 }
431
432 return r.Pod(ctx, list.Items[0].Namespace, list.Items[0].Name)
433 }
434
435 func (r *loggerResolver) Pod(ctx context.Context, ns string, name string) (<-chan string, error) {
436 logs, err := r.Clientset.CoreV1().Pods(ns).GetLogs(name, &v1.PodLogOptions{Follow: true}).Stream(ctx)
437 if err != nil {
438 return nil, err
439 }
440 logChan := make(chan string)
441 go func() {
442 defer logs.Close()
443 reader := bufio.NewReader(logs)
444 for {
445 line, err := reader.ReadString('\n')
446 if err != nil {
447 r.Log.Error(err, fmt.Sprintf("fail to read log of pod(%s/%s)", ns, name))
448 break
449 }
450 select {
451 case logChan <- string(line):
452 continue
453 case <-time.NewTimer(time.Minute).C:
454 r.Log.Info(fmt.Sprintf("client has not read log of pod(%s/%s) for 1m, close channel", ns, name))
455 return
456 }
457 }
458 }()
459 return logChan, nil
460 }
461
462 func (r *mistakeSpecResolver) Filling(ctx context.Context, obj *v1alpha1.MistakeSpec) (*string, error) {
463 filling := string(obj.Filling)
464 return &filling, nil
465 }
466
467 func (r *mutablePodResolver) KillProcesses(ctx context.Context, obj *model.MutablePod, pids []string) ([]*model.KillProcessResult, error) {
468 return r.Resolver.killProcess(ctx, obj.Pod, pids)
469 }
470
471 func (r *mutablePodResolver) CleanTcs(ctx context.Context, obj *model.MutablePod, devices []string) ([]string, error) {
472 return r.Resolver.cleanTcs(ctx, obj.Pod, devices)
473 }
474
475 func (r *mutablePodResolver) CleanIptables(ctx context.Context, obj *model.MutablePod, chains []string) ([]string, error) {
476 return r.Resolver.cleanIptables(ctx, obj.Pod, chains)
477 }
478
479 func (r *mutationResolver) Pod(ctx context.Context, ns string, name string) (*model.MutablePod, error) {
480 key := types.NamespacedName{Namespace: ns, Name: name}
481 pod := new(v1.Pod)
482 if err := r.Client.Get(ctx, key, pod); err != nil {
483 return nil, err
484 }
485 return &model.MutablePod{Pod: pod}, nil
486 }
487
488 func (r *namespaceResolver) Component(ctx context.Context, obj *model.Namespace, component model.Component) ([]*v1.Pod, error) {
489 var list v1.PodList
490 var pods []*v1.Pod
491 if err := r.Client.List(ctx, &list, client.MatchingLabels(componentLabels(component)), client.InNamespace(obj.Ns)); err != nil {
492 return nil, err
493 }
494 for i := range list.Items {
495 pods = append(pods, &list.Items[i])
496 }
497 return pods, nil
498 }
499
500 func (r *namespaceResolver) Pod(ctx context.Context, obj *model.Namespace, name *string) ([]*v1.Pod, error) {
501 if name == nil {
502 var podList v1.PodList
503 var pods []*v1.Pod
504 if err := r.Client.List(ctx, &podList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
505 return nil, err
506 }
507
508 for i := range podList.Items {
509 pods = append(pods, &podList.Items[i])
510 }
511
512 return pods, nil
513 }
514
515 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
516 pod := new(v1.Pod)
517 if err := r.Client.Get(ctx, key, pod); err != nil {
518 return nil, err
519 }
520 return []*v1.Pod{pod}, nil
521 }
522
523 func (r *namespaceResolver) Stresschaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.StressChaos, error) {
524 if name == nil {
525 var stressList v1alpha1.StressChaosList
526 var stresses []*v1alpha1.StressChaos
527 if err := r.Client.List(ctx, &stressList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
528 return nil, err
529 }
530
531 for i := range stressList.Items {
532 stresses = append(stresses, &stressList.Items[i])
533 }
534
535 return stresses, nil
536 }
537
538 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
539 stress := new(v1alpha1.StressChaos)
540 if err := r.Client.Get(ctx, key, stress); err != nil {
541 return nil, err
542 }
543 return []*v1alpha1.StressChaos{stress}, nil
544 }
545
546 func (r *namespaceResolver) Iochaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.IOChaos, error) {
547 if name == nil {
548 var ioList v1alpha1.IOChaosList
549 var ios []*v1alpha1.IOChaos
550 if err := r.Client.List(ctx, &ioList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
551 return nil, err
552 }
553
554 for i := range ioList.Items {
555 ios = append(ios, &ioList.Items[i])
556 }
557
558 return ios, nil
559 }
560
561 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
562 io := new(v1alpha1.IOChaos)
563 if err := r.Client.Get(ctx, key, io); err != nil {
564 return nil, err
565 }
566 return []*v1alpha1.IOChaos{io}, nil
567 }
568
569 func (r *namespaceResolver) Podiochaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.PodIOChaos, error) {
570 if name == nil {
571 var ioList v1alpha1.PodIOChaosList
572 var ios []*v1alpha1.PodIOChaos
573 if err := r.Client.List(ctx, &ioList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
574 return nil, err
575 }
576
577 for i := range ioList.Items {
578 ios = append(ios, &ioList.Items[i])
579 }
580
581 return ios, nil
582 }
583
584 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
585 io := new(v1alpha1.PodIOChaos)
586 if err := r.Client.Get(ctx, key, io); err != nil {
587 return nil, err
588 }
589
590 return []*v1alpha1.PodIOChaos{io}, nil
591 }
592
593 func (r *namespaceResolver) Httpchaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.HTTPChaos, error) {
594 if name == nil {
595 var httpList v1alpha1.HTTPChaosList
596 var https []*v1alpha1.HTTPChaos
597 if err := r.Client.List(ctx, &httpList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
598 return nil, err
599 }
600
601 for i := range httpList.Items {
602 https = append(https, &httpList.Items[i])
603 }
604
605 return https, nil
606 }
607
608 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
609 http := new(v1alpha1.HTTPChaos)
610 if err := r.Client.Get(ctx, key, http); err != nil {
611 return nil, err
612 }
613 return []*v1alpha1.HTTPChaos{http}, nil
614 }
615
616 func (r *namespaceResolver) Podhttpchaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.PodHttpChaos, error) {
617 if name == nil {
618 var httpList v1alpha1.PodHttpChaosList
619 var https []*v1alpha1.PodHttpChaos
620 if err := r.Client.List(ctx, &httpList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
621 return nil, err
622 }
623
624 for i := range httpList.Items {
625 https = append(https, &httpList.Items[i])
626 }
627
628 return https, nil
629 }
630
631 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
632 http := new(v1alpha1.PodHttpChaos)
633 if err := r.Client.Get(ctx, key, http); err != nil {
634 return nil, err
635 }
636 return []*v1alpha1.PodHttpChaos{http}, nil
637 }
638
639 func (r *namespaceResolver) Networkchaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.NetworkChaos, error) {
640 if name == nil {
641 var networkList v1alpha1.NetworkChaosList
642 var networks []*v1alpha1.NetworkChaos
643 if err := r.Client.List(ctx, &networkList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
644 return nil, err
645 }
646
647 for i := range networkList.Items {
648 networks = append(networks, &networkList.Items[i])
649 }
650
651 return networks, nil
652 }
653
654 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
655 network := new(v1alpha1.NetworkChaos)
656 if err := r.Client.Get(ctx, key, network); err != nil {
657 return nil, err
658 }
659 return []*v1alpha1.NetworkChaos{network}, nil
660 }
661
662 func (r *namespaceResolver) Podnetworkchaos(ctx context.Context, obj *model.Namespace, name *string) ([]*v1alpha1.PodNetworkChaos, error) {
663 if name == nil {
664 var networkList v1alpha1.PodNetworkChaosList
665 var networks []*v1alpha1.PodNetworkChaos
666 if err := r.Client.List(ctx, &networkList, &client.ListOptions{Namespace: obj.Ns}); err != nil {
667 return nil, err
668 }
669
670 for i := range networkList.Items {
671 networks = append(networks, &networkList.Items[i])
672 }
673
674 return networks, nil
675 }
676
677 key := types.NamespacedName{Namespace: obj.Ns, Name: *name}
678 network := new(v1alpha1.PodNetworkChaos)
679 if err := r.Client.Get(ctx, key, network); err != nil {
680 return nil, err
681 }
682 return []*v1alpha1.PodNetworkChaos{network}, nil
683 }
684
685 func (r *networkChaosResolver) UID(ctx context.Context, obj *v1alpha1.NetworkChaos) (string, error) {
686 return string(obj.UID), nil
687 }
688
689 func (r *networkChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.NetworkChaos) (*time.Time, error) {
690 return &obj.CreationTimestamp.Time, nil
691 }
692
693 func (r *networkChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.NetworkChaos) (*time.Time, error) {
694 return &obj.DeletionTimestamp.Time, nil
695 }
696
697 func (r *networkChaosResolver) Labels(ctx context.Context, obj *v1alpha1.NetworkChaos) (map[string]interface{}, error) {
698 labels := make(map[string]interface{})
699 for k, v := range obj.Labels {
700 labels[k] = v
701 }
702 return labels, nil
703 }
704
705 func (r *networkChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.NetworkChaos) (map[string]interface{}, error) {
706 annotations := make(map[string]interface{})
707 for k, v := range obj.Annotations {
708 annotations[k] = v
709 }
710 return annotations, nil
711 }
712
713 func (r *networkChaosResolver) Podnetwork(ctx context.Context, obj *v1alpha1.NetworkChaos) ([]*v1alpha1.PodNetworkChaos, error) {
714 podnetworks := make([]*v1alpha1.PodNetworkChaos, 0, len(obj.Status.Instances))
715 for id := range obj.Status.Instances {
716 podnetwork := new(v1alpha1.PodNetworkChaos)
717 if err := r.Client.Get(ctx, parseNamespacedName(id), podnetwork); err != nil {
718 return nil, err
719 }
720 podnetworks = append(podnetworks, podnetwork)
721 }
722 return podnetworks, nil
723 }
724
725 func (r *ownerReferenceResolver) UID(ctx context.Context, obj *v11.OwnerReference) (string, error) {
726 return string(obj.UID), nil
727 }
728
729 func (r *podResolver) UID(ctx context.Context, obj *v1.Pod) (string, error) {
730 return string(obj.UID), nil
731 }
732
733 func (r *podResolver) CreationTimestamp(ctx context.Context, obj *v1.Pod) (*time.Time, error) {
734 return &obj.CreationTimestamp.Time, nil
735 }
736
737 func (r *podResolver) DeletionTimestamp(ctx context.Context, obj *v1.Pod) (*time.Time, error) {
738 return &obj.DeletionTimestamp.Time, nil
739 }
740
741 func (r *podResolver) Labels(ctx context.Context, obj *v1.Pod) (map[string]interface{}, error) {
742 labels := make(map[string]interface{})
743 for k, v := range obj.Labels {
744 labels[k] = v
745 }
746 return labels, nil
747 }
748
749 func (r *podResolver) Annotations(ctx context.Context, obj *v1.Pod) (map[string]interface{}, error) {
750 annotations := make(map[string]interface{})
751 for k, v := range obj.Annotations {
752 annotations[k] = v
753 }
754 return annotations, nil
755 }
756
757 func (r *podResolver) Logs(ctx context.Context, obj *v1.Pod) (string, error) {
758 logs, err := r.Clientset.CoreV1().Pods(obj.Namespace).GetLogs(obj.Name, &v1.PodLogOptions{}).Stream(ctx)
759 if err != nil {
760 return "", err
761 }
762 defer logs.Close()
763 data, err := io.ReadAll(logs)
764 if err != nil {
765 return "", err
766 }
767 return string(data), nil
768 }
769
770 func (r *podResolver) Daemon(ctx context.Context, obj *v1.Pod) (*v1.Pod, error) {
771 daemons, err := getDaemonMap(ctx, r.Client)
772 if err != nil {
773 return nil, err
774 }
775
776 daemon, exist := daemons[obj.Spec.NodeName]
777 if !exist {
778 return nil, fmt.Errorf("daemon of pod(%s/%s) not found", obj.Namespace, obj.Name)
779 }
780 return &daemon, nil
781 }
782
783 func (r *podResolver) Processes(ctx context.Context, obj *v1.Pod) ([]*model.Process, error) {
784 return r.GetPidFromPS(ctx, obj)
785 }
786
787 func (r *podResolver) Mounts(ctx context.Context, obj *v1.Pod) ([]string, error) {
788 return r.GetMounts(ctx, obj)
789 }
790
791 func (r *podResolver) Ipset(ctx context.Context, obj *v1.Pod) (string, error) {
792 return r.GetIpset(ctx, obj)
793 }
794
795 func (r *podResolver) TcQdisc(ctx context.Context, obj *v1.Pod) ([]string, error) {
796 return r.GetTcQdisc(ctx, obj)
797 }
798
799 func (r *podResolver) Iptables(ctx context.Context, obj *v1.Pod) ([]string, error) {
800 return r.GetIptables(ctx, obj)
801 }
802
803 func (r *podConditionResolver) Type(ctx context.Context, obj *v1.PodCondition) (string, error) {
804 return string(obj.Type), nil
805 }
806
807 func (r *podConditionResolver) Status(ctx context.Context, obj *v1.PodCondition) (string, error) {
808 return string(obj.Status), nil
809 }
810
811 func (r *podConditionResolver) LastProbeTime(ctx context.Context, obj *v1.PodCondition) (*time.Time, error) {
812 return &obj.LastProbeTime.Time, nil
813 }
814
815 func (r *podConditionResolver) LastTransitionTime(ctx context.Context, obj *v1.PodCondition) (*time.Time, error) {
816 return &obj.LastTransitionTime.Time, nil
817 }
818
819 func (r *podHTTPChaosResolver) UID(ctx context.Context, obj *v1alpha1.PodHttpChaos) (string, error) {
820 return string(obj.UID), nil
821 }
822
823 func (r *podHTTPChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.PodHttpChaos) (*time.Time, error) {
824 return &obj.CreationTimestamp.Time, nil
825 }
826
827 func (r *podHTTPChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.PodHttpChaos) (*time.Time, error) {
828 return &obj.DeletionTimestamp.Time, nil
829 }
830
831 func (r *podHTTPChaosResolver) Labels(ctx context.Context, obj *v1alpha1.PodHttpChaos) (map[string]interface{}, error) {
832 labels := make(map[string]interface{})
833 for k, v := range obj.Labels {
834 labels[k] = v
835 }
836 return labels, nil
837 }
838
839 func (r *podHTTPChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.PodHttpChaos) (map[string]interface{}, error) {
840 annotations := make(map[string]interface{})
841 for k, v := range obj.Annotations {
842 annotations[k] = v
843 }
844 return annotations, nil
845 }
846
847 func (r *podHTTPChaosResolver) Pod(ctx context.Context, obj *v1alpha1.PodHttpChaos) (*v1.Pod, error) {
848 pod := new(v1.Pod)
849 if err := r.Client.Get(ctx, types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}, pod); err != nil {
850 return nil, err
851 }
852 return pod, nil
853 }
854
855 func (r *podHttpChaosReplaceActionsResolver) Body(ctx context.Context, obj *v1alpha1.PodHttpChaosReplaceActions) (*string, error) {
856 data, err := json.Marshal(obj.Body)
857 if err != nil {
858 return nil, err
859 }
860
861 body := string(data)
862 return &body, nil
863 }
864
865 func (r *podHttpChaosReplaceActionsResolver) Queries(ctx context.Context, obj *v1alpha1.PodHttpChaosReplaceActions) (map[string]interface{}, error) {
866 queries := make(map[string]interface{})
867 for k, v := range obj.Queries {
868 queries[k] = v
869 }
870 return queries, nil
871 }
872
873 func (r *podHttpChaosReplaceActionsResolver) Headers(ctx context.Context, obj *v1alpha1.PodHttpChaosReplaceActions) (map[string]interface{}, error) {
874 headers := make(map[string]interface{})
875 for k, v := range obj.Headers {
876 headers[k] = v
877 }
878 return headers, nil
879 }
880
881 func (r *podHttpChaosRuleResolver) Target(ctx context.Context, obj *v1alpha1.PodHttpChaosRule) (string, error) {
882 return string(obj.Target), nil
883 }
884
885 func (r *podHttpChaosSelectorResolver) RequestHeaders(ctx context.Context, obj *v1alpha1.PodHttpChaosSelector) (map[string]interface{}, error) {
886 headers := make(map[string]interface{})
887 for k, v := range obj.RequestHeaders {
888 headers[k] = v
889 }
890 return headers, nil
891 }
892
893 func (r *podHttpChaosSelectorResolver) ResponseHeaders(ctx context.Context, obj *v1alpha1.PodHttpChaosSelector) (map[string]interface{}, error) {
894 headers := make(map[string]interface{})
895 for k, v := range obj.ResponseHeaders {
896 headers[k] = v
897 }
898 return headers, nil
899 }
900
901 func (r *podIOChaosResolver) UID(ctx context.Context, obj *v1alpha1.PodIOChaos) (string, error) {
902 return string(obj.UID), nil
903 }
904
905 func (r *podIOChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.PodIOChaos) (*time.Time, error) {
906 return &obj.CreationTimestamp.Time, nil
907 }
908
909 func (r *podIOChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.PodIOChaos) (*time.Time, error) {
910 return &obj.DeletionTimestamp.Time, nil
911 }
912
913 func (r *podIOChaosResolver) Labels(ctx context.Context, obj *v1alpha1.PodIOChaos) (map[string]interface{}, error) {
914 labels := make(map[string]interface{})
915 for k, v := range obj.Labels {
916 labels[k] = v
917 }
918 return labels, nil
919 }
920
921 func (r *podIOChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.PodIOChaos) (map[string]interface{}, error) {
922 annotations := make(map[string]interface{})
923 for k, v := range obj.Annotations {
924 annotations[k] = v
925 }
926 return annotations, nil
927 }
928
929 func (r *podIOChaosResolver) Pod(ctx context.Context, obj *v1alpha1.PodIOChaos) (*v1.Pod, error) {
930 pod := new(v1.Pod)
931 key := types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}
932 if err := r.Client.Get(ctx, key, pod); err != nil {
933 return nil, err
934 }
935 return pod, nil
936 }
937
938 func (r *podIOChaosResolver) Ios(ctx context.Context, obj *v1alpha1.PodIOChaos) ([]*v1alpha1.IOChaos, error) {
939 ioNames := make(map[string]bool)
940 for _, action := range obj.Spec.Actions {
941 ioNames[action.Source] = true
942 }
943
944 ios := make([]*v1alpha1.IOChaos, 0, len(ioNames))
945 for name := range ioNames {
946 namespaced := parseNamespacedName(name)
947 io := new(v1alpha1.IOChaos)
948 if err := r.Client.Get(ctx, namespaced, io); err != nil {
949 return nil, err
950 }
951 ios = append(ios, io)
952 }
953 return ios, nil
954 }
955
956 func (r *podNetworkChaosResolver) UID(ctx context.Context, obj *v1alpha1.PodNetworkChaos) (string, error) {
957 return string(obj.UID), nil
958 }
959
960 func (r *podNetworkChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.PodNetworkChaos) (*time.Time, error) {
961 return &obj.CreationTimestamp.Time, nil
962 }
963
964 func (r *podNetworkChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.PodNetworkChaos) (*time.Time, error) {
965 return &obj.DeletionTimestamp.Time, nil
966 }
967
968 func (r *podNetworkChaosResolver) Labels(ctx context.Context, obj *v1alpha1.PodNetworkChaos) (map[string]interface{}, error) {
969 labels := make(map[string]interface{})
970 for k, v := range obj.Labels {
971 labels[k] = v
972 }
973 return labels, nil
974 }
975
976 func (r *podNetworkChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.PodNetworkChaos) (map[string]interface{}, error) {
977 annotations := make(map[string]interface{})
978 for k, v := range obj.Annotations {
979 annotations[k] = v
980 }
981 return annotations, nil
982 }
983
984 func (r *podNetworkChaosResolver) Pod(ctx context.Context, obj *v1alpha1.PodNetworkChaos) (*v1.Pod, error) {
985 pod := new(v1.Pod)
986 if err := r.Client.Get(ctx, types.NamespacedName{Namespace: obj.Namespace, Name: obj.Name}, pod); err != nil {
987 return nil, err
988 }
989 return pod, nil
990 }
991
992 func (r *podSelectorSpecResolver) Pods(ctx context.Context, obj *v1alpha1.PodSelectorSpec) (map[string]interface{}, error) {
993 pods := make(map[string]interface{})
994 for k, v := range obj.Pods {
995 pods[k] = v
996 }
997 return pods, nil
998 }
999
1000 func (r *podSelectorSpecResolver) NodeSelectors(ctx context.Context, obj *v1alpha1.PodSelectorSpec) (map[string]interface{}, error) {
1001 selectors := make(map[string]interface{})
1002 for k, v := range obj.NodeSelectors {
1003 selectors[k] = v
1004 }
1005 return selectors, nil
1006 }
1007
1008 func (r *podSelectorSpecResolver) FieldSelectors(ctx context.Context, obj *v1alpha1.PodSelectorSpec) (map[string]interface{}, error) {
1009 selectors := make(map[string]interface{})
1010 for k, v := range obj.FieldSelectors {
1011 selectors[k] = v
1012 }
1013 return selectors, nil
1014 }
1015
1016 func (r *podSelectorSpecResolver) LabelSelectors(ctx context.Context, obj *v1alpha1.PodSelectorSpec) (map[string]interface{}, error) {
1017 selectors := make(map[string]interface{})
1018 for k, v := range obj.LabelSelectors {
1019 selectors[k] = v
1020 }
1021 return selectors, nil
1022 }
1023
1024 func (r *podSelectorSpecResolver) AnnotationSelectors(ctx context.Context, obj *v1alpha1.PodSelectorSpec) (map[string]interface{}, error) {
1025 selectors := make(map[string]interface{})
1026 for k, v := range obj.AnnotationSelectors {
1027 selectors[k] = v
1028 }
1029 return selectors, nil
1030 }
1031
1032 func (r *podStatusResolver) Phase(ctx context.Context, obj *v1.PodStatus) (string, error) {
1033 return string(obj.Phase), nil
1034 }
1035
1036 func (r *podStatusResolver) StartTime(ctx context.Context, obj *v1.PodStatus) (*time.Time, error) {
1037 return &obj.StartTime.Time, nil
1038 }
1039
1040 func (r *podStatusResolver) QosClass(ctx context.Context, obj *v1.PodStatus) (string, error) {
1041 return string(obj.QOSClass), nil
1042 }
1043
1044 func (r *podStressChaosResolver) Cgroups(ctx context.Context, obj *model.PodStressChaos) (*model.Cgroups, error) {
1045 return r.GetCgroups(ctx, obj)
1046 }
1047
1048 func (r *podStressChaosResolver) ProcessStress(ctx context.Context, obj *model.PodStressChaos) ([]*model.ProcessStress, error) {
1049 processes, err := r.Pod().Processes(ctx, obj.Pod)
1050 if err != nil {
1051 return nil, err
1052 }
1053
1054 var processStress []*model.ProcessStress
1055 for _, process := range processes {
1056 cgroup, err := r.GetCgroup(ctx, obj.Pod, process.Pid)
1057 if err != nil {
1058 r.Log.Error(err, "get cgroup for process", "pid", process.Pid)
1059
1060 continue
1061 }
1062
1063 processStress = append(processStress, &model.ProcessStress{
1064 Process: process,
1065 Cgroup: cgroup,
1066 })
1067 }
1068 return processStress, nil
1069 }
1070
1071 func (r *processResolver) Fds(ctx context.Context, obj *model.Process) ([]*model.Fd, error) {
1072 return r.GetFdsOfProcess(ctx, obj), nil
1073 }
1074
1075 func (r *queryResolver) Namespace(ctx context.Context, ns *string) ([]*model.Namespace, error) {
1076 if ns == nil {
1077 var nsList v1.NamespaceList
1078 var namespaces []*model.Namespace
1079 if err := r.Client.List(ctx, &nsList); err != nil {
1080 return nil, err
1081 }
1082
1083 for _, ns := range nsList.Items {
1084 namespaces = append(namespaces, &model.Namespace{Ns: ns.Name})
1085 }
1086
1087 return namespaces, nil
1088 }
1089 return []*model.Namespace{{Ns: *ns}}, nil
1090 }
1091
1092 func (r *queryResolver) Pods(ctx context.Context, selector model.PodSelectorInput) ([]*v1.Pod, error) {
1093 spec := v1alpha1.PodSelectorSpec{
1094 Pods: map[string][]string{},
1095 NodeSelectors: map[string]string{},
1096 Nodes: selector.Nodes,
1097 PodPhaseSelectors: selector.PodPhaseSelectors,
1098 GenericSelectorSpec: v1alpha1.GenericSelectorSpec{
1099 Namespaces: selector.Namespaces,
1100 FieldSelectors: map[string]string{},
1101 LabelSelectors: map[string]string{},
1102 AnnotationSelectors: map[string]string{},
1103 },
1104 }
1105
1106 for ns, p := range selector.Pods {
1107 if pod, ok := p.(string); ok {
1108 spec.Pods[ns] = []string{pod}
1109 }
1110
1111 if pods, ok := p.([]string); ok {
1112 spec.Pods[ns] = pods
1113 }
1114 }
1115
1116 for k, s := range selector.NodeSelectors {
1117 if selector, ok := s.(string); ok {
1118 spec.NodeSelectors[k] = selector
1119 }
1120 }
1121
1122 for k, s := range selector.FieldSelectors {
1123 if selector, ok := s.(string); ok {
1124 spec.FieldSelectors[k] = selector
1125 }
1126 }
1127
1128 for k, s := range selector.LabelSelectors {
1129 if selector, ok := s.(string); ok {
1130 spec.LabelSelectors[k] = selector
1131 }
1132 }
1133
1134 for k, s := range selector.AnnotationSelectors {
1135 if selector, ok := s.(string); ok {
1136 spec.AnnotationSelectors[k] = selector
1137 }
1138 }
1139
1140 selectImpl := podSelector.New(podSelector.Params{
1141 Client: r.Client,
1142 Reader: r.Client,
1143 })
1144 pods, err := selectImpl.Select(ctx, &v1alpha1.PodSelector{Selector: spec, Mode: v1alpha1.AllMode})
1145 if err != nil {
1146 if errors.Is(err, podSelector.ErrNoPodSelected) {
1147 return nil, nil
1148 }
1149 return nil, err
1150 }
1151 var list []*v1.Pod
1152 for _, pod := range pods {
1153 p := pod
1154 list = append(list, &p.Pod)
1155 }
1156 return list, nil
1157 }
1158
1159 func (r *rawIPSetResolver) IPSetType(ctx context.Context, obj *v1alpha1.RawIPSet) (string, error) {
1160 return string(obj.IPSetType), nil
1161 }
1162
1163 func (r *rawIptablesResolver) Direction(ctx context.Context, obj *v1alpha1.RawIptables) (string, error) {
1164 return string(obj.Direction), nil
1165 }
1166
1167 func (r *rawTrafficControlResolver) Type(ctx context.Context, obj *v1alpha1.RawTrafficControl) (string, error) {
1168 return string(obj.Type), nil
1169 }
1170
1171 func (r *recordResolver) Phase(ctx context.Context, obj *v1alpha1.Record) (string, error) {
1172 return string(obj.Phase), nil
1173 }
1174
1175 func (r *stressChaosResolver) UID(ctx context.Context, obj *v1alpha1.StressChaos) (string, error) {
1176 return string(obj.UID), nil
1177 }
1178
1179 func (r *stressChaosResolver) CreationTimestamp(ctx context.Context, obj *v1alpha1.StressChaos) (*time.Time, error) {
1180 return &obj.CreationTimestamp.Time, nil
1181 }
1182
1183 func (r *stressChaosResolver) DeletionTimestamp(ctx context.Context, obj *v1alpha1.StressChaos) (*time.Time, error) {
1184 return &obj.DeletionTimestamp.Time, nil
1185 }
1186
1187 func (r *stressChaosResolver) Labels(ctx context.Context, obj *v1alpha1.StressChaos) (map[string]interface{}, error) {
1188 labels := make(map[string]interface{})
1189 for k, v := range obj.Labels {
1190 labels[k] = v
1191 }
1192 return labels, nil
1193 }
1194
1195 func (r *stressChaosResolver) Annotations(ctx context.Context, obj *v1alpha1.StressChaos) (map[string]interface{}, error) {
1196 annotations := make(map[string]interface{})
1197 for k, v := range obj.Annotations {
1198 annotations[k] = v
1199 }
1200 return annotations, nil
1201 }
1202
1203 func (r *stressChaosResolver) Podstress(ctx context.Context, obj *v1alpha1.StressChaos) ([]*model.PodStressChaos, error) {
1204 pods, _, err := GetPods(ctx, obj.Status.ChaosStatus, obj.Spec.Selector, r.Client)
1205 if err != nil {
1206 return nil, err
1207 }
1208
1209 var podStress []*model.PodStressChaos
1210 for _, pod := range pods {
1211 p := pod
1212 podStress = append(podStress, &model.PodStressChaos{
1213 StressChaos: obj,
1214 Pod: &p,
1215 })
1216 }
1217 return podStress, nil
1218 }
1219
1220 func (r *stressChaosSpecResolver) Mode(ctx context.Context, obj *v1alpha1.StressChaosSpec) (string, error) {
1221 return string(obj.Mode), nil
1222 }
1223
1224 func (r *stressChaosStatusResolver) Instances(ctx context.Context, obj *v1alpha1.StressChaosStatus) (map[string]interface{}, error) {
1225 instances := make(map[string]interface{})
1226 for k, v := range obj.Instances {
1227 instances[k] = v
1228 }
1229 return instances, nil
1230 }
1231
1232
1233 func (r *Resolver) AttrOverrideSpec() generated.AttrOverrideSpecResolver {
1234 return &attrOverrideSpecResolver{r}
1235 }
1236
1237
1238 func (r *Resolver) BandwidthSpec() generated.BandwidthSpecResolver { return &bandwidthSpecResolver{r} }
1239
1240
1241 func (r *Resolver) ChaosCondition() generated.ChaosConditionResolver {
1242 return &chaosConditionResolver{r}
1243 }
1244
1245
1246 func (r *Resolver) CidrAndPort() generated.CidrAndPortResolver { return &cidrAndPortResolver{r} }
1247
1248
1249 func (r *Resolver) ContainerStateRunning() generated.ContainerStateRunningResolver {
1250 return &containerStateRunningResolver{r}
1251 }
1252
1253
1254 func (r *Resolver) ContainerStateTerminated() generated.ContainerStateTerminatedResolver {
1255 return &containerStateTerminatedResolver{r}
1256 }
1257
1258
1259 func (r *Resolver) ExperimentStatus() generated.ExperimentStatusResolver {
1260 return &experimentStatusResolver{r}
1261 }
1262
1263
1264 func (r *Resolver) HTTPChaos() generated.HTTPChaosResolver { return &hTTPChaosResolver{r} }
1265
1266
1267 func (r *Resolver) HTTPChaosSpec() generated.HTTPChaosSpecResolver { return &hTTPChaosSpecResolver{r} }
1268
1269
1270 func (r *Resolver) HTTPChaosStatus() generated.HTTPChaosStatusResolver {
1271 return &hTTPChaosStatusResolver{r}
1272 }
1273
1274
1275 func (r *Resolver) IOChaos() generated.IOChaosResolver { return &iOChaosResolver{r} }
1276
1277
1278 func (r *Resolver) IOChaosAction() generated.IOChaosActionResolver { return &iOChaosActionResolver{r} }
1279
1280
1281 func (r *Resolver) IOChaosSpec() generated.IOChaosSpecResolver { return &iOChaosSpecResolver{r} }
1282
1283
1284 func (r *Resolver) IOChaosStatus() generated.IOChaosStatusResolver { return &iOChaosStatusResolver{r} }
1285
1286
1287 func (r *Resolver) IoFault() generated.IoFaultResolver { return &ioFaultResolver{r} }
1288
1289
1290 func (r *Resolver) Logger() generated.LoggerResolver { return &loggerResolver{r} }
1291
1292
1293 func (r *Resolver) MistakeSpec() generated.MistakeSpecResolver { return &mistakeSpecResolver{r} }
1294
1295
1296 func (r *Resolver) MutablePod() generated.MutablePodResolver { return &mutablePodResolver{r} }
1297
1298
1299 func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
1300
1301
1302 func (r *Resolver) Namespace() generated.NamespaceResolver { return &namespaceResolver{r} }
1303
1304
1305 func (r *Resolver) NetworkChaos() generated.NetworkChaosResolver { return &networkChaosResolver{r} }
1306
1307
1308 func (r *Resolver) OwnerReference() generated.OwnerReferenceResolver {
1309 return &ownerReferenceResolver{r}
1310 }
1311
1312
1313 func (r *Resolver) Pod() generated.PodResolver { return &podResolver{r} }
1314
1315
1316 func (r *Resolver) PodCondition() generated.PodConditionResolver { return &podConditionResolver{r} }
1317
1318
1319 func (r *Resolver) PodHTTPChaos() generated.PodHTTPChaosResolver { return &podHTTPChaosResolver{r} }
1320
1321
1322 func (r *Resolver) PodHttpChaosReplaceActions() generated.PodHttpChaosReplaceActionsResolver {
1323 return &podHttpChaosReplaceActionsResolver{r}
1324 }
1325
1326
1327 func (r *Resolver) PodHttpChaosRule() generated.PodHttpChaosRuleResolver {
1328 return &podHttpChaosRuleResolver{r}
1329 }
1330
1331
1332 func (r *Resolver) PodHttpChaosSelector() generated.PodHttpChaosSelectorResolver {
1333 return &podHttpChaosSelectorResolver{r}
1334 }
1335
1336
1337 func (r *Resolver) PodIOChaos() generated.PodIOChaosResolver { return &podIOChaosResolver{r} }
1338
1339
1340 func (r *Resolver) PodNetworkChaos() generated.PodNetworkChaosResolver {
1341 return &podNetworkChaosResolver{r}
1342 }
1343
1344
1345 func (r *Resolver) PodSelectorSpec() generated.PodSelectorSpecResolver {
1346 return &podSelectorSpecResolver{r}
1347 }
1348
1349
1350 func (r *Resolver) PodStatus() generated.PodStatusResolver { return &podStatusResolver{r} }
1351
1352
1353 func (r *Resolver) PodStressChaos() generated.PodStressChaosResolver {
1354 return &podStressChaosResolver{r}
1355 }
1356
1357
1358 func (r *Resolver) Process() generated.ProcessResolver { return &processResolver{r} }
1359
1360
1361 func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
1362
1363
1364 func (r *Resolver) RawIPSet() generated.RawIPSetResolver { return &rawIPSetResolver{r} }
1365
1366
1367 func (r *Resolver) RawIptables() generated.RawIptablesResolver { return &rawIptablesResolver{r} }
1368
1369
1370 func (r *Resolver) RawTrafficControl() generated.RawTrafficControlResolver {
1371 return &rawTrafficControlResolver{r}
1372 }
1373
1374
1375 func (r *Resolver) Record() generated.RecordResolver { return &recordResolver{r} }
1376
1377
1378 func (r *Resolver) StressChaos() generated.StressChaosResolver { return &stressChaosResolver{r} }
1379
1380
1381 func (r *Resolver) StressChaosSpec() generated.StressChaosSpecResolver {
1382 return &stressChaosSpecResolver{r}
1383 }
1384
1385
1386 func (r *Resolver) StressChaosStatus() generated.StressChaosStatusResolver {
1387 return &stressChaosStatusResolver{r}
1388 }
1389
1390 type attrOverrideSpecResolver struct{ *Resolver }
1391 type bandwidthSpecResolver struct{ *Resolver }
1392 type chaosConditionResolver struct{ *Resolver }
1393 type cidrAndPortResolver struct{ *Resolver }
1394 type containerStateRunningResolver struct{ *Resolver }
1395 type containerStateTerminatedResolver struct{ *Resolver }
1396 type experimentStatusResolver struct{ *Resolver }
1397 type hTTPChaosResolver struct{ *Resolver }
1398 type hTTPChaosSpecResolver struct{ *Resolver }
1399 type hTTPChaosStatusResolver struct{ *Resolver }
1400 type iOChaosResolver struct{ *Resolver }
1401 type iOChaosActionResolver struct{ *Resolver }
1402 type iOChaosSpecResolver struct{ *Resolver }
1403 type iOChaosStatusResolver struct{ *Resolver }
1404 type ioFaultResolver struct{ *Resolver }
1405 type loggerResolver struct{ *Resolver }
1406 type mistakeSpecResolver struct{ *Resolver }
1407 type mutablePodResolver struct{ *Resolver }
1408 type mutationResolver struct{ *Resolver }
1409 type namespaceResolver struct{ *Resolver }
1410 type networkChaosResolver struct{ *Resolver }
1411 type ownerReferenceResolver struct{ *Resolver }
1412 type podResolver struct{ *Resolver }
1413 type podConditionResolver struct{ *Resolver }
1414 type podHTTPChaosResolver struct{ *Resolver }
1415 type podHttpChaosReplaceActionsResolver struct{ *Resolver }
1416 type podHttpChaosRuleResolver struct{ *Resolver }
1417 type podHttpChaosSelectorResolver struct{ *Resolver }
1418 type podIOChaosResolver struct{ *Resolver }
1419 type podNetworkChaosResolver struct{ *Resolver }
1420 type podSelectorSpecResolver struct{ *Resolver }
1421 type podStatusResolver struct{ *Resolver }
1422 type podStressChaosResolver struct{ *Resolver }
1423 type processResolver struct{ *Resolver }
1424 type queryResolver struct{ *Resolver }
1425 type rawIPSetResolver struct{ *Resolver }
1426 type rawIptablesResolver struct{ *Resolver }
1427 type rawTrafficControlResolver struct{ *Resolver }
1428 type recordResolver struct{ *Resolver }
1429 type stressChaosResolver struct{ *Resolver }
1430 type stressChaosSpecResolver struct{ *Resolver }
1431 type stressChaosStatusResolver struct{ *Resolver }
1432