qurd 0.0.1

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.
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: