-
Notifications
You must be signed in to change notification settings - Fork 2k
WIP: refactor(storage): standardize buckets error handling (nodejs-storage migration) #4256
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
angelcaamal
wants to merge
11
commits into
GoogleCloudPlatform:main
Choose a base branch
from
angelcaamal:chore/storage-samples-migration
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+13,793
−0
Draft
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
bc5b01f
chore: add original unmodified storage samples as baseline
angelcaamal 7fafefa
refactor(buckets): standardize error handling for buckets.test.js
angelcaamal 9bd5aed
refactor(acl): standardize error handling and address PR feedback in …
angelcaamal af43faa
refactor(lifecycle): standardize error handling in bucket lifecycle s…
angelcaamal 1439c81
refactor(bucket-lock): standardize error handling and remove dead cod…
angelcaamal 969c66b
refactor(encryption): standardize error handling in encryption samples
angelcaamal d3694dc
refactor(files): standardize error handling and remove dead code in f…
angelcaamal 3df66e6
refactor(hmac-keys): standardize error handling and fix region tags i…
angelcaamal 2b99c0a
refactor(iam): standardize error handling in IAM samples
angelcaamal f220b4d
refactor(notifications): standardize error handling, fix metadata des…
angelcaamal 1feea69
refactor(storage, quickstart, requesterpays): standardize error handl…
angelcaamal File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,109 @@ | ||
| // Copyright 2020 Google LLC | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
|
|
||
| 'use strict'; | ||
|
|
||
| /** | ||
| * This application demonstrates how to perform basic operations on bucket and | ||
| * file Access Control Lists with the Google Cloud Storage API. | ||
| * | ||
| * For more information, see the README.md under /storage and the documentation | ||
| * at https://cloud.google.com/storage/docs. | ||
| */ | ||
|
|
||
| function main( | ||
| bucketName = 'my-bucket', | ||
| roleName = 'roles/storage.objectViewer', | ||
| title = 'match-prefix', | ||
| description = 'Applies to objects matching a prefix', | ||
| expression = 'resource.name.startsWith("projects/_/buckets/bucket-name/objects/prefix-a-")', | ||
| members = 'user:test@example.com' | ||
| ) { | ||
| members = members.split(','); | ||
| // [START storage_add_bucket_conditional_iam_binding] | ||
| /** | ||
| * TODO(developer): Uncomment the following lines before running the sample. | ||
| */ | ||
| // The ID of your GCS bucket | ||
| // const bucketName = 'your-unique-bucket-name'; | ||
|
|
||
| // The role to grant | ||
| // const roleName = 'roles/storage.objectViewer'; | ||
|
|
||
| // The members to grant the new role to | ||
| // const members = [ | ||
| // 'user:jdoe@example.com', | ||
| // 'group:admins@example.com', | ||
| // ]; | ||
|
|
||
| // Create a condition | ||
| // const title = 'Title'; | ||
| // const description = 'Description'; | ||
| // const expression = 'resource.name.startsWith(\"projects/_/buckets/bucket-name/objects/prefix-a-\")'; | ||
|
|
||
| // Imports the Google Cloud client library | ||
| const {Storage} = require('@google-cloud/storage'); | ||
|
|
||
| // Creates a client | ||
| const storage = new Storage(); | ||
|
|
||
| async function addBucketConditionalBinding() { | ||
| try { | ||
| // Get a reference to a Google Cloud Storage bucket | ||
| const bucket = storage.bucket(bucketName); | ||
|
|
||
| // Gets and updates the bucket's IAM policy | ||
| const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3}); | ||
|
|
||
| // Set the policy's version to 3 to use condition in bindings. | ||
| policy.version = 3; | ||
|
|
||
| // Adds the new roles to the bucket's IAM policy | ||
| policy.bindings.push({ | ||
| role: roleName, | ||
| members: members, | ||
| condition: { | ||
| title: title, | ||
| description: description, | ||
| expression: expression, | ||
| }, | ||
| }); | ||
|
|
||
| // Updates the bucket's IAM policy | ||
| await bucket.iam.setPolicy(policy); | ||
|
|
||
| console.log( | ||
| `Added the following member(s) with role ${roleName} to ${bucketName}:` | ||
| ); | ||
|
|
||
| members.forEach(member => { | ||
| console.log(` ${member}`); | ||
| }); | ||
|
|
||
| console.log('with condition:'); | ||
| console.log(` Title: ${title}`); | ||
| console.log(` Description: ${description}`); | ||
| console.log(` Expression: ${expression}`); | ||
| } catch (error) { | ||
| console.error( | ||
| 'Error executing add bucket conditional binding:', | ||
| error.message || error | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| addBucketConditionalBinding(); | ||
| // [END storage_add_bucket_conditional_iam_binding] | ||
| } | ||
| main(...process.argv.slice(2)); | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| // Copyright 2020 Google LLC | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
|
|
||
| 'use strict'; | ||
|
|
||
| /** | ||
| * This application demonstrates how to perform basic operations on bucket and | ||
| * file Access Control Lists with the Google Cloud Storage API. | ||
| * | ||
| * For more information, see the README.md under /storage and the documentation | ||
| * at https://cloud.google.com/storage/docs. | ||
| */ | ||
|
|
||
| function main(bucketName = 'my-bucket', userEmail = 'jdobry@google.com') { | ||
| // [START storage_add_bucket_default_owner] | ||
| /** | ||
| * TODO(developer): Uncomment the following lines before running the sample. | ||
| */ | ||
| // The ID of your GCS bucket | ||
| // const bucketName = 'your-unique-bucket-name'; | ||
|
|
||
| // The email address of the user to add | ||
| // const userEmail = 'user-email-to-add'; | ||
|
|
||
| // Imports the Google Cloud client library | ||
| const {Storage} = require('@google-cloud/storage'); | ||
|
|
||
| // Creates a client | ||
| const storage = new Storage(); | ||
|
|
||
| async function addBucketDefaultOwner() { | ||
| try { | ||
| // Makes the user an owner in the default ACL of the bucket. You can use | ||
| // addAllUsers(), addDomain(), addProject(), addGroup(), and | ||
| // addAllAuthenticatedUsers() to grant access to different types of entities. | ||
| // You can also use "readers" and "writers" to grant different roles. | ||
| await storage.bucket(bucketName).acl.default.owners.addUser(userEmail); | ||
|
|
||
| console.log( | ||
| `Added user ${userEmail} as an owner on bucket ${bucketName}.` | ||
| ); | ||
| } catch (error) { | ||
| console.error( | ||
| 'Error executing add bucket default owner ACL:', | ||
| error.message || error | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| addBucketDefaultOwner(); | ||
| // [END storage_add_bucket_default_owner] | ||
| } | ||
| main(...process.argv.slice(2)); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| // Copyright 2020 Google LLC | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
|
|
||
| 'use strict'; | ||
|
|
||
| function main( | ||
| bucketName = 'my-bucket', | ||
| roleName = 'roles/storage.objectViewer', | ||
| members = 'user:test@example.com' | ||
| ) { | ||
| //including this logic so as to not use yargs | ||
| members = members.split(','); | ||
| // [START storage_add_bucket_iam_member] | ||
| /** | ||
| * TODO(developer): Uncomment the following lines before running the sample. | ||
| */ | ||
| // The ID of your GCS bucket | ||
| // const bucketName = 'your-unique-bucket-name'; | ||
|
|
||
| // The role to grant | ||
| // const roleName = 'roles/storage.objectViewer'; | ||
|
|
||
| // The members to grant the new role to | ||
| // const members = [ | ||
| // 'user:jdoe@example.com', | ||
| // 'group:admins@example.com', | ||
| // ]; | ||
|
|
||
| // Imports the Google Cloud client library | ||
| const {Storage} = require('@google-cloud/storage'); | ||
|
|
||
| // Creates a client | ||
| const storage = new Storage(); | ||
|
|
||
| async function addBucketIamMember() { | ||
| try { | ||
| // Get a reference to a Google Cloud Storage bucket | ||
| const bucket = storage.bucket(bucketName); | ||
|
|
||
| // For more information please read: | ||
| // https://cloud.google.com/storage/docs/access-control/iam | ||
| const [policy] = await bucket.iam.getPolicy({requestedPolicyVersion: 3}); | ||
|
|
||
| // Adds the new roles to the bucket's IAM policy | ||
| policy.bindings.push({ | ||
| role: roleName, | ||
| members: members, | ||
| }); | ||
|
|
||
| // Updates the bucket's IAM policy | ||
| await bucket.iam.setPolicy(policy); | ||
|
|
||
| console.log( | ||
| `Added the following member(s) with role ${roleName} to ${bucketName}:` | ||
| ); | ||
|
|
||
| members.forEach(member => { | ||
| console.log(` ${member}`); | ||
| }); | ||
| } catch (error) { | ||
| console.error( | ||
| 'Error executing add bucket iam member:', | ||
| error.message || error | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| addBucketIamMember(); | ||
| // [END storage_add_bucket_iam_member] | ||
| } | ||
| main(...process.argv.slice(2)); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,69 @@ | ||
| // Copyright 2020 Google LLC | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
|
|
||
| 'use strict'; | ||
|
|
||
| // sample-metadata: | ||
| // title: Storage Add Bucket Label. | ||
| // description: Adds bucket label. | ||
| // usage: node addBucketLabel.js <BUCKET_NAME> <LABEL_KEY> <LABEL_VALUE> | ||
|
|
||
| function main( | ||
| bucketName = 'my-bucket', | ||
| labelKey = 'labelone', | ||
| labelValue = 'labelonevalue' | ||
| ) { | ||
| // [START storage_add_bucket_label] | ||
| /** | ||
| * TODO(developer): Uncomment the following lines before running the sample. | ||
| */ | ||
| // The ID of your GCS bucket | ||
| // const bucketName = 'your-unique-bucket-name'; | ||
|
|
||
| // The key of the label to add | ||
| // const labelKey = 'label-key-to-add'; | ||
|
|
||
| // The value of the label to add | ||
| // const labelValue = 'label-value-to-add'; | ||
|
|
||
| // Imports the Google Cloud client library | ||
| const {Storage} = require('@google-cloud/storage'); | ||
|
|
||
| // Creates a client | ||
| const storage = new Storage(); | ||
|
|
||
| const labels = { | ||
| [labelKey]: labelValue, | ||
| }; | ||
|
|
||
| async function addBucketLabel() { | ||
| try { | ||
| await storage.bucket(bucketName).setMetadata({labels}); | ||
| console.log(`Added label to bucket ${bucketName}`); | ||
| } catch (error) { | ||
| console.error( | ||
| 'Error executing add bucket label:', | ||
| error.message || error | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| addBucketLabel(); | ||
| // [END storage_add_bucket_label] | ||
| } | ||
| process.on('unhandledRejection', err => { | ||
| console.error(err.message); | ||
| process.exitCode = 1; | ||
| }); | ||
| main(...process.argv.slice(2)); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| // Copyright 2020 Google LLC | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
|
|
||
| 'use strict'; | ||
|
|
||
| /** | ||
| * This application demonstrates how to perform basic operations on bucket and | ||
| * file Access Control Lists with the Google Cloud Storage API. | ||
| * | ||
| * For more information, see the README.md under /storage and the documentation | ||
| * at https://cloud.google.com/storage/docs. | ||
| */ | ||
|
|
||
| function main(bucketName = 'my-bucket', userEmail = 'jdobry@google.com') { | ||
| // [START storage_add_bucket_owner] | ||
| /** | ||
| * TODO(developer): Uncomment the following lines before running the sample. | ||
| */ | ||
| // The ID of your GCS bucket | ||
| // const bucketName = 'your-unique-bucket-name'; | ||
|
|
||
| // The email address of the user to add | ||
| // const userEmail = 'user-email-to-add'; | ||
|
|
||
| // Imports the Google Cloud client library | ||
| const {Storage} = require('@google-cloud/storage'); | ||
|
|
||
| // Creates a client | ||
| const storage = new Storage(); | ||
|
|
||
| async function addBucketOwner() { | ||
| try { | ||
| // Makes the user an owner of the bucket. You can use addAllUsers(), | ||
| // addDomain(), addProject(), addGroup(), and addAllAuthenticatedUsers() | ||
| // to grant access to different types of entities. You can also use "readers" | ||
| // and "writers" to grant different roles. | ||
| await storage.bucket(bucketName).acl.owners.addUser(userEmail); | ||
|
|
||
| console.log( | ||
| `Added user ${userEmail} as an owner on bucket ${bucketName}.` | ||
| ); | ||
| } catch (error) { | ||
| console.error( | ||
| 'Error executing add bucket owner ACL:', | ||
| error.message || error | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| addBucketOwner(); | ||
| // [END storage_add_bucket_owner] | ||
| } | ||
| main(...process.argv.slice(2)); |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To standardize error handling and provide more descriptive error messages, please wrap the logic inside
addBucketConditionalBindingin atry...catchblock. This is inconsistent with other new samples likeaddBucketLabel.jswhich use this pattern.