@@ -15,22 +15,21 @@ import (
1515 "github.com/gorilla/mux"
1616 "github.com/spf13/afero"
1717
18+ "github.com/ovh/cds/engine/worker/pkg/workerruntime"
1819 "github.com/ovh/cds/sdk"
1920 "github.com/ovh/cds/sdk/log"
2021)
2122
2223func cachePushHandler (ctx context.Context , wk * CurrentWorker ) http.HandlerFunc {
2324 return func (w http.ResponseWriter , r * http.Request ) {
24- vars := mux .Vars (r )
25- // Get body
26- data , errRead := ioutil .ReadAll (r .Body )
27- if errRead != nil {
28- errRead = sdk.Error {
29- Message : "worker cache push > Cannot read body : " + errRead .Error (),
25+ data , err := ioutil .ReadAll (r .Body )
26+ if err != nil {
27+ err = sdk.Error {
28+ Message : "worker cache push > Cannot read body : " + err .Error (),
3029 Status : http .StatusInternalServerError ,
3130 }
32- log .Error (ctx , "%v" , errRead )
33- writeError (w , r , errRead )
31+ log .Error (ctx , "%v" , err )
32+ writeError (w , r , err )
3433 return
3534 }
3635
@@ -45,38 +44,77 @@ func cachePushHandler(ctx context.Context, wk *CurrentWorker) http.HandlerFunc {
4544 return
4645 }
4746
48- res , size , errTar := sdk .CreateTarFromPaths (afero .NewOsFs (), c .WorkingDirectory , c .Files , nil )
49- if errTar != nil {
50- errTar = sdk.Error {
51- Message : fmt .Sprintf ("worker cache push > Cannot tar (%+v) : %v" , c .Files , errTar .Error ()),
47+ tmpDirectory , err := workerruntime .TmpDirectory (wk .currentJob .context )
48+ if err != nil {
49+ err = sdk.Error {
50+ Message : "worker cache push > Cannot get tmp directory : " + err .Error (),
51+ Status : http .StatusInternalServerError ,
52+ }
53+ log .Error (ctx , "%v" , err )
54+ writeError (w , r , err )
55+ return
56+ }
57+
58+ tarF , err := afero .TempFile (wk .BaseDir (), tmpDirectory .Name (), "tar-" )
59+ if err != nil {
60+ err = sdk.Error {
61+ Message : "worker cache push > Cannot create tmp tar file : " + err .Error (),
62+ Status : http .StatusInternalServerError ,
63+ }
64+ log .Error (ctx , "%v" , err )
65+ writeError (w , r , err )
66+ return
67+ }
68+ defer tarF .Close () // nolint
69+
70+ if err := sdk .CreateTarFromPaths (afero .NewOsFs (), c .WorkingDirectory , c .Files , tarF , nil ); err != nil {
71+ err = sdk.Error {
72+ Message : fmt .Sprintf ("worker cache push > Cannot tar (%+v) : %v" , c .Files , err .Error ()),
5273 Status : http .StatusBadRequest ,
5374 }
54- log .Error (ctx , "%v" , errTar )
55- writeError (w , r , errTar )
75+ log .Error (ctx , "%v" , err )
76+ writeError (w , r , err )
77+ return
78+ }
79+
80+ tarInfo , err := tarF .Stat ()
81+ if err != nil {
82+ err = sdk.Error {
83+ Message : "worker cache push > Cannot get tmp tar file info : " + err .Error (),
84+ Status : http .StatusInternalServerError ,
85+ }
86+ log .Error (ctx , "%v" , err )
87+ writeError (w , r , err )
5688 return
5789 }
90+
5891 params := wk .currentJob .wJob .Parameters
5992 projectKey := sdk .ParameterValue (params , "cds.project" )
6093 if projectKey == "" {
61- errP := sdk.Error {
94+ err := sdk.Error {
6295 Message : "worker cache push > Cannot find project" ,
6396 Status : http .StatusInternalServerError ,
6497 }
65- log .Error (ctx , "%v" , errP )
66- writeError (w , r , errP )
98+ log .Error (ctx , "%v" , err )
99+ writeError (w , r , err )
67100 return
68101 }
69102
70103 var errPush error
71104 for i := 0 ; i < 10 ; i ++ {
72- if errPush = wk .client .WorkflowCachePush (projectKey , sdk .DefaultIfEmptyStorage (c .IntegrationName ), vars ["ref" ], res , size ); errPush == nil {
73- return
105+ // Seek to be able to read the content of the file from beginning just after it had been written or in case of retry
106+ if _ , err := tarF .Seek (0 , 0 ); err != nil {
107+ errPush = err
108+ } else {
109+ if errPush = wk .client .WorkflowCachePush (projectKey , sdk .DefaultIfEmptyStorage (c .IntegrationName ), c .Tag , tarF , int (tarInfo .Size ())); errPush == nil {
110+ return
111+ }
74112 }
75113 time .Sleep (3 * time .Second )
76114 log .Error (ctx , "worker cache push > cannot push cache (retry x%d) : %v" , i , errPush )
77115 }
78116
79- err : = sdk.Error {
117+ err = sdk.Error {
80118 Message : "worker cache push > Cannot push cache: " + errPush .Error (),
81119 Status : http .StatusInternalServerError ,
82120 }
@@ -86,23 +124,25 @@ func cachePushHandler(ctx context.Context, wk *CurrentWorker) http.HandlerFunc {
86124}
87125
88126func cachePullHandler (ctx context.Context , wk * CurrentWorker ) http.HandlerFunc {
89- return func (w http.ResponseWriter , r * http.Request ) {
90- vars := mux .Vars (r )
91- path := r .FormValue ("path" )
92- integrationName := sdk .DefaultIfEmptyStorage (r .FormValue ("integration" ))
127+ return func (w http.ResponseWriter , req * http.Request ) {
128+ vars := mux .Vars (req )
129+ path := req .FormValue ("path" )
130+ integrationName := sdk .DefaultIfEmptyStorage (req .FormValue ("integration" ))
93131 params := wk .currentJob .wJob .Parameters
94132 projectKey := sdk .ParameterValue (params , "cds.project" )
95- bts , err := wk .client .WorkflowCachePull (projectKey , integrationName , vars ["ref" ])
133+ r , err := wk .client .WorkflowCachePull (projectKey , integrationName , vars ["ref" ])
96134 if err != nil {
97135 err = sdk.Error {
98136 Message : "worker cache pull > Cannot pull cache: " + err .Error (),
99137 Status : http .StatusNotFound ,
100138 }
101- writeError (w , r , err )
139+ writeError (w , req , err )
102140 return
103141 }
104142
105- tr := tar .NewReader (bts )
143+ log .Debug ("cachePullHandler> Start read cache tar" )
144+
145+ tr := tar .NewReader (r )
106146 for {
107147 header , errH := tr .Next ()
108148 if errH == io .EOF {
@@ -122,6 +162,8 @@ func cachePullHandler(ctx context.Context, wk *CurrentWorker) http.HandlerFunc {
122162 continue
123163 }
124164
165+ log .Debug ("cachePullHandler> Tar contains file %s" , header .Name )
166+
125167 // the target location where the dir/file should be created
126168 target := filepath .Join (path , header .Name )
127169
@@ -163,6 +205,8 @@ func cachePullHandler(ctx context.Context, wk *CurrentWorker) http.HandlerFunc {
163205 }
164206 }
165207
208+ log .Debug ("cachePullHandler> Create file at %s" , target )
209+
166210 f , err := os .OpenFile (target , os .O_CREATE | os .O_WRONLY , os .FileMode (header .Mode ))
167211 if err != nil {
168212 sdkErr := sdk.Error {
0 commit comments