Skip to content

Commit df0c64a

Browse files
authored
Merge pull request #8255 from tangledbytes/utkarsh/add-support-for-noobaa-specific-headers
Add support for "Server" and "x-noobaa-available-storage-classes" headers
2 parents dbe6dab + 4e7790f commit df0c64a

File tree

5 files changed

+42
-6
lines changed

5 files changed

+42
-6
lines changed

src/endpoint/endpoint.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ function create_endpoint_handler(init_request_sdk, virtual_hosts, sts, logger) {
269269

270270
/** @type {EndpointHandler} */
271271
const endpoint_request_handler = (req, res) => {
272+
endpoint_utils.set_noobaa_server_header(res);
272273
endpoint_utils.prepare_rest_request(req);
273274
req.virtual_hosts = virtual_hosts;
274275
if (logger) req.bucket_logger = logger;
@@ -287,6 +288,7 @@ function create_endpoint_handler(init_request_sdk, virtual_hosts, sts, logger) {
287288
};
288289
/** @type {EndpointHandler} */
289290
const endpoint_sts_request_handler = (req, res) => {
291+
endpoint_utils.set_noobaa_server_header(res);
290292
endpoint_utils.prepare_rest_request(req);
291293
init_request_sdk(req, res);
292294
return sts_rest(req, res);
@@ -298,6 +300,7 @@ function create_endpoint_handler(init_request_sdk, virtual_hosts, sts, logger) {
298300
function create_endpoint_handler_iam(init_request_sdk) {
299301
/** @type {EndpointHandler} */
300302
const endpoint_iam_request_handler = (req, res) => {
303+
endpoint_utils.set_noobaa_server_header(res);
301304
endpoint_utils.prepare_rest_request(req);
302305
init_request_sdk(req, res);
303306
return iam_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 & 1 deletion
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
/**
4042
* get_default_object_owner returns bucket_owner info if exists
4143
* else it'll return the default owner
@@ -322,6 +324,14 @@ function set_response_object_md(res, object_md) {
322324
}
323325
}
324326

327+
/**
328+
* @param {nb.S3Response} res
329+
* @param {Array<string>} [supported_storage_classes]
330+
*/
331+
function set_response_supported_storage_classes(res, supported_storage_classes = []) {
332+
res.setHeader(X_NOOBAA_AVAILABLE_STORAGE_CLASSES, supported_storage_classes);
333+
}
334+
325335
/**
326336
* @param {nb.S3Request} req
327337
* @returns {nb.StorageClass}
@@ -752,4 +762,4 @@ exports.parse_restore_request_days = parse_restore_request_days;
752762
exports.parse_version_id = parse_version_id;
753763
exports.get_object_owner = get_object_owner;
754764
exports.get_default_object_owner = get_default_object_owner;
755-
765+
exports.set_response_supported_storage_classes = set_response_supported_storage_classes;

src/sdk/bucketspace_fs.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const {
3030
} = require('../util/native_fs_utils');
3131
const NoobaaEvent = require('../manage_nsfs/manage_nsfs_events_utils').NoobaaEvent;
3232
const { anonymous_access_key } = require('./object_sdk');
33+
const s3_utils = require('../endpoint/s3/s3_utils');
3334

3435
const dbg = require('../util/debug_module')(__filename);
3536
const bucket_semaphore = new KeysSemaphore(1);
@@ -141,7 +142,7 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
141142
id: bucket.owner_account,
142143
email: bucket.bucket_owner
143144
};
144-
145+
bucket.supported_storage_classes = this._supported_storage_class();
145146
if (bucket.s3_policy) {
146147
for (const [s_index, statement] of bucket.s3_policy.Statement.entries()) {
147148
const statement_principal = statement.Principal || statement.NotPrincipal;
@@ -744,6 +745,22 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
744745
is_nsfs_non_containerized_user_anonymous(token) {
745746
return !token && process.env.NC_NSFS_NO_DB_ENV;
746747
}
748+
749+
/**
750+
* returns a list of storage class supported by this bucketspace
751+
* @returns {Array<string>}
752+
*/
753+
_supported_storage_class() {
754+
const storage_classes = [];
755+
if (!config.DENY_UPLOAD_TO_STORAGE_CLASS_STANDARD) {
756+
storage_classes.push(s3_utils.STORAGE_CLASS_STANDARD);
757+
}
758+
if (config.NSFS_GLACIER_ENABLED) {
759+
storage_classes.push(s3_utils.STORAGE_CLASS_GLACIER);
760+
}
761+
762+
return storage_classes;
763+
}
747764
}
748765

749766
module.exports = BucketSpaceFS;

0 commit comments

Comments
 (0)