Skip to content

Commit 4506b59

Browse files
Jon Wayne Parrottplamut
Jon Wayne Parrott
authored andcommitted
1 parent ef58554 commit 4506b59

9 files changed

+460
-283
lines changed

samples/snippets/iam.py

+67-71
Original file line numberDiff line numberDiff line change
@@ -23,122 +23,121 @@
2323

2424
import argparse
2525

26-
from google.cloud import pubsub
26+
from google.cloud import pubsub_v1
2727

2828

29-
def get_topic_policy(topic_name):
29+
def get_topic_policy(project, topic_name):
3030
"""Prints the IAM policy for the given topic."""
31-
pubsub_client = pubsub.Client()
32-
topic = pubsub_client.topic(topic_name)
31+
client = pubsub_v1.PublisherClient()
32+
topic_path = client.topic_path(project, topic_name)
3333

34-
policy = topic.get_iam_policy()
34+
policy = client.get_iam_policy(topic_path)
3535

36-
print('Policy for topic {}:'.format(topic.name))
37-
print('Version: {}'.format(policy.version))
38-
print('Owners: {}'.format(policy.owners))
39-
print('Editors: {}'.format(policy.editors))
40-
print('Viewers: {}'.format(policy.viewers))
41-
print('Publishers: {}'.format(policy.publishers))
42-
print('Subscribers: {}'.format(policy.subscribers))
36+
print('Policy for topic {}:'.format(topic_path))
37+
for binding in policy.bindings:
38+
print('Role: {}, Members: {}'.format(binding.role, binding.members))
4339

4440

45-
def get_subscription_policy(topic_name, subscription_name):
41+
def get_subscription_policy(project, subscription_name):
4642
"""Prints the IAM policy for the given subscription."""
47-
pubsub_client = pubsub.Client()
48-
topic = pubsub_client.topic(topic_name)
49-
subscription = topic.subscription(subscription_name)
43+
client = pubsub_v1.SubscriberClient()
44+
subscription_path = client.subscription_path(project, subscription_name)
5045

51-
policy = subscription.get_iam_policy()
46+
policy = client.get_iam_policy(subscription_path)
5247

53-
print('Policy for subscription {} on topic {}:'.format(
54-
subscription.name, topic.name))
55-
print('Version: {}'.format(policy.version))
56-
print('Owners: {}'.format(policy.owners))
57-
print('Editors: {}'.format(policy.editors))
58-
print('Viewers: {}'.format(policy.viewers))
59-
print('Publishers: {}'.format(policy.publishers))
60-
print('Subscribers: {}'.format(policy.subscribers))
48+
print('Policy for subscription {}:'.format(subscription_path))
49+
for binding in policy.bindings:
50+
print('Role: {}, Members: {}'.format(binding.role, binding.members))
6151

6252

63-
def set_topic_policy(topic_name):
53+
def set_topic_policy(project, topic_name):
6454
"""Sets the IAM policy for a topic."""
65-
pubsub_client = pubsub.Client()
66-
topic = pubsub_client.topic(topic_name)
67-
policy = topic.get_iam_policy()
55+
client = pubsub_v1.PublisherClient()
56+
topic_path = client.topic_path(project, topic_name)
57+
58+
policy = client.get_iam_policy(topic_path)
6859

6960
# Add all users as viewers.
70-
policy['roles/pubsub.viewer'] = [policy.all_users()]
71-
# Add a group as publisherss.
72-
publishers = policy.get('roles/pubsub.publisher', [])
73-
publishers.add(policy.group('cloud-logs@google.com'))
74-
policy['roles/pubsub.publisher'] = publishers
61+
policy.bindings.add(
62+
role='roles/pubsub.viewer',
63+
members=['allUsers'])
64+
65+
# Add a group as a publisher.
66+
policy.bindings.add(
67+
role='roles/pubsub.publisher',
68+
members=['group:cloud-logs@google.com'])
7569

7670
# Set the policy
77-
topic.set_iam_policy(policy)
71+
policy = client.set_iam_policy(topic_path, policy)
7872

79-
print('IAM policy for topic {} set.'.format(topic.name))
73+
print('IAM policy for topic {} set: {}'.format(
74+
topic_name, policy))
8075

8176

82-
def set_subscription_policy(topic_name, subscription_name):
77+
def set_subscription_policy(project, subscription_name):
8378
"""Sets the IAM policy for a topic."""
84-
pubsub_client = pubsub.Client()
85-
topic = pubsub_client.topic(topic_name)
86-
subscription = topic.subscription(subscription_name)
87-
policy = subscription.get_iam_policy()
79+
client = pubsub_v1.SubscriberClient()
80+
subscription_path = client.subscription_path(project, subscription_name)
81+
82+
policy = client.get_iam_policy(subscription_path)
8883

8984
# Add all users as viewers.
90-
policy['roles/viewer'] = [policy.all_users()]
91-
# # Add a group as editors.
92-
editors = policy.get('roles/editor', [])
93-
editors.add(policy.group('cloud-logs@google.com'))
94-
policy['roles/editor'] = editors
85+
policy.bindings.add(
86+
role='roles/pubsub.viewer',
87+
members=['allUsers'])
88+
89+
# Add a group as an editor.
90+
policy.bindings.add(
91+
role='roles/editor',
92+
members=['group:cloud-logs@google.com'])
9593

9694
# Set the policy
97-
subscription.set_iam_policy(policy)
95+
policy = client.set_iam_policy(subscription_path, policy)
9896

99-
print('IAM policy for subscription {} on topic {} set.'.format(
100-
topic.name, subscription.name))
97+
print('IAM policy for subscription {} set: {}'.format(
98+
subscription_name, policy))
10199

102100

103-
def check_topic_permissions(topic_name):
101+
def check_topic_permissions(project, topic_name):
104102
"""Checks to which permissions are available on the given topic."""
105-
pubsub_client = pubsub.Client()
106-
topic = pubsub_client.topic(topic_name)
103+
client = pubsub_v1.PublisherClient()
104+
topic_path = client.topic_path(project, topic_name)
107105

108106
permissions_to_check = [
109107
'pubsub.topics.publish',
110108
'pubsub.topics.update'
111109
]
112110

113-
allowed_permissions = topic.check_iam_permissions(permissions_to_check)
111+
allowed_permissions = client.test_iam_permissions(
112+
topic_path, permissions_to_check)
114113

115114
print('Allowed permissions for topic {}: {}'.format(
116-
topic.name, allowed_permissions))
115+
topic_path, allowed_permissions))
117116

118117

119-
def check_subscription_permissions(topic_name, subscription_name):
118+
def check_subscription_permissions(project, subscription_name):
120119
"""Checks to which permissions are available on the given subscription."""
121-
pubsub_client = pubsub.Client()
122-
topic = pubsub_client.topic(topic_name)
123-
subscription = topic.subscription(subscription_name)
120+
client = pubsub_v1.SubscriberClient()
121+
subscription_path = client.subscription_path(project, subscription_name)
124122

125123
permissions_to_check = [
126124
'pubsub.subscriptions.consume',
127125
'pubsub.subscriptions.update'
128126
]
129127

130-
allowed_permissions = subscription.check_iam_permissions(
131-
permissions_to_check)
128+
allowed_permissions = client.test_iam_permissions(
129+
subscription_path, permissions_to_check)
132130

133-
print('Allowed permissions for subscription {} on topic {}: {}'.format(
134-
subscription.name, topic.name, allowed_permissions))
131+
print('Allowed permissions for subscription {}: {}'.format(
132+
subscription_path, allowed_permissions))
135133

136134

137135
if __name__ == '__main__':
138136
parser = argparse.ArgumentParser(
139137
description=__doc__,
140138
formatter_class=argparse.RawDescriptionHelpFormatter
141139
)
140+
parser.add_argument('project', help='Your Google Cloud project ID')
142141

143142
subparsers = parser.add_subparsers(dest='command')
144143

@@ -148,7 +147,6 @@ def check_subscription_permissions(topic_name, subscription_name):
148147

149148
get_subscription_policy_parser = subparsers.add_parser(
150149
'get-subscription-policy', help=get_subscription_policy.__doc__)
151-
get_subscription_policy_parser.add_argument('topic_name')
152150
get_subscription_policy_parser.add_argument('subscription_name')
153151

154152
set_topic_policy_parser = subparsers.add_parser(
@@ -157,7 +155,6 @@ def check_subscription_permissions(topic_name, subscription_name):
157155

158156
set_subscription_policy_parser = subparsers.add_parser(
159157
'set-subscription-policy', help=set_subscription_policy.__doc__)
160-
set_subscription_policy_parser.add_argument('topic_name')
161158
set_subscription_policy_parser.add_argument('subscription_name')
162159

163160
check_topic_permissions_parser = subparsers.add_parser(
@@ -167,20 +164,19 @@ def check_subscription_permissions(topic_name, subscription_name):
167164
check_subscription_permissions_parser = subparsers.add_parser(
168165
'check-subscription-permissions',
169166
help=check_subscription_permissions.__doc__)
170-
check_subscription_permissions_parser.add_argument('topic_name')
171167
check_subscription_permissions_parser.add_argument('subscription_name')
172168

173169
args = parser.parse_args()
174170

175171
if args.command == 'get-topic-policy':
176-
get_topic_policy(args.topic_name)
172+
get_topic_policy(args.project, args.topic_name)
177173
elif args.command == 'get-subscription-policy':
178-
get_subscription_policy(args.topic_name, args.subscription_name)
174+
get_subscription_policy(args.project, args.subscription_name)
179175
elif args.command == 'set-topic-policy':
180-
set_topic_policy(args.topic_name)
176+
set_topic_policy(args.project, args.topic_name)
181177
elif args.command == 'set-subscription-policy':
182-
set_subscription_policy(args.topic_name, args.subscription_name)
178+
set_subscription_policy(args.project, args.subscription_name)
183179
elif args.command == 'check-topic-permissions':
184-
check_topic_permissions(args.topic_name)
180+
check_topic_permissions(args.project, args.topic_name)
185181
elif args.command == 'check-subscription-permissions':
186-
check_subscription_permissions(args.topic_name, args.subscription_name)
182+
check_subscription_permissions(args.project, args.subscription_name)

samples/snippets/iam_test.py

+58-52
Original file line numberDiff line numberDiff line change
@@ -12,94 +12,100 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from google.cloud import pubsub
15+
import os
16+
17+
from google.cloud import pubsub_v1
1618
import pytest
1719

1820
import iam
1921

20-
TEST_TOPIC = 'iam-test-topic'
21-
TEST_SUBSCRIPTION = 'iam-test-subscription'
22+
PROJECT = os.environ['GCLOUD_PROJECT']
23+
TOPIC = 'iam-test-topic'
24+
SUBSCRIPTION = 'iam-test-subscription'
2225

2326

2427
@pytest.fixture(scope='module')
25-
def test_topic():
26-
client = pubsub.Client()
27-
topic = client.topic(TEST_TOPIC)
28+
def publisher_client():
29+
yield pubsub_v1.PublisherClient()
2830

29-
if not topic.exists():
30-
topic.create()
3131

32-
yield topic
32+
@pytest.fixture(scope='module')
33+
def topic(publisher_client):
34+
topic_path = publisher_client.topic_path(PROJECT, TOPIC)
3335

34-
if topic.exists():
35-
topic.delete()
36+
try:
37+
publisher_client.delete_topic(topic_path)
38+
except:
39+
pass
3640

41+
publisher_client.create_topic(topic_path)
3742

38-
@pytest.fixture
39-
def test_subscription(test_topic):
40-
subscription = test_topic.subscription(TEST_SUBSCRIPTION)
41-
yield subscription
42-
if subscription.exists():
43-
subscription.delete()
43+
yield topic_path
4444

4545

46-
def test_get_topic_policy(test_topic, capsys):
47-
iam.get_topic_policy(test_topic.name)
46+
@pytest.fixture(scope='module')
47+
def subscriber_client():
48+
yield pubsub_v1.SubscriberClient()
4849

49-
out, _ = capsys.readouterr()
50-
assert test_topic.name in out
5150

51+
@pytest.fixture
52+
def subscription(subscriber_client, topic):
53+
subscription_path = subscriber_client.subscription_path(
54+
PROJECT, SUBSCRIPTION)
55+
56+
try:
57+
subscriber_client.delete_subscription(subscription_path)
58+
except:
59+
pass
5260

53-
def test_get_subscription_policy(test_subscription, capsys):
54-
test_subscription.create()
61+
subscriber_client.create_subscription(subscription_path, topic=topic)
5562

56-
iam.get_subscription_policy(
57-
test_subscription.topic.name,
58-
test_subscription.name)
63+
yield subscription_path
64+
65+
66+
def test_get_topic_policy(topic, capsys):
67+
iam.get_topic_policy(PROJECT, TOPIC)
5968

6069
out, _ = capsys.readouterr()
61-
assert test_subscription.topic.name in out
62-
assert test_subscription.name in out
70+
assert topic in out
71+
6372

73+
def test_get_subscription_policy(subscription, capsys):
74+
iam.get_subscription_policy(PROJECT, SUBSCRIPTION)
75+
76+
out, _ = capsys.readouterr()
77+
assert subscription in out
6478

65-
def test_set_topic_policy(test_topic):
66-
iam.set_topic_policy(test_topic.name)
6779

68-
policy = test_topic.get_iam_policy()
69-
assert policy.viewers
70-
assert policy['roles/pubsub.publisher']
80+
def test_set_topic_policy(publisher_client, topic):
81+
iam.set_topic_policy(PROJECT, TOPIC)
7182

83+
policy = publisher_client.get_iam_policy(topic)
84+
assert 'roles/pubsub.publisher' in str(policy)
85+
assert 'allUsers' in str(policy)
7286

73-
def test_set_subscription_policy(test_subscription):
74-
test_subscription.create()
7587

76-
iam.set_subscription_policy(
77-
test_subscription.topic.name,
78-
test_subscription.name)
88+
def test_set_subscription_policy(subscriber_client, subscription):
89+
iam.set_subscription_policy(PROJECT, SUBSCRIPTION)
7990

80-
policy = test_subscription.get_iam_policy()
81-
assert policy.viewers
82-
assert policy.editors
91+
policy = subscriber_client.get_iam_policy(subscription)
92+
assert 'roles/pubsub.viewer' in str(policy)
93+
assert 'allUsers' in str(policy)
8394

8495

85-
def test_check_topic_permissions(test_topic, capsys):
86-
iam.check_topic_permissions(test_topic.name)
96+
def test_check_topic_permissions(topic, capsys):
97+
iam.check_topic_permissions(PROJECT, TOPIC)
8798

8899
out, _ = capsys.readouterr()
89100

90-
assert test_topic.name in out
101+
assert topic in out
91102
assert 'pubsub.topics.publish' in out
92103

93104

94-
def test_check_subscription_permissions(test_subscription, capsys):
95-
test_subscription.create()
96-
97-
iam.check_subscription_permissions(
98-
test_subscription.topic.name,
99-
test_subscription.name)
105+
def test_check_subscription_permissions(subscription, capsys):
106+
iam.check_subscription_permissions(PROJECT, SUBSCRIPTION)
100107

101108
out, _ = capsys.readouterr()
102109

103-
assert test_subscription.topic.name in out
104-
assert test_subscription.name in out
110+
assert subscription in out
105111
assert 'pubsub.subscriptions.consume' in out

0 commit comments

Comments
 (0)