From 4e5726fe60ecede6bec6508e4b4ec214f2e173dd Mon Sep 17 00:00:00 2001 From: Denis DelGrosso <85250797+ddelgrosso1@users.noreply.github.com> Date: Fri, 3 May 2024 15:50:34 -0400 Subject: [PATCH 1/3] feat: add ability to enable hierarchical namespace on buckets (#2453) * feat: add ability to enable hierarchical namespace on buckets * specify uniform bucket level access in hierarchical namespace test * remove describe.only --- src/bucket.ts | 3 +++ src/storage.ts | 11 +++++++++++ system-test/storage.ts | 44 ++++++++++++++++++++++++++++++++++++++++++ test/index.ts | 15 ++++++++++++++ 4 files changed, 73 insertions(+) diff --git a/src/bucket.ts b/src/bucket.ts index d4321e072..7ea33e957 100644 --- a/src/bucket.ts +++ b/src/bucket.ts @@ -308,6 +308,9 @@ export interface BucketMetadata extends BaseMetadata { encryption?: { defaultKmsKeyName?: string; } | null; + hierarchicalNamespace?: { + enabled?: boolean; + }; iamConfiguration?: { publicAccessPrevention?: string; uniformBucketLevelAccess?: { diff --git a/src/storage.ts b/src/storage.ts index f13c37acc..a7027bc83 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -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; @@ -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}. diff --git a/system-test/storage.ts b/system-test/storage.ts index 5bee90e5e..cd184f4bc 100644 --- a/system-test/storage.ts +++ b/system-test/storage.ts @@ -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 () => { diff --git a/test/index.ts b/test/index.ts index e09814ad6..72637a466 100644 --- a/test/index.ts +++ b/test/index.ts @@ -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) => { From 13e29f768e41565346504fde4693ddddbb2cef2a Mon Sep 17 00:00:00 2001 From: Denis DelGrosso <85250797+ddelgrosso1@users.noreply.github.com> Date: Fri, 3 May 2024 15:50:47 -0400 Subject: [PATCH 2/3] chore(deps): replace ent with html-entities to avoid punycode deprecation warnings (#2451) --- package.json | 3 +-- src/nodejs-common/util.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 17c3edb72..9781284e4 100644 --- a/package.json +++ b/package.json @@ -78,10 +78,10 @@ "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", - "ent": "^2.2.0", "fast-xml-parser": "^4.3.0", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", "mime": "^3.0.0", "p-limit": "^3.0.1", "retry-request": "^7.0.0", @@ -95,7 +95,6 @@ "@grpc/grpc-js": "^1.0.3", "@grpc/proto-loader": "^0.7.0", "@types/async-retry": "^1.4.3", - "@types/ent": "^2.2.1", "@types/mime": "^3.0.0", "@types/mocha": "^9.1.1", "@types/mockery": "^1.4.29", diff --git a/src/nodejs-common/util.ts b/src/nodejs-common/util.ts index 555c5be67..aec0b2f50 100644 --- a/src/nodejs-common/util.ts +++ b/src/nodejs-common/util.ts @@ -22,7 +22,7 @@ import { replaceProjectIdToken, MissingProjectIdError, } from '@google-cloud/projectify'; -import * as ent from 'ent'; +import * as htmlEntities from 'html-entities'; import {AuthClient, GoogleAuth, GoogleAuthOptions} from 'google-auth-library'; import {CredentialBody} from 'google-auth-library'; import * as r from 'teeny-request'; @@ -311,7 +311,7 @@ export class ApiError extends Error { if (errors && errors.length) { errors.forEach(({message}) => messages.add(message!)); } else if (err.response && err.response.body) { - messages.add(ent.decode(err.response.body.toString())); + messages.add(htmlEntities.decode(err.response.body.toString())); } else if (!err.message) { messages.add('A failure occurred during this request.'); } From dad4dda1d346f1044fd488913614bb92accfd47e Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 09:50:17 -0400 Subject: [PATCH 3/3] chore(main): release 7.11.0 (#2455) * chore(main): release 7.11.0 * fix merge issue --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Denis DelGrosso --- CHANGELOG.md | 7 +++++++ package.json | 2 +- samples/package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e500c6ee0..49bf23085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://www.npmjs.com/package/@google-cloud/storage?activeTab=versions +## [7.11.0](https://github.com/googleapis/nodejs-storage/compare/v7.10.2...v7.11.0) (2024-05-03) + + +### Features + +* Add ability to enable hierarchical namespace on buckets ([#2453](https://github.com/googleapis/nodejs-storage/issues/2453)) ([4e5726f](https://github.com/googleapis/nodejs-storage/commit/4e5726fe60ecede6bec6508e4b4ec214f2e173dd)) + ## [7.10.2](https://github.com/googleapis/nodejs-storage/compare/v7.10.1...v7.10.2) (2024-04-26) diff --git a/package.json b/package.json index 9781284e4..a4f2fe49b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@google-cloud/storage", "description": "Cloud Storage Client Library for Node.js", - "version": "7.10.2", + "version": "7.11.0", "license": "Apache-2.0", "author": "Google Inc.", "engines": { diff --git a/samples/package.json b/samples/package.json index 2518ca5a6..2734ab2ad 100644 --- a/samples/package.json +++ b/samples/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@google-cloud/pubsub": "^4.0.0", - "@google-cloud/storage": "^7.10.2", + "@google-cloud/storage": "^7.11.0", "node-fetch": "^2.6.7", "uuid": "^8.0.0", "yargs": "^16.0.0"