Skip to content

feat(storage): add bucket IP filtering samples and tests - #14594

Open
nidhiii-27 wants to merge 4 commits into
mainfrom
samples-bucket-ip-filter-python
Open

nidhiii-27 wants to merge 4 commits into
mainfrom
samples-bucket-ip-filter-python

Conversation

@nidhiii-27

Copy link
Copy Markdown
Contributor

Add Python code samples and tests demonstrating Cloud Storage Bucket IP filtering.

Fixes: b/544985518

[Generated-by: AI]

Add Python code samples and tests demonstrating Cloud Storage Bucket IP filtering.

Fixes: b/544985518

[Generated-by: AI]
@product-auto-label product-auto-label Bot added api: storage Issues related to the Cloud Storage API. samples Issues that are directly related to samples. labels Sep 9, 2026

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces Python code snippets and tests demonstrating Google Cloud Storage bucket IP filtering features, including creating, enabling, disabling, retrieving, listing, and deleting IP filtering rules. The review feedback highlights several potential bugs and improvement opportunities: handling potential IndexError exceptions when executing the scripts from the command line without arguments, defensively checking for None values to avoid TypeError exceptions on list operations, and refactoring direct self-assignments to prevent linter warnings or accidental code removal that would break the SDK's change registration.

Comment thread storage/samples/snippets/storage_delete_ip_filtering_rules.py Outdated
Comment thread storage/samples/snippets/storage_disable_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_delete_ip_filtering_rules.py Outdated
Comment thread storage/samples/snippets/storage_delete_ip_filtering_rules.py
Comment thread storage/samples/snippets/storage_disable_ip_filtering.py
Comment thread storage/samples/snippets/storage_enable_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_enable_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_enable_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_create_bucket_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_get_ip_filtering.py
Address review feedback regarding self-assignment, defensive None checks, and CLI arg handling.

[Generated-by: AI]
@nidhiii-27
nidhiii-27 marked this pull request as ready for review September 9, 2026 08:53
@nidhiii-27
nidhiii-27 requested review from a team as code owners September 9, 2026 08:53
@snippet-bot

snippet-bot Bot commented Sep 9, 2026 •

Copy link
Copy Markdown

Here is the summary of changes.

You are about to add 6 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

@chandra-siri

Copy link
Copy Markdown
Contributor

why all the kokoro tests are failing ?

@nidhiii-27

Copy link
Copy Markdown
Contributor Author

why all the kokoro tests are failing ?

The kokoro configs have been disabled hence these tests do not run at all.

@shradhakatyal shradhakatyal left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Blocking dependency issue (storage/samples/snippets/requirements.txt):
storage/samples/snippets/requirements.txt currently pins google-cloud-storage==3.1.0, which predates google.cloud.storage.ip_filter (added in 3.3.0). Please bump google-cloud-storage to >=3.3.0 (e.g., 3.14.1) so nox tests do not fail with ModuleNotFoundError.

Comment thread storage/samples/snippets/storage_delete_ip_filtering_rules.py Outdated
Comment thread storage/samples/snippets/bucket_ip_filter_test.py Outdated
Comment thread storage/samples/snippets/bucket_ip_filter_test.py Outdated
Comment thread storage/samples/snippets/storage_disable_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_create_bucket_ip_filtering.py Outdated

@shradhakatyal shradhakatyal left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thank you for addressing the previous inline feedback. Please resolve the remaining dependency version issue in requirements.txt and the inline comments below.

Blocking dependency issue (storage/samples/snippets/requirements.txt):
storage/samples/snippets/requirements.txt currently pins google-cloud-storage==3.1.0. The google.cloud.storage.ip_filter module was added in version 3.3.0. Without updating this dependency, nox test sessions will fail with ModuleNotFoundError.

Comment thread storage/samples/snippets/bucket_ip_filter_test.py
Comment thread storage/samples/snippets/bucket_ip_filter_test.py Outdated
Comment thread storage/samples/snippets/storage_list_buckets_ip_filtering.py Outdated
Comment thread storage/samples/snippets/storage_enable_ip_filtering.py Outdated
…a pattern

- Simplify enable_ip_filtering to take bucket_name only, verify ip_filter exists, set mode to Enabled, reassign, patch, print confirmation, and return bucket.
- Simplify get_ip_filtering to display mode and print serialized ip_filter dictionary.
- Streamline delete_ip_filtering_rules logic by eliminating unnecessary modification flags.
- Remove projection="full" in list_buckets_ip_filtering and handle potential None mode.
- Pin google-cloud-storage==3.14.1 in requirements.txt.
- Update bucket_ip_filter_test.py to match simplified signatures, add None check on public_network_source, and handle IP filter network constraints.

[Generated-by: AI]

@shradhakatyal shradhakatyal left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thank you for updating requirements.txt, storage_list_buckets_ip_filtering.py, and the None check in bucket_ip_filter_test.py. Please address the inline comments below regarding the changes in the latest commit.

Comment on lines +39 to +40
print(f"IP Filter mode: {ip_filter.mode}")
print(f"IP Filter configuration: {ip_filter._to_api_resource()}")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

_to_api_resource() is a private internal helper on IPFilter and should not be used in public documentation samples. Please print the public attributes of IPFilter directly (as done in the previous revision) so users can see how to inspect the configuration fields.

Suggested change
print(f"IP Filter mode: {ip_filter.mode}")
print(f"IP Filter configuration: {ip_filter._to_api_resource()}")
print(f"IP Filter Configuration for {bucket_name}:")
print(f"Mode: {ip_filter.mode}")
print(
f"Allow All Service Agent Access: {ip_filter.allow_all_service_agent_access}"
)
print(f"Allow Cross Org VPCs: {ip_filter.allow_cross_org_vpcs}")
if ip_filter.public_network_source:
print(
"Public CIDR Ranges:"
f" {ip_filter.public_network_source.allowed_ip_cidr_ranges}"
)
if ip_filter.vpc_network_sources:
for vpc in ip_filter.vpc_network_sources:
print(
f"VPC Network: {vpc.network}, CIDR Ranges:"
f" {vpc.allowed_ip_cidr_ranges}"
)

Comment on lines +86 to +90
except (exceptions.Forbidden, exceptions.BadRequest) as e:
pytest.skip(
"Skipping test due to insufficient permissions or IP filter"
f" network restriction: {e}"
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Catching exceptions.BadRequest and calling pytest.skip() will mask 400 Bad Request errors caused by invalid ipFilter payloads in the samples. Please do not skip on BadRequest.

Also, in the test_bucket fixture teardown, please attempt to disable IP filtering before deleting the bucket (similar to the Java test teardown) so buckets are cleaned up if an assertion fails while IP filtering is enabled.

Comment on lines +23 to +43
def enable_ip_filtering(bucket_name: str) -> storage.Bucket:
"""Enables IP filtering on an existing bucket."""
# The ID of your GCS bucket
# bucket_name = "your-bucket-name"

storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)

ip_filter = bucket.ip_filter
if not ip_filter:
print(f"No IP filter configuration found for bucket {bucket_name}.")
return bucket

ip_filter.mode = "Enabled"
# Re-assign to the bucket property to force google-cloud-storage to register
# the nested changes for the patch() call.
bucket.ip_filter = ip_filter
bucket.patch()

print(f"Enabled IP filtering for bucket {bucket.name}.")
return bucket

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The storage_enable_ip_filtering region tag documents how to create or update IP filtering rules on an existing bucket. With the current simplification:

  1. Calling enable_ip_filtering on an existing bucket without pre-configured rules exits early without enabling IP filtering.
  2. None of the samples show how to configure VpcNetworkSource.
  3. In bucket_ip_filter_test.py, vpc_network_to_delete=vpc_network becomes a no-op because vpc_network is never added to the bucket.

Please restore the public_range and vpc_network configuration in enable_ip_filtering (with the if public_range: guard) and update the call in bucket_ip_filter_test.py.

Comment on lines +56 to +57
bucket.ip_filter = ip_filter
bucket.patch()

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nit: Please keep the explanatory comment before bucket.ip_filter = ip_filter (as in storage_enable_ip_filtering.py and storage_disable_ip_filtering.py) so readers understand why re-assigning ip_filter is necessary after mutating ranges in place.

Suggested change
bucket.ip_filter = ip_filter
bucket.patch()
# Re-assign to the bucket property to force google-cloud-storage to register
# the nested changes for the patch() call.
bucket.ip_filter = ip_filter
bucket.patch()

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

Labels

ai-generated api: storage Issues related to the Cloud Storage API. samples Issues that are directly related to samples.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants