@@ -2,6 +2,8 @@ package jobs
2
2
3
3
import (
4
4
"context"
5
+ "errors"
6
+ "fmt"
5
7
"github.com/nginxinc/kubectl-kic-supportpkg/pkg/data_collector"
6
8
"os"
7
9
"path"
@@ -11,27 +13,44 @@ import (
11
13
type Job struct {
12
14
Name string
13
15
Global bool
14
- Execute func (dc * data_collector.DataCollector , ctx context.Context ) map [string ][]byte
15
- //TODO: execute function must return an error
16
+ Timeout time.Duration
17
+ Execute func (dc * data_collector.DataCollector , ctx context.Context , ch chan JobResult )
18
+ }
19
+
20
+ type JobResult struct {
21
+ Files map [string ][]byte
22
+ Error error
16
23
}
17
24
18
25
func (j Job ) Collect (dc * data_collector.DataCollector ) error {
19
- ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
26
+ ch := make (chan JobResult , 1 )
27
+
28
+ ctx , cancel := context .WithTimeout (context .Background (), j .Timeout )
20
29
defer cancel ()
21
30
22
- jobResults := j .Execute (dc , ctx )
31
+ go j .Execute (dc , ctx , ch )
23
32
24
- for fileName , fileValue := range jobResults {
25
- err := os .MkdirAll (path .Dir (fileName ), os .ModePerm )
26
- if err != nil {
27
- return err
33
+ select {
34
+ case <- ctx .Done ():
35
+ return errors .New (fmt .Sprintf ("Context cancelled: %v" , ctx .Err ()))
36
+
37
+ case jobResults := <- ch :
38
+ if jobResults .Error != nil {
39
+ return jobResults .Error
28
40
}
29
- file , _ := os .Create (fileName )
30
- _ , err = file .Write (fileValue )
31
- if err != nil {
32
- return err
41
+
42
+ for fileName , fileValue := range jobResults .Files {
43
+ err := os .MkdirAll (path .Dir (fileName ), os .ModePerm )
44
+ if err != nil {
45
+ return err
46
+ }
47
+ file , _ := os .Create (fileName )
48
+ _ , err = file .Write (fileValue )
49
+ if err != nil {
50
+ return err
51
+ }
52
+ _ = file .Close ()
33
53
}
34
- _ = file . Close ()
54
+ return nil
35
55
}
36
- return nil
37
56
}
0 commit comments