Skip to content

Commit 72614c7

Browse files
authored
Merge pull request #20 from replicatedhq/ch20665
Honor timeout in the run collector
2 parents 537b117 + fa2a71a commit 72614c7

File tree

5 files changed

+58
-31
lines changed

5 files changed

+58
-31
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ bin
1717

1818
!vendor/**/zz_generated.*
1919

20+
# Vendored files downloaded with go mod
21+
vendor
22+
2023
# editor and IDE paraphernalia
2124
.idea
2225
*.swp

go.mod

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,17 @@ require (
99
github.com/gin-gonic/gin v1.4.0
1010
github.com/gizak/termui/v3 v3.1.0
1111
github.com/golang/snappy v0.0.1 // indirect
12-
github.com/gorilla/websocket v1.4.0
13-
github.com/manifoldco/promptui v0.3.2
12+
github.com/manifoldco/promptui v0.3.2 // indirect
1413
github.com/mholt/archiver v3.1.1+incompatible
1514
github.com/nwaples/rardecode v1.0.0 // indirect
1615
github.com/onsi/gomega v1.5.0
1716
github.com/pierrec/lz4 v2.0.5+incompatible // indirect
18-
github.com/pkg/errors v0.8.1
19-
github.com/pmezard/go-difflib v1.0.0
20-
github.com/sergi/go-diff v1.0.0
17+
github.com/sergi/go-diff v1.0.0 // indirect
2118
github.com/spf13/cobra v0.0.3
2219
github.com/spf13/viper v1.4.0
2320
github.com/stretchr/testify v1.3.0
2421
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
25-
github.com/xo/dburl v0.0.0-20190203050942-98997a05b24f
26-
go.uber.org/zap v1.10.0
22+
github.com/xo/dburl v0.0.0-20190203050942-98997a05b24f // indirect
2723
golang.org/x/net v0.0.0-20190522155817-f3200d17e092
2824
gopkg.in/yaml.v2 v2.2.2
2925
k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
163163
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
164164
github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
165165
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
166+
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
166167
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
167168
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
168169
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
@@ -444,6 +445,7 @@ gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6d
444445
gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
445446
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
446447
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
448+
google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
447449
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
448450
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
449451
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=

pkg/collect/logs.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func Logs(logsCollector *troubleshootv1beta1.Logs, redact bool) error {
3939
PodLogs: make(map[string][]byte),
4040
}
4141
for _, pod := range pods {
42-
podLogs, err := getPodLogs(client, pod, logsCollector.Limits)
42+
podLogs, err := getPodLogs(client, pod, logsCollector.Limits, false)
4343
if err != nil {
4444
return err
4545
}
@@ -81,8 +81,10 @@ func listPodsInSelectors(client *kubernetes.Clientset, namespace string, selecto
8181
return pods.Items, nil
8282
}
8383

84-
func getPodLogs(client *kubernetes.Clientset, pod corev1.Pod, limits *troubleshootv1beta1.LogLimits) (map[string][]byte, error) {
85-
podLogOpts := corev1.PodLogOptions{}
84+
func getPodLogs(client *kubernetes.Clientset, pod corev1.Pod, limits *troubleshootv1beta1.LogLimits, follow bool) (map[string][]byte, error) {
85+
podLogOpts := corev1.PodLogOptions{
86+
Follow: follow,
87+
}
8688

8789
defaultMaxLines := int64(10000)
8890
if limits == nil || limits.MaxLines == 0 {

pkg/collect/run.go

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package collect
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"time"
78

@@ -32,46 +33,69 @@ func Run(runCollector *troubleshootv1beta1.Run, redact bool) error {
3233
return err
3334
}
3435

35-
runOutput := &RunOutput{
36-
PodLogs: make(map[string][]byte),
36+
defer func() {
37+
if err := client.CoreV1().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{}); err != nil {
38+
fmt.Printf("Failed to delete pod %s: %v\n", pod.Name, err)
39+
}
40+
}()
41+
42+
if runCollector.Timeout == "" {
43+
return runWithoutTimeout(pod, runCollector, redact)
3744
}
3845

39-
now := time.Now()
40-
then := now.Add(time.Duration(20 * time.Second))
46+
timeout, err := time.ParseDuration(runCollector.Timeout)
47+
if err != nil {
48+
return err
49+
}
4150

42-
if runCollector.Timeout != "" {
43-
parsedDuration, err := time.ParseDuration(runCollector.Timeout)
44-
if err != nil {
45-
fmt.Printf("unable to parse time duration %s\n", runCollector.Timeout)
46-
} else {
47-
then = now.Add(parsedDuration)
48-
}
51+
runChan := make(chan error, 1)
52+
go func() {
53+
runChan <- runWithoutTimeout(pod, runCollector, redact)
54+
}()
55+
56+
select {
57+
case <-time.After(timeout):
58+
return errors.New("timeout")
59+
case err := <-runChan:
60+
return err
61+
}
62+
}
63+
64+
func runWithoutTimeout(pod *corev1.Pod, runCollector *troubleshootv1beta1.Run, redact bool) error {
65+
cfg, err := config.GetConfig()
66+
if err != nil {
67+
return err
68+
}
69+
70+
client, err := kubernetes.NewForConfig(cfg)
71+
if err != nil {
72+
return err
4973
}
5074

5175
for {
52-
if time.Now().After(then) {
76+
status, err := client.CoreV1().Pods(pod.Namespace).Get(pod.Name, metav1.GetOptions{})
77+
if err != nil {
78+
return err
79+
}
80+
if status.Status.Phase == "Running" {
5381
break
5482
}
83+
time.Sleep(time.Second * 1)
84+
}
5585

56-
time.Sleep(time.Second)
86+
runOutput := &RunOutput{
87+
PodLogs: make(map[string][]byte),
5788
}
5889

5990
limits := troubleshootv1beta1.LogLimits{
6091
MaxLines: 10000,
6192
}
62-
podLogs, err := getPodLogs(client, *pod, &limits)
63-
if err != nil {
64-
return err
65-
}
93+
podLogs, err := getPodLogs(client, *pod, &limits, true)
6694

6795
for k, v := range podLogs {
6896
runOutput.PodLogs[k] = v
6997
}
7098

71-
if err := client.CoreV1().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{}); err != nil {
72-
return err
73-
}
74-
7599
if redact {
76100
runOutput, err = runOutput.Redact()
77101
if err != nil {

0 commit comments

Comments
 (0)