Skip to content

Commit 4290240

Browse files
committed
adding new runpod collector and refactoring old run collector to use new code
1 parent 2516924 commit 4290240

File tree

4 files changed

+159
-83
lines changed

4 files changed

+159
-83
lines changed

pkg/apis/troubleshoot/v1beta2/collector_shared.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,15 @@ type Run struct {
7676
ImagePullPolicy string `json:"imagePullPolicy,omitempty" yaml:"imagePullPolicy,omitempty"`
7777
ImagePullSecret *ImagePullSecrets `json:"imagePullSecret,omitempty" yaml:"imagePullSecret,omitempty"`
7878
ServiceAccountName string `json:"serviceAccountName,omitempty" yaml:"serviceAccountName,omitempty"`
79-
PodSpec corev1.PodSpec `json:"podSpec,omitempty" yaml:"podSpec,omitempty"`
79+
}
80+
81+
type RunPod struct {
82+
CollectorMeta `json:",inline" yaml:",inline"`
83+
Name string `json:"name,omitempty" yaml:"name,omitempty"`
84+
Namespace string `json:"namespace" yaml:"namespace"`
85+
Timeout string `json:"timeout,omitempty" yaml:"timeout,omitempty"`
86+
ImagePullSecret *ImagePullSecrets `json:"imagePullSecret,omitempty" yaml:"imagePullSecret,omitempty"`
87+
PodSpec corev1.PodSpec `json:"podSpec,omitempty" yaml:"podSpec,omitempty"`
8088
}
8189

8290
type ImagePullSecrets struct {
@@ -197,6 +205,7 @@ type Collect struct {
197205
ConfigMap *ConfigMap `json:"configMap,omitempty" yaml:"configMap,omitempty"`
198206
Logs *Logs `json:"logs,omitempty" yaml:"logs,omitempty"`
199207
Run *Run `json:"run,omitempty" yaml:"run,omitempty"`
208+
RunPod *RunPod `json:"runPod,omitempty" yaml:"runPod,omitempty"`
200209
Exec *Exec `json:"exec,omitempty" yaml:"exec,omitempty"`
201210
Data *Data `json:"data,omitempty" yaml:"data,omitempty"`
202211
Copy *Copy `json:"copy,omitempty" yaml:"copy,omitempty"`
@@ -330,6 +339,19 @@ func (c *Collect) AccessReviewSpecs(overrideNS string) []authorizationv1.SelfSub
330339
},
331340
NonResourceAttributes: nil,
332341
})
342+
} else if c.RunPod != nil {
343+
result = append(result, authorizationv1.SelfSubjectAccessReviewSpec{
344+
ResourceAttributes: &authorizationv1.ResourceAttributes{
345+
Namespace: pickNamespaceOrDefault(c.RunPod.Namespace, overrideNS),
346+
Verb: "create",
347+
Group: "",
348+
Version: "",
349+
Resource: "pods",
350+
Subresource: "",
351+
Name: "",
352+
},
353+
NonResourceAttributes: nil,
354+
})
333355
} else if c.Exec != nil {
334356
result = append(result, authorizationv1.SelfSubjectAccessReviewSpec{
335357
ResourceAttributes: &authorizationv1.ResourceAttributes{
@@ -435,6 +457,10 @@ func (c *Collect) GetName() string {
435457
collector = "run"
436458
name = c.Run.CollectorName
437459
}
460+
if c.RunPod != nil {
461+
collector = "run-pod"
462+
name = c.RunPod.CollectorName
463+
}
438464
if c.Exec != nil {
439465
collector = "exec"
440466
name = c.Exec.CollectorName

pkg/apis/troubleshoot/v1beta2/zz_generated.deepcopy.go

Lines changed: 27 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/collect/collector.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ func (c *Collector) IsExcluded() bool {
9393
if isExcludedResult {
9494
return true
9595
}
96+
} else if c.Collect.RunPod != nil {
97+
isExcludedResult, err := isExcluded(c.Collect.RunPod.Exclude)
98+
if err != nil {
99+
return true
100+
}
101+
if isExcludedResult {
102+
return true
103+
}
96104
} else if c.Collect.Exec != nil {
97105
isExcludedResult, err := isExcluded(c.Collect.Exec.Exclude)
98106
if err != nil {
@@ -221,6 +229,8 @@ func (c *Collector) RunCollectorSync(clientConfig *rest.Config, client kubernete
221229
result, err = Logs(c, c.Collect.Logs)
222230
} else if c.Collect.Run != nil {
223231
result, err = Run(c, c.Collect.Run)
232+
} else if c.Collect.RunPod != nil {
233+
result, err = RunPod(c, c.Collect.RunPod)
224234
} else if c.Collect.Exec != nil {
225235
result, err = Exec(c, c.Collect.Exec)
226236
} else if c.Collect.Data != nil {

pkg/collect/run.go

Lines changed: 95 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,56 @@ import (
1616
)
1717

1818
func Run(c *Collector, runCollector *troubleshootv1beta2.Run) (CollectorResult, error) {
19+
podLabels := make(map[string]string)
20+
podLabels["troubleshoot-role"] = "run-collector"
21+
22+
pullPolicy := corev1.PullIfNotPresent
23+
if runCollector.ImagePullPolicy != "" {
24+
pullPolicy = corev1.PullPolicy(runCollector.ImagePullPolicy)
25+
}
26+
27+
namespace := "default"
28+
if runCollector.Namespace != "" {
29+
namespace = runCollector.Namespace
30+
}
31+
32+
serviceAccountName := "default"
33+
if runCollector.ServiceAccountName != "" {
34+
serviceAccountName = runCollector.ServiceAccountName
35+
}
36+
37+
runPodCollector := &troubleshootv1beta2.RunPod{
38+
Name: runCollector.CollectorName,
39+
Namespace: namespace,
40+
Timeout: runCollector.Timeout,
41+
ImagePullSecret: runCollector.ImagePullSecret,
42+
PodSpec: corev1.PodSpec{
43+
RestartPolicy: corev1.RestartPolicyNever,
44+
ServiceAccountName: serviceAccountName,
45+
Containers: []corev1.Container{
46+
{
47+
Image: runCollector.Image,
48+
ImagePullPolicy: pullPolicy,
49+
Name: "collector",
50+
Command: runCollector.Command,
51+
Args: runCollector.Args,
52+
},
53+
},
54+
},
55+
}
56+
57+
return RunPod(c, runPodCollector)
58+
}
59+
60+
func RunPod(c *Collector, runCollector *troubleshootv1beta2.RunPod) (CollectorResult, error) {
1961
ctx := context.Background()
2062

2163
client, err := kubernetes.NewForConfig(c.ClientConfig)
2264
if err != nil {
2365
return nil, errors.Wrap(err, "failed to create client from config")
2466
}
2567

26-
pod, err := runPod(ctx, client, runCollector, c.Namespace)
68+
pod, err := runPodWithSpec(ctx, client, runCollector)
2769
if err != nil {
2870
return nil, errors.Wrap(err, "failed to run pod")
2971
}
@@ -76,7 +118,52 @@ func Run(c *Collector, runCollector *troubleshootv1beta2.Run) (CollectorResult,
76118
}
77119
}
78120

79-
func runWithoutTimeout(ctx context.Context, c *Collector, pod *corev1.Pod, runCollector *troubleshootv1beta2.Run) (CollectorResult, error) {
121+
func runPodWithSpec(ctx context.Context, client *kubernetes.Clientset, runCollector *troubleshootv1beta2.RunPod) (*corev1.Pod, error) {
122+
podLabels := make(map[string]string)
123+
podLabels["troubleshoot-role"] = "run-collector"
124+
125+
namespace := "default"
126+
if runCollector.Namespace != "" {
127+
namespace = runCollector.Namespace
128+
}
129+
130+
podName := "run-pod"
131+
if runCollector.CollectorName != "" {
132+
podName = runCollector.CollectorName
133+
} else if runCollector.Name != "" {
134+
podName = runCollector.Name
135+
}
136+
137+
pod := corev1.Pod{
138+
ObjectMeta: metav1.ObjectMeta{
139+
Name: podName,
140+
Namespace: namespace,
141+
Labels: podLabels,
142+
},
143+
TypeMeta: metav1.TypeMeta{
144+
APIVersion: "v1",
145+
Kind: "Pod",
146+
},
147+
Spec: runCollector.PodSpec,
148+
}
149+
150+
if runCollector.ImagePullSecret != nil && runCollector.ImagePullSecret.Data != nil {
151+
secretName, err := createSecret(ctx, client, pod.Namespace, runCollector.ImagePullSecret)
152+
if err != nil {
153+
return nil, errors.Wrap(err, "failed to create secret")
154+
}
155+
pod.Spec.ImagePullSecrets = append(pod.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: secretName})
156+
}
157+
158+
created, err := client.CoreV1().Pods(namespace).Create(ctx, &pod, metav1.CreateOptions{})
159+
if err != nil {
160+
return nil, errors.Wrap(err, "failed to create pod")
161+
}
162+
163+
return created, nil
164+
}
165+
166+
func runWithoutTimeout(ctx context.Context, c *Collector, pod *corev1.Pod, runCollector *troubleshootv1beta2.RunPod) (CollectorResult, error) {
80167
client, err := kubernetes.NewForConfig(c.ClientConfig)
81168
if err != nil {
82169
return nil, errors.Wrap(err, "failed create client from config")
@@ -104,10 +191,15 @@ func runWithoutTimeout(ctx context.Context, c *Collector, pod *corev1.Pod, runCo
104191

105192
output := NewResult()
106193

194+
collectorName := runCollector.Name
195+
if collectorName == "" {
196+
collectorName = runCollector.CollectorName
197+
}
198+
107199
limits := troubleshootv1beta2.LogLimits{
108200
MaxLines: 10000,
109201
}
110-
podLogs, err := savePodLogs(ctx, c.BundlePath, client, *pod, runCollector.Name, "", &limits, true)
202+
podLogs, err := savePodLogs(ctx, c.BundlePath, client, *pod, collectorName, "", &limits, true)
111203
if err != nil {
112204
return nil, errors.Wrap(err, "failed to get pod logs")
113205
}
@@ -119,84 +211,6 @@ func runWithoutTimeout(ctx context.Context, c *Collector, pod *corev1.Pod, runCo
119211
return output, nil
120212
}
121213

122-
func runPod(ctx context.Context, client *kubernetes.Clientset, runCollector *troubleshootv1beta2.Run, namespace string) (*corev1.Pod, error) {
123-
podLabels := make(map[string]string)
124-
podLabels["troubleshoot-role"] = "run-collector"
125-
126-
pullPolicy := corev1.PullIfNotPresent
127-
if runCollector.ImagePullPolicy != "" {
128-
pullPolicy = corev1.PullPolicy(runCollector.ImagePullPolicy)
129-
}
130-
131-
if namespace == "" {
132-
namespace = runCollector.Namespace
133-
}
134-
if namespace == "" {
135-
namespace = "default"
136-
}
137-
138-
serviceAccountName := "default"
139-
if runCollector.ServiceAccountName != "" {
140-
serviceAccountName = runCollector.ServiceAccountName
141-
}
142-
143-
pod := corev1.Pod{}
144-
if runCollector.PodSpec.Containers != nil {
145-
pod = corev1.Pod{
146-
ObjectMeta: metav1.ObjectMeta{
147-
Name: runCollector.CollectorName,
148-
Namespace: namespace,
149-
Labels: podLabels,
150-
},
151-
TypeMeta: metav1.TypeMeta{
152-
APIVersion: "v1",
153-
Kind: "Pod",
154-
},
155-
Spec: runCollector.PodSpec,
156-
}
157-
} else {
158-
pod = corev1.Pod{
159-
ObjectMeta: metav1.ObjectMeta{
160-
Name: runCollector.CollectorName,
161-
Namespace: namespace,
162-
Labels: podLabels,
163-
},
164-
TypeMeta: metav1.TypeMeta{
165-
APIVersion: "v1",
166-
Kind: "Pod",
167-
},
168-
Spec: corev1.PodSpec{
169-
RestartPolicy: corev1.RestartPolicyNever,
170-
ServiceAccountName: serviceAccountName,
171-
Containers: []corev1.Container{
172-
{
173-
Image: runCollector.Image,
174-
ImagePullPolicy: pullPolicy,
175-
Name: "collector",
176-
Command: runCollector.Command,
177-
Args: runCollector.Args,
178-
},
179-
},
180-
},
181-
}
182-
183-
if runCollector.ImagePullSecret != nil && runCollector.ImagePullSecret.Data != nil {
184-
secretName, err := createSecret(ctx, client, pod.Namespace, runCollector.ImagePullSecret)
185-
if err != nil {
186-
return nil, errors.Wrap(err, "failed to create secret")
187-
}
188-
pod.Spec.ImagePullSecrets = append(pod.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: secretName})
189-
}
190-
}
191-
192-
created, err := client.CoreV1().Pods(namespace).Create(ctx, &pod, metav1.CreateOptions{})
193-
if err != nil {
194-
return nil, errors.Wrap(err, "failed to create pod")
195-
}
196-
197-
return created, nil
198-
}
199-
200214
func createSecret(ctx context.Context, client kubernetes.Interface, namespace string, imagePullSecret *troubleshootv1beta2.ImagePullSecrets) (string, error) {
201215
if imagePullSecret.Data == nil {
202216
return "", nil

0 commit comments

Comments
 (0)