qurd 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +367 -0
  7. data/Rakefile +9 -0
  8. data/bin/qurd +10 -0
  9. data/lib/hash.rb +6 -0
  10. data/lib/qurd.rb +49 -0
  11. data/lib/qurd/action.rb +92 -0
  12. data/lib/qurd/action/chef.rb +128 -0
  13. data/lib/qurd/action/dummy.rb +27 -0
  14. data/lib/qurd/action/route53.rb +168 -0
  15. data/lib/qurd/configuration.rb +182 -0
  16. data/lib/qurd/listener.rb +207 -0
  17. data/lib/qurd/message.rb +231 -0
  18. data/lib/qurd/mixins.rb +8 -0
  19. data/lib/qurd/mixins/aws_clients.rb +37 -0
  20. data/lib/qurd/mixins/configuration.rb +29 -0
  21. data/lib/qurd/mixins/configuration_helpers.rb +79 -0
  22. data/lib/qurd/processor.rb +97 -0
  23. data/lib/qurd/version.rb +5 -0
  24. data/lib/string.rb +12 -0
  25. data/qurd.gemspec +32 -0
  26. data/test/action_test.rb +115 -0
  27. data/test/chef_test.rb +206 -0
  28. data/test/configuration_test.rb +333 -0
  29. data/test/dummy_action_test.rb +51 -0
  30. data/test/inputs/foo.pem +27 -0
  31. data/test/inputs/knife.rb +9 -0
  32. data/test/inputs/qurd.yml +32 -0
  33. data/test/inputs/qurd_chef.yml +35 -0
  34. data/test/inputs/qurd_chef_route53.yml +43 -0
  35. data/test/inputs/qurd_route53.yml +39 -0
  36. data/test/inputs/qurd_route53_wrong.yml +37 -0
  37. data/test/inputs/validator.pem +27 -0
  38. data/test/listener_test.rb +135 -0
  39. data/test/message_test.rb +187 -0
  40. data/test/mixin_aws_clients_test.rb +28 -0
  41. data/test/mixin_configuration_test.rb +36 -0
  42. data/test/processor_test.rb +41 -0
  43. data/test/responses/aws/ec2-describe-instances-0.xml +2 -0
  44. data/test/responses/aws/ec2-describe-instances-1.xml +127 -0
  45. data/test/responses/aws/error-response.xml +1 -0
  46. data/test/responses/aws/route53-change-resource-record-sets.xml +2 -0
  47. data/test/responses/aws/route53-list-hosted-zones-by-name-0.xml +3 -0
  48. data/test/responses/aws/route53-list-hosted-zones-by-name-1.xml +4 -0
  49. data/test/responses/aws/route53-list-hosted-zones-by-name-n.xml +5 -0
  50. data/test/responses/aws/route53-list-resource-record-sets-0.xml +2 -0
  51. data/test/responses/aws/route53-list-resource-record-sets-1.xml +4 -0
  52. data/test/responses/aws/route53-list-resource-record-sets-n.xml +6 -0
  53. data/test/responses/aws/sqs-list-queues-0.xml +1 -0
  54. data/test/responses/aws/sqs-list-queues-n.xml +4 -0
  55. data/test/responses/aws/sqs-receive-message-1-launch.xml +6 -0
  56. data/test/responses/aws/sqs-receive-message-1-launch_error.xml +6 -0
  57. data/test/responses/aws/sqs-receive-message-1-other.xml +12 -0
  58. data/test/responses/aws/sqs-receive-message-1-terminate.xml +6 -0
  59. data/test/responses/aws/sqs-receive-message-1-terminate_error.xml +6 -0
  60. data/test/responses/aws/sqs-receive-message-1-test.xml +12 -0
  61. data/test/responses/aws/sqs-set-queue-attributes.xml +1 -0
  62. data/test/responses/aws/sts-assume-role.xml +17 -0
  63. data/test/responses/chef/search-client-name-0.json +6 -0
  64. data/test/responses/chef/search-client-name-1.json +7 -0
  65. data/test/responses/chef/search-client-name-n.json +8 -0
  66. data/test/responses/chef/search-node-instance-0.json +5 -0
  67. data/test/responses/chef/search-node-instance-1.json +784 -0
  68. data/test/responses/chef/search-node-instance-n.json +1565 -0
  69. data/test/responses/ec2/latest-meta-data-iam-security-credentials-client.txt +9 -0
  70. data/test/responses/ec2/latest-meta-data-iam-security-credentials.txt +1 -0
  71. data/test/route53_test.rb +231 -0
  72. data/test/support/web_mock_stubs.rb +109 -0
  73. data/test/test_helper.rb +10 -0
  74. metadata +307 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "Code" : "Success",
3
+ "LastUpdated" : "2015-03-28T11:02:33Z",
4
+ "Type" : "AWS-HMAC",
5
+ "AccessKeyId" : "abc",
6
+ "SecretAccessKey" : "def",
7
+ "Token" : "foobar==",
8
+ "Expiration" : "2015-03-28T17:03:32Z"
9
+ }
@@ -0,0 +1 @@
1
+ test-IAMRole-1X7IHUVCNNF5V
@@ -0,0 +1,231 @@
1
+ require 'test_helper'
2
+ describe Qurd::Action::Route53 do
3
+ include WebMockStubs
4
+
5
+ let(:sqs_client) { Aws::SQS::Client.new(region: 'us-west-2') }
6
+ let(:queue_url) { 'https://sqs.us-west-2.amazonaws.com/123456890/test2-ScalingNotificationsQueue-HPPYDAYSAGAI1' }
7
+ let(:sqs_message) { sqs_client.receive_message(queue_url: queue_url).messages.first }
8
+ let(:qurd_message) { Qurd::Message.new(message: sqs_message, region: 'us-west-2', aws_credentials: Aws::Credentials.new('a', 'b'), name: 'staging') }
9
+ let(:subject) { Qurd::Action::Route53.new(qurd_message) }
10
+
11
+ describe '#configure' do
12
+ def setup
13
+ aws_sqs_list_queues
14
+ aws_sqs_set_queue_attributes
15
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
16
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
17
+ end
18
+
19
+ it 'verifies configuration' do
20
+ Qurd::Configuration.instance.init('test/inputs/qurd_route53.yml')
21
+ Qurd::Action::Route53.configure('launch')
22
+ ret = Qurd::Action::Route53.instance_variable_get :@configure_done
23
+ ret.must_equal true
24
+ end
25
+
26
+ end
27
+
28
+ describe '#check_configuration' do
29
+ it 'fails to configure' do
30
+ Qurd::Configuration.instance.init('test/inputs/qurd_route53_wrong.yml')
31
+ lambda {
32
+ Qurd::Action::Route53.check_configuration
33
+ }.must_raise RuntimeError, 'Missing configuration for route53: staging'
34
+ end
35
+ end
36
+
37
+ describe '#instance_name' do
38
+ def setup
39
+ aws_sqs_list_queues
40
+ aws_sqs_set_queue_attributes
41
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
42
+ Qurd::Configuration.instance.configure('test/inputs/qurd_route53.yml')
43
+ end
44
+
45
+ it 'returns a hostname' do
46
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
47
+ subject.send(:instance_name).must_equal 'test-414.staging.example.com'
48
+ end
49
+
50
+ it 'returns nil' do
51
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-0.xml'
52
+ subject.send(:instance_name).must_equal nil
53
+ end
54
+ end
55
+
56
+ describe '#hosted_zone' do
57
+ def setup
58
+ aws_sqs_list_queues
59
+ aws_sqs_set_queue_attributes
60
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
61
+ Qurd::Configuration.instance.configure('test/inputs/qurd_chef_route53.yml')
62
+ end
63
+
64
+ it 'finds a zone id' do
65
+ aws_route53_list_hosted_zones_by_name
66
+ ret = subject.send :hosted_zone
67
+ ret.id.must_equal '/hostedzone/Z3EWK6Z93GXEWJ'
68
+ end
69
+
70
+ it 'raises Aws::Route53::Errors' do
71
+ aws_route53_list_hosted_zones_by_name(
72
+ 'test/responses/aws/route53-list-hosted-zones-by-name-0.xml',
73
+ 500
74
+ )
75
+ lambda {
76
+ subject.send :hosted_zone, 0
77
+ }.must_raise Aws::Route53::Errors::Http500Error
78
+ end
79
+ end
80
+
81
+ describe '#resource_record' do
82
+ def setup
83
+ aws_sqs_list_queues
84
+ aws_sqs_set_queue_attributes
85
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
86
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
87
+ Qurd::Configuration.instance.configure('test/inputs/qurd_chef_route53.yml')
88
+ end
89
+
90
+ it 'finds a resource record' do
91
+ aws_route53_list_hosted_zones_by_name
92
+ aws_route53_list_resource_record_sets
93
+ ret = subject.send :resource_record
94
+ ret.name.must_equal 'test-414.staging.example.com.'
95
+ end
96
+
97
+ it 'raises Qurd::Action::Route53::Errors::ResourceNotFound' do
98
+ aws_route53_list_hosted_zones_by_name
99
+ aws_route53_list_resource_record_sets 'test/responses/aws/route53-list-resource-record-sets-0.xml'
100
+ lambda {
101
+ subject.send :resource_record, 0
102
+ }.must_raise Qurd::Action::Route53::Errors::ResourceNotFound
103
+ end
104
+
105
+ it 'raises Aws::Route53::Errors' do
106
+ aws_route53_list_hosted_zones_by_name
107
+ aws_route53_list_resource_record_sets 'test/responses/aws/route53-list-resource-record-sets-0.xml', 500
108
+ lambda {
109
+ subject.send :resource_record, 0
110
+ }.must_raise Aws::Route53::Errors::Http500Error
111
+ end
112
+
113
+ end
114
+
115
+ describe '#chef_node_name' do
116
+ def setup
117
+ aws_sqs_list_queues
118
+ aws_sqs_set_queue_attributes
119
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
120
+ Qurd::Configuration.instance.configure('test/inputs/qurd_chef_route53.yml')
121
+ end
122
+
123
+ it 'returns a hostname' do
124
+ chef_search
125
+ chef_search(
126
+ 'test/responses/chef/search-client-name-1.json',
127
+ 'client',
128
+ 'name:test-414.staging.example.com'
129
+ )
130
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
131
+ chef = Qurd::Action::Chef.new(qurd_message)
132
+ chef.run_before
133
+ subject.send(:chef_node_name).must_equal 'test-414.staging.example.com'
134
+ end
135
+
136
+ it 'returns nil' do
137
+ chef_search 'test/responses/chef/search-node-instance-0.json'
138
+ chef_search(
139
+ 'test/responses/chef/search-client-name-0.json',
140
+ 'client',
141
+ 'name:test-414.staging.example.com'
142
+ )
143
+ chef = Qurd::Action::Chef.new(qurd_message)
144
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-0.xml'
145
+ subject.send(:chef_node_name).must_equal nil
146
+ end
147
+ end
148
+
149
+ describe '#terminate' do
150
+ def setup
151
+ aws_sqs_list_queues
152
+ aws_sqs_set_queue_attributes
153
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
154
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
155
+ aws_route53_list_hosted_zones_by_name
156
+ aws_route53_list_resource_record_sets
157
+ Qurd::Configuration.instance.configure('test/inputs/qurd_chef_route53.yml')
158
+ end
159
+ let(:mock) { Minitest::Mock.new }
160
+
161
+ it 'saves a node; dry_run' do
162
+ mock.expect :debug, nil, [String]
163
+ mock.expect :debug, nil, [String]
164
+ mock.expect :debug, nil, [String]
165
+ mock.expect :debug, nil, [String]
166
+ mock.expect :debug, nil, ['Dry run; would delete']
167
+
168
+ subject.stub :qurd_logger, mock do
169
+ Qurd::Configuration.instance.config.dry_run = true
170
+ subject.terminate
171
+ end
172
+ mock.verify
173
+ end
174
+
175
+ it 'destroys a node; not dry_run; not failed' do
176
+ aws_route53_change_resource_record_sets
177
+ Qurd::Configuration.instance.config.dry_run = false
178
+ subject.terminate
179
+ end
180
+
181
+ it 'raises during destroys a node; not dry_run; not failed' do
182
+ aws_route53_change_resource_record_sets('test/responses/aws/route53-change-resource-record-sets.xml', 500)
183
+ Qurd::Configuration.instance.config.dry_run = false
184
+ lambda {
185
+ subject.terminate
186
+ }.must_raise Aws::Route53::Errors::Http500Error
187
+ end
188
+
189
+ it 'keeps a node; failed' do
190
+ mock.expect :warn, nil, ['Not deleting, message failed to process']
191
+ qurd_message.stub :failed?, true do
192
+ subject.stub :qurd_logger, mock do
193
+ Qurd::Configuration.instance.config.dry_run = false
194
+ subject.terminate
195
+ end
196
+ end
197
+ mock.verify
198
+ end
199
+
200
+ it 'calls message.failed!' do
201
+ aws_route53_change_resource_record_sets('test/responses/aws/route53-change-resource-record-sets.xml')
202
+ aws_route53_list_resource_record_sets('test/responses/aws/route53-list-resource-record-sets-0.xml')
203
+ Qurd::Configuration.instance.config.dry_run = false
204
+ subject.terminate
205
+ qurd_message.failed?.must_equal true
206
+ end
207
+
208
+ end
209
+
210
+ describe '#test' do
211
+ def setup
212
+ aws_sqs_list_queues
213
+ aws_sqs_set_queue_attributes
214
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
215
+ aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-terminate.xml'
216
+ aws_route53_list_hosted_zones_by_name
217
+ aws_route53_list_resource_record_sets
218
+ Qurd::Configuration.instance.configure('test/inputs/qurd_chef_route53.yml')
219
+ end
220
+ let(:mock) { Minitest::Mock.new }
221
+
222
+ it 'logs Test' do
223
+ mock.expect :info, nil, ['Test']
224
+ subject.run_before
225
+ subject.stub :qurd_logger, mock do
226
+ subject.test
227
+ end
228
+ mock.verify
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,109 @@
1
+ # AWS sends status 400 for test/responses/aws/error-response.xml
2
+ module WebMockStubs
3
+ def aws_sts_assume_role(file = 'test/responses/aws/sts-assume-role.xml',
4
+ status = 200)
5
+ stub_request(:post, 'https://sts.amazonaws.com/')
6
+ .with(body: /Action=AssumeRole/)
7
+ .to_return(status: status.to_i, body: File.read(file))
8
+ end
9
+
10
+ def aws_ec2_describe_instances(file = 'test/responses/aws/ec2-describe-instances-0.xml',
11
+ status = 200,
12
+ region = 'us-west-2')
13
+ stub_request(:post, "https://ec2.#{region}.amazonaws.com/")
14
+ .with(body: /Action=DescribeInstances/)
15
+ .to_return(status: status.to_i, body: File.read(file))
16
+ end
17
+
18
+ def aws_sqs_list_queues(file = 'test/responses/aws/sqs-list-queues-n.xml',
19
+ status = 200,
20
+ region = 'us-west-2')
21
+ stub_request(:post, "https://sqs.#{region}.amazonaws.com/")
22
+ .with(body: /Action=ListQueues/)
23
+ .to_return(status: status.to_i, body: File.read(file))
24
+ end
25
+
26
+ def aws_sqs_set_queue_attributes(file = 'test/responses/aws/sqs-set-queue-attributes.xml',
27
+ status = 200,
28
+ region = 'us-west-2')
29
+ stub_request(:post, %r{https://#{region}.queue.amazonaws.com/})
30
+ .with(body: /Action=SetQueueAttributes/)
31
+ .to_return(status: status.to_i, body: File.read(file))
32
+ stub_request(:post, %r{https://sqs.#{region}.amazonaws.com/})
33
+ .with(body: /Action=SetQueueAttributes/)
34
+ .to_return(status: status.to_i, body: File.read(file))
35
+ end
36
+
37
+ def aws_sqs_receive_message(file = 'test/responses/aws/sqs-receive-message-1-other.xml',
38
+ queue_path = '/123456890/test2-ScalingNotificationsQueue-HPPYDAYSAGAI1',
39
+ status = 200,
40
+ region = 'us-west-2')
41
+ stub_request(:post, "https://sqs.#{region}.amazonaws.com#{queue_path}")
42
+ .with(body: /Action=ReceiveMessage/)
43
+ .to_return(status: status.to_i, body: File.read(file))
44
+ end
45
+
46
+ def aws_route53_list_hosted_zones_by_name(file = 'test/responses/aws/route53-list-hosted-zones-by-name-1.xml',
47
+ status = 200,
48
+ region = 'us-west-2')
49
+ stub_request(:get, %r{https://route53.amazonaws.com/2013-04-01/hostedzonesbyname})
50
+ .to_return(status: status.to_i, body: File.read(file))
51
+ end
52
+
53
+ def aws_route53_list_resource_record_sets(file = 'test/responses/aws/route53-list-resource-record-sets-1.xml',
54
+ status = 200,
55
+ zone = 'Z3EWK6Z93GXEWJ',
56
+ region = 'us-west-2')
57
+ stub_request(:get, %r{https://route53.amazonaws.com/2013-04-01/hostedzone/#{zone}/rrset}i)
58
+ .to_return(status: status.to_i, body: File.read(file))
59
+ end
60
+
61
+ def aws_route53_change_resource_record_sets(file = 'test/responses/aws/route53-change-resource-record-sets.xml',
62
+ status = 200,
63
+ zone = 'Z3EWK6Z93GXEWJ')
64
+ stub_request(:post, "https://route53.amazonaws.com/2013-04-01/hostedzone/#{zone}/rrset/")
65
+ .to_return(status: status.to_i, body: File.read(file))
66
+ end
67
+
68
+ def ec2metadata
69
+ ec2_latest_meta_data_iam_security_credentials
70
+ ec2_latest_meta_data_iam_security_credentials_client
71
+ end
72
+
73
+ def ec2_latest_meta_data_iam_security_credentials(file = 'test/responses/ec2/latest-meta-data-iam-security-credentials.txt',
74
+ status = 200)
75
+ stub_request(:get, 'http://169.254.169.254/latest/meta-data/iam/security-credentials/')
76
+ .to_return(status: status.to_i, body: File.read(file))
77
+ end
78
+
79
+ def ec2_latest_meta_data_iam_security_credentials_client(file = 'test/responses/ec2/latest-meta-data-iam-security-credentials-client.txt',
80
+ status = 200)
81
+ stub_request(:get, 'http://169.254.169.254/latest/meta-data/iam/security-credentials/test-IAMRole-1X7IHUVCNNF5V')
82
+ .to_return(status: status.to_i, body: File.read(file))
83
+ end
84
+
85
+ def chef_search(file = 'test/responses/chef/search-node-instance-1.json',
86
+ type = 'node',
87
+ search = 'instance_id:i-b57d975a',
88
+ status = 200)
89
+ stub_request(:get, %r{https://api.opscode.com/organizations/foo/search/#{type}\?q=#{search}})
90
+ .to_return(status: status,
91
+ body: File.read(file),
92
+ headers: {'Content-Type'=>'application/json'})
93
+ end
94
+
95
+ def chef_node_delete(node = 'test-414.staging.example.com', status = 200)
96
+ stub_request(:delete, "https://api.opscode.com/organizations/foo/nodes/#{node}")
97
+ .to_return(status: status,
98
+ body: '',
99
+ headers: {'Content-Type'=>'application/json'})
100
+ end
101
+
102
+ def chef_client_delete(client = 'test-414.staging.example.com', status = 200)
103
+ stub_request(:delete, "https://api.opscode.com/organizations/foo/clients/#{client}")
104
+ .to_return(status: status,
105
+ body: '',
106
+ headers: {'Content-Type'=>'application/json'})
107
+ end
108
+
109
+ end
@@ -0,0 +1,10 @@
1
+ require 'minitest'
2
+ require 'minitest/mock'
3
+ require 'minitest/autorun'
4
+ #require 'minitest/pride'
5
+ require 'webmock/minitest'
6
+ require 'support/web_mock_stubs'
7
+ require 'qurd'
8
+
9
+ WebMock.disable_net_connect!
10
+ Qurd::Configuration.instance.init('test/inputs/qurd.yml')
metadata ADDED
@@ -0,0 +1,307 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qurd
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Philip Champon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-nav
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-matchers_vaccine
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: cabin
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: hashie
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: aws-sdk
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 2.0.30
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 2.0.30
139
+ - !ruby/object:Gem::Dependency
140
+ name: chef
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 11.16.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 11.16.0
153
+ description: Configure resources, based on auto scaling events, published to SQS.
154
+ Qurd is extensible, simply create a plugin and let it rip.
155
+ email:
156
+ - philip@adaptly.com
157
+ executables:
158
+ - qurd
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - ".gitignore"
163
+ - ".ruby-version"
164
+ - Gemfile
165
+ - LICENSE.txt
166
+ - README.md
167
+ - Rakefile
168
+ - bin/qurd
169
+ - lib/hash.rb
170
+ - lib/qurd.rb
171
+ - lib/qurd/action.rb
172
+ - lib/qurd/action/chef.rb
173
+ - lib/qurd/action/dummy.rb
174
+ - lib/qurd/action/route53.rb
175
+ - lib/qurd/configuration.rb
176
+ - lib/qurd/listener.rb
177
+ - lib/qurd/message.rb
178
+ - lib/qurd/mixins.rb
179
+ - lib/qurd/mixins/aws_clients.rb
180
+ - lib/qurd/mixins/configuration.rb
181
+ - lib/qurd/mixins/configuration_helpers.rb
182
+ - lib/qurd/processor.rb
183
+ - lib/qurd/version.rb
184
+ - lib/string.rb
185
+ - qurd.gemspec
186
+ - test/action_test.rb
187
+ - test/chef_test.rb
188
+ - test/configuration_test.rb
189
+ - test/dummy_action_test.rb
190
+ - test/inputs/foo.pem
191
+ - test/inputs/knife.rb
192
+ - test/inputs/qurd.yml
193
+ - test/inputs/qurd_chef.yml
194
+ - test/inputs/qurd_chef_route53.yml
195
+ - test/inputs/qurd_route53.yml
196
+ - test/inputs/qurd_route53_wrong.yml
197
+ - test/inputs/validator.pem
198
+ - test/listener_test.rb
199
+ - test/message_test.rb
200
+ - test/mixin_aws_clients_test.rb
201
+ - test/mixin_configuration_test.rb
202
+ - test/processor_test.rb
203
+ - test/responses/aws/ec2-describe-instances-0.xml
204
+ - test/responses/aws/ec2-describe-instances-1.xml
205
+ - test/responses/aws/error-response.xml
206
+ - test/responses/aws/route53-change-resource-record-sets.xml
207
+ - test/responses/aws/route53-list-hosted-zones-by-name-0.xml
208
+ - test/responses/aws/route53-list-hosted-zones-by-name-1.xml
209
+ - test/responses/aws/route53-list-hosted-zones-by-name-n.xml
210
+ - test/responses/aws/route53-list-resource-record-sets-0.xml
211
+ - test/responses/aws/route53-list-resource-record-sets-1.xml
212
+ - test/responses/aws/route53-list-resource-record-sets-n.xml
213
+ - test/responses/aws/sqs-list-queues-0.xml
214
+ - test/responses/aws/sqs-list-queues-n.xml
215
+ - test/responses/aws/sqs-receive-message-1-launch.xml
216
+ - test/responses/aws/sqs-receive-message-1-launch_error.xml
217
+ - test/responses/aws/sqs-receive-message-1-other.xml
218
+ - test/responses/aws/sqs-receive-message-1-terminate.xml
219
+ - test/responses/aws/sqs-receive-message-1-terminate_error.xml
220
+ - test/responses/aws/sqs-receive-message-1-test.xml
221
+ - test/responses/aws/sqs-set-queue-attributes.xml
222
+ - test/responses/aws/sts-assume-role.xml
223
+ - test/responses/chef/search-client-name-0.json
224
+ - test/responses/chef/search-client-name-1.json
225
+ - test/responses/chef/search-client-name-n.json
226
+ - test/responses/chef/search-node-instance-0.json
227
+ - test/responses/chef/search-node-instance-1.json
228
+ - test/responses/chef/search-node-instance-n.json
229
+ - test/responses/ec2/latest-meta-data-iam-security-credentials-client.txt
230
+ - test/responses/ec2/latest-meta-data-iam-security-credentials.txt
231
+ - test/route53_test.rb
232
+ - test/support/web_mock_stubs.rb
233
+ - test/test_helper.rb
234
+ homepage: https://github.com/Adaptly/qurd
235
+ licenses:
236
+ - MIT
237
+ metadata: {}
238
+ post_install_message:
239
+ rdoc_options: []
240
+ require_paths:
241
+ - lib
242
+ required_ruby_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: '0'
247
+ required_rubygems_version: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ requirements: []
253
+ rubyforge_project:
254
+ rubygems_version: 2.2.2
255
+ signing_key:
256
+ specification_version: 4
257
+ summary: 'QUeue Resource Daemon: reaping and sowing your auto-scaled resources'
258
+ test_files:
259
+ - test/action_test.rb
260
+ - test/chef_test.rb
261
+ - test/configuration_test.rb
262
+ - test/dummy_action_test.rb
263
+ - test/inputs/foo.pem
264
+ - test/inputs/knife.rb
265
+ - test/inputs/qurd.yml
266
+ - test/inputs/qurd_chef.yml
267
+ - test/inputs/qurd_chef_route53.yml
268
+ - test/inputs/qurd_route53.yml
269
+ - test/inputs/qurd_route53_wrong.yml
270
+ - test/inputs/validator.pem
271
+ - test/listener_test.rb
272
+ - test/message_test.rb
273
+ - test/mixin_aws_clients_test.rb
274
+ - test/mixin_configuration_test.rb
275
+ - test/processor_test.rb
276
+ - test/responses/aws/ec2-describe-instances-0.xml
277
+ - test/responses/aws/ec2-describe-instances-1.xml
278
+ - test/responses/aws/error-response.xml
279
+ - test/responses/aws/route53-change-resource-record-sets.xml
280
+ - test/responses/aws/route53-list-hosted-zones-by-name-0.xml
281
+ - test/responses/aws/route53-list-hosted-zones-by-name-1.xml
282
+ - test/responses/aws/route53-list-hosted-zones-by-name-n.xml
283
+ - test/responses/aws/route53-list-resource-record-sets-0.xml
284
+ - test/responses/aws/route53-list-resource-record-sets-1.xml
285
+ - test/responses/aws/route53-list-resource-record-sets-n.xml
286
+ - test/responses/aws/sqs-list-queues-0.xml
287
+ - test/responses/aws/sqs-list-queues-n.xml
288
+ - test/responses/aws/sqs-receive-message-1-launch.xml
289
+ - test/responses/aws/sqs-receive-message-1-launch_error.xml
290
+ - test/responses/aws/sqs-receive-message-1-other.xml
291
+ - test/responses/aws/sqs-receive-message-1-terminate.xml
292
+ - test/responses/aws/sqs-receive-message-1-terminate_error.xml
293
+ - test/responses/aws/sqs-receive-message-1-test.xml
294
+ - test/responses/aws/sqs-set-queue-attributes.xml
295
+ - test/responses/aws/sts-assume-role.xml
296
+ - test/responses/chef/search-client-name-0.json
297
+ - test/responses/chef/search-client-name-1.json
298
+ - test/responses/chef/search-client-name-n.json
299
+ - test/responses/chef/search-node-instance-0.json
300
+ - test/responses/chef/search-node-instance-1.json
301
+ - test/responses/chef/search-node-instance-n.json
302
+ - test/responses/ec2/latest-meta-data-iam-security-credentials-client.txt
303
+ - test/responses/ec2/latest-meta-data-iam-security-credentials.txt
304
+ - test/route53_test.rb
305
+ - test/support/web_mock_stubs.rb
306
+ - test/test_helper.rb
307
+ has_rdoc: