barbeque 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/barbeque/job_definitions_controller.rb +3 -0
- data/app/controllers/barbeque/sns_subscriptions_controller.rb +6 -106
- data/app/models/barbeque/job_definition.rb +1 -0
- data/app/services/barbeque/sns_subscription_service.rb +125 -0
- data/lib/barbeque/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0956004e27b896eda31157ad3cb964d216b1c575'
|
4
|
+
data.tar.gz: 20e711d2e9c7d68444d5cd79a73f1b83cd86eb90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22b89b6062790e1d7e87e340ba18a95facfa7714d38ced1b4482fdfc3aab1e0a9a861a67f3ab5f99b3e156074129eec12f679ffec525a279d0e4e7a8d71682e0
|
7
|
+
data.tar.gz: 95d7fee60b607d649f444ef3e1c9ae71f30edfe7a8b59ec4e49a35e6c2efe561dab321d644df4d7a5d4864be4bef4ab002120fe720f8ab4e116fcc32145e7621
|
@@ -49,6 +49,9 @@ class Barbeque::JobDefinitionsController < Barbeque::ApplicationController
|
|
49
49
|
|
50
50
|
def destroy
|
51
51
|
@job_definition = Barbeque::JobDefinition.find(params[:id])
|
52
|
+
@job_definition.sns_subscriptions.each do |sns_subscription|
|
53
|
+
Barbeque::SNSSubscriptionService.new.unsubscribe(sns_subscription)
|
54
|
+
end
|
52
55
|
@job_definition.destroy
|
53
56
|
redirect_to job_definitions_url, notice: 'Job definition was successfully destroyed.'
|
54
57
|
end
|
@@ -18,23 +18,10 @@ class Barbeque::SnsSubscriptionsController < Barbeque::ApplicationController
|
|
18
18
|
|
19
19
|
def create
|
20
20
|
@sns_subscription = Barbeque::SNSSubscription.new(params.require(:sns_subscription).permit(:topic_arn, :job_queue_id, :job_definition_id))
|
21
|
-
if @sns_subscription
|
22
|
-
|
23
|
-
subscribe_topic!
|
24
|
-
rescue Aws::SNS::Errors::AuthorizationError
|
25
|
-
@sns_subscription.errors[:topic_arn] << 'is not authorized'
|
26
|
-
@sns_topic_arns = fetch_sns_topic_arns
|
27
|
-
render :new
|
28
|
-
rescue Aws::SNS::Errors::NotFound
|
29
|
-
@sns_subscription.errors[:topic_arn] << 'is not found'
|
30
|
-
@sns_topic_arns = fetch_sns_topic_arns
|
31
|
-
render :new
|
32
|
-
else
|
33
|
-
@sns_subscription.save!
|
34
|
-
update_sqs_policy!
|
35
|
-
redirect_to @sns_subscription, notice: 'SNS subscription was successfully created.'
|
36
|
-
end
|
21
|
+
if Barbeque::SNSSubscriptionService.new.subscribe(@sns_subscription)
|
22
|
+
redirect_to @sns_subscription, notice: 'SNS subscription was successfully created.'
|
37
23
|
else
|
24
|
+
@sns_topic_arns = fetch_sns_topic_arns
|
38
25
|
render :new
|
39
26
|
end
|
40
27
|
end
|
@@ -49,101 +36,14 @@ class Barbeque::SnsSubscriptionsController < Barbeque::ApplicationController
|
|
49
36
|
end
|
50
37
|
|
51
38
|
def destroy
|
52
|
-
|
53
|
-
|
54
|
-
update_sqs_policy!
|
55
|
-
unsubscribe_topic!
|
39
|
+
sns_subscription = Barbeque::SNSSubscription.find(params[:id])
|
40
|
+
Barbeque::SNSSubscriptionService.new.unsubscribe(sns_subscription)
|
56
41
|
redirect_to sns_subscriptions_path, notice: 'SNS subscription was successfully destroyed.'
|
57
42
|
end
|
58
43
|
|
59
44
|
private
|
60
45
|
|
61
46
|
def fetch_sns_topic_arns
|
62
|
-
sns_client.list_topics.topics.map(&:topic_arn)
|
63
|
-
end
|
64
|
-
|
65
|
-
def update_sqs_policy!
|
66
|
-
attrs = sqs_client.get_queue_attributes(
|
67
|
-
queue_url: @sns_subscription.job_queue.queue_url,
|
68
|
-
attribute_names: ['QueueArn'],
|
69
|
-
)
|
70
|
-
queue_arn = attrs.attributes['QueueArn']
|
71
|
-
topic_arns = @sns_subscription.job_queue.sns_subscriptions.map(&:topic_arn)
|
72
|
-
|
73
|
-
if topic_arns.present?
|
74
|
-
policy = generate_policy(queue_arn: queue_arn, topic_arns: topic_arns)
|
75
|
-
else
|
76
|
-
policy = '' # Be blank when there're no subscriptions.
|
77
|
-
end
|
78
|
-
|
79
|
-
sqs_client.set_queue_attributes(
|
80
|
-
queue_url: @sns_subscription.job_queue.queue_url,
|
81
|
-
attributes: { 'Policy' => policy },
|
82
|
-
)
|
83
|
-
end
|
84
|
-
|
85
|
-
# @paaram [String] queue_arn
|
86
|
-
# @param [Array<String>] topic_arns
|
87
|
-
# @return [String] JSON formatted policy
|
88
|
-
def generate_policy(queue_arn:, topic_arns:)
|
89
|
-
{
|
90
|
-
'Version' => '2012-10-17',
|
91
|
-
'Statement' => [
|
92
|
-
'Effect' => 'Allow',
|
93
|
-
'Principal' => '*',
|
94
|
-
'Action' => 'sqs:SendMessage',
|
95
|
-
'Resource' => queue_arn,
|
96
|
-
'Condition' => {
|
97
|
-
'ArnEquals' => {
|
98
|
-
'aws:SourceArn' => topic_arns,
|
99
|
-
}
|
100
|
-
}
|
101
|
-
]
|
102
|
-
}.to_json
|
103
|
-
end
|
104
|
-
|
105
|
-
def subscribe_topic!
|
106
|
-
sns_client.subscribe(
|
107
|
-
topic_arn: @sns_subscription.topic_arn,
|
108
|
-
protocol: 'sqs',
|
109
|
-
endpoint: queue_arn
|
110
|
-
)
|
111
|
-
end
|
112
|
-
|
113
|
-
def unsubscribe_topic!
|
114
|
-
sqs_attrs = sqs_client.get_queue_attributes(
|
115
|
-
queue_url: @sns_subscription.job_queue.queue_url,
|
116
|
-
attribute_names: ['QueueArn'],
|
117
|
-
)
|
118
|
-
queue_arn = sqs_attrs.attributes['QueueArn']
|
119
|
-
|
120
|
-
subscriptions = sns_client.list_subscriptions_by_topic(
|
121
|
-
topic_arn: @sns_subscription.topic_arn,
|
122
|
-
)
|
123
|
-
subscription_arn = subscriptions.subscriptions.find {|subscription| subscription.endpoint == queue_arn }.try!(:subscription_arn)
|
124
|
-
|
125
|
-
if subscription_arn
|
126
|
-
sns_client.unsubscribe(
|
127
|
-
subscription_arn: subscription_arn,
|
128
|
-
)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def sqs_client
|
133
|
-
@sqs_client ||= Aws::SQS::Client.new
|
134
|
-
end
|
135
|
-
|
136
|
-
def sns_client
|
137
|
-
@sns_client ||= Aws::SNS::Client.new
|
138
|
-
end
|
139
|
-
|
140
|
-
def queue_arn
|
141
|
-
return @queue_arn if @queue_arn
|
142
|
-
|
143
|
-
sqs_attrs = sqs_client.get_queue_attributes(
|
144
|
-
queue_url: @sns_subscription.job_queue.queue_url,
|
145
|
-
attribute_names: ['QueueArn'],
|
146
|
-
)
|
147
|
-
@queue_arn = sqs_attrs.attributes['QueueArn']
|
47
|
+
Barbeque::SNSSubscriptionService.sns_client.list_topics.topics.map(&:topic_arn)
|
148
48
|
end
|
149
49
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class Barbeque::JobDefinition < Barbeque::ApplicationRecord
|
2
2
|
belongs_to :app
|
3
3
|
has_many :job_executions, dependent: :destroy
|
4
|
+
has_many :sns_subscriptions, class_name: 'SNSSubscription'
|
4
5
|
has_one :slack_notification, dependent: :destroy
|
5
6
|
|
6
7
|
validates :job, uniqueness: { scope: :app_id }
|
@@ -0,0 +1,125 @@
|
|
1
|
+
class Barbeque::SNSSubscriptionService
|
2
|
+
def self.sqs_client
|
3
|
+
@sqs_client ||= Aws::SQS::Client.new
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.sns_client
|
7
|
+
@sns_client ||= Aws::SNS::Client.new
|
8
|
+
end
|
9
|
+
|
10
|
+
# @param [Barbeque::SNSSubscription] sns_subscription
|
11
|
+
# @return [Boolean] `true` if succeeded to subscribe
|
12
|
+
def subscribe(sns_subscription)
|
13
|
+
if sns_subscription.valid?
|
14
|
+
begin
|
15
|
+
subscribe_topic!(sns_subscription)
|
16
|
+
sns_subscription.save!
|
17
|
+
update_sqs_policy!(sns_subscription)
|
18
|
+
true
|
19
|
+
rescue Aws::SNS::Errors::AuthorizationError
|
20
|
+
sns_subscription.errors[:topic_arn] << 'is not authorized'
|
21
|
+
false
|
22
|
+
rescue Aws::SNS::Errors::NotFound
|
23
|
+
sns_subscription.errors[:topic_arn] << 'is not found'
|
24
|
+
false
|
25
|
+
end
|
26
|
+
else
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param [Barbeque::SNSSubscription] sns_subscription
|
32
|
+
def unsubscribe(sns_subscription)
|
33
|
+
sns_subscription.destroy
|
34
|
+
update_sqs_policy!(sns_subscription)
|
35
|
+
unsubscribe_topic!(sns_subscription)
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def sqs_client
|
42
|
+
Barbeque::SNSSubscriptionService.sqs_client
|
43
|
+
end
|
44
|
+
|
45
|
+
def sns_client
|
46
|
+
Barbeque::SNSSubscriptionService.sns_client
|
47
|
+
end
|
48
|
+
|
49
|
+
# @param [Barbeque::SNSSubscription] sns_subscription
|
50
|
+
def update_sqs_policy!(sns_subscription)
|
51
|
+
attrs = sqs_client.get_queue_attributes(
|
52
|
+
queue_url: sns_subscription.job_queue.queue_url,
|
53
|
+
attribute_names: ['QueueArn'],
|
54
|
+
)
|
55
|
+
queue_arn = attrs.attributes['QueueArn']
|
56
|
+
topic_arns = sns_subscription.job_queue.sns_subscriptions.map(&:topic_arn)
|
57
|
+
|
58
|
+
if topic_arns.present?
|
59
|
+
policy = generate_policy(queue_arn: queue_arn, topic_arns: topic_arns)
|
60
|
+
else
|
61
|
+
policy = '' # Be blank when there're no subscriptions.
|
62
|
+
end
|
63
|
+
|
64
|
+
sqs_client.set_queue_attributes(
|
65
|
+
queue_url: sns_subscription.job_queue.queue_url,
|
66
|
+
attributes: { 'Policy' => policy },
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
# @paaram [String] queue_arn
|
71
|
+
# @param [Array<String>] topic_arns
|
72
|
+
# @return [String] JSON formatted policy
|
73
|
+
def generate_policy(queue_arn:, topic_arns:)
|
74
|
+
{
|
75
|
+
'Version' => '2012-10-17',
|
76
|
+
'Statement' => [
|
77
|
+
'Effect' => 'Allow',
|
78
|
+
'Principal' => '*',
|
79
|
+
'Action' => 'sqs:SendMessage',
|
80
|
+
'Resource' => queue_arn,
|
81
|
+
'Condition' => {
|
82
|
+
'ArnEquals' => {
|
83
|
+
'aws:SourceArn' => topic_arns,
|
84
|
+
}
|
85
|
+
}
|
86
|
+
]
|
87
|
+
}.to_json
|
88
|
+
end
|
89
|
+
|
90
|
+
# @param [Barbeque::SNSSubscription] sns_subscription
|
91
|
+
def subscribe_topic!(sns_subscription)
|
92
|
+
sqs_attrs = sqs_client.get_queue_attributes(
|
93
|
+
queue_url: sns_subscription.job_queue.queue_url,
|
94
|
+
attribute_names: ['QueueArn'],
|
95
|
+
)
|
96
|
+
queue_arn = sqs_attrs.attributes['QueueArn']
|
97
|
+
|
98
|
+
sns_client.subscribe(
|
99
|
+
topic_arn: sns_subscription.topic_arn,
|
100
|
+
protocol: 'sqs',
|
101
|
+
endpoint: queue_arn
|
102
|
+
)
|
103
|
+
end
|
104
|
+
|
105
|
+
# @param [Barbeque::SNSSubscription] sns_subscription
|
106
|
+
def unsubscribe_topic!(sns_subscription)
|
107
|
+
sqs_attrs = sqs_client.get_queue_attributes(
|
108
|
+
queue_url: sns_subscription.job_queue.queue_url,
|
109
|
+
attribute_names: ['QueueArn'],
|
110
|
+
)
|
111
|
+
queue_arn = sqs_attrs.attributes['QueueArn']
|
112
|
+
|
113
|
+
subscriptions = sns_client.list_subscriptions_by_topic(
|
114
|
+
topic_arn: sns_subscription.topic_arn,
|
115
|
+
)
|
116
|
+
subscription_arn = subscriptions.subscriptions.find {|subscription| subscription.endpoint == queue_arn }.try!(:subscription_arn)
|
117
|
+
|
118
|
+
if subscription_arn
|
119
|
+
sns_client.unsubscribe(
|
120
|
+
subscription_arn: subscription_arn,
|
121
|
+
)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
data/lib/barbeque/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barbeque
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: adminlte2-rails
|
@@ -309,6 +309,7 @@ files:
|
|
309
309
|
- app/models/barbeque/sns_subscription.rb
|
310
310
|
- app/services/barbeque/message_enqueuing_service.rb
|
311
311
|
- app/services/barbeque/message_retrying_service.rb
|
312
|
+
- app/services/barbeque/sns_subscription_service.rb
|
312
313
|
- app/views/barbeque/apps/_form.html.haml
|
313
314
|
- app/views/barbeque/apps/edit.html.haml
|
314
315
|
- app/views/barbeque/apps/index.html.haml
|