silver_spurs 2.0.0.rc1 → 2.0.0.rc3

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