11const async = require ( 'async' ) ;
22const assert = require ( 'assert' ) ;
3- const { S3 } = require ( 'aws-sdk' ) ;
3+ const {
4+ S3Client,
5+ CreateBucketCommand,
6+ DeleteBucketCommand,
7+ PutObjectCommand,
8+ DeleteObjectCommand,
9+ DeleteObjectsCommand,
10+ CopyObjectCommand,
11+ PutBucketVersioningCommand,
12+ CreateMultipartUploadCommand,
13+ UploadPartCommand,
14+ CompleteMultipartUploadCommand,
15+ ListObjectVersionsCommand,
16+ GetObjectCommand,
17+ } = require ( '@aws-sdk/client-s3' ) ;
418
519const MockUtapi = require ( '../utilities/mock/Utapi' ) ;
620const getConfig = require ( '../functional/aws-node-sdk/test/support/config' ) ;
@@ -10,150 +24,132 @@ let s3Client = null;
1024function wait ( timeoutMs , cb ) {
1125 setTimeout ( cb , timeoutMs ) ;
1226}
27+
1328function createBucket ( bucket , cb ) {
14- return s3Client . createBucket ( {
15- Bucket : bucket ,
16- } , ( err , data ) => {
17- assert . ifError ( err ) ;
18- return cb ( err , data ) ;
19- } ) ;
29+ s3Client . send ( new CreateBucketCommand ( { Bucket : bucket } ) )
30+ . then ( data => cb ( null , data ) )
31+ . catch ( cb ) ;
2032}
33+
2134function deleteBucket ( bucket , cb ) {
22- return s3Client . deleteBucket ( {
23- Bucket : bucket ,
24- } , err => {
25- assert . ifError ( err ) ;
26- return cb ( err ) ;
27- } ) ;
35+ s3Client . send ( new DeleteBucketCommand ( { Bucket : bucket } ) )
36+ . then ( ( ) => cb ( null ) )
37+ . catch ( cb ) ;
2838}
39+
2940function putObject ( bucket , key , size , cb ) {
30- return s3Client . putObject ( {
41+ const body = Buffer . alloc ( size ) ;
42+ const params = {
3143 Bucket : bucket ,
3244 Key : key ,
33- Body : Buffer . alloc ( size ) ,
34- } , ( err , data ) => {
35- assert . ifError ( err ) ;
36- return cb ( err , data ) ;
37- } ) ;
45+ Body : body ,
46+ } ;
47+ s3Client . send ( new PutObjectCommand ( params ) )
48+ . then ( data => cb ( null , data ) )
49+ . catch ( cb ) ;
3850}
51+
3952function deleteObject ( bucket , key , cb ) {
40- return s3Client . deleteObject ( {
41- Bucket : bucket ,
42- Key : key ,
43- } , err => {
44- assert . ifError ( err ) ;
45- return cb ( err ) ;
46- } ) ;
53+ s3Client . send ( new DeleteObjectCommand ( { Bucket : bucket , Key : key } ) )
54+ . then ( ( ) => cb ( null ) )
55+ . catch ( cb ) ;
4756}
57+
4858function deleteObjects ( bucket , keys , cb ) {
49- const objects = keys . map ( key => {
50- const keyObj = {
51- Key : key ,
52- } ;
53- return keyObj ;
54- } ) ;
59+ const objects = keys . map ( key => ( { Key : key } ) ) ;
60+ const deleteRequest = { Objects : objects , Quiet : true } ;
5561 const params = {
5662 Bucket : bucket ,
57- Delete : {
58- Objects : objects ,
59- Quiet : true ,
60- } ,
63+ Delete : deleteRequest ,
6164 } ;
62- return s3Client . deleteObjects ( params , err => {
63- assert . ifError ( err ) ;
64- return cb ( err ) ;
65- } ) ;
65+ s3Client . send ( new DeleteObjectsCommand ( params ) )
66+ . then ( ( ) => cb ( null ) )
67+ . catch ( cb ) ;
6668}
69+
6770function copyObject ( bucket , key , cb ) {
68- return s3Client . copyObject ( {
69- Bucket : bucket ,
70- CopySource : `/${ bucket } /${ key } ` ,
71- Key : `${ key } -copy` ,
72- } , err => {
73- assert . ifError ( err ) ;
74- return cb ( err ) ;
75- } ) ;
71+ const params = { Bucket : bucket , CopySource : `${ bucket } /${ key } ` , Key : `${ key } -copy` } ;
72+ s3Client . send ( new CopyObjectCommand ( params ) )
73+ . then ( ( ) => cb ( null ) )
74+ . catch ( cb ) ;
7675}
76+
7777function enableVersioning ( bucket , enable , cb ) {
78- const versioningStatus = {
79- Status : enable ? 'Enabled' : 'Disabled' ,
80- } ;
81- return s3Client . putBucketVersioning ( {
82- Bucket : bucket ,
83- VersioningConfiguration : versioningStatus ,
84- } , err => {
85- assert . ifError ( err ) ;
86- return cb ( err ) ;
87- } ) ;
78+ const versioningStatus = { Status : enable ? 'Enabled' : 'Disabled' } ;
79+ const params = { Bucket : bucket , VersioningConfiguration : versioningStatus } ;
80+ s3Client . send ( new PutBucketVersioningCommand ( params ) )
81+ . then ( ( ) => cb ( null ) )
82+ . catch ( cb ) ;
8883}
89- function deleteVersionList ( versionList , bucket , callback ) {
84+
85+ async function deleteVersionList ( versionList , bucket ) {
9086 if ( versionList === undefined || versionList . length === 0 ) {
91- return callback ( ) ;
87+ return ;
9288 }
93- const params = { Bucket : bucket , Delete : { Objects : [ ] } } ;
89+ const deleteRequest = { Objects : [ ] } ;
9490 versionList . forEach ( version => {
95- params . Delete . Objects . push ( {
96- Key : version . Key , VersionId : version . VersionId ,
97- } ) ;
91+ deleteRequest . Objects . push ( { Key : version . Key , VersionId : version . VersionId } ) ;
9892 } ) ;
99-
100- return s3Client . deleteObjects ( params , callback ) ;
93+ const params = {
94+ Bucket : bucket ,
95+ Delete : deleteRequest ,
96+ } ;
97+ await s3Client . send ( new DeleteObjectsCommand ( params ) ) ;
10198}
102- function removeAllVersions ( params , callback ) {
103- const bucket = params . Bucket ;
104- async . waterfall ( [
105- cb => s3Client . listObjectVersions ( params , cb ) ,
106- ( data , cb ) => deleteVersionList ( data . DeleteMarkers , bucket ,
107- err => cb ( err , data ) ) ,
108- ( data , cb ) => deleteVersionList ( data . Versions , bucket ,
109- err => cb ( err , data ) ) ,
110- ( data , cb ) => {
111- if ( data . IsTruncated ) {
112- const params = {
113- Bucket : bucket ,
114- KeyMarker : data . NextKeyMarker ,
115- VersionIdMarker : data . NextVersionIdMarker ,
116- } ;
117- return removeAllVersions ( params , cb ) ;
118- }
119- return cb ( ) ;
120- } ,
121- ] , callback ) ;
99+
100+ async function removeAllVersions ( params , callback ) {
101+ try {
102+ const bucket = params . Bucket ;
103+ const data = await s3Client . send ( new ListObjectVersionsCommand ( params ) ) ;
104+
105+ if ( data . DeleteMarkers && data . DeleteMarkers . length > 0 ) {
106+ await deleteVersionList ( data . DeleteMarkers , bucket ) ;
107+ }
108+
109+ if ( data . Versions && data . Versions . length > 0 ) {
110+ await deleteVersionList ( data . Versions , bucket ) ;
111+ }
112+
113+ if ( data . IsTruncated ) {
114+ const nextParams = {
115+ Bucket : bucket ,
116+ KeyMarker : data . NextKeyMarker ,
117+ VersionIdMarker : data . NextVersionIdMarker
118+ } ;
119+ await removeAllVersions ( nextParams ) ;
120+ }
121+
122+ callback ( ) ;
123+ } catch ( error ) {
124+ callback ( error ) ;
125+ }
122126}
127+
123128function objectMPU ( bucket , key , parts , partSize , callback ) {
124129 let ETags = [ ] ;
125130 let uploadId = null ;
126131 const partNumbers = Array . from ( Array ( parts ) . keys ( ) ) ;
127- const initiateMPUParams = {
128- Bucket : bucket ,
129- Key : key ,
130- } ;
131- return async . waterfall ( [
132- next => s3Client . createMultipartUpload ( initiateMPUParams ,
133- ( err , data ) => {
134- if ( err ) {
135- return next ( err ) ;
136- }
132+ const initiateMPUParams = { Bucket : bucket , Key : key } ;
133+ async . waterfall ( [
134+ next => s3Client . send ( new CreateMultipartUploadCommand ( initiateMPUParams ) )
135+ . then ( data => {
137136 uploadId = data . UploadId ;
138137 return next ( ) ;
139- } ) ,
138+ } )
139+ . catch ( next ) ,
140140 next =>
141141 async . mapLimit ( partNumbers , 1 , ( partNumber , callback ) => {
142+ const body = Buffer . alloc ( partSize ) ;
142143 const uploadPartParams = {
143144 Bucket : bucket ,
144145 Key : key ,
145146 PartNumber : partNumber + 1 ,
146147 UploadId : uploadId ,
147- Body : Buffer . alloc ( partSize ) ,
148+ Body : body ,
148149 } ;
149-
150- return s3Client . uploadPart ( uploadPartParams ,
151- ( err , data ) => {
152- if ( err ) {
153- return callback ( err ) ;
154- }
155- return callback ( null , data . ETag ) ;
156- } ) ;
150+ s3Client . send ( new UploadPartCommand ( uploadPartParams ) )
151+ . then ( data => callback ( null , data . ETag ) )
152+ . catch ( callback ) ;
157153 } , ( err , results ) => {
158154 if ( err ) {
159155 return next ( err ) ;
@@ -162,33 +158,28 @@ function objectMPU(bucket, key, parts, partSize, callback) {
162158 return next ( ) ;
163159 } ) ,
164160 next => {
161+ const completeRequest = { Parts : partNumbers . map ( n => ( { ETag : ETags [ n ] , PartNumber : n + 1 } ) ) } ;
165162 const params = {
166163 Bucket : bucket ,
167164 Key : key ,
168- MultipartUpload : {
169- Parts : partNumbers . map ( n => ( {
170- ETag : ETags [ n ] ,
171- PartNumber : n + 1 ,
172- } ) ) ,
173- } ,
165+ MultipartUpload : completeRequest ,
174166 UploadId : uploadId ,
175167 } ;
176- return s3Client . completeMultipartUpload ( params , next ) ;
168+ s3Client . send ( new CompleteMultipartUploadCommand ( params ) )
169+ . then ( data => next ( null , data ) )
170+ . catch ( next ) ;
177171 } ,
178172 ] , callback ) ;
179173}
174+
180175function removeVersions ( buckets , cb ) {
181- return async . each ( buckets ,
182- ( bucket , done ) => removeAllVersions ( { Bucket : bucket } , done ) , cb ) ;
176+ async . each ( buckets , ( bucket , done ) => removeAllVersions ( { Bucket : bucket } , done ) , cb ) ;
183177}
178+
184179function getObject ( bucket , key , cb ) {
185- return s3Client . getObject ( {
186- Bucket : bucket ,
187- Key : key ,
188- } , ( err , data ) => {
189- assert . ifError ( err ) ;
190- return cb ( err , data ) ;
191- } ) ;
180+ s3Client . send ( new GetObjectCommand ( { Bucket : bucket , Key : key } ) )
181+ . then ( data => cb ( null , data ) )
182+ . catch ( cb ) ;
192183}
193184
194185describe ( 'utapi v2 metrics incoming and outgoing bytes' , function t ( ) {
@@ -204,8 +195,7 @@ describe('utapi v2 metrics incoming and outgoing bytes', function t() {
204195 }
205196
206197 before ( ( ) => {
207- const config = getConfig ( 'default' , { signatureVersion : 'v4' } ) ;
208- s3Client = new S3 ( config ) ;
198+ s3Client = new S3Client ( getConfig ( 'default' ) ) ;
209199 utapi . start ( ) ;
210200 } ) ;
211201 afterEach ( ( ) => {
0 commit comments