@@ -2,13 +2,21 @@ package cdn
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"github.com/ovh/cds/engine/cdn/item"
6
7
"github.com/ovh/cds/engine/cdn/storage"
7
8
cdntest "github.com/ovh/cds/engine/cdn/test"
9
+ "github.com/ovh/cds/engine/test"
8
10
"github.com/ovh/cds/sdk"
11
+ "github.com/ovh/cds/sdk/cdn"
12
+ "github.com/ovh/symmecrypt/ciphers/aesgcm"
13
+ "github.com/ovh/symmecrypt/convergent"
14
+ "github.com/ovh/symmecrypt/keyloader"
9
15
"github.com/rockbears/log"
10
16
"github.com/stretchr/testify/require"
17
+ "io/ioutil"
11
18
"net/http/httptest"
19
+ "os"
12
20
"testing"
13
21
"time"
14
22
)
@@ -94,3 +102,139 @@ func TestMarkItemUnitAsDeleteHandler(t *testing.T) {
94
102
require .Equal (t , 204 , recDel .Code )
95
103
96
104
}
105
+
106
+ func TestPostAdminResyncBackendWithDatabaseHandler (t * testing.T ) {
107
+ s , db := newTestService (t )
108
+
109
+ cfg := test .LoadTestingConf (t , sdk .TypeCDN )
110
+
111
+ cdntest .ClearItem (t , context .TODO (), s .Mapper , db )
112
+ cdntest .ClearItem (t , context .TODO (), s .Mapper , db )
113
+ cdntest .ClearSyncRedisSet (t , s .Cache , "local_storage" )
114
+
115
+ // Start CDN
116
+ ctx , cancel := context .WithCancel (context .Background ())
117
+ t .Cleanup (cancel )
118
+ tmpDir , err := ioutil .TempDir ("" , t .Name ()+ "-cdn-1-*" )
119
+ require .NoError (t , err )
120
+
121
+ tmpDir2 , err := ioutil .TempDir ("" , t .Name ()+ "-cdn-2-*" )
122
+ require .NoError (t , err )
123
+
124
+ cdnUnits , err := storage .Init (ctx , s .Mapper , s .Cache , db .DbMap , sdk .NewGoRoutines (ctx ), storage.Configuration {
125
+ SyncSeconds : 1 ,
126
+ SyncNbElements : 1000 ,
127
+ PurgeNbElements : 1000 ,
128
+ PurgeSeconds : 30 ,
129
+ HashLocatorSalt : "thisismysalt" ,
130
+ Buffers : map [string ]storage.BufferConfiguration {
131
+ "refis_buffer" : {
132
+ Redis : & storage.RedisBufferConfiguration {
133
+ Host : cfg ["redisHost" ],
134
+ Password : cfg ["redisPassword" ],
135
+ },
136
+ BufferType : storage .CDNBufferTypeLog ,
137
+ },
138
+ "local_buffer" : {
139
+ Local : & storage.LocalBufferConfiguration {
140
+ Path : tmpDir ,
141
+ Encryption : []* keyloader.KeyConfig {
142
+ {
143
+ Key : "iamakey.iamakey.iamakey.iamakey." ,
144
+ Cipher : aesgcm .CipherName ,
145
+ Identifier : "local-bukker-id" ,
146
+ },
147
+ },
148
+ },
149
+ BufferType : storage .CDNBufferTypeFile ,
150
+ },
151
+ },
152
+ Storages : map [string ]storage.StorageConfiguration {
153
+ "local_storage" : {
154
+ SyncParallel : 10 ,
155
+ SyncBandwidth : int64 (1024 * 1024 ),
156
+ Local : & storage.LocalStorageConfiguration {
157
+ Path : tmpDir2 ,
158
+ Encryption : []convergent.ConvergentEncryptionConfig {
159
+ {
160
+ Cipher : aesgcm .CipherName ,
161
+ LocatorSalt : "secret_locator_salt" ,
162
+ SecretValue : "secret_value" ,
163
+ },
164
+ },
165
+ },
166
+ },
167
+ },
168
+ })
169
+ require .NoError (t , err )
170
+ s .Units = cdnUnits
171
+ cdnUnits .Start (ctx , sdk .NewGoRoutines (ctx ))
172
+
173
+ // Create an Item
174
+ it , err := s .loadOrCreateItem (context .TODO (), sdk .CDNTypeItemRunResult , cdn.Signature {
175
+ RunID : 1 ,
176
+ JobID : 1 ,
177
+ WorkflowID : 1 ,
178
+ NodeRunID : 1 ,
179
+ Worker : & cdn.SignatureWorker {
180
+ WorkerID : "1" ,
181
+ FileName : sdk .RandomString (10 ),
182
+ RunResultType : string (sdk .WorkflowRunResultTypeArtifact ),
183
+ FilePerm : 0777 ,
184
+ StepOrder : 0 ,
185
+ WorkerName : sdk .RandomString (10 ),
186
+ },
187
+ })
188
+ require .NoError (t , err )
189
+ _ , err = s .loadOrCreateItemUnitBuffer (context .TODO (), it .ID , sdk .CDNTypeItemRunResult )
190
+ require .NoError (t , err )
191
+
192
+ require .NoError (t , os .Mkdir (fmt .Sprintf ("%s/%s" , tmpDir , string (sdk .CDNTypeItemRunResult )), 0755 ))
193
+
194
+ file1Path := fmt .Sprintf ("%s/%s/%s" , tmpDir , string (sdk .CDNTypeItemRunResult ), it .APIRefHash )
195
+ t .Logf ("Creating file %s" , file1Path )
196
+ content1 := []byte ("I'm the real one" )
197
+ f1 , err := os .Create (file1Path )
198
+ require .NoError (t , err )
199
+ defer f1 .Close ()
200
+ _ , err = f1 .Write (content1 )
201
+ require .NoError (t , err )
202
+
203
+ file2Path := fmt .Sprintf ("%s/%s/%s" , tmpDir , string (sdk .CDNTypeItemRunResult ), "wronghash" )
204
+ t .Logf ("Creating file %s" , file2Path )
205
+ content2 := []byte ("I'm not the real one" )
206
+ f2 , err := os .Create (file2Path )
207
+ require .NoError (t , err )
208
+ defer f2 .Close ()
209
+ _ , err = f2 .Write (content2 )
210
+ require .NoError (t , err )
211
+
212
+ vars := make (map [string ]string )
213
+ vars ["id" ] = s .Units .GetBuffer (sdk .CDNTypeItemRunResult ).ID ()
214
+ vars ["type" ] = string (sdk .CDNTypeItemRunResult )
215
+ uri := s .Router .GetRoute ("POST" , s .postAdminResyncBackendWithDatabaseHandler , vars ) + "?dryRun=false"
216
+ require .NotEmpty (t , uri )
217
+ req := newRequest (t , "POST" , uri , nil )
218
+ rec := httptest .NewRecorder ()
219
+ s .Router .Mux .ServeHTTP (rec , req )
220
+ require .Equal (t , 204 , rec .Code )
221
+
222
+ cpt := 0
223
+ for {
224
+ _ , err := os .Stat (file2Path )
225
+ if os .IsNotExist (err ) {
226
+ break
227
+ }
228
+ if cpt >= 20 {
229
+ t .FailNow ()
230
+ }
231
+ cpt ++
232
+ time .Sleep (250 * time .Millisecond )
233
+ }
234
+ _ , err = os .Stat (file2Path )
235
+ require .True (t , os .IsNotExist (err ))
236
+
237
+ _ , err = os .Stat (file1Path )
238
+ require .NoError (t , err )
239
+
240
+ }
0 commit comments