qurd 0.0.2 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 94d9eff5cd0487e81357efd7bf1f070919d88a8e
4
- data.tar.gz: 6e5ff2cbc80058aac96a37508708aaa4a7dea145
3
+ metadata.gz: 60d8e2710e6c78de59f55d37f0477ce3f1fd98a3
4
+ data.tar.gz: 63d106eb2c2817c6b1a7f21f77534eeb37ea639c
5
5
  SHA512:
6
- metadata.gz: c0ba3fb9cf0cb2ac637e568ff3b3a27e9affd7be961169351fb38d64d2db8c7e346c6670790eddeef4d81888824bd21680309008571244154fce538f1c2bfb89
7
- data.tar.gz: 4309198c61db3c1017178fe46c85b0535c5e667935fa31f6e8ec6ed17718aa46775930f713ad0b8a50272fe4b81de16f879f20f4673e97d92d904e8cef9879c9
6
+ metadata.gz: f1afebad665bf6e6b1586aadffa014ab7e201694d7104d373a8ddfe4e6ab945f9b887e5c776e5da41fde63199f762e87e40e38e03f848fb1e1115643252e7bce
7
+ data.tar.gz: 9a29b9618381985cb9396fdb388a1f14483027cc042731ddb264c2d6a67910b43b0730e9de2bfbe6ba935d31c2fe5cf5d44a40efd126ac277c42aa6f4cec8106
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  *.a
14
14
  mkmf.log
15
15
  *.sw[a-z]
16
+ test/reports
@@ -1 +1 @@
1
- 2.1.2
1
+ 2.3.1
@@ -0,0 +1,6 @@
1
+ # qurd CHANGELOG
2
+
3
+ ## 0.0.3
4
+ * Add periodic stats logging
5
+ * Add configuration option `stats_interval`
6
+
data/README.md CHANGED
@@ -19,15 +19,20 @@ Dummy is provided as a simple example, but, in a nutshell, inherit from
19
19
  Qurd::Action and override the actions you respond to.
20
20
 
21
21
  Your action class can configure itself, by overriding the class method
22
- `configure`. Instances must override the action methods launch, launch_error,
23
- terminate, terminate_error, and test. Action instances have two attributes,
24
- `message` and `context`. Message is a `Qurd::Message` instance. Context is a
25
- `Cabin::Context`, used for logging. Callbacks, to interact with the action
26
- before and after the instance are executed, can be overridden.
22
+ `configure`. Instances must override the action methods `launch`,
23
+ `launch_error`, `terminate`, `terminate_error`, and `test`. Action instances
24
+ have two attributes, `message` and `context`. Message is a `Qurd::Message`
25
+ instance. Context is a `Cabin::Context`, used for logging. Callbacks, to
26
+ interact with the action before and after the instance are executed, can be
27
+ overridden.
27
28
 
28
29
  The mixins for AwsClients and Configuration are also available at the class and
29
30
  instance level.
30
31
 
32
+ Action instances will also respond to `aws_credentials`,
33
+ `chef_client`, `chef_client=`, `chef_node`, `chef_node=`, `failed!`, `failed?`,
34
+ `instance`, `instance_id`, `instance_name`, `name`, `region`.
35
+
31
36
  ```ruby
32
37
  # This contrived example creates a file in s3 when an instance launches
33
38
  # It can be triggered by adding the class name to the list of actions in the
@@ -45,7 +50,7 @@ class Foo < Qurd::Action
45
50
  aws_retryable do
46
51
  aws_client(:S3).delete_object(
47
52
  bucket: qurd_configuration.bucket,
48
- key: message.instance_id
53
+ key: instance_id
49
54
  )
50
55
  end
51
56
  end
@@ -54,8 +59,8 @@ class Foo < Qurd::Action
54
59
  aws_retryable do
55
60
  aws_client(:S3).put_object(
56
61
  bucket: qurd_configuration.bucket,
57
- key: message.instance_id,
58
- body: message.instance.private_ip_address
62
+ key: instance_id,
63
+ body: instance.private_ip_address
59
64
  )
60
65
  end
61
66
  end
@@ -64,7 +69,7 @@ class Foo < Qurd::Action
64
69
  aws_retryable do
65
70
  o = aws_client(:S3).get_object(
66
71
  bucket: qurd_configuration.bucket,
67
- key: message.instance_id
72
+ key: instance_id
68
73
  )
69
74
  qurd_logger.debug("Found #{o.body}")
70
75
  end
@@ -121,7 +126,7 @@ If you are using the route53 action, you will also need
121
126
  "route53:ChangeResourceRecordSets",
122
127
  "route53:DeleteHostedZone",
123
128
  "route53:GetHostedZone",
124
- "route53:ListHostedZones",
129
+ "route53:ListHostedZonesByName",
125
130
  "route53:ListResourceRecordSets"
126
131
  ],
127
132
  "Resource": [
@@ -215,6 +220,13 @@ To configure the daemon, edit the YAML configuration file. The default path is
215
220
  <td><tt>true</tt></td>
216
221
  </tr>
217
222
 
223
+ <tr>
224
+ <td><tt>stats_interval</tt></td>
225
+ <td>Control the interval at which stats are logged, in seconds</td>
226
+ <td><tt>Fixnum</tt></td>
227
+ <td><tt>600</tt></td>
228
+ </tr>
229
+
218
230
  <tr>
219
231
  <td><tt>sqs_set_attributes_timeout</tt></td>
220
232
  <td>Defines the timeout, in seconds, for a thread setting SQS attributes</td>
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
+ require 'ci/reporter/rake/minitest'
4
+ task :minitest => ['ci:setup:minitest', 'test']
3
5
 
4
6
  Rake::TestTask.new do |t|
5
7
  t.pattern = "test/*_test.rb"
@@ -1,3 +1,4 @@
1
+ require 'forwardable'
1
2
  module Qurd
2
3
  # Subclass and override {#launch}, {#launch_error}, {#terminate},
3
4
  # {#terminate_error}, and {#test}, optionally override class method
@@ -12,12 +13,49 @@ module Qurd
12
13
  autoload :Chef, 'qurd/action/chef'
13
14
  autoload :Route53, 'qurd/action/route53'
14
15
 
16
+ extend Forwardable
17
+
15
18
  extend Qurd::Mixins::Configuration
16
19
  include Qurd::Mixins::Configuration
17
20
 
18
21
  extend Qurd::Mixins::AwsClients
19
22
  include Qurd::Mixins::AwsClients
20
23
 
24
+ # @!attribute aws_credentials [r]
25
+ # @return [Aws::Credentials]
26
+ def_delegator :@message, :aws_credentials, :aws_credentials
27
+ # @!attribute chef_client
28
+ # @return [Chef::ApiClient]
29
+ def_delegator :@message, :chef_client, :chef_client
30
+ def_delegator :@message, :chef_client=, :chef_client=
31
+ # @!attribute chef_node
32
+ # @return [Chef::Node]
33
+ def_delegator :@message, :chef_node, :chef_node
34
+ def_delegator :@message, :chef_node=, :chef_node=
35
+ # @!method failed!(e) [r]
36
+ # Log an action failure, setting the Qurd::Message
37
+ # @return [Aws::Credentials]
38
+ # @see Qurd::Message.failed!
39
+ def_delegator :@message, :failed!, :failed!
40
+ # @!attribute failed? [r]
41
+ # @return [Boolean]
42
+ def_delegator :@message, :failed?, :failed?
43
+ # @!attribute instance_id [r]
44
+ # @return [String]
45
+ def_delegator :@message, :instance_id, :instance_id
46
+ # @!attribute instance_name [r]
47
+ # @return [String]
48
+ def_delegator :@message, :instance_name, :instance_name
49
+ # @!attribute instance [r]
50
+ # @return [Struct]
51
+ def_delegator :@message, :instance, :instance
52
+ # @!attribute name [r]
53
+ # @return [String]
54
+ def_delegator :@message, :name, :name
55
+ # @!attribute region [r]
56
+ # @return [String]
57
+ def_delegator :@message, :region, :region
58
+
21
59
  # @!attribute context [r]
22
60
  # The logging context
23
61
  # @return [Cabin::Context]
@@ -46,18 +84,6 @@ module Qurd
46
84
  @context = message.context
47
85
  end
48
86
 
49
- # Aws region for the message
50
- # @return [String]
51
- def region
52
- message.region
53
- end
54
-
55
- # Aws credentials for the message
56
- # @return [Aws::Credentials]
57
- def aws_credentials
58
- message.aws_credentials
59
- end
60
-
61
87
  # Executed before the processor runs the plugins for an action
62
88
  # @see Qurd::Processor
63
89
  def run_before
@@ -47,14 +47,14 @@ module Qurd
47
47
  # dry_run is not true
48
48
  # @see {#Qurd::Message}
49
49
  def terminate
50
- if message.failed?
50
+ if failed?
51
51
  qurd_logger.warn('Not deleting, message failed to process')
52
52
  elsif qurd_configuration.dry_run
53
53
  check_dry_run
54
54
  else
55
55
  qurd_logger.debug('Deleting')
56
- message.chef_node.destroy unless message.chef_node.nil?
57
- message.chef_client.destroy unless message.chef_client.nil?
56
+ chef_node.destroy unless chef_node.nil?
57
+ chef_client.destroy unless chef_client.nil?
58
58
  end
59
59
  end
60
60
 
@@ -68,26 +68,27 @@ module Qurd
68
68
  # Set the +message+ +chef_node+ and +context+ +chef_name+
69
69
  # @see chef_search_node
70
70
  def find_chef_node
71
- node = chef_search_node
72
- message.chef_node = node
71
+ node = chef_search_node("instance_id", instance_id)
72
+ node ||= chef_search_node("name", instance_name)
73
+ self.chef_node = node
73
74
  message.context[:chef_name] = node.name
74
75
  qurd_logger.debug('Chef node found')
75
76
  rescue NoMethodError
76
77
  qurd_logger.warn('Chef node not found')
77
- message.chef_node = nil
78
+ self.chef_node = nil
78
79
  message.context[:chef_name] = nil
79
80
  end
80
81
 
81
82
  # Set the +message+ +chef_client+ and +context+ +chef_client_name+
82
83
  # @see chef_search_client
83
84
  def find_chef_client
84
- client = chef_search_client(message.chef_node.name)
85
- message.chef_client = client
85
+ client = chef_search_client(chef_node.name)
86
+ self.chef_client = client
86
87
  message.context[:chef_client_name] = client.name
87
88
  qurd_logger.debug('Chef client found')
88
89
  rescue NoMethodError
89
90
  qurd_logger.warn('Chef client not found')
90
- message.chef_client = nil
91
+ self.chef_client = nil
91
92
  message.context[:chef_client_name] = nil
92
93
  end
93
94
 
@@ -98,10 +99,11 @@ module Qurd
98
99
  end
99
100
 
100
101
  # Search for a Chef node, based on the +instance_id+
102
+ # @param [String] key the chef key to search
103
+ # @param [String] value the value of the key to search
101
104
  # @return [Chef::Node|nil]
102
- # @see instance_id
103
- def chef_search_node
104
- res = chef_search.search(:node, "instance_id:#{message.instance_id}")
105
+ def chef_search_node(key, value)
106
+ res = chef_search.search(:node, "#{key}:#{value}")
105
107
  res.last == 1 ? res[0][0] : nil
106
108
  end
107
109
 
@@ -39,7 +39,7 @@ module Qurd
39
39
  # dry_run is not true
40
40
  # @see {#Qurd::Message}
41
41
  def terminate
42
- if message.failed?
42
+ if failed?
43
43
  qurd_logger.warn('Not deleting, message failed to process')
44
44
  elsif qurd_configuration.dry_run
45
45
  if !hosted_zone
@@ -63,21 +63,17 @@ module Qurd
63
63
 
64
64
  private
65
65
 
66
- def instance_name
67
- message.instance_name
68
- end
69
-
70
66
  def route53
71
67
  @route53 ||= aws_client(:Route53)
72
68
  end
73
69
 
74
70
  def qurd_route53
75
- @config ||= qurd_configuration.route53[message.name]
71
+ @config ||= qurd_configuration.route53[name]
76
72
  end
77
73
 
78
74
  def chef_node_name
79
75
  return @chef_node_name if @chef_node_name
80
- @chef_node_name = message.chef_node.name
76
+ @chef_node_name = chef_node.name
81
77
  qurd_logger.debug("Found chef name '#{@chef_node_name}'")
82
78
  @chef_node_name
83
79
  rescue NoMethodError
@@ -127,7 +123,7 @@ module Qurd
127
123
  end
128
124
  rescue Qurd::Action::Route53::Errors => e
129
125
  qurd_logger.error("Failed to delete: #{e}")
130
- message.failed!(e)
126
+ failed!(e)
131
127
  end
132
128
 
133
129
  def hosted_zone(tries = nil)
@@ -8,8 +8,8 @@ module Qurd
8
8
  # Configuration options, ie
9
9
  # +aws_credentials+, +auto_scaling_queues+, +actions+, +daemonize+,
10
10
  # +dry_run+, +listen_timeout+, +log_file+, +log_level+, +pid_file+,
11
- # +save_failures+, +sqs_set_attributes_timeout+, +visibility_timeout+,
12
- # +wait_time+.
11
+ # +save_failures+, +stats_interval+, +sqs_set_attributes_timeout+,
12
+ # +visibility_timeout+, +wait_time+.
13
13
  # Additional configuration keys include +listeners+.
14
14
  # @return [Hashie::Mash] the config YAML as a Mash
15
15
  # @!attribute [r] logger
@@ -30,10 +30,12 @@ module Qurd
30
30
  @config.save_failures = get_or_default(@config, :save_failures, true)
31
31
  @queues = []
32
32
  @aws_credentials = []
33
+ st = get_or_default(@config, :sqs_set_attributes_timeout, 10, :to_f)
34
+ si = get_or_default(@config, :stats_interval, 600, :to_i)
33
35
  vt = get_or_default(@config, :visibility_timeout, 300, :to_s)
34
36
  wt = get_or_default(@config, :wait_time, 20, :to_s)
35
- st = get_or_default(@config, :sqs_set_attributes_timeout, 10, :to_f)
36
37
  lt = get_or_default(@config, :listen_timeout, vt, :to_f)
38
+ @config.stats_interval = si
37
39
  @config.visibility_timeout = vt
38
40
  @config.wait_time = wt
39
41
  @config.sqs_set_attributes_timeout = st
@@ -58,6 +58,9 @@ module Qurd
58
58
  # @yieldparam [Cabin::Context] ctx the logging context
59
59
  def queue_threads(&_block)
60
60
  queues.map do |qurl|
61
+ @mutex = Mutex.new
62
+ @counter = Hashie::Mash.new({thread_timeouts: 0, aws_service_errors: 0, successes: 0, failures: 0, messages: 0})
63
+
61
64
  qurd_logger.debug("Creating thread for #{qurl}")
62
65
  Thread.new(qurl) do |url|
63
66
  ctx = qurd_config.get_context(name: name, queue_name: url[/([^\/]+)$/])
@@ -71,7 +74,7 @@ module Qurd
71
74
  # message received
72
75
  # @return [Array<Thread>]
73
76
  def listen
74
- queue_threads do |qurl, _context|
77
+ threads = queue_threads do |qurl, _context|
75
78
  loop do
76
79
  begin
77
80
  msgs = aws_client(:SQS).receive_message(
@@ -84,13 +87,17 @@ module Qurd
84
87
  thread.join(qurd_configuration.listen_timeout)
85
88
  end
86
89
  if joins.compact.count != threads.count
90
+ nthreads = threads.count - joins.compact.count
91
+ lock_counter { @counter.thread_timeouts += nthreads }
87
92
  qurd_logger.warn('Some threads timed out')
88
93
  end
89
94
  rescue Aws::Errors::ServiceError => e
95
+ lock_counter { @counter.aws_service_errors += 1 }
90
96
  qurd_logger.error("Aws raised #{e}")
91
97
  end
92
98
  end
93
99
  end
100
+ threads << stats_thread
94
101
  end
95
102
 
96
103
  # @private
@@ -100,12 +107,39 @@ module Qurd
100
107
 
101
108
  private
102
109
 
110
+ def stats_thread
111
+ Thread.new do
112
+ loop do
113
+ sleep(qurd_configuration.stats_interval)
114
+ lock_counter { qurd_logger.info("STATS", @counter) }
115
+ end
116
+ end
117
+ end
118
+
119
+ def lock_counter(&_block)
120
+ @mutex.synchronize {
121
+ begin
122
+ yield
123
+ rescue ThreadError => e
124
+ @mutex.sleep(0.1)
125
+ qurd_logger.debug("ThreadError: #{e}")
126
+ retry
127
+ end
128
+ }
129
+ end
130
+
103
131
  def process_messages(qurl, msgs)
132
+ lock_counter { @counter.messages += msgs.messages.count }
104
133
  msgs.messages.map do |msg|
105
134
  Thread.new(msg) do |m|
106
135
  qurd_logger.debug("Found message #{msg}")
107
136
  r = Processor.new self, m, name, qurl
108
137
  r.process
138
+ lock_counter {
139
+ r.message.failed? ?
140
+ @counter.failures += 1 :
141
+ @counter.successes += 1
142
+ }
109
143
  end
110
144
  end
111
145
  end
@@ -134,6 +168,7 @@ module Qurd
134
168
  )
135
169
  rescue Aws::SQS::Errors::ServiceError::QueueDoesNotExist => e
136
170
  qurd_logger.error("SQS raised #{e}")
171
+ Thread.terminate
137
172
  rescue Aws::SQS::Errors::ServiceError => e
138
173
  qurd_logger.error("SQS raised #{e}")
139
174
  raise e
@@ -1,5 +1,5 @@
1
1
  # Gem module
2
2
  module Qurd
3
3
  # The daemon version
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.6'
5
5
  end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.8"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "minitest"
24
+ spec.add_development_dependency "ci_reporter_minitest"
24
25
  spec.add_development_dependency "pry-nav"
25
26
  spec.add_development_dependency "webmock"
26
27
  spec.add_development_dependency "minitest-matchers_vaccine"
@@ -0,0 +1,9 @@
1
+ #!/bin/bash
2
+ set -e
3
+ bundle package --all
4
+ bundle install --binstubs bundler-bin --deployment --local --without development test
5
+ echo ${BUILD_NUMBER} > .release.txt
6
+ git rev-parse --verify HEAD >> .release.txt
7
+ rm -rf release
8
+ mkdir -p release
9
+ tar -cvzf release/qurd-${BUILD_NUMBER}.tgz --exclude release * .release.txt .bundle .ruby-version
@@ -39,12 +39,12 @@ describe Qurd::Action do
39
39
  aws_sqs_list_queues
40
40
  aws_sqs_set_queue_attributes
41
41
  aws_sqs_receive_message 'test/responses/aws/sqs-receive-message-1-launch.xml'
42
- Qurd::Configuration.instance.configure('test/inputs/qurd.yml')
42
+ Qurd::Configuration.instance.configure('test/inputs/qurd_chef.yml')
43
43
  end
44
44
  let(:sqs_client) { Aws::SQS::Client.new(region: 'us-west-2') }
45
45
  let(:queue_url) { 'https://sqs.us-west-2.amazonaws.com/123456890/test2-ScalingNotificationsQueue-HPPYDAYSAGAI1' }
46
46
  let(:sqs_message) { sqs_client.receive_message(queue_url: queue_url).messages.first }
47
- let(:qurd_message) { Qurd::Message.new(message: sqs_message) }
47
+ let(:qurd_message) { Qurd::Message.new(message: sqs_message, region: 'us-west-2', aws_credentials: Aws::Credentials.new('a', 'b')) }
48
48
  let(:subject) { TestActionClass.new(qurd_message) }
49
49
 
50
50
  it 'includes configuration mixin' do
@@ -72,12 +72,12 @@ describe Qurd::Action do
72
72
  end
73
73
  end
74
74
 
75
- it 'responds to region' do
76
- subject.region.must_equal qurd_message.region
77
- end
78
-
79
- it 'responds to aws_credentials' do
80
- subject.aws_credentials.must_equal qurd_message.aws_credentials
75
+ %w[aws_credentials instance chef_client chef_node failed! failed?
76
+ instance_id instance_name name region].each do |method|
77
+ it "responds to #{method}" do
78
+ aws_ec2_describe_instances 'test/responses/aws/ec2-describe-instances-1.xml'
79
+ subject.send(method).must_equal qurd_message.send(method)
80
+ end
81
81
  end
82
82
 
83
83
  %w[launch launch_error terminate terminate_error test].each do |action|
@@ -57,6 +57,11 @@ describe Qurd::Action::Chef do
57
57
  'node',
58
58
  "instance_id:#{qurd_message.instance_id}"
59
59
  )
60
+ chef_search(
61
+ 'test/responses/chef/search-node-instance-n.json',
62
+ 'node',
63
+ "name:test-414.staging.example.com"
64
+ )
60
65
  chef_search(
61
66
  'test/responses/chef/search-client-name-n.json',
62
67
  'client',
@@ -67,7 +72,7 @@ describe Qurd::Action::Chef do
67
72
  subject.message.context[:chef_name].must_equal nil
68
73
  end
69
74
 
70
- it 'finds a node and client' do
75
+ it 'finds a node (instance_id) and client' do
71
76
  chef_search(
72
77
  'test/responses/chef/search-node-instance-1.json',
73
78
  'node',
@@ -85,12 +90,40 @@ describe Qurd::Action::Chef do
85
90
  subject.message.context[:chef_client_name].must_equal 'test-414.staging.example.com'
86
91
  end
87
92
 
93
+ it 'finds a node (name) and client' do
94
+ chef_search(
95
+ 'test/responses/chef/search-node-instance-0.json',
96
+ 'node',
97
+ "instance_id:#{qurd_message.instance_id}"
98
+ )
99
+ chef_search(
100
+ 'test/responses/chef/search-node-instance-1.json',
101
+ 'node',
102
+ "name:test-414.staging.example.com"
103
+ )
104
+ chef_search(
105
+ 'test/responses/chef/search-client-name-1.json',
106
+ 'client',
107
+ 'name:test-414.staging.example.com'
108
+ )
109
+ subject.run_before
110
+ subject.message.chef_node.must_be_kind_of Chef::Node
111
+ subject.message.context[:chef_name].must_equal 'test-414.staging.example.com'
112
+ subject.message.chef_client.must_be_kind_of Chef::ApiClient
113
+ subject.message.context[:chef_client_name].must_equal 'test-414.staging.example.com'
114
+ end
115
+
88
116
  it 'does not find a node' do
89
117
  chef_search(
90
118
  'test/responses/chef/search-node-instance-0.json',
91
119
  'node',
92
120
  "instance_id:#{qurd_message.instance_id}"
93
121
  )
122
+ chef_search(
123
+ 'test/responses/chef/search-node-instance-0.json',
124
+ 'node',
125
+ "name:test-414.staging.example.com"
126
+ )
94
127
  chef_search(
95
128
  'test/responses/chef/search-client-name-0.json',
96
129
  'client',
@@ -61,6 +61,7 @@ describe Qurd::Configuration do
61
61
  subject.config.pid_file.must_equal '/var/run/qurd/qurd.pid'
62
62
  subject.config.save_failures.must_equal true
63
63
  subject.config.sqs_set_attributes_timeout.must_equal 10.0
64
+ subject.config.stats_interval.must_equal 600
64
65
  subject.config.visibility_timeout.must_equal '300'
65
66
  subject.config.wait_time.must_equal '20'
66
67
  end
@@ -74,6 +75,7 @@ describe Qurd::Configuration do
74
75
  pid_file: 'tmp/qurd.pid',
75
76
  save_failures: false,
76
77
  sqs_set_attributes_timeout: 3,
78
+ stats_interval: 100,
77
79
  visibility_timeout: 0,
78
80
  wait_time: 1
79
81
  )
@@ -85,6 +87,7 @@ describe Qurd::Configuration do
85
87
  subject.config.pid_file.must_equal 'tmp/qurd.pid'
86
88
  subject.config.save_failures.must_equal false
87
89
  subject.config.sqs_set_attributes_timeout.must_equal 3.0
90
+ subject.config.stats_interval.must_equal 100
88
91
  subject.config.visibility_timeout.must_equal '0'
89
92
  subject.config.wait_time.must_equal '1'
90
93
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qurd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philip Champon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-17 00:00:00.000000000 Z
11
+ date: 2017-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ci_reporter_minitest
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'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry-nav
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -161,6 +175,7 @@ extra_rdoc_files: []
161
175
  files:
162
176
  - ".gitignore"
163
177
  - ".ruby-version"
178
+ - CHANGELOG.md
164
179
  - Gemfile
165
180
  - LICENSE.txt
166
181
  - README.md
@@ -183,6 +198,7 @@ files:
183
198
  - lib/qurd/version.rb
184
199
  - lib/string.rb
185
200
  - qurd.gemspec
201
+ - scripts/artifact.sh
186
202
  - test/action_test.rb
187
203
  - test/chef_test.rb
188
204
  - test/configuration_test.rb
@@ -251,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
251
267
  version: '0'
252
268
  requirements: []
253
269
  rubyforge_project:
254
- rubygems_version: 2.2.2
270
+ rubygems_version: 2.5.1
255
271
  signing_key:
256
272
  specification_version: 4
257
273
  summary: 'QUeue Resource Daemon: reaping and sowing your auto-scaled resources'
@@ -304,4 +320,3 @@ test_files:
304
320
  - test/route53_test.rb
305
321
  - test/support/web_mock_stubs.rb
306
322
  - test/test_helper.rb
307
- has_rdoc: