Compare commits
3 Commits
developmen
...
feature/ZE
Author | SHA1 | Date |
---|---|---|
Rahul Padigela | fd935a9588 | |
yutaka-oishi | 27904cedac | |
Yutaka Oishi | c5e4c522ca |
4
index.js
4
index.js
|
@ -153,6 +153,10 @@ module.exports = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
utils: require('./lib/storage/utils'),
|
utils: require('./lib/storage/utils'),
|
||||||
|
coldstorage: {
|
||||||
|
ColdStorageWrapper:
|
||||||
|
require('./lib/storage/coldstorage/ColdStorageWrapper'),
|
||||||
|
}
|
||||||
},
|
},
|
||||||
models: {
|
models: {
|
||||||
BackendInfo: require('./lib/models/BackendInfo'),
|
BackendInfo: require('./lib/models/BackendInfo'),
|
||||||
|
|
|
@ -39,6 +39,7 @@ const awsSubresources = [
|
||||||
'replication',
|
'replication',
|
||||||
'versions',
|
'versions',
|
||||||
'website',
|
'website',
|
||||||
|
'restore',
|
||||||
];
|
];
|
||||||
|
|
||||||
function getCanonicalizedResource(request, clientType) {
|
function getCanonicalizedResource(request, clientType) {
|
||||||
|
|
|
@ -5,6 +5,9 @@ const VersionIDUtils = require('../versioning/VersionID');
|
||||||
|
|
||||||
const ObjectMDLocation = require('./ObjectMDLocation');
|
const ObjectMDLocation = require('./ObjectMDLocation');
|
||||||
|
|
||||||
|
const ObjectMDAmzRestore = require('./ObjectMDAmzRestore');
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to manage metadata object for regular s3 objects (instead of
|
* Class to manage metadata object for regular s3 objects (instead of
|
||||||
* mpuPart metadata for example)
|
* mpuPart metadata for example)
|
||||||
|
@ -42,6 +45,7 @@ class ObjectMD {
|
||||||
// set latest md model version now that we ensured
|
// set latest md model version now that we ensured
|
||||||
// backward-compat conversion
|
// backward-compat conversion
|
||||||
this._data['md-model-version'] = constants.mdModelVersion;
|
this._data['md-model-version'] = constants.mdModelVersion;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -102,6 +106,9 @@ class ObjectMD {
|
||||||
// similar to normalizing request but after checkAuth so
|
// similar to normalizing request but after checkAuth so
|
||||||
// string to sign is not impacted. This is GH Issue#89.
|
// string to sign is not impacted. This is GH Issue#89.
|
||||||
'x-amz-storage-class': 'STANDARD',
|
'x-amz-storage-class': 'STANDARD',
|
||||||
|
'x-amz-restore': {
|
||||||
|
'ongoing-request': false,
|
||||||
|
},
|
||||||
'x-amz-server-side-encryption': '',
|
'x-amz-server-side-encryption': '',
|
||||||
'x-amz-server-side-encryption-aws-kms-key-id': '',
|
'x-amz-server-side-encryption-aws-kms-key-id': '',
|
||||||
'x-amz-server-side-encryption-customer-algorithm': '',
|
'x-amz-server-side-encryption-customer-algorithm': '',
|
||||||
|
@ -1033,6 +1040,33 @@ class ObjectMD {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get x-amz-restore
|
||||||
|
*
|
||||||
|
* @returns {ObjectMDAmzRestore} x-amz-restore
|
||||||
|
*/
|
||||||
|
getAmzRestore() {
|
||||||
|
|
||||||
|
return this._data['x-amz-restore'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set x-amz-restore
|
||||||
|
*
|
||||||
|
* @param {ObjectMDAmzRestore} value x-amz-restore object
|
||||||
|
* @returns {ObjectMD} itself
|
||||||
|
* @throws {Error} case of invalid parameter
|
||||||
|
*/
|
||||||
|
setAmzRestore(value) {
|
||||||
|
|
||||||
|
if (value && !(value instanceof ObjectMDAmzRestore)) {
|
||||||
|
throw new Error('x-amz-restore is must be type of ObjectMDAmzRestore.');
|
||||||
|
}
|
||||||
|
|
||||||
|
this._data['x-amz-restore'] = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create or update the microVersionId field
|
* Create or update the microVersionId field
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/**
|
||||||
|
* class representing the x-amz-restore of object metadata.
|
||||||
|
*
|
||||||
|
* @class
|
||||||
|
*/
|
||||||
|
class ObjectMDAmzRestore {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @param {boolean} ongoingRequest ongoing-request
|
||||||
|
* @param {Date} [expiryDate] expiry-date
|
||||||
|
* @throws {Error} case of invalid parameter
|
||||||
|
*/
|
||||||
|
constructor(ongoingRequest, expiryDate = undefined) {
|
||||||
|
|
||||||
|
this._data = {};
|
||||||
|
this.setOngoingRequest(ongoingRequest);
|
||||||
|
this.setExpirayDate(expiryDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {boolean} ongoing-request
|
||||||
|
*/
|
||||||
|
getOngoingRequest() {
|
||||||
|
|
||||||
|
return this._data['ongoing-request'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {boolean} value ongoing-request
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {Error} case of invalid parameter
|
||||||
|
*/
|
||||||
|
setOngoingRequest(value) {
|
||||||
|
|
||||||
|
if (!value) {
|
||||||
|
throw new Error('ongoing-request is required.');
|
||||||
|
} else if (typeof value !== 'boolean') {
|
||||||
|
throw new Error('ongoing-request is must be type of boolean.');
|
||||||
|
}
|
||||||
|
|
||||||
|
this._data['ongoing-request'] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Date} expiry-date
|
||||||
|
*/
|
||||||
|
getExpiryDate() {
|
||||||
|
|
||||||
|
return this._data['expiry-date'] || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {Date} value expiry-date
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {Error} case of invalid parameter
|
||||||
|
*/
|
||||||
|
setExpiryDate(value) {
|
||||||
|
|
||||||
|
if (!(value instanceof Date)) {
|
||||||
|
throw new Error('expiry-date is must be type of Date.');
|
||||||
|
}
|
||||||
|
|
||||||
|
this._data['expiry-date'] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ObjectMDAmzRestore;
|
|
@ -47,6 +47,14 @@ function routePOST(request, response, api, log) {
|
||||||
corsHeaders));
|
corsHeaders));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// POST Object restore
|
||||||
|
if (request.query.restore !== undefined) {
|
||||||
|
return api.callApiMethod('objectRestore', request, response,
|
||||||
|
log, (err, statusCode, resHeaders) =>
|
||||||
|
routesUtils.responseNoBody(err, resHeaders, response,
|
||||||
|
statusCode, log));
|
||||||
|
}
|
||||||
|
|
||||||
return routesUtils.responseNoBody(errors.NotImplemented, null, response,
|
return routesUtils.responseNoBody(errors.NotImplemented, null, response,
|
||||||
200, log);
|
200, log);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
const errors = require('../../errors');
|
||||||
|
|
||||||
|
const ColdStorageFileInterface = require('./file/ColdStorageFileInterface');
|
||||||
|
|
||||||
|
class ColdStorageWrapper {
|
||||||
|
constructor(clientName, params, logger) {
|
||||||
|
if (clientName === 'file') {
|
||||||
|
this.client = new ColdStorageFileInterface(params, logger);
|
||||||
|
this.implName = 'coldstorageFile';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setup(done) {
|
||||||
|
if (this.client.setup) {
|
||||||
|
return this.client.setup(done);
|
||||||
|
}
|
||||||
|
return process.nextTick(done);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateAmzStorageClass(bucketName, objName, objMD, storageClass, log, cb) {
|
||||||
|
if (this.client.updateAmzStorageClass){
|
||||||
|
log.debug('try to update x-amz-storage-class');
|
||||||
|
this.client.updateAmzStorageClass(bucketName, objName, objMD, storageClass, log, err => {
|
||||||
|
if (err) {
|
||||||
|
log.debug('error from metadata', { implName: this.implName,
|
||||||
|
error: err });
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
log.trace('update x-amz-storage-class complete. : ' + storageClass);
|
||||||
|
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRestoreExpiration(bucketName, objName, objMD, log, cb){
|
||||||
|
if (this.client.updateRestoreExpiration){
|
||||||
|
log.debug('try to update restore enpire-date');
|
||||||
|
this.client.updateRestoreExpiration(bucketName, objName, objMD, storageClass, log, err => {
|
||||||
|
if (err) {
|
||||||
|
log.debug('error from metadata', { implName: this.implName,
|
||||||
|
error: err });
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
log.trace('update restore enpire-date complete. : ' + storageClass);
|
||||||
|
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRestoreOngoing(bucketName, objName, objMD, updateParam, log, cb){
|
||||||
|
if (this.client.updateRestoreOngoing){
|
||||||
|
log.debug('try to update restore ongoing-request');
|
||||||
|
this.client.updateRestoreOngoing(bucketName, objName, objMD, updateParam, log, err => {
|
||||||
|
if (err) {
|
||||||
|
log.debug('error from metadata', { implName: this.implName,
|
||||||
|
error: err });
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
log.trace('update restore ongoing-request complete. : ' + updateParam);
|
||||||
|
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteAmzRestore(bucketName, objName, objMD, log, cb){
|
||||||
|
if (this.client.deleteAmzRestore){
|
||||||
|
log.debug('try to delete x-amz-restore');
|
||||||
|
this.client.deleteAmzRestore(bucketName, objName, objMD, log, err => {
|
||||||
|
if (err) {
|
||||||
|
log.debug('error from metadata', { implName: this.implName,
|
||||||
|
error: err });
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
log.trace('delete x-amz-restore complete.');
|
||||||
|
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch(newClient, cb) {
|
||||||
|
this.client = newClient;
|
||||||
|
return cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
close(cb) {
|
||||||
|
if (typeof this.client.close === 'function') {
|
||||||
|
return this.client.close(cb);
|
||||||
|
}
|
||||||
|
return cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ColdStorageWrapper;
|
|
@ -0,0 +1,36 @@
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
class ColdStorageFileInterface {
|
||||||
|
|
||||||
|
updateAmzStorageClass(bucketName, objName, objMD, storageClass, log, cb) {
|
||||||
|
|
||||||
|
log.debug('does not support updateAmzStorageClass', {
|
||||||
|
implName: this.implName,
|
||||||
|
});
|
||||||
|
return cb(errors.NotImplemented);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRestoreExpiration(bucketName, objName, objMD, requestParam, log, cb){
|
||||||
|
log.debug('does not support updateRestoreExpiration', {
|
||||||
|
implName: this.implName,
|
||||||
|
});
|
||||||
|
return cb(errors.NotImplemented);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRestoreOngoing(bucketName, objName, objMD, requestParam, log, cb){
|
||||||
|
log.debug('does not support updateRestoreOngoing', {
|
||||||
|
implName: this.implName,
|
||||||
|
});
|
||||||
|
return cb(errors.NotImplemented);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteAmzRestore(bucketName, objName, objMD, log, cb){
|
||||||
|
log.debug('does not support deleteAmzRestore', {
|
||||||
|
implName: this.implName,
|
||||||
|
});
|
||||||
|
return cb(errors.NotImplemented);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ColdStorageFileInterface;
|
|
@ -413,6 +413,7 @@ describe('getAttributes static method', () => {
|
||||||
'x-amz-server-side-encryption-aws-kms-key-id': true,
|
'x-amz-server-side-encryption-aws-kms-key-id': true,
|
||||||
'x-amz-server-side-encryption-customer-algorithm': true,
|
'x-amz-server-side-encryption-customer-algorithm': true,
|
||||||
'x-amz-website-redirect-location': true,
|
'x-amz-website-redirect-location': true,
|
||||||
|
'x-amz-restore': true,
|
||||||
'acl': true,
|
'acl': true,
|
||||||
'key': true,
|
'key': true,
|
||||||
'location': true,
|
'location': true,
|
||||||
|
|
Loading…
Reference in New Issue