Skip to content

Commit

Permalink
feat: add ability to enable hierarchical namespace on buckets (#2453)
Browse files Browse the repository at this point in the history
* feat: add ability to enable hierarchical namespace on buckets

* specify uniform bucket level access in hierarchical namespace test

* remove describe.only
  • Loading branch information
ddelgrosso1 authored May 3, 2024
1 parent c267e6b commit 4e5726f
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/bucket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,9 @@ export interface BucketMetadata extends BaseMetadata {
encryption?: {
defaultKmsKeyName?: string;
} | null;
hierarchicalNamespace?: {
enabled?: boolean;
};
iamConfiguration?: {
publicAccessPrevention?: string;
uniformBucketLevelAccess?: {
Expand Down
11 changes: 11 additions & 0 deletions src/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@ export interface CreateBucketRequest {
customPlacementConfig?: CustomPlacementConfig;
dra?: boolean;
enableObjectRetention?: boolean;
hierarchicalNamespace?: {
enabled?: boolean;
};
iamConfiguration?: {
publicAccessPrevention?: string;
uniformBucketLevelAccess?: {
enabled?: boolean;
lockedTime?: string;
};
};
location?: string;
multiRegional?: boolean;
nearline?: boolean;
Expand Down Expand Up @@ -868,6 +878,7 @@ export class Storage extends Service {
* @property {boolean} [dra=false] Specify the storage class as Durable Reduced
* Availability.
* @property {boolean} [enableObjectRetention=false] Specifiy whether or not object retention should be enabled on this bucket.
* @property {object} [hierarchicalNamespace.enabled=false] Specify whether or not to enable hierarchical namespace on this bucket.
* @property {string} [location] Specify the bucket's location. If specifying
* a dual-region, the `customPlacementConfig` property should be set in conjunction.
* For more information, see {@link https://cloud.google.com/storage/docs/locations| Bucket Locations}.
Expand Down
44 changes: 44 additions & 0 deletions system-test/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1512,6 +1512,50 @@ describe('storage', function () {
});
});

describe('bucket hierarchical namespace', async () => {
let bucket: Bucket;

beforeEach(() => {
bucket = storage.bucket(generateName());
});

afterEach(async () => {
try {
await bucket.delete();
} catch {
//Ignore errors
}
});

it('should create a bucket without hierarchical namespace enabled (implicit)', async () => {
await storage.createBucket(bucket.name);
const [metadata] = await bucket.getMetadata();
assert.strictEqual(metadata.hierarchicalNamespace, undefined);
});

it('should create a bucket without hierarchical namespace enabled (explicit)', async () => {
await storage.createBucket(bucket.name, {
hierarchicalNamespace: {enabled: false},
});
const [metadata] = await bucket.getMetadata();
assert.strictEqual(metadata.hierarchicalNamespace, undefined);
});

it('should create a bucket with hierarchical namespace enabled', async () => {
await storage.createBucket(bucket.name, {
hierarchicalNamespace: {enabled: true},
iamConfiguration: {
uniformBucketLevelAccess: {
enabled: true,
},
},
});
const [metadata] = await bucket.getMetadata();
assert(metadata.hierarchicalNamespace);
assert.strictEqual(metadata.hierarchicalNamespace.enabled, true);
});
});

describe('bucket retention policies', () => {
describe('bucket', () => {
it('should create a bucket with a retention policy', async () => {
Expand Down
15 changes: 15 additions & 0 deletions test/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,21 @@ describe('Storage', () => {
storage.createBucket(BUCKET_NAME, {enableObjectRetention: true}, done);
});

it('should allow enabling hierarchical namespace', done => {
storage.request = (
reqOpts: DecorateRequestOptions,
callback: Function
) => {
assert.strictEqual(reqOpts.json.hierarchicalNamespace.enabled, true);
callback();
};
storage.createBucket(
BUCKET_NAME,
{hierarchicalNamespace: {enabled: true}},
done
);
});

describe('storage classes', () => {
it('should expand metadata.archive', done => {
storage.request = (reqOpts: DecorateRequestOptions) => {
Expand Down

0 comments on commit 4e5726f

Please sign in to comment.