@@ -92,9 +92,9 @@ func publishExternalNetworks(
92
92
) error {
93
93
// We use the folder name as object prefix so that all the objects
94
94
// uploaded as part of this run appears under the same folder
95
- folderName := getFolderName ()
96
- objectPrefix := getObjectPrefix (folderName )
97
- latestPrefixFilePrefix := getObjectPrefix ("" )
95
+ timestamp := getCurrentTimestamp ()
96
+ latestObjectPrefix := getObjectPrefix (common . LatestFolderName )
97
+ topLevelPrefixes := getObjectPrefix ("" )
98
98
99
99
var allExternalNetworks common.ExternalNetworkSources
100
100
for _ , crawler := range crawlerImpls {
@@ -116,16 +116,16 @@ func publishExternalNetworks(
116
116
return errors .Wrap (err , "external network sources validation failed" )
117
117
}
118
118
119
- // Create and upload the object file
120
- err = uploadExternalNetworkSources ( & allExternalNetworks , isDryRun , bucketName , objectPrefix )
119
+ // Rename the existing latest files
120
+ err = copyExistingLatestFilesToTimestampName ( isDryRun , bucketName , latestObjectPrefix , topLevelPrefixes )
121
121
if err != nil {
122
- return errors .Wrap (err , "failed to upload data to bucket " )
122
+ return errors .Wrap (err , "failed to rename existing latest files " )
123
123
}
124
124
125
- // Update the latest_prefix pointer
126
- err = updateLatestPrefixPointer ( isDryRun , bucketName , folderName , latestPrefixFilePrefix )
125
+ // Create and upload the object file
126
+ err = uploadExternalNetworkSources ( & allExternalNetworks , isDryRun , bucketName , latestObjectPrefix , timestamp )
127
127
if err != nil {
128
- return errors .Wrapf (err , "failed to update latest pointer with prefix: %s" , objectPrefix )
128
+ return errors .Wrap (err , "failed to upload data to bucket" )
129
129
}
130
130
131
131
log .Print ("Finished crawling all providers." )
@@ -182,10 +182,62 @@ func validateExternalNetworks(crawlers []common.NetworkCrawler, networks *common
182
182
return nil
183
183
}
184
184
185
+ func copyExistingLatestFilesToTimestampName (isDryRun bool , bucketName , latestObjectPrefix , topLevelPrefixes string ) error {
186
+ existingLatestFileNames , err := utils .GetAllObjectNamesWithPrefix (bucketName , latestObjectPrefix )
187
+ if err != nil {
188
+ return err
189
+ }
190
+ if len (existingLatestFileNames ) == 0 {
191
+ log .Printf ("No filed found under %s. Not renaming anything..." , latestObjectPrefix )
192
+ return nil
193
+ }
194
+ if len (existingLatestFileNames ) != 3 {
195
+ return fmt .Errorf (
196
+ "there should be three different files: %s, %s, and %s" ,
197
+ common .NetworkFileName ,
198
+ common .ChecksumFileName ,
199
+ common .TimestampFileName )
200
+ }
201
+ var timestampVal []byte
202
+ for _ , name := range existingLatestFileNames {
203
+ if strings .Contains (name , common .TimestampFileName ) {
204
+ timestampVal , err = utils .Read (bucketName , name )
205
+ if err != nil {
206
+ return errors .Wrapf (err , "failed while trying to read from the existing timestamp file: %s" , name )
207
+ }
208
+ }
209
+ }
210
+ for _ , name := range existingLatestFileNames {
211
+ var filename string
212
+ switch filepath .Base (name ) {
213
+ case common .NetworkFileName :
214
+ filename = common .NetworkFileName
215
+ case common .ChecksumFileName :
216
+ filename = common .ChecksumFileName
217
+ case common .TimestampFileName :
218
+ filename = common .TimestampFileName
219
+ default :
220
+ return fmt .Errorf ("unrecognized file name: %s" , name )
221
+ }
222
+
223
+ newName := filepath .Join (topLevelPrefixes , string (timestampVal ), filename )
224
+ if isDryRun {
225
+ log .Printf ("Dry run specified. Not renaming %s -> %s" , name , newName )
226
+ } else {
227
+ err := utils .Copy (bucketName , name , bucketName , newName )
228
+ if err != nil {
229
+ return errors .Wrap (err , "failed to copy existing latest files to timestamped folder" )
230
+ }
231
+ }
232
+ }
233
+
234
+ return nil
235
+ }
236
+
185
237
func uploadExternalNetworkSources (
186
238
networks * common.ExternalNetworkSources ,
187
239
isDryRun bool ,
188
- bucketName , objectPrefix string ,
240
+ bucketName , objectPrefix , timestamp string ,
189
241
) error {
190
242
data , cksum , err := marshalAndGetCksum (networks )
191
243
if err != nil {
@@ -201,16 +253,21 @@ func uploadExternalNetworkSources(
201
253
if err != nil {
202
254
return errors .Wrapf (err , "content upload succeeded but checksum upload has failed. Checksum: %s" , cksum )
203
255
}
256
+ err = uploadObjectWithPrefix (bucketName , objectPrefix , common .TimestampFileName , []byte (timestamp ))
257
+ if err != nil {
258
+ return errors .Wrapf (err , "content upload succeeded but timestamp upload has failed. Checksum: %s" , timestamp )
259
+ }
204
260
log .Print ("Successfully uploaded all contents and checksum." )
205
261
log .Print ("++++++" )
206
262
log .Printf ("Please check bucket: https://console.cloud.google.com/storage/browser/%s" , bucketName )
207
263
log .Print ("++++++" )
208
264
} else {
209
265
// In dry run, just print out the package name and hashes
210
266
log .Printf (
211
- "Dry run specified. Folder name is: %s. Checksum computed is: %s" ,
267
+ "Dry run specified. Folder name is: %s. Checksum computed is: %s. Timestamp is: %s " ,
212
268
objectPrefix ,
213
- cksum )
269
+ cksum ,
270
+ timestamp )
214
271
}
215
272
216
273
return nil
@@ -245,26 +302,7 @@ func getObjectPrefix(prefixes ...string) string {
245
302
return filepath .Join (prefixes ... )
246
303
}
247
304
248
- func getFolderName () string {
305
+ func getCurrentTimestamp () string {
249
306
// Some Go magic here. DO NOT CHANGE THIS STRING
250
307
return time .Now ().UTC ().Format ("2006-01-02 15-04-05" )
251
308
}
252
-
253
- func updateLatestPrefixPointer (isDryRun bool , bucketName , latestFolderName , filePrefix string ) error {
254
- if ! isDryRun {
255
- // Write new latest_prefix file
256
- err := uploadObjectWithPrefix (bucketName , filePrefix , common .LatestPrefixFileName , []byte (latestFolderName ))
257
- if err != nil {
258
- return errors .Wrapf (err , "failed to write latest_prefix file under bucket: %s" , bucketName )
259
- }
260
- } else {
261
- // Dry run specified.
262
- log .Printf (
263
- "Dry run specified. Skipping the update of %s with folder name %s under bucket %s" ,
264
- common .LatestPrefixFileName ,
265
- latestFolderName ,
266
- bucketName )
267
- }
268
-
269
- return nil
270
- }
0 commit comments