qurd 0.0.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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: