Skip to content

Conversation

@khilan-crest
Copy link

Adding etag samples

Fixes #

Note: Before submitting a pull request, please open an issue for discussion if you are not associated with Google.

Checklist

  • I have followed guidelines from CONTRIBUTING.MD and Samples Style Guide
  • Tests pass: npm test (see Testing)
  • Lint pass: npm run lint (see Style)
  • Required CI tests pass (see CI testing)
  • These samples need a new API enabled in testing projects to pass (let us know which ones)
  • These samples need a new/updated env vars in testing projects set to pass (let us know which ones)
  • This pull request is from a branch created directly off of GoogleCloudPlatform/nodejs-docs-samples. Not a fork.
  • This sample adds a new sample directory, and I updated the CODEOWNERS file with the codeowners for this sample
  • This sample adds a new sample directory, and I created GitHub Actions workflow for this sample
  • This sample adds a new Product API, and I updated the Blunderbuss issue/PR auto-assigner with the codeowners for this sample
  • Please merge this PR for me once it is approved

Note: Any check with (dev), (experimental), or (legacy) can be ignored and should not block your PR from merging (see CI testing).

@khilan-crest khilan-crest requested review from a team as code owners January 21, 2026 15:36
@product-auto-label product-auto-label bot added api: secretmanager Issues related to the Secret Manager API. samples Issues that are directly related to samples. labels Jan 21, 2026
@snippet-bot
Copy link

snippet-bot bot commented Jan 21, 2026

Here is the summary of changes.

You are about to add 35 region tags.

This comment is generated by snippet-bot.
If you find problems with this result, please file an issue at:
https://github.com/googleapis/repo-automation-bots/issues.
To update this comment, add snippet-bot:force-run label or use the checkbox below:

  • Refresh this comment

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @khilan-crest, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly expands the Node.js sample collection for Google Cloud Secret Manager. It introduces a wide array of new functionalities, including advanced secret creation options, lifecycle management (expiration, rotation), concurrency control using ETags, and integration with other Google Cloud services like Pub/Sub and KMS. Furthermore, it provides a complete suite of regional Secret Manager samples, ensuring comprehensive coverage for various deployment scenarios.

Highlights

  • New Secret Management Samples: A comprehensive set of new Node.js samples for Google Cloud Secret Manager has been added, demonstrating various advanced functionalities.
  • ETag Support: Several new samples showcase the use of ETags for optimistic concurrency control when performing operations like deleting secrets, destroying secret versions, and enabling/disabling secret versions.
  • Secret Configuration Options: New samples cover creating secrets with advanced configurations, including Customer-Managed Encryption Keys (CMEK), setting expiration times, defining rotation policies, and integrating with Pub/Sub topics for notifications.
  • Replication Policies: A new sample illustrates how to create secrets with user-managed replication policies, allowing secrets to be replicated across specified locations.
  • Filtering and Listing: Samples for listing secrets and secret versions with specific filters, as well as listing and detaching tag bindings, have been introduced to enhance secret discovery and management.
  • Regional Secret Operations: A dedicated suite of samples for regional Secret Manager operations has been added, mirroring many of the global secret management functionalities to support regional deployments.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request introduces several new samples for Secret Manager, covering features like CMEK, expiration, rotation, user-managed replication, tag bindings, and etag operations for both global and regional secrets and versions. The accompanying test file has been updated to include comprehensive tests for these new functionalities, which is great. However, there are a few minor issues related to asynchronous function calls and type handling that should be addressed.

},
},
ttl: {
seconds: ttl,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The ttl parameter is expected to be a string (e.g., '900s') but is used directly as seconds which expects a number. This will cause a type error. Please parse the ttl string to an integer, similar to how it's handled in createSecret.js.

      ttl: {
        seconds: parseInt(ttl.replace('s', ''), 10),
      },

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


console.log(`Created secret ${secret.name} with CMEK key ${kmsKeyName}`);
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The createRegionalSecretWithCmek function is async, but it's called without await in the main function. This means main might complete before the secret creation is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

Suggested change
await createRegionalSecretWithCmek();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.


enableRegionalSecretVersionWithEtag();
// [END secretmanager_enable_regional_secret_version_with_etag]
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The enableRegionalSecretVersionWithEtag function is async, but it's called without await in the main function. This means main might complete before the version enabling is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

  await enableRegionalSecretVersionWithEtag();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

);
}

createSecretWithExpiration();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The createSecretWithExpiration function is async, but it's called without await in the main function. This means main might complete before the secret creation is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

Suggested change
createSecretWithExpiration();
await createSecretWithExpiration();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

console.log(`Created secret: ${secret.name}`);
}

createUmmrSecret();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The createUmmrSecret function is async, but it's called without await in the main function. This means main might complete before the secret creation is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

  await createUmmrSecret();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.


updateRegionalSecretRotationPeriod();
// [END secretmanager_update_regional_secret_rotation_period]
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The updateRegionalSecretRotationPeriod function is async, but it's called without await in the main function. This means main might complete before the secret update is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

  await updateRegionalSecretRotationPeriod();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

}

updateRegionalSecretWithEtag();
// [END secretmanager_v1_update_regional_secret_with_etag]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The updateRegionalSecretWithEtag function is async, but it's called without await in the main function. This means main might complete before the secret update is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

Suggested change
// [END secretmanager_v1_update_regional_secret_with_etag]
await updateRegionalSecretWithEtag();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

);
}

updateSecretExpiration();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The updateSecretExpiration function is async, but it's called without await in the main function. This means main might complete before the secret update is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

Suggested change
updateSecretExpiration();
await updateSecretExpiration();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

);
}

updateSecretRotation();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The updateSecretRotation function is async, but it's called without await in the main function. This means main might complete before the secret update is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

Suggested change
updateSecretRotation();
await updateSecretRotation();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

}

updateSecretWithEtag();
// [END secretmanager_update_secret_with_etag]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The updateSecretWithEtag function is async, but it's called without await in the main function. This means main might complete before the secret update is finished, potentially leading to unexpected behavior or unhandled rejections. Please await the call.

Suggested change
// [END secretmanager_update_secret_with_etag]
await updateSecretWithEtag();

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

await is added within function wherever required.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api: secretmanager Issues related to the Secret Manager API. samples Issues that are directly related to samples.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant