@@ -2,8 +2,13 @@ const assert = require('assert');
22const async = require ( 'async' ) ;
33const arsenal = require ( 'arsenal' ) ;
44const { GCP , GcpUtils } = arsenal . storage . data . external . GCP ;
5- const { gcpRequestRetry, setBucketClass, gcpMpuSetup, genUniqID } =
6- require ( '../../../utils/gcpUtils' ) ;
5+ const {
6+ gcpRequestRetry,
7+ gcpClientRetry,
8+ setBucketClass,
9+ gcpMpuSetup,
10+ genUniqID,
11+ } = require ( '../../../utils/gcpUtils' ) ;
712const { getRealAwsConfig } =
813 require ( '../../../../aws-node-sdk/test/support/awsConfig' ) ;
914
@@ -34,6 +39,59 @@ function gcpMpuSetupWrapper(params, callback) {
3439 } ) ;
3540}
3641
42+ function listObjectsPaginated ( gcpClient , bucketName , cb ) {
43+ const objects = [ ] ;
44+ let marker ;
45+
46+ function _list ( ) {
47+ const params = { Bucket : bucketName } ;
48+ if ( marker ) {
49+ params . Marker = marker ;
50+ }
51+
52+ return gcpClientRetry ( gcpClient . listObjects . bind ( gcpClient ) , params , ( err , res ) => {
53+ if ( err ) {
54+ return cb ( err ) ;
55+ }
56+
57+ const contents = ( res && res . Contents ) || [ ] ;
58+ objects . push ( ...contents ) ;
59+
60+ const isTruncated = Boolean ( res && res . IsTruncated ) ;
61+ if ( ! isTruncated ) {
62+ return cb ( null , objects ) ;
63+ }
64+
65+ // AWS listObjects(V1) pagination: prefer NextMarker, fallback to last key.
66+ marker = ( res && res . NextMarker ) ||
67+ ( contents . length ? contents [ contents . length - 1 ] . Key : undefined ) ;
68+
69+ if ( ! marker ) {
70+ return cb ( null , objects ) ;
71+ }
72+
73+ return _list ( ) ;
74+ } ) ;
75+ }
76+
77+ return _list ( ) ;
78+ }
79+
80+ function emptyBucket ( gcpClient , bucketName , cb ) {
81+ return listObjectsPaginated ( gcpClient , bucketName , ( err , objects ) => {
82+ if ( err ) {
83+ return cb ( err ) ;
84+ }
85+ return async . eachLimit ( objects , 20 , ( object , next ) => {
86+ const deleteParams = {
87+ Bucket : bucketName ,
88+ Key : object . Key ,
89+ } ;
90+ return gcpClientRetry ( gcpClient . deleteObject . bind ( gcpClient ) , deleteParams , next ) ;
91+ } , cb ) ;
92+ } ) ;
93+ }
94+
3795describe ( 'GCP: Complete MPU' , function testSuite ( ) {
3896 this . timeout ( 600000 ) ;
3997 let config ;
@@ -59,32 +117,19 @@ describe('GCP: Complete MPU', function testSuite() {
59117
60118 after ( done => {
61119 async . eachSeries ( bucketNames ,
62- ( bucket , next ) => gcpClient . listObjects ( {
63- Bucket : bucket . Name ,
64- } , ( err , res ) => {
120+ ( bucket , next ) => emptyBucket ( gcpClient , bucket . Name , err => {
65121 assert . equal ( err , null ,
66122 `Expected success, but got error ${ err } ` ) ;
67- async . map ( res . Contents , ( object , moveOn ) => {
68- const deleteParams = {
69- Bucket : bucket . Name ,
70- Key : object . Key ,
71- } ;
72- gcpClient . deleteObject (
73- deleteParams , err => moveOn ( err ) ) ;
74- } , err => {
75- assert . equal ( err , null ,
76- `Expected success, but got error ${ err } ` ) ;
77- gcpRequestRetry ( {
78- method : 'DELETE' ,
79- bucket : bucket . Name ,
80- authCredentials : config . credentials ,
81- } , 0 , err => {
82- if ( err ) {
83- process . stdout . write (
84- `err in deleting bucket ${ err } \n` ) ;
85- }
86- return next ( err ) ;
87- } ) ;
123+ gcpRequestRetry ( {
124+ method : 'DELETE' ,
125+ bucket : bucket . Name ,
126+ authCredentials : config . credentials ,
127+ } , 0 , err => {
128+ if ( err ) {
129+ process . stdout . write (
130+ `err in deleting bucket ${ err } \n` ) ;
131+ }
132+ return next ( err ) ;
88133 } ) ;
89134 } ) ,
90135 done ) ;
@@ -169,6 +214,9 @@ describe('GCP: Complete MPU', function testSuite() {
169214
170215 it ( 'should successfully complete MPU' ,
171216 function testFn ( done ) {
217+ this . timeout ( 1200000 ) ;
218+ this . retries ( 1 ) ;
219+
172220 const parts = GcpUtils . createMpuList ( {
173221 Key : this . test . key ,
174222 UploadId : this . test . uploadId ,
0 commit comments