Skip to content

Commit a0a062d

Browse files
authored
feat(bigtable): support requested_policy_version for Instance IAM (#10001)
* iam proposal #3 maintain compatibility with defaultdict remove in place raise KeyError on delete update deprecation for dict-key access and factory methods clean up maintain compatibility - removing duplicate in __setitems__ check for conditions for dict access remove empty binding fix test accessing private var _bindings fix(tests): change version to make existing tests pass tests: add tests for getitem, delitem, setitem on v3 and conditions test policy.bindings property fixlint black sort bindings by role when converting to api repr add deprecation warning for iam factory methods update deprecation message for role methods make Policy#bindings.members a set update policy docs fix docs make docs better fix: Bigtable policy class to use Policy.bindings add from_pb with conditions test add to_pb condition test blacken fix policy __delitem__ add docs on dict access do not modify binding in to_apr_repr * feat(bigtable): support requested_policy_version to instance * fix passing requested_policy_version to pb2 * add unit test * add unit test
1 parent 9b856cf commit a0a062d

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

bigtable/google/cloud/bigtable/instance.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
from google.protobuf import field_mask_pb2
2525

26-
from google.cloud.bigtable_admin_v2.types import instance_pb2
26+
from google.cloud.bigtable_admin_v2.types import instance_pb2, options_pb2
2727

2828
from google.api_core.exceptions import NotFound
2929

@@ -434,7 +434,7 @@ def delete(self):
434434
"""
435435
self._client.instance_admin_client.delete_instance(name=self.name)
436436

437-
def get_iam_policy(self):
437+
def get_iam_policy(self, requested_policy_version=None):
438438
"""Gets the access control policy for an instance resource.
439439
440440
For example:
@@ -443,11 +443,30 @@ def get_iam_policy(self):
443443
:start-after: [START bigtable_get_iam_policy]
444444
:end-before: [END bigtable_get_iam_policy]
445445
446+
:type requested_policy_version: int or ``NoneType``
447+
:param requested_policy_version: Optional. The version of IAM policies to request.
448+
If a policy with a condition is requested without
449+
setting this, the server will return an error.
450+
This must be set to a value of 3 to retrieve IAM
451+
policies containing conditions. This is to prevent
452+
client code that isn't aware of IAM conditions from
453+
interpreting and modifying policies incorrectly.
454+
The service might return a policy with version lower
455+
than the one that was requested, based on the
456+
feature syntax in the policy fetched.
457+
446458
:rtype: :class:`google.cloud.bigtable.policy.Policy`
447459
:returns: The current IAM policy of this instance
448460
"""
461+
args = {"resource": self.name}
462+
if requested_policy_version is not None:
463+
args["options_"] = options_pb2.GetPolicyOptions(
464+
requested_policy_version=requested_policy_version
465+
)
466+
449467
instance_admin_client = self._client.instance_admin_client
450-
resp = instance_admin_client.get_iam_policy(resource=self.name)
468+
469+
resp = instance_admin_client.get_iam_policy(**args)
451470
return Policy.from_pb(resp)
452471

453472
def set_iam_policy(self, policy):

bigtable/tests/unit/test_instance.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,44 @@ def test_get_iam_policy(self):
633633
for found, expected in zip(sorted(admins), sorted(members)):
634634
self.assertEqual(found, expected)
635635

636+
def test_get_iam_policy_w_requested_policy_version(self):
637+
from google.cloud.bigtable_admin_v2.gapic import bigtable_instance_admin_client
638+
from google.iam.v1 import policy_pb2, options_pb2
639+
from google.cloud.bigtable.policy import BIGTABLE_ADMIN_ROLE
640+
641+
credentials = _make_credentials()
642+
client = self._make_client(
643+
project=self.PROJECT, credentials=credentials, admin=True
644+
)
645+
instance = self._make_one(self.INSTANCE_ID, client)
646+
647+
version = 1
648+
etag = b"etag_v1"
649+
members = ["serviceAccount:service_acc1@test.com", "user:user1@test.com"]
650+
bindings = [{"role": BIGTABLE_ADMIN_ROLE, "members": members}]
651+
iam_policy = policy_pb2.Policy(version=version, etag=etag, bindings=bindings)
652+
653+
# Patch the stub used by the API method.
654+
instance_api = mock.create_autospec(
655+
bigtable_instance_admin_client.BigtableInstanceAdminClient
656+
)
657+
client._instance_admin_client = instance_api
658+
instance_api.get_iam_policy.return_value = iam_policy
659+
660+
# Perform the method and check the result.
661+
result = instance.get_iam_policy(requested_policy_version=3)
662+
663+
instance_api.get_iam_policy.assert_called_once_with(
664+
resource=instance.name,
665+
options_=options_pb2.GetPolicyOptions(requested_policy_version=3),
666+
)
667+
self.assertEqual(result.version, version)
668+
self.assertEqual(result.etag, etag)
669+
admins = result.bigtable_admins
670+
self.assertEqual(len(admins), len(members))
671+
for found, expected in zip(sorted(admins), sorted(members)):
672+
self.assertEqual(found, expected)
673+
636674
def test_set_iam_policy(self):
637675
from google.cloud.bigtable_admin_v2.gapic import bigtable_instance_admin_client
638676
from google.iam.v1 import policy_pb2

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy