8000 Merge pull request #480 from GoogleCloudPlatform/pubsub-iam-samples · comcomhanb/python-docs-samples@037be58 · GitHub
[go: up one dir, main page]

Skip to content

Commit 037be58

Browse files
authored
Merge pull request GoogleCloudPlatform#480 from GoogleCloudPlatform/pubsub-iam-samples
2 parents d1d79c1 + 5833866 commit 037be58

File tree

2 files changed

+283
-0
lines changed

2 files changed

+283
-0
lines changed

pubsub/cloud-client/iam.py

Lines changed: 182 additions & 0 deletions
< 9E88 /tr>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
#!/usr/bin/env python
2+
3+
# Copyright 2016 Google Inc. All Rights Reserved.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
"""This application demonstrates how to perform basic operations on IAM
18+
policies with the Cloud Pub/Sub API.
19+
20+
For more information, see the README.md under /pubsub and the documentation
21+
at https://cloud.google.com/pubsub/docs.
22+
"""
23+
24+
import argparse
25+
26+
from gcloud import pubsub
27+
28+
29+
def get_topic_policy(topic_name):
30+
"""Prints the IAM policy for the given topic."""
31+
pubsub_client = pubsub.Client()
32+
topic = pubsub_client.topic(topic_name)
33+
34+
policy = topic.get_iam_policy()
35+
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))
43+
44+
45+
def get_subscription_policy(topic_name, subscription_name):
46+
"""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)
50+
51+
policy = subscription.get_iam_policy()
52+
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))
61+
62+
63+
def set_topic_policy(topic_name):
64+
"""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()
68+
69+
# Add all users as viewers.
70+
policy.viewers.add(policy.all_users())
71+
# Add a group as editors.
72+
policy.editors.add(policy.group('cloud-logs@google.com'))
73+
74+
# Set the policy
75+
topic.set_iam_policy(policy)
76+
77+
print('IAM policy for topic {} set.'.format(topic.name))
78+
79+
80+
def set_subscription_policy(topic_name, subscription_name):
81+
"""Sets the IAM policy for a topic."""
82+
pubsub_client = pubsub.Client()
83+
topic = pubsub_client.topic(topic_name)
84+
subscription = topic.subscription(subscription_name)
85+
policy = subscription.get_iam_policy()
86+
87+
# Add all users as viewers.
88+
policy.viewers.add(policy.all_users())
89+
# Add a group as editors.
90+
policy.editors.add(policy.group('cloud-logs@google.com'))
91+
92+
# Set the policy
93+
subscription.set_iam_policy(policy)
94+
95+
print('IAM policy for subscription {} on topic {} set.'.format(
96+
topic.name, subscription.name))
97+
98+
99+
def check_topic_permissions(topic_name):
100+
"""Checks to which permissions are available on the given topic."""
101+
pubsub_client = pubsub.Client()
102+
topic = pubsub_client.topic(topic_name)
103+
104+
permissions_to_check = [
105+
'pubsub.topics.publish',
106+
'pubsub.topics.update'
107+
]
108+
109+
allowed_permissions = topic.check_iam_permissions(permissions_to_check)
110+
111+
print('Allowed permissions for topic {}: {}'.format(
112+
topic.name, allowed_permissions))
113+
114+
115+
def check_subscription_permissions(topic_name, subscription_name):
116+
"""Checks to which permissions are available on the given subscription."""
117+
pubsub_client = pubsub.Client()
118+
topic = pubsub_client.topic(topic_name)
119+
subscription = topic.subscription(subscription_name)
120+
121+
permissions_to_check = [
122+
'pubsub.subscriptions.consume',
123+
'pubsub.subscriptions.update'
124+
]
125+
126+
allowed_permissions = subscription.check_iam_permissions(
127+
permissions_to_check)
128+
129+
print('Allowed permissions for subscription {} on topic {}: {}'.format(
130+
subscription.name, topic.name, allowed_permissions))
131+
132+
133+
if __name__ == '__main__':
134+
parser = argparse.ArgumentParser(
135+
description=__doc__,
136+
formatter_class=argparse.RawDescriptionHelpFormatter
137+
)
138+
139+
subparsers = parser.add_subparsers(dest='command')
140+
141+
get_topic_policy_parser = subparsers.add_parser(
142+
'get-topic-policy', help=get_topic_policy.__doc__)
143+
get_topic_policy_parser.add_argument('topic_name')
144+
145+
get_subscription_policy_parser = subparsers.add_parser(
146+
'get-subscription-policy', help=get_subscription_policy.__doc__)
147+
get_subscription_policy_parser.add_argument('topic_name')
148+
get_subscription_policy_parser.add_argument('subscription_name')
149+
150+
set_topic_policy_parser = subparsers.add_parser(
151+
'set-topic-policy', help=set_topic_policy.__doc__)
152+
set_topic_policy_parser.add_argument('topic_name')
153+
154+
set_subscription_policy_parser = subparsers.add_parser(
155+
'set-subscription-policy', help=set_subscription_policy.__doc__)
156+
set_subscription_policy_parser.add_argument('topic_name')
157+
set_subscription_policy_parser.add_argument('subscription_name')
158+
159+
check_topic_permissions_parser = subparsers.add_parser(
160+
'check-topic-permissions', help=check_topic_permissions.__doc__)
161+
check_topic_permissions_parser.add_argument('topic_name')
162+
163+
check_subscription_permissions_parser = subparsers.add_parser(
164+
'check-subscription-permissions',
165+
help=check_subscription_permissions.__doc__)
166+
check_subscription_permissions_parser.add_argument('topic_name')
167+
check_subscription_permissions_parser.add_argument('subscription_name')
168+
169+
args = parser.parse_args()
170+
171+
if args.command == 'get-topic-policy':
172+
get_topic_policy(args.topic_name)
173+
elif args.command == 'get-subscription-policy':
174+
get_subscription_policy(args.topic_name, args.subscription_name)
175+
elif args.command == 'set-topic-policy':
176+
set_topic_policy(args.topic_name)
177+
elif args.command == 'set-subscription-policy':
178+
set_subscription_policy(args.topic_name, args.subscription_name)
179+
elif args.command == 'check-topic-permissions':
180+
check_topic_permissions(args.topic_name)
181+
elif args.command == 'check-subscription-permissions':
182+
check_subscription_permissions(args.topic_name, args.subscription_name)

pubsub/cloud-client/iam_test.py

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Copyright 2016 Google Inc. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
from gcloud import pubsub
16+
import pytest
17+
18+
import iam
19+
20+
TEST_TOPIC = 'iam-test-topic'
21+
TEST_SUBSCRIPTION = 'iam-test-subscription'
22+
23+
24+
@pytest.fixture
25+
def test_topic():
26+
client = pubsub.Client()
27+
topic = client.topic(TEST_TOPIC)
28+
topic.create()
29+
yield topic
30+
if topic.exists():
31+
topic.delete()
32+
33+
34+
@pytest.fixture
35+
def test_subscription(test_topic):
36+
subscription = test_topic.subscription(TEST_SUBSCRIPTION)
37+
yield subscription
38+
if subscription.exists():
39+
subscription.delete()
40+
41+
42+
def test_get_topic_policy(test_topic, capsys):
43+
iam.get_topic_policy(test_topic.name)
44+
45+
out, _ = capsys.readouterr()
46+
assert test_topic.name in out
47+
48+
49+
def test_get_subscription_policy(test_subscription, capsys):
50+
test_subscription.create()
51+
52+
iam.get_subscription_policy(
53+
test_subscription.topic.name,
54+
test_subscription.name)
55+
56+
out, _ = capsys.readouterr()
57+
assert test_subscription.topic.name in out
58+
assert test_subscription.name in out
59+
60+
61+
def test_set_topic_policy(test_topic):
62+
iam.set_topic_policy(test_topic.name)
63+
64+
policy = test_topic.get_iam_policy()
65+
assert policy.viewers
66+
assert policy.editors
67+
68+
69+
def test_set_subscript EB61 ion_policy(test_subscription):
70+
test_subscription.create()
71+
72+
iam.set_subscription_policy(
73+
test_subscription.topic.name,
74+
test_subscription.name)
75+
76+
policy = test_subscription.get_iam_policy()
77+
assert policy.viewers
78+
assert policy.editors
79+
80+
81+
def test_check_topic_permissions(test_topic, capsys):
82+
iam.check_topic_permissions(test_topic.name)
83+
84+
out, _ = capsys.readouterr()
85+
86+
assert test_topic.name in out
87+
assert 'pubsub.topics.publish' in out
88+
89+
90+
def test_check_subscription_permissions(test_subscription, capsys):
91+
test_subscription.create()
92+
93+
iam.check_subscription_permissions(
94+
test_subscription.topic.name,
95+
test_subscription.name)
96+
97+
out, _ = capsys.readouterr()
98+
99+
assert test_subscription.topic.name in out
100+
assert test_subscription.name in out
101+
assert 'pubsub.subscriptions.consume' in out

0 commit comments

Comments
 (0)
0