Skip to content

Commit 1c40d7b

Browse files
Merge pull request #8330 from tangledbytes/utkarsh/backport/5.16.x/8255
[Backport 5.16] add support for "Server" and "x-noobaa-available-storage-classes" headers
2 parents a15bf2d + ea7379e commit 1c40d7b

File tree

5 files changed

+41
-4
lines changed

5 files changed

+41
-4
lines changed

src/endpoint/endpoint.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ function create_endpoint_handler(init_request_sdk, virtual_hosts, sts) {
234234

235235
/** @type {EndpointHandler} */
236236
const endpoint_request_handler = (req, res) => {
237+
endpoint_utils.set_noobaa_server_header(res);
237238
endpoint_utils.prepare_rest_request(req);
238239
req.virtual_hosts = virtual_hosts;
239240
init_request_sdk(req, res);
@@ -251,6 +252,7 @@ function create_endpoint_handler(init_request_sdk, virtual_hosts, sts) {
251252
};
252253
/** @type {EndpointHandler} */
253254
const endpoint_sts_request_handler = (req, res) => {
255+
endpoint_utils.set_noobaa_server_header(res);
254256
endpoint_utils.prepare_rest_request(req);
255257
init_request_sdk(req, res);
256258
return sts_rest(req, res);

src/endpoint/endpoint_utils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
const querystring = require('querystring');
55
const http_utils = require('../util/http_utils');
6+
const pkg = require('../../package.json');
67

78
function prepare_rest_request(req) {
89
// generate request id, this is lighter than uuid
@@ -38,6 +39,10 @@ function parse_source_url(source_url) {
3839
return { query, bucket, key };
3940
}
4041

42+
function set_noobaa_server_header(res) {
43+
res.setHeader('Server', `NooBaa/${pkg.version}`);
44+
}
4145

4246
exports.prepare_rest_request = prepare_rest_request;
4347
exports.parse_source_url = parse_source_url;
48+
exports.set_noobaa_server_header = set_noobaa_server_header;

src/endpoint/s3/ops/s3_head_bucket.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
/* Copyright (C) 2016 NooBaa */
22
'use strict';
33

4+
const s3_utils = require("../s3_utils");
5+
46
/**
57
* http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketHEAD.html
68
*/
7-
async function head_bucket(req) {
8-
await req.object_sdk.read_bucket({ name: req.params.bucket });
9-
// only called to check for existence
10-
// no headers or reply needed
9+
async function head_bucket(req, res) {
10+
const bucket_info = await req.object_sdk.read_bucket({ name: req.params.bucket });
11+
s3_utils.set_response_supported_storage_classes(res, bucket_info.supported_storage_classes);
1112
}
1213

1314
module.exports = {

src/endpoint/s3/s3_utils.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ const DEFAULT_OBJECT_ACL = Object.freeze({
3636
const XATTR_SORT_SYMBOL = Symbol('XATTR_SORT_SYMBOL');
3737
const base64_regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
3838

39+
const X_NOOBAA_AVAILABLE_STORAGE_CLASSES = 'x-noobaa-available-storage-classes';
40+
3941
function decode_chunked_upload(source_stream) {
4042
const decoder = new ChunkedContentDecoder();
4143
// pipeline will back-propagate errors from the decoder to stop streaming from the source,
@@ -283,6 +285,14 @@ function set_response_object_md(res, object_md) {
283285
}
284286
}
285287

288+
/**
289+
* @param {nb.S3Response} res
290+
* @param {Array<string>} [supported_storage_classes]
291+
*/
292+
function set_response_supported_storage_classes(res, supported_storage_classes = []) {
293+
res.setHeader(X_NOOBAA_AVAILABLE_STORAGE_CLASSES, supported_storage_classes);
294+
}
295+
286296
/**
287297
* @param {nb.S3Request} req
288298
* @returns {nb.StorageClass}
@@ -694,3 +704,4 @@ exports.get_response_field_encoder = get_response_field_encoder;
694704
exports.parse_decimal_int = parse_decimal_int;
695705
exports.parse_restore_request_days = parse_restore_request_days;
696706
exports.parse_version_id = parse_version_id;
707+
exports.set_response_supported_storage_classes = set_response_supported_storage_classes;

src/sdk/bucketspace_fs.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const { CONFIG_SUBDIRS } = require('../manage_nsfs/manage_nsfs_constants');
2222
const KeysSemaphore = require('../util/keys_semaphore');
2323
const native_fs_utils = require('../util/native_fs_utils');
2424
const NoobaaEvent = require('../manage_nsfs/manage_nsfs_events_utils').NoobaaEvent;
25+
const s3_utils = require('../endpoint/s3/s3_utils');
2526

2627
const dbg = require('../util/debug_module')(__filename);
2728
const bucket_semaphore = new KeysSemaphore(1);
@@ -158,6 +159,7 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
158159
id: bucket.owner_account,
159160
email: bucket.bucket_owner
160161
};
162+
bucket.supported_storage_classes = this._supported_storage_class();
161163
if (bucket.s3_policy) {
162164
for (const [s_index, statement] of bucket.s3_policy.Statement.entries()) {
163165
const statement_principal = statement.Principal || statement.NotPrincipal;
@@ -710,6 +712,22 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
710712
throw err;
711713
}
712714
}
715+
716+
/**
717+
* returns a list of storage class supported by this bucketspace
718+
* @returns {Array<string>}
719+
*/
720+
_supported_storage_class() {
721+
const storage_classes = [];
722+
if (!config.DENY_UPLOAD_TO_STORAGE_CLASS_STANDARD) {
723+
storage_classes.push(s3_utils.STORAGE_CLASS_STANDARD);
724+
}
725+
if (config.NSFS_GLACIER_ENABLED) {
726+
storage_classes.push(s3_utils.STORAGE_CLASS_GLACIER);
727+
}
728+
729+
return storage_classes;
730+
}
713731
}
714732

715733
module.exports = BucketSpaceFS;

0 commit comments

Comments
 (0)