@@ -34,7 +34,7 @@ const archive = {
3434 restoreRequestedDays : 5 ,
3535} ;
3636
37- async function putObjectVersion ( s3 , params , vid , next ) {
37+ function putObjectVersion ( s3 , params , vid , cb ) {
3838 const paramsWithBody = { ...params , Body : '123' } ;
3939 const command = new PutObjectCommand ( paramsWithBody ) ;
4040 command . middlewareStack . add (
@@ -48,13 +48,9 @@ async function putObjectVersion(s3, params, vid, next) {
4848 name : 'addVersionIdHeader' , // Add a name to identify the middleware
4949 }
5050 ) ;
51-
52- try {
53- const res = await s3 . send ( command ) ;
54- next ( null , res ) ;
55- } catch ( err ) {
56- next ( err ) ;
57- }
51+
52+ const promise = s3 . send ( command ) ;
53+ return cb ? promise . then ( res => cb ( null , res ) , cb ) : promise ;
5854}
5955
6056function clearRestoreStatus ( versions ) {
@@ -956,6 +952,68 @@ describe('PUT object with x-scal-s3-version-id header', () => {
956952 } ,
957953 ] , done ) ;
958954 } ) ;
955+
956+ it ( 'should set restore originOp and drop restore-attempt metadata' , done => {
957+ const params = { Bucket : bucketName , Key : objectName } ;
958+
959+ async . series ( [
960+ next => s3 . send ( new PutObjectCommand ( {
961+ ...params ,
962+ Metadata : {
963+ 'custom-md' : 'preserved-value' ,
964+ } ,
965+ } ) ) . then ( ( ) => next ( ) ) . catch ( next ) ,
966+ next => fakeMetadataArchive ( bucketName , objectName , undefined , archive , next ) ,
967+ next => getMetadata ( bucketName , objectName , undefined , ( err , objMD ) => {
968+ if ( err ) {
969+ return next ( err ) ;
970+ }
971+ /* eslint-disable no-param-reassign */
972+ objMD [ 'x-amz-meta-scal-s3-restore-attempt' ] = '3' ;
973+ /* eslint-enable no-param-reassign */
974+ return metadata . putObjectMD ( bucketName , objectName , objMD , undefined , log , next ) ;
975+ } ) ,
976+ next => putObjectVersion ( s3 , params , '' , next ) ,
977+ next => getMetadata ( bucketName , objectName , undefined , ( err , objMD ) => {
978+ if ( err ) {
979+ return next ( err ) ;
980+ }
981+ assert . strictEqual ( objMD . originOp , 's3:ObjectRestore:Completed' ) ;
982+ assert . strictEqual ( objMD [ 'x-amz-meta-custom-md' ] , 'preserved-value' ) ;
983+ assert . strictEqual ( objMD [ 'x-amz-meta-scal-s3-restore-attempt' ] , undefined ) ;
984+ return next ( ) ;
985+ } ) ,
986+ ] , done ) ;
987+ } ) ;
988+
989+ it ( 'should keep x-amz-meta-scal-version-id when restoring on ingestion bucket' , async ( ) => {
990+ const ingestionBucketName = `ingestion-restore-${ Date . now ( ) } ` ;
991+ const params = { Bucket : ingestionBucketName , Key : objectName } ;
992+ let putVersionId ;
993+ try {
994+ await s3 . send ( new CreateBucketCommand ( {
995+ Bucket : ingestionBucketName ,
996+ CreateBucketConfiguration : {
997+ LocationConstraint : 'us-east-2:ingest' ,
998+ } ,
999+ } ) ) ;
1000+
1001+ const putRes = await s3 . send ( new PutObjectCommand ( params ) ) ;
1002+ putVersionId = putRes . VersionId ;
1003+
1004+ await fakeMetadataArchive ( ingestionBucketName , objectName , putVersionId , archive ) ;
1005+
1006+ await putObjectVersion ( s3 , params , putVersionId ) ;
1007+
1008+ const restoredObjMD = await getMetadata (
1009+ ingestionBucketName , objectName , putVersionId ) ;
1010+
1011+ assert . strictEqual ( restoredObjMD [ 'x-amz-meta-scal-version-id' ] , putVersionId ) ;
1012+ } finally {
1013+ await bucketUtil . emptyMany ( [ ingestionBucketName ] ) . catch ( ( ) => { } ) ;
1014+ await bucketUtil . deleteMany ( [ ingestionBucketName ] ) . catch ( ( ) => { } ) ;
1015+ }
1016+ } ) ;
9591017 } ) ;
9601018 } ) ;
9611019} ) ;
0 commit comments