circuitry 2.1.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +107 -59
- data/circuitry.gemspec +2 -2
- data/lib/circuitry.rb +32 -15
- data/lib/circuitry/cli.rb +32 -32
- data/lib/circuitry/config/file_loader.rb +24 -0
- data/lib/circuitry/config/publisher_settings.rb +16 -0
- data/lib/circuitry/config/shared_settings.rb +39 -0
- data/lib/circuitry/config/subscriber_settings.rb +32 -0
- data/lib/circuitry/locks/base.rb +3 -3
- data/lib/circuitry/locks/memory.rb +4 -4
- data/lib/circuitry/locks/noop.rb +1 -1
- data/lib/circuitry/locks/redis.rb +1 -1
- data/lib/circuitry/middleware/chain.rb +1 -1
- data/lib/circuitry/processor.rb +12 -10
- data/lib/circuitry/processors/forker.rb +1 -1
- data/lib/circuitry/processors/threader.rb +1 -1
- data/lib/circuitry/provisioning.rb +9 -0
- data/lib/circuitry/provisioning/provisioner.rb +71 -0
- data/lib/circuitry/provisioning/queue_creator.rb +64 -0
- data/lib/circuitry/provisioning/subscription_creator.rb +65 -0
- data/lib/circuitry/provisioning/topic_creator.rb +31 -0
- data/lib/circuitry/publisher.rb +5 -6
- data/lib/circuitry/queue.rb +25 -3
- data/lib/circuitry/railtie.rb +9 -0
- data/lib/circuitry/services/sns.rb +1 -1
- data/lib/circuitry/services/sqs.rb +1 -1
- data/lib/circuitry/subscriber.rb +8 -8
- data/lib/circuitry/tasks.rb +3 -3
- data/lib/circuitry/topic.rb +24 -2
- data/lib/circuitry/version.rb +1 -1
- metadata +11 -7
- data/lib/circuitry/configuration.rb +0 -64
- data/lib/circuitry/provisioner.rb +0 -60
- data/lib/circuitry/queue_creator.rb +0 -50
- data/lib/circuitry/subscription_creator.rb +0 -60
- data/lib/circuitry/topic_creator.rb +0 -25
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'circuitry/services/sqs'
|
2
|
-
require 'circuitry/queue'
|
3
|
-
|
4
|
-
module Circuitry
|
5
|
-
class QueueCreator
|
6
|
-
include Services::SQS
|
7
|
-
|
8
|
-
attr_reader :queue_name
|
9
|
-
|
10
|
-
def self.find_or_create(queue_name, dead_letter_queue_name: nil, max_receive_count: 8 )
|
11
|
-
creator = new(queue_name)
|
12
|
-
result = creator.create_queue
|
13
|
-
creator.create_dead_letter_queue(dead_letter_queue_name, max_receive_count) if dead_letter_queue_name
|
14
|
-
result
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(queue_name)
|
18
|
-
@queue_name = queue_name
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_queue
|
22
|
-
@_queue ||= Queue.new(create_primary_queue_internal)
|
23
|
-
end
|
24
|
-
|
25
|
-
def create_dead_letter_queue(name, max_receive_count)
|
26
|
-
@_dl_queue ||= Queue.new(create_dl_queue_internal(name, max_receive_count))
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def create_dl_queue_internal(name, max_receive_count)
|
32
|
-
dl_url = sqs.create_queue(queue_name: name).queue_url
|
33
|
-
dl_arn = sqs.get_queue_attributes(queue_url: dl_url, attribute_names: ['QueueArn']).attributes['QueueArn']
|
34
|
-
|
35
|
-
sqs.set_queue_attributes(queue_url: create_queue.url, attributes: build_redrive_policy(dl_arn, max_receive_count))
|
36
|
-
dl_url
|
37
|
-
end
|
38
|
-
|
39
|
-
def build_redrive_policy(deadletter_arn, max_receive_count)
|
40
|
-
{
|
41
|
-
'RedrivePolicy' => %({"maxReceiveCount":"#{max_receive_count}", "deadLetterTargetArn":"#{deadletter_arn}"})
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
def create_primary_queue_internal
|
46
|
-
attributes = { 'VisibilityTimeout' => (30 * 60).to_s }
|
47
|
-
sqs.create_queue(queue_name: queue_name, attributes: attributes).queue_url
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'circuitry/services/sns'
|
2
|
-
require 'circuitry/topic'
|
3
|
-
|
4
|
-
module Circuitry
|
5
|
-
class SubscriptionCreator
|
6
|
-
include Services::SNS
|
7
|
-
include Services::SQS
|
8
|
-
|
9
|
-
attr_reader :queue
|
10
|
-
attr_reader :topics
|
11
|
-
|
12
|
-
def self.subscribe_all(queue, topics)
|
13
|
-
new(queue, topics).subscribe_all
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize(queue, topics)
|
17
|
-
raise ArgumentError, 'queue must be a Circuitry::Queue' unless queue.is_a?(Circuitry::Queue)
|
18
|
-
raise ArgumentError, 'topics must be an array' unless topics.is_a?(Array)
|
19
|
-
|
20
|
-
@queue = queue
|
21
|
-
@topics = topics
|
22
|
-
end
|
23
|
-
|
24
|
-
def subscribe_all
|
25
|
-
topics.each do |topic|
|
26
|
-
sns.subscribe(topic_arn: topic.arn, endpoint: queue.arn, protocol: 'sqs')
|
27
|
-
end
|
28
|
-
sqs.set_queue_attributes(
|
29
|
-
queue_url: queue.url,
|
30
|
-
attributes: build_policy
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def build_policy
|
37
|
-
# The aws ruby SDK doesn't have a policy builder :{
|
38
|
-
{
|
39
|
-
'Policy' => {
|
40
|
-
'Version' => '2012-10-17',
|
41
|
-
'Id' => '#{queue.arn}/SNSPolicy',
|
42
|
-
'Statement' => topics.map { |t| build_policy_statement(t) }
|
43
|
-
}.to_json
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
def build_policy_statement(topic)
|
48
|
-
{
|
49
|
-
'Sid' => "Sid#{topic.name}",
|
50
|
-
'Effect' => 'Allow',
|
51
|
-
'Principal' => { 'AWS' => '*' },
|
52
|
-
'Action' => 'SQS:SendMessage',
|
53
|
-
'Resource' => queue.arn,
|
54
|
-
'Condition' => {
|
55
|
-
'ArnEquals' => { 'aws:SourceArn' => topic.arn }
|
56
|
-
}
|
57
|
-
}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'circuitry/services/sns'
|
2
|
-
require 'circuitry/topic'
|
3
|
-
|
4
|
-
module Circuitry
|
5
|
-
class TopicCreator
|
6
|
-
include Services::SNS
|
7
|
-
|
8
|
-
attr_reader :topic_name
|
9
|
-
|
10
|
-
def self.find_or_create(topic_name)
|
11
|
-
new(topic_name).topic
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(topic_name)
|
15
|
-
@topic_name = topic_name
|
16
|
-
end
|
17
|
-
|
18
|
-
def topic
|
19
|
-
return @_topic if defined?(@_topic)
|
20
|
-
|
21
|
-
response = sns.create_topic(name: topic_name)
|
22
|
-
@_topic = Topic.new(response.topic_arn)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|