Skip to content

Commit 2c235a6

Browse files
author
remi Taylor
authored
Merge pull request #35 from GoogleCloudPlatform/jlm/pubsub-iam
Add IAM samples to pubsub.
2 parents b9a54c7 + 9f129bd commit 2c235a6

4 files changed

Lines changed: 197 additions & 50 deletions

File tree

.rubocop.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ Style/NumericLiterals:
7171
Enabled: false
7272
Style/SpaceAroundOperators:
7373
Enabled: false
74+
Style/AccessorMethodName:
75+
Enabled: false
7476
Metrics/ClassLength:
7577
Enabled: false
7678
Style/EmptyElse:

pubsub/Gemfile.lock

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,29 @@
11
GEM
22
remote: https://rubygems.org/
33
specs:
4-
activesupport (4.2.6)
5-
i18n (~> 0.7)
6-
json (~> 1.7, >= 1.7.7)
7-
minitest (~> 5.1)
8-
thread_safe (~> 0.3, >= 0.3.4)
9-
tzinfo (~> 1.1)
104
addressable (2.4.0)
115
ast (2.2.0)
12-
autoparse (0.3.3)
13-
addressable (>= 2.3.1)
14-
extlib (>= 0.9.15)
15-
multi_json (>= 1.0.0)
166
diff-lcs (1.2.5)
177
digest-crc (0.4.1)
18-
extlib (0.9.16)
198
faraday (0.9.2)
209
multipart-post (>= 1.2, < 3)
21-
gcloud (0.11.0)
10+
gcloud (0.12.1)
2211
digest-crc (~> 0.4)
23-
google-api-client (~> 0.8.3)
12+
google-api-client (~> 0.9.11)
2413
google-protobuf (= 3.0.0.alpha.5.0.5.1)
25-
grpc (~> 0.13.1)
26-
mime-types (~> 2.4)
14+
grpc (= 1.0.0.pre1)
15+
mime-types (>= 2.4, < 4.0)
2716
zonefile (~> 1.04)
28-
google-api-client (0.8.6)
29-
activesupport (>= 3.2)
17+
google-api-client (0.9.11)
3018
addressable (~> 2.3)
31-
autoparse (~> 0.3)
32-
extlib (~> 0.9)
33-
faraday (~> 0.9)
34-
googleauth (~> 0.3)
35-
launchy (~> 2.4)
36-
multi_json (~> 1.10)
37-
retriable (~> 1.4)
38-
signet (~> 0.6)
19+
googleauth (~> 0.5)
20+
httpclient (~> 2.7)
21+
hurley (~> 0.1)
22+
memoist (~> 0.11)
23+
mime-types (>= 1.6)
24+
representable (~> 2.3.0)
25+
retriable (~> 2.0)
26+
thor (~> 0.19)
3927
google-protobuf (3.0.0.alpha.5.0.5.1)
4028
googleauth (0.5.1)
4129
faraday (~> 0.9)
@@ -45,21 +33,20 @@ GEM
4533
multi_json (~> 1.11)
4634
os (~> 0.9)
4735
signet (~> 0.7)
48-
grpc (0.13.1)
36+
grpc (1.0.0.pre1)
4937
google-protobuf (~> 3.0.0.alpha.5.0.3)
5038
googleauth (~> 0.5.1)
51-
i18n (0.7.0)
52-
json (1.8.3)
39+
httpclient (2.8.0)
40+
hurley (0.2)
5341
jwt (1.5.4)
54-
launchy (2.4.3)
55-
addressable (~> 2.3)
5642
little-plugger (1.1.4)
5743
logging (2.1.0)
5844
little-plugger (~> 1.1)
5945
multi_json (~> 1.10)
6046
memoist (0.14.0)
61-
mime-types (2.99.2)
62-
minitest (5.9.0)
47+
mime-types (3.1)
48+
mime-types-data (~> 3.2015)
49+
mime-types-data (3.2016.0521)
6350
multi_json (1.12.1)
6451
multipart-post (2.0.0)
6552
os (0.9.6)
@@ -73,7 +60,9 @@ GEM
7360
rack (>= 1.0)
7461
rainbow (2.1.0)
7562
rake (10.5.0)
76-
retriable (1.4.1)
63+
representable (2.3.0)
64+
uber (~> 0.0.7)
65+
retriable (2.1.0)
7766
rspec (3.4.0)
7867
rspec-core (~> 3.4.0)
7968
rspec-expectations (~> 3.4.0)
@@ -102,10 +91,9 @@ GEM
10291
rack (~> 1.5)
10392
rack-protection (~> 1.4)
10493
tilt (>= 1.3, < 3)
105-
thread_safe (0.3.5)
94+
thor (0.19.1)
10695
tilt (2.0.2)
107-
tzinfo (1.2.2)
108-
thread_safe (~> 0.1)
96+
uber (0.0.15)
10997
zonefile (1.04)
11098

11199
PLATFORMS

pubsub/sample.rb

Lines changed: 100 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,31 @@
1919
pubsub = gcloud.pubsub
2020
# [END create_pubsub_client]
2121

22-
# [START create_topic]
2322
def create_topic
23+
# [START create_topic]
2424
gcloud = Gcloud.new "my-gcp-project-id"
2525
pubsub = gcloud.pubsub
2626

2727
topic = pubsub.create_topic "my-topic"
2828

2929
puts "Topic created #{topic.name}"
30+
# [END create_topic]
3031
end
31-
# [END create_topic]
3232

33-
# [START create_subscription]
3433
def create_subscription
34+
# [START create_subscription]
3535
gcloud = Gcloud.new "my-gcp-project-id"
3636
pubsub = gcloud.pubsub
3737
topic = pubsub.topic "my-topic"
3838

3939
subscription = topic.subscribe "my-subscription"
4040

4141
puts "Subscription created #{subscription.name}"
42+
# [END create_subscription]
4243
end
43-
# [END create_subscription]
4444

45-
# [START create_push_subscription]
4645
def create_push_subscription
46+
# [START create_push_subscription]
4747
gcloud = Gcloud.new "my-gcp-project-id"
4848
pubsub = gcloud.pubsub
4949
topic = pubsub.topic "my-topic"
@@ -54,21 +54,21 @@ def create_push_subscription
5454
)
5555

5656
puts "Push subscription created #{subscription.name}"
57+
# [END create_push_subscription]
5758
end
58-
# [END create_push_subscription]
5959

60-
# [START publish_message]
6160
def publish_message
61+
# [START publish_message]
6262
gcloud = Gcloud.new "my-gcp-project-id"
6363
pubsub = gcloud.pubsub
6464
topic = pubsub.topic "my-topic"
6565

6666
topic.publish "A Message"
67+
# [END publish_message]
6768
end
68-
# [END publish_message]
6969

70-
# [START pull_messages]
7170
def pull_messages
71+
# [START pull_messages]
7272
gcloud = Gcloud.new "my-gcp-project-id"
7373
pubsub = gcloud.pubsub
7474
subscription = pubsub.subscription "my-subscription"
@@ -78,11 +78,11 @@ def pull_messages
7878
puts message.data
7979
message.acknowledge!
8080
end
81+
# [END pull_messages]
8182
end
82-
# [END pull_messages]
8383

84-
# [START list_topics]
8584
def list_topics
85+
# [START list_topics]
8686
gcloud = Gcloud.new "my-gcp-project-id"
8787
pubsub = gcloud.pubsub
8888
topics = pubsub.topics
@@ -91,11 +91,11 @@ def list_topics
9191
topics.each do |topic|
9292
puts topic.name
9393
end
94+
# [END list_topics]
9495
end
95-
# [END list_topics]
9696

97-
# [START list_subscriptions]
9897
def list_subscriptions
98+
# [START list_subscriptions]
9999
gcloud = Gcloud.new "my-gcp-project-id"
100100
pubsub = gcloud.pubsub
101101
subscriptions = pubsub.subscriptions
@@ -104,5 +104,91 @@ def list_subscriptions
104104
subscriptions.each do |subscription|
105105
puts subscription.name
106106
end
107+
# [END list_subscriptions]
108+
end
109+
110+
def get_topic_policy
111+
# [START get_topic_policy]
112+
gcloud = Gcloud.new "my-gcp-project-id"
113+
pubsub = gcloud.pubsub
114+
topic = pubsub.topic "my-topic"
115+
116+
policy = topic.policy
117+
118+
puts "Topic policy:"
119+
puts policy.roles
120+
# [END get_topic_policy]
121+
end
122+
123+
def get_subscription_policy
124+
# [START get_subscription_policy]
125+
gcloud = Gcloud.new "my-gcp-project-id"
126+
pubsub = gcloud.pubsub
127+
subscription = pubsub.subscription "my-subscription"
128+
129+
policy = subscription.policy
130+
131+
puts "Subscription policy:"
132+
puts policy.roles
133+
# [END get_subscription_policy]
134+
end
135+
136+
def set_subscription_policy
137+
# [START set_subscription_policy]
138+
gcloud = Gcloud.new "my-gcp-project-id"
139+
pubsub = gcloud.pubsub
140+
subscription = pubsub.subscription "my-subscription"
141+
142+
policy = subscription.policy do |p|
143+
p.add "roles/pubsub.subscriber",
144+
"serviceAccount:account-name@other-project.iam.gserviceaccount.com"
145+
end
146+
147+
puts subscription.policy.roles
148+
# [END set_subscription_policy]
149+
end
150+
151+
def set_topic_policy
152+
# [START set_topic_policy]
153+
gcloud = Gcloud.new "my-gcp-project-id"
154+
pubsub = gcloud.pubsub
155+
topic = pubsub.topic "my-topic"
156+
157+
policy = topic.policy do |p|
158+
p.add "roles/pubsub.publisher",
159+
"serviceAccount:account-name@other-project.iam.gserviceaccount.com"
160+
end
161+
162+
puts topic.policy.roles
163+
# [END set_topic_policy]
164+
end
165+
166+
def test_subscription_permissions
167+
# [START test_subscription_permissions]
168+
gcloud = Gcloud.new "my-gcp-project-id"
169+
pubsub = gcloud.pubsub
170+
subscription = pubsub.subscription "my-subscription"
171+
172+
permissions = subscription.test_permissions "pubsub.subscriptions.consume",
173+
"pubsub.subscriptions.update"
174+
175+
puts permissions.include? "pubsub.subscriptions.consume"
176+
puts permissions.include? "pubsub.subscriptions.update"
177+
# [END test_subscription_permissions]
178+
end
179+
180+
def test_topic_permissions
181+
# [START test_topic_permissions]
182+
gcloud = Gcloud.new "my-gcp-project-id"
183+
pubsub = gcloud.pubsub
184+
topic = pubsub.topic "my-topic"
185+
186+
permissions = topic.test_permissions "pubsub.topics.attachSubscription",
187+
"pubsub.topics.publish",
188+
"pubsub.topics.update"
189+
190+
puts permissions.include? "pubsub.topics.attachSubscription"
191+
puts permissions.include? "pubsub.topics.publish"
192+
puts permissions.include? "pubsub.topics.update"
193+
# [END test_topic_permissions]
107194
end
108-
# [END list_subscriptions]

pubsub/spec/sample_spec.rb

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
describe "Pub/Sub sample" do
1919
TOPIC_NAME = "my-topic"
2020
SUBSCRIPTION_NAME = "my-subscription"
21+
SERVICE_ACCOUNT =
22+
"serviceAccount:test-account@#{ENV['GOOGLE_PROJECT_ID']}"\
23+
".iam.gserviceaccount.com"
2124

2225
before :all do
2326
@gcloud = Gcloud.new ENV["GOOGLE_PROJECT_ID"]
@@ -141,6 +144,74 @@ def expect_with_retry attempts: 5
141144
end
142145
end
143146

147+
it "gets topic policy" do
148+
@pubsub.create_topic TOPIC_NAME
149+
150+
expect { get_topic_policy }.to output(/{}/).to_stdout
151+
end
152+
153+
it "gets subscription policy" do
154+
@pubsub.create_subscription(
155+
TOPIC_NAME,
156+
SUBSCRIPTION_NAME,
157+
autocreate: true
158+
)
159+
160+
expect { get_subscription_policy }.to output(/{}/).to_stdout
161+
end
162+
163+
it "sets topic policy" do
164+
@pubsub.create_topic TOPIC_NAME
165+
166+
expect_any_instance_of(Gcloud::Pubsub::Policy).to \
167+
receive(:add).with(
168+
"roles/pubsub.publisher",
169+
"serviceAccount:account-name@other-project.iam.gserviceaccount.com"
170+
).and_wrap_original do |m|
171+
m.call "roles/pubsub.publisher", SERVICE_ACCOUNT
172+
end
173+
174+
expect { set_topic_policy }.to output(/roles/).to_stdout
175+
176+
expect(@pubsub.topic(TOPIC_NAME).policy.roles).to \
177+
include("roles/pubsub.publisher" => [SERVICE_ACCOUNT])
178+
end
179+
180+
it "sets subscription policy" do
181+
@pubsub.create_subscription(
182+
TOPIC_NAME,
183+
SUBSCRIPTION_NAME,
184+
autocreate: true
185+
)
186+
187+
expect_any_instance_of(Gcloud::Pubsub::Policy).to \
188+
receive(:add).with(
189+
"roles/pubsub.subscriber",
190+
"serviceAccount:account-name@other-project.iam.gserviceaccount.com"
191+
).and_wrap_original do |m|
192+
m.call "roles/pubsub.subscriber", SERVICE_ACCOUNT
193+
end
194+
195+
expect { set_subscription_policy }.to output(/roles/).to_stdout
196+
197+
expect(@pubsub.subscription(SUBSCRIPTION_NAME).policy.roles).to \
198+
include("roles/pubsub.subscriber" => [SERVICE_ACCOUNT])
199+
end
200+
201+
it "tests topic permissions" do
202+
@pubsub.create_topic TOPIC_NAME
203+
expect { test_topic_permissions }.to output(/true\ntrue/).to_stdout
204+
end
205+
206+
it "tests subscription permissions" do
207+
@pubsub.create_subscription(
208+
TOPIC_NAME,
209+
SUBSCRIPTION_NAME,
210+
autocreate: true
211+
)
212+
expect { test_subscription_permissions }.to output(/true\ntrue/).to_stdout
213+
end
214+
144215
after :all do
145216
cleanup!
146217
end

0 commit comments

Comments
 (0)