11const assert = require ( 'assert' ) ;
2-
3- const { S3 } = require ( 'aws-sdk' ) ;
42const { timesLimit, waterfall } = require ( 'async' ) ;
3+ const { NodeHttpHandler } = require ( '@smithy/node-http-handler' ) ;
4+
5+ const {
6+ S3Client,
7+ CreateBucketCommand,
8+ CreateMultipartUploadCommand,
9+ UploadPartCommand,
10+ CompleteMultipartUploadCommand,
11+ GetObjectCommand,
12+ DeleteObjectCommand,
13+ DeleteBucketCommand
14+ } = require ( '@aws-sdk/client-s3' ) ;
515
616const getConfig = require ( '../support/config' ) ;
717
@@ -14,6 +24,7 @@ const finalETag = require('crypto').createHash('md5')
1424 . update ( Buffer . from ( eTag . repeat ( partCount ) , 'hex' ) . toString ( 'binary' ) ,
1525 'binary' ) . digest ( 'hex' ) ;
1626
27+ const partETags = new Array ( partCount ) ;
1728function uploadPart ( n , uploadId , s3 , next ) {
1829 const params = {
1930 Bucket : bucket ,
@@ -25,13 +36,16 @@ function uploadPart(n, uploadId, s3, next) {
2536 if ( params . PartNumber % 20 === 0 ) {
2637 process . stdout . write ( `uploading PartNumber: ${ params . PartNumber } \n` ) ;
2738 }
28- s3 . uploadPart ( params , err => {
29- if ( err ) {
30- process . stdout . write ( 'error putting part: ' , err ) ;
39+
40+ s3 . send ( new UploadPartCommand ( params ) )
41+ . then ( data => {
42+ partETags [ n ] = data . ETag ;
43+ next ( ) ;
44+ } )
45+ . catch ( err => {
46+ process . stdout . write ( `error putting part ${ params . PartNumber } : ${ err } \n` ) ;
3147 return next ( err ) ;
32- }
33- return next ( ) ;
34- } ) ;
48+ } ) ;
3549}
3650
3751// NOTE: This test has a history of failing in end-to-end Integration tests.
@@ -42,25 +56,36 @@ describe('large mpu', function tester() {
4256 let s3 ;
4357 before ( done => {
4458 const config = getConfig ( 'default' , { signatureVersion : 'v4' } ) ;
45- s3 = new S3 ( config ) ;
4659 // disable node sdk retries and timeout to prevent InvalidPart
4760 // and SocketHangUp errors. If retries are allowed, sdk will send
4861 // another request after first request has already deleted parts,
4962 // causing InvalidPart. Meanwhile, if request takes too long to finish,
5063 // sdk will create SocketHangUp error before response.
51- s3 . config . update ( { maxRetries : 0 } ) ;
52- s3 . config . update ( { httpOptions : { timeout : 0 } } ) ;
53- s3 . createBucket ( { Bucket : bucket } , done ) ;
64+ // Custom request handler with no timeouts
65+ const requestHandler = new NodeHttpHandler ( {
66+ requestTimeout : 0 ,
67+ connectionTimeout : 0 ,
68+ } ) ;
69+
70+ s3 = new S3Client ( {
71+ ...config ,
72+ maxAttempts : 1 ,
73+ requestHandler,
74+ } ) ;
75+
76+ s3 . send ( new CreateBucketCommand ( { Bucket : bucket } ) )
77+ . then ( ( ) => done ( ) )
78+ . catch ( err => done ( err ) ) ;
5479 } ) ;
5580
5681 after ( done => {
57- s3 . deleteObject ( { Bucket : bucket , Key : key } , err => {
58- if ( err ) {
59- process . stdout . write ( 'err deleting object in after: ' , err ) ;
82+ s3 . send ( new DeleteObjectCommand ( { Bucket : bucket , Key : key } ) )
83+ . then ( ( ) => s3 . send ( new DeleteBucketCommand ( { Bucket : bucket } ) ) )
84+ . then ( ( ) => done ( ) )
85+ . catch ( err => {
86+ process . stdout . write ( `err deleting object in after: ${ err } \n` ) ;
6087 return done ( err ) ;
61- }
62- return s3 . deleteBucket ( { Bucket : bucket } , done ) ;
63- } ) ;
88+ } ) ;
6489 } ) ;
6590
6691 const itSkipIfAWS = process . env . AWS_ON_AIR ? it . skip : it ;
@@ -69,30 +94,36 @@ describe('large mpu', function tester() {
6994 itSkipIfAWS ( 'should intiate, put parts and complete mpu ' +
7095 `with ${ partCount } parts` , done => {
7196 process . stdout . write ( '***Running large MPU test***\n' ) ;
72- let uploadId ;
97+ let uploadId ;
7398 return waterfall ( [
74- next => s3 . createMultipartUpload ( { Bucket : bucket , Key : key } ,
75- ( err , data ) => {
76- if ( err ) {
77- return done ( err ) ;
78- }
79- process . stdout . write ( 'initated mpu\n' ) ;
80- uploadId = data . UploadId ;
81- return next ( ) ;
82- } ) ,
8399 next => {
84- process . stdout . write ( 'putting parts' ) ;
100+ s3 . send ( new CreateMultipartUploadCommand ( { Bucket : bucket , Key : key } ) )
101+ . then ( data => {
102+ process . stdout . write ( 'initiated mpu\n' ) ;
103+ uploadId = data . UploadId ;
104+ return next ( ) ;
105+ } )
106+ . catch ( err => next ( err ) ) ;
107+ } ,
108+ next => {
109+ process . stdout . write ( 'putting parts\n' ) ;
85110 return timesLimit ( partCount , 20 , ( n , cb ) =>
86- uploadPart ( n , uploadId , s3 , cb ) , err =>
87- next ( err )
88- ) ;
111+ uploadPart ( n , uploadId , s3 , cb ) , err => {
112+ if ( err ) {
113+ process . stdout . write ( `Error in timesLimit: ${ err } \n` ) ;
114+ }
115+ return next ( err ) ;
116+ } ) ;
89117 } ,
90118 next => {
91119 const parts = [ ] ;
92- for ( let i = 1 ; i <= partCount ; i ++ ) {
120+ for ( let i = 0 ; i < partCount ; i ++ ) {
121+ if ( ! partETags [ i ] ) {
122+ return next ( new Error ( `Missing ETag for part ${ i + 1 } ` ) ) ;
123+ }
93124 parts . push ( {
94- ETag : eTag ,
95- PartNumber : i ,
125+ ETag : partETags [ i ] ,
126+ PartNumber : i + 1 ,
96127 } ) ;
97128 }
98129 const params = {
@@ -103,25 +134,23 @@ describe('large mpu', function tester() {
103134 Parts : parts ,
104135 } ,
105136 } ;
106- return s3 . completeMultipartUpload ( params , err => {
107- if ( err ) {
108- process . stdout . write ( 'err complting mpu: ' , err ) ;
109- return next ( err ) ;
110- }
111- return next ( ) ;
112- } ) ;
137+ return s3 . send ( new CompleteMultipartUploadCommand ( params ) )
138+ . then ( ( ) => {
139+ process . stdout . write ( 'mpu completed successfully\n' ) ;
140+ next ( ) ;
141+ } )
142+ . catch ( err => next ( err ) ) ;
113143 } ,
114144 next => {
115- process . stdout . write ( 'about to get object' ) ;
116- return s3 . getObject ( { Bucket : bucket , Key : key } ,
117- ( err , data ) => {
118- if ( err ) {
119- return next ( err ) ;
120- }
145+ process . stdout . write ( 'about to get object\n' ) ;
146+ s3 . send ( new GetObjectCommand ( { Bucket : bucket , Key : key } ) )
147+ . then ( data => {
121148 assert . strictEqual ( data . ETag ,
122149 `"${ finalETag } -${ partCount } "` ) ;
150+ process . stdout . write ( 'get object successful\n' ) ;
123151 return next ( ) ;
124- } ) ;
152+ } )
153+ . catch ( err => next ( err ) ) ;
125154 } ,
126155 ] , done ) ;
127156 } ) ;
0 commit comments