silver_spurs 2.0.0.rc1 → 2.0.0.rc3

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Yjc1NDE4ZTRiM2U0OWZiZjIxYzFhMWYwZGQxYzg3ZjdjMmQ2NzE0NQ==
5
+ data.tar.gz: !binary |-
6
+ NWJhMjM4ZmMyMzNmMjMwOTViM2E2NjdkZGJjYjk0YzZiYjk1M2Y3ZQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MDExZmYwMzJiZjQ0Y2ZlZjRlNWJlZTA1NDg5YzgyOThjY2NhMGI3YzYyNGM0
10
+ YWE5YzMzZmRhMmMzM2UzY2QyODAwMDYzYzQ4YmNiMWFlODk0MDRkOWMwNzM3
11
+ YmY2YWVkY2NiY2Y3NDBlZGY1NzFhYTNkYzdjZjNmNjQ5NDI2NWE=
12
+ data.tar.gz: !binary |-
13
+ YWJkMzQxMjQ4MzdiN2ZhMDI1OTM5NzFhOWJmN2JjNzMyNDM0YzcyNGZjNTNh
14
+ NmE4NWI2NDMyNWNlZDBkMmU1ZDg0NmRhMDc2ZTFjN2E0ZGZkMTJhNDI3Mzkw
15
+ OGExMDE2ZDM5OGRmNjc0ZmU0MmU3ZjU5ZWZhZjc4ZTFhZTE4Y2I=
data/.gitignore CHANGED
@@ -32,4 +32,5 @@ tramp
32
32
  .org-id-locations
33
33
  *_archive
34
34
 
35
+ .idea
35
36
 
data/.travis.yml CHANGED
@@ -3,4 +3,7 @@ rvm:
3
3
  - 2.0.0
4
4
  - 1.9.3
5
5
  - 1.9.2
6
- - ruby-head
6
+ - ruby-head
7
+ notifications:
8
+ campfire:
9
+ secure: "e/rh1fwGlXvclgG7ql+WEHVm1TwdbJ/iSpbjzYvdvud9ZtWPHEI8/qvUMeqR\n4PZDqLfCt9N2Eliky4VGo49yu4OGYEy9bY0I/oRLi8DQw4eFohwTII14oXM2\nDh1qT/5p1DeIfm0BgHwbS0YwsbaIWpYoYdh3C93FNwsNXI0lMoQ="
@@ -40,10 +40,7 @@ module SilverSpurs
40
40
  end
41
41
 
42
42
  put '/bootstrap/:ip' do
43
- required_params = [:node_name]
44
- unless required_vars? params, required_params
45
- return 406, {:required_params => required_params}.to_json
46
- end
43
+ ensure_required_params :node_name
47
44
 
48
45
  node_name = params[:node_name].strip
49
46
  return 406, {:bad_params => :node_name}.to_json unless node_name =~ settings.node_name_filter
@@ -107,8 +104,38 @@ module SilverSpurs
107
104
  end
108
105
  end
109
106
 
110
- def required_vars?(params, requirement_list)
111
- requirement_list.none? { |required_param| params[required_param].nil? }
107
+ # JSON endpoint - set Content-Type request header to 'application/json'
108
+ # This should be PUT'd to with a JSON payload that looks like:
109
+ # {
110
+ # "attributes": {
111
+ # "somenew.node.attribute": "bananas",
112
+ # "another.node.attribute": true
113
+ # }
114
+ # }
115
+ put '/attributes/:ip' do
116
+ ensure_required_params :attributes
117
+
118
+ chef = ChefInterface.new(settings.chef_config)
119
+ begin
120
+ chef.update_node_attributes(params[:ip], params[:attributes])
121
+ rescue SilverSpurs::NodeNotFoundException
122
+ status 404
123
+ end
124
+ end
125
+
126
+ def ensure_required_params(*required_params)
127
+ merge_json_body_params
128
+ all_present = required_params.none? { |required_param| params[required_param].nil? }
129
+ unless all_present
130
+ halt 406, {:required_params => required_params}.to_json
131
+ end
132
+ end
133
+
134
+ def merge_json_body_params
135
+ if request.content_type.include?('application/json') and request.content_length.to_i > 0
136
+ request.body.rewind
137
+ params.merge! JSON.parse(request.body.read.strip)
138
+ end
112
139
  end
113
140
 
114
141
  end
@@ -38,7 +38,12 @@ module SilverSpurs
38
38
  return false unless File.exists? pid_file_path(process_name)
39
39
 
40
40
  pid = File.read(pid_file_path(process_name)).to_i
41
- IO.popen("ps -o command -p #{pid}").read.split("\n").count == 2
41
+
42
+ ps_handle = IO.popen("ps -o command -p #{pid}")
43
+ process_is_running = ps_handle.read.split("\n").count == 2
44
+ ps_handle.close
45
+
46
+ process_is_running
42
47
  end
43
48
 
44
49
  def success?(process_name)
@@ -14,12 +14,20 @@ module SilverSpurs
14
14
  node = find_node node_name
15
15
  if run_list.size > 0
16
16
  command = "sudo chef-client -o '#{run_list.join(',')}'"
17
- ridley.node.execute_command node.public_hostname, command
17
+ ridley.node.execute_command find_hostname(node_name, node), command
18
18
  else
19
19
  node.chef_run
20
20
  end
21
21
  end
22
22
 
23
+ def update_node_attributes(node_name, attributes)
24
+ node = find_node node_name
25
+ attributes.each do |attribute_name, value|
26
+ node.set_chef_attribute attribute_name, value
27
+ end
28
+ node.save
29
+ end
30
+
23
31
  private
24
32
 
25
33
  def ridley
@@ -32,5 +40,12 @@ module SilverSpurs
32
40
  node
33
41
  end
34
42
 
43
+ # Waterfall through the options, use the node name as a last resort
44
+ def find_hostname(node_name, node)
45
+ return node.public_hostname if node.public_hostname
46
+ return node.public_ipv4 if node.public_ipv4
47
+ return node_name
48
+ end
49
+
35
50
  end
36
51
  end
@@ -4,7 +4,7 @@ require 'json'
4
4
  require 'silver_spurs/knife_interface'
5
5
  require 'silver_spurs/client/exceptions'
6
6
  require 'silver_spurs/client/bootstrap_run'
7
- require 'silver_spurs/client/chef_run'
7
+ require 'silver_spurs/client/chef_output'
8
8
 
9
9
  module SilverSpurs
10
10
  class Client
@@ -18,7 +18,9 @@ module SilverSpurs
18
18
  payload = parameterize_hash params
19
19
  headers = {:accept => :json, :content_type=> 'application/x-www-form-urlencoded'}
20
20
 
21
- response = spur_host["bootstrap/#{ip}"].put(payload, headers, &method(:dont_redirect_for_303))
21
+ response = gracefully_handle_rest_call do
22
+ spur_host["bootstrap/#{ip}"].put(payload, headers, &method(:dont_redirect_for_303))
23
+ end
22
24
 
23
25
  throw ClientException.new("unexpected response", response) unless response.code == 303
24
26
 
@@ -26,12 +28,32 @@ module SilverSpurs
26
28
  end
27
29
 
28
30
  def start_chef_run(host_name, runlist = [])
29
- response = spur_host["kick/#{host_name}"].post :params => { :run => runlist }
30
- raise ClientException.new("the host name was not found", response) if response.code == 404
31
- ChefRun.new JSON.parse(response)
31
+ response = gracefully_handle_rest_call do
32
+ spur_host["kick/#{host_name}"].post :params => { :run => runlist }
33
+ end
34
+ ChefOutput.new JSON.parse(response)
35
+ end
36
+
37
+ def set_node_attributes(host_name, attributes = {})
38
+ headers = { :accept => :json, :content_type => 'application/json' }
39
+ gracefully_handle_rest_call do
40
+ spur_host["attributes/#{host_name}"].put({ :attributes => attributes }.to_json, headers)
41
+ end
32
42
  end
33
43
 
34
44
  private
45
+
46
+ def gracefully_handle_rest_call(&rest_call)
47
+ begin
48
+ response = rest_call.call
49
+ rescue RestClient::ResourceNotFound
50
+ raise ClientException.new("the host name was not found", response)
51
+ rescue Exception
52
+ raise ClientException.new("an unanticipated error occured", response)
53
+ end
54
+
55
+ response
56
+ end
35
57
 
36
58
  def parameterize_hash(param_hash)
37
59
  uri = Addressable::URI.new
@@ -3,7 +3,7 @@ require 'silver_spurs/client/exceptions'
3
3
  require 'erb'
4
4
 
5
5
  module SilverSpurs
6
- class ChefRun
6
+ class ChefOutput
7
7
 
8
8
  attr_reader :log, :status
9
9
 
@@ -1,3 +1,3 @@
1
1
  module SilverSpurs
2
- VERSION = "2.0.0.rc1"
2
+ VERSION = "2.0.0.rc3"
3
3
  end
@@ -292,6 +292,61 @@ describe SilverSpurs::App do
292
292
  end
293
293
 
294
294
  end
295
+
296
+ describe '/attributes/:ip' do
297
+ before :each do
298
+ @chef = double('chef')
299
+ SilverSpurs::ChefInterface.stub(:new).and_return @chef
300
+ end
301
+
302
+ context 'when attributes are supplied' do
303
+
304
+ before :each do
305
+ @attributes = {
306
+ :attributes => {
307
+ :thing => 'sloth',
308
+ :things => 'more_sloths'
309
+ }
310
+ }.to_json
311
+
312
+ header 'Content-Type', 'application/json'
313
+ end
314
+
315
+ it 'updates the attributes on the target node' do
316
+ @chef.should_receive(:update_node_attributes)
317
+
318
+ put '/attributes/node', @attributes
319
+ last_response.status.should eq 200
320
+ end
321
+
322
+ context 'and the node does not exist' do
323
+ it 'should return a 404' do
324
+ @chef.stub(:update_node_attributes).and_raise(SilverSpurs::NodeNotFoundException.new)
325
+
326
+ put '/attributes/node', @attributes
327
+ last_response.status.should eq 404
328
+ end
329
+ end
330
+
331
+ end
332
+
333
+ context 'when attributes are not supplied' do
334
+
335
+ it 'returns a 406 since attributes (required) were not present' do
336
+ put '/attributes/node'
337
+ last_response.status.should eq 406
338
+ end
339
+
340
+ context 'and the node does not exist' do
341
+ it 'should still return a 406 due to the missing attributes' do
342
+ put '/attributes/node'
343
+ last_response.status.should eq 406
344
+ end
345
+ end
346
+
347
+ end
348
+
349
+ end
295
350
 
296
351
  end
297
352
 
@@ -37,7 +37,7 @@ describe SilverSpurs::ChefInterface do
37
37
  end
38
38
 
39
39
  it 'should pass in the host name from the node object' do
40
- @node_obj.should_receive(:public_hostname).and_return 'hostname'
40
+ @chef_i.should_receive(:find_hostname).and_return 'hostname'
41
41
  @node_resource.should_receive(:execute_command).with('hostname', anything)
42
42
  end
43
43
 
@@ -131,5 +131,115 @@ describe SilverSpurs::ChefInterface do
131
131
  end
132
132
 
133
133
  end
134
-
134
+
135
+ describe :find_hostname do
136
+ before :each do
137
+ @chef_i = SilverSpurs::ChefInterface.new({})
138
+ @node_resource = double('node_resource')
139
+ @node_name = 'node_name'
140
+ @hostname = 'hostname.domain.tld'
141
+ @ipv4 = '1.1.1.1'
142
+ end
143
+
144
+ def call_find_hostname(node_name, node)
145
+ @chef_i.send :find_hostname, node_name, node
146
+ end
147
+
148
+ context 'when node knows about public_hostname' do
149
+ before :each do
150
+ @node_resource.stub(:public_hostname).and_return @hostname
151
+ end
152
+
153
+ context 'and also public_ipv4' do
154
+ before :each do
155
+ @node_resource.stub(:public_ipv4).and_return @ipv4
156
+ end
157
+
158
+ it 'returns the public hostname' do
159
+ call_find_hostname(@node_name, @node_resource).should eq @hostname
160
+ end
161
+ end
162
+
163
+ context 'but not public_ipv4' do
164
+ before :each do
165
+ @node_resource.stub(:public_ipv4).and_return nil
166
+ end
167
+
168
+ it 'returns the public hostname' do
169
+ call_find_hostname(@node_name, @node_resource).should eq @hostname
170
+ end
171
+ end
172
+ end
173
+
174
+ context 'when node does not know about public_hostname' do
175
+ before :each do
176
+ @node_resource.stub(:public_hostname).and_return nil
177
+ end
178
+
179
+ context 'but does know public_ipv4' do
180
+ before :each do
181
+ @node_resource.stub(:public_ipv4).and_return @ipv4
182
+ end
183
+
184
+ it 'returns the public_ipv4' do
185
+ call_find_hostname(@node_name, @node_resource).should eq @ipv4
186
+ end
187
+ end
188
+
189
+ context 'and is also ignorant of the public_ipv4' do
190
+ before :each do
191
+ @node_resource.stub(:public_ipv4).and_return nil
192
+ end
193
+
194
+ it 'returns the node name' do
195
+ call_find_hostname(@node_name, @node_resource).should eq @node_name
196
+ end
197
+ end
198
+ end
199
+
200
+ end
201
+
202
+ describe :update_node_attributes do
203
+
204
+ before :each do
205
+ @chef_i = SilverSpurs::ChefInterface.new({})
206
+ @node_obj = double('node_obj')
207
+ end
208
+
209
+ context 'when the target node is found' do
210
+ it 'finds a node then updates its attributes' do
211
+ @chef_i.should_receive(:find_node).and_return @node_obj
212
+ @node_obj.should_receive(:set_chef_attribute).with(kind_of(String), kind_of(String))
213
+ @node_obj.should_receive(:save)
214
+
215
+ @chef_i.update_node_attributes 'node', { 'app.program.config' => 'bananas' }
216
+ end
217
+ end
218
+
219
+ context 'when the target node is not found' do
220
+ before :each do
221
+ @ridley = double('ridley')
222
+ Ridley.stub(:new).and_return @ridley
223
+ @node_resource = double('node_res')
224
+ @ridley.stub(:node).and_return @node_resource
225
+ @node_resource.stub(:find).and_return nil
226
+ end
227
+
228
+ it 'throws an exception when trying to find the target node' do
229
+ expect {
230
+ @chef_i.update_node_attributes('node', { 'app.program.config' => 'bananas' })
231
+ }.to raise_exception SilverSpurs::NodeNotFoundException
232
+ end
233
+
234
+ it 'does not try to set or save any node attributes' do
235
+ @node_obj.should_not_receive(:set_chef_attribute).with any_args
236
+ @node_obj.should_not_receive(:save).with any_args
237
+
238
+ expect {
239
+ @chef_i.update_node_attributes('node', { 'app.program.config' => 'bananas' })
240
+ }.to raise_exception SilverSpurs::NodeNotFoundException
241
+ end
242
+ end
243
+
244
+ end
135
245
  end
@@ -1,9 +1,9 @@
1
- require 'silver_spurs/client/chef_run'
1
+ require 'silver_spurs/client/chef_output'
2
2
 
3
- describe SilverSpurs::ChefRun do
3
+ describe SilverSpurs::ChefOutput do
4
4
  describe :convert_status do
5
5
  before :each do
6
- @chef_run = SilverSpurs::ChefRun.new(["ok",{'stdout' => '', 'stderr' => '', 'exit_code' => 0, 'exit_status' => 0}])
6
+ @chef_run = SilverSpurs::ChefOutput.new(["ok",{'stdout' => '', 'stderr' => '', 'exit_code' => 0, 'exit_status' => 0}])
7
7
  end
8
8
 
9
9
  def call_convert_status(response)
@@ -34,7 +34,7 @@ describe SilverSpurs::ChefRun do
34
34
 
35
35
  describe :prettify_log do
36
36
  before :each do
37
- @chef_run = SilverSpurs::ChefRun.new(["ok",{'stdout' => '', 'stderr' => '', 'exit_code' => 0, 'exit_status' => 0}])
37
+ @chef_run = SilverSpurs::ChefOutput.new(["ok",{'stdout' => '', 'stderr' => '', 'exit_code' => 0, 'exit_status' => 0}])
38
38
  end
39
39
 
40
40
  def call_prettify_log(response)
@@ -118,7 +118,7 @@ describe SilverSpurs::Client do
118
118
  @client.stub(:spur_host).and_return @resource
119
119
  end
120
120
 
121
- it 'returns a ChefRun object' do
121
+ it 'returns a ChefOutput object' do
122
122
  response_payload = ["ok", {'stderr' => '', 'stdout' => '', 'exit_code' => 0, 'exit_status' => 0}]
123
123
  response = double('response')
124
124
  response.stub(:to_str).and_return response_payload.to_json
@@ -126,11 +126,51 @@ describe SilverSpurs::Client do
126
126
 
127
127
  @resource.stub(:post).and_return response
128
128
 
129
- SilverSpurs::ChefRun.should_receive(:new).with(response_payload)
129
+ SilverSpurs::ChefOutput.should_receive(:new).with(response_payload)
130
130
 
131
131
  @client.start_chef_run('hostname')
132
132
  end
133
133
 
134
134
  end
135
-
135
+
136
+ describe :set_node_attributes do
137
+ before :each do
138
+ @client = SilverSpurs::Client.new 'http://localhost'
139
+ @resource = double('rest-resource')
140
+ @resource.stub(:[]).and_return @resource
141
+ @client.stub(:spur_host).and_return @resource
142
+ end
143
+
144
+ it 'returns a String indicating success' do
145
+ response = 'true'
146
+ response.stub(:to_str).and_return 'true'
147
+ response.stub(:code).and_return 200
148
+ @resource.stub(:put).and_return response
149
+
150
+ @client.set_node_attributes('hostname', { 'this.attribute.right.here' => true })
151
+ .should be_a String
152
+ end
153
+
154
+ it 'raises an exception if a 404 is encountered' do
155
+ response = 'explosions'
156
+ response.stub(:to_str).and_return 'explosions'
157
+ response.stub(:code).and_return 404
158
+ @resource.stub(:put).and_raise RestClient::ResourceNotFound
159
+
160
+ expect {
161
+ @client.set_node_attributes('hostname', { 'this.attribute.right.here' => true })
162
+ }.to raise_exception SilverSpurs::ClientException
163
+ end
164
+
165
+ it 'raises a rather generic ClientException when any exception is caught' do
166
+ response = 'explosions'
167
+ response.stub(:to_str).and_return 'explosions'
168
+ @resource.stub(:put).and_raise 'uh ohes!'
169
+
170
+ expect {
171
+ @client.set_node_attributes('hostname', { 'this.attribute.right.here' => true })
172
+ }.to raise_exception SilverSpurs::ClientException
173
+ end
174
+ end
175
+
136
176
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: silver_spurs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc1
5
- prerelease: 6
4
+ version: 2.0.0.rc3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Christian Blades
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-07 00:00:00.000000000 Z
11
+ date: 2013-06-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sinatra
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: chef
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rest-client
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: addressable
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: ridley
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: guard
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: guard-rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
@@ -126,7 +111,6 @@ dependencies:
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: simplecov
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ! '>='
132
116
  - !ruby/object:Gem::Version
@@ -134,7 +118,6 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ! '>='
140
123
  - !ruby/object:Gem::Version
@@ -142,7 +125,6 @@ dependencies:
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: growl
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - ! '>='
148
130
  - !ruby/object:Gem::Version
@@ -150,7 +132,6 @@ dependencies:
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - ! '>='
156
137
  - !ruby/object:Gem::Version
@@ -158,7 +139,6 @@ dependencies:
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: rb-fsevent
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
143
  - - ~>
164
144
  - !ruby/object:Gem::Version
@@ -166,7 +146,6 @@ dependencies:
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
150
  - - ~>
172
151
  - !ruby/object:Gem::Version
@@ -174,7 +153,6 @@ dependencies:
174
153
  - !ruby/object:Gem::Dependency
175
154
  name: rack-test
176
155
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
156
  requirements:
179
157
  - - ! '>='
180
158
  - !ruby/object:Gem::Version
@@ -182,7 +160,6 @@ dependencies:
182
160
  type: :development
183
161
  prerelease: false
184
162
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
163
  requirements:
187
164
  - - ! '>='
188
165
  - !ruby/object:Gem::Version
@@ -190,7 +167,6 @@ dependencies:
190
167
  - !ruby/object:Gem::Dependency
191
168
  name: rake
192
169
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
170
  requirements:
195
171
  - - ! '>='
196
172
  - !ruby/object:Gem::Version
@@ -198,7 +174,6 @@ dependencies:
198
174
  type: :development
199
175
  prerelease: false
200
176
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
177
  requirements:
203
178
  - - ! '>='
204
179
  - !ruby/object:Gem::Version
@@ -227,7 +202,7 @@ files:
227
202
  - lib/silver_spurs/chef_interface.rb
228
203
  - lib/silver_spurs/client.rb
229
204
  - lib/silver_spurs/client/bootstrap_run.rb
230
- - lib/silver_spurs/client/chef_run.rb
205
+ - lib/silver_spurs/client/chef_output.rb
231
206
  - lib/silver_spurs/client/exceptions.rb
232
207
  - lib/silver_spurs/knife_interface.rb
233
208
  - lib/silver_spurs/version.rb
@@ -242,27 +217,26 @@ files:
242
217
  - spec/spec_helper.rb
243
218
  homepage: http://github.com/christian-blades-cb/silver_spurs
244
219
  licenses: []
220
+ metadata: {}
245
221
  post_install_message:
246
222
  rdoc_options: []
247
223
  require_paths:
248
224
  - lib
249
225
  required_ruby_version: !ruby/object:Gem::Requirement
250
- none: false
251
226
  requirements:
252
227
  - - ! '>='
253
228
  - !ruby/object:Gem::Version
254
229
  version: '0'
255
230
  required_rubygems_version: !ruby/object:Gem::Requirement
256
- none: false
257
231
  requirements:
258
232
  - - ! '>'
259
233
  - !ruby/object:Gem::Version
260
234
  version: 1.3.1
261
235
  requirements: []
262
236
  rubyforge_project:
263
- rubygems_version: 1.8.23
237
+ rubygems_version: 2.0.3
264
238
  signing_key:
265
- specification_version: 3
239
+ specification_version: 4
266
240
  summary: RESTful service to kick off chef bootstraps
267
241
  test_files:
268
242
  - spec/lib/silver_spurs/app_spec.rb