chef-zero 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +3 -1
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +3 -1
- data/lib/chef_zero/rest_base.rb +5 -6
- data/lib/chef_zero/rest_request.rb +14 -0
- data/lib/chef_zero/{router.rb → rest_router.rb} +6 -6
- data/lib/chef_zero/rspec.rb +12 -1
- data/lib/chef_zero/server.rb +22 -3
- data/lib/chef_zero/version.rb +1 -1
- metadata +3 -3
@@ -9,7 +9,9 @@ module ChefZero
|
|
9
9
|
container = get_data(request)
|
10
10
|
contents = request.body
|
11
11
|
name = JSON.parse(contents, :create_additions => false)[identity_key]
|
12
|
-
if
|
12
|
+
if name.nil?
|
13
|
+
error(400, "Must specify '#{identity_key}' in JSON")
|
14
|
+
elsif container[name]
|
13
15
|
error(409, "Object already exists")
|
14
16
|
else
|
15
17
|
container[name] = {}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module ChefZero
|
2
2
|
module Endpoints
|
3
3
|
class NotFoundEndpoint
|
4
|
-
def call(
|
5
|
-
return [404, {"Content-Type" => "application/json"}, "Object not found: #{env['REQUEST_PATH']}"]
|
4
|
+
def call(request)
|
5
|
+
return [404, {"Content-Type" => "application/json"}, "Object not found: #{request.env['REQUEST_PATH']}"]
|
6
6
|
end
|
7
7
|
end
|
8
8
|
end
|
@@ -25,7 +25,9 @@ module ChefZero
|
|
25
25
|
container = get_data(request)
|
26
26
|
contents = request.body
|
27
27
|
key = get_key(contents)
|
28
|
-
if
|
28
|
+
if key.nil?
|
29
|
+
error(400, "Must specify '#{identity_key}' in JSON")
|
30
|
+
elsif container[key]
|
29
31
|
error(409, 'Object already exists')
|
30
32
|
else
|
31
33
|
container[key] = contents
|
data/lib/chef_zero/rest_base.rb
CHANGED
@@ -14,20 +14,19 @@ module ChefZero
|
|
14
14
|
server.data
|
15
15
|
end
|
16
16
|
|
17
|
-
def call(
|
18
|
-
|
19
|
-
method = env['REQUEST_METHOD'].downcase.to_sym
|
17
|
+
def call(request)
|
18
|
+
method = request.method.downcase.to_sym
|
20
19
|
if !self.respond_to?(method)
|
21
20
|
accept_methods = [:get, :put, :post, :delete].select { |m| self.respond_to?(m) }
|
22
21
|
accept_methods_str = accept_methods.map { |m| m.to_s.upcase }.join(', ')
|
23
|
-
return [405, {"Content-Type" => "text/plain", "Allow" => accept_methods_str}, "Bad request method for '#{env['REQUEST_PATH']}': #{env['REQUEST_METHOD']}"]
|
22
|
+
return [405, {"Content-Type" => "text/plain", "Allow" => accept_methods_str}, "Bad request method for '#{request.env['REQUEST_PATH']}': #{request.env['REQUEST_METHOD']}"]
|
24
23
|
end
|
25
|
-
if json_only && !env['HTTP_ACCEPT'].split(';').include?('application/json')
|
24
|
+
if json_only && !request.env['HTTP_ACCEPT'].split(';').include?('application/json')
|
26
25
|
return [406, {"Content-Type" => "text/plain"}, "Must accept application/json"]
|
27
26
|
end
|
28
27
|
# Dispatch to get()/post()/put()/delete()
|
29
28
|
begin
|
30
|
-
self.send(method,
|
29
|
+
self.send(method, request)
|
31
30
|
rescue RestErrorResponse => e
|
32
31
|
error(e.response_code, e.error)
|
33
32
|
end
|
@@ -37,6 +37,20 @@ module ChefZero
|
|
37
37
|
params
|
38
38
|
end
|
39
39
|
end
|
40
|
+
|
41
|
+
def to_s
|
42
|
+
result = "#{method} #{rest_path.join('/')}"
|
43
|
+
if query_params.size > 0
|
44
|
+
result << "?#{query_params.map { |k,v| "#{k}=#{v}" }.join('&') }"
|
45
|
+
end
|
46
|
+
if body.chomp != ''
|
47
|
+
result << "\n--- #{method} BODY ---\n"
|
48
|
+
result << body
|
49
|
+
result << "\n" if !body.end_with?("\n")
|
50
|
+
result << "--- END #{method} BODY ---"
|
51
|
+
end
|
52
|
+
result
|
53
|
+
end
|
40
54
|
end
|
41
55
|
end
|
42
56
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'chef/log'
|
2
2
|
|
3
3
|
module ChefZero
|
4
|
-
class
|
4
|
+
class RestRouter
|
5
5
|
def initialize(routes)
|
6
6
|
@routes = routes.map do |route, endpoint|
|
7
7
|
pattern = Regexp.new("^#{route.gsub('*', '[^/]*')}$")
|
@@ -12,16 +12,16 @@ module ChefZero
|
|
12
12
|
attr_reader :routes
|
13
13
|
attr_accessor :not_found
|
14
14
|
|
15
|
-
def call(
|
15
|
+
def call(request)
|
16
16
|
begin
|
17
|
-
Chef::Log.debug "
|
18
|
-
clean_path = "/" +
|
17
|
+
Chef::Log.debug "Request: #{request}"
|
18
|
+
clean_path = "/" + request.rest_path.join("/")
|
19
19
|
routes.each do |route, endpoint|
|
20
20
|
if route.match(clean_path)
|
21
|
-
return endpoint.call(
|
21
|
+
return endpoint.call(request)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
not_found.call(
|
24
|
+
not_found.call(request)
|
25
25
|
rescue
|
26
26
|
Chef::Log.error("#{$!.inspect}\n#{$!.backtrace.join("\n")}")
|
27
27
|
[500, {"Content-Type" => "text/plain"}, "Exception raised! #{$!.inspect}\n#{$!.backtrace.join("\n")}"]
|
data/lib/chef_zero/rspec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'thin'
|
2
2
|
require 'tempfile'
|
3
3
|
require 'chef_zero/server'
|
4
|
+
require 'chef_zero/rest_request'
|
4
5
|
require 'chef/config'
|
5
6
|
|
6
7
|
module ChefZero
|
@@ -17,6 +18,12 @@ module ChefZero
|
|
17
18
|
def self.client_key=(value)
|
18
19
|
@client_key = value
|
19
20
|
end
|
21
|
+
def self.request_log
|
22
|
+
@request_log ||= []
|
23
|
+
end
|
24
|
+
def self.clear_request_log
|
25
|
+
@request_log = []
|
26
|
+
end
|
20
27
|
|
21
28
|
def when_the_chef_server(description, *tags, &block)
|
22
29
|
context "When the Chef server #{description}", *tags do
|
@@ -24,15 +31,19 @@ module ChefZero
|
|
24
31
|
unless ChefZero::RSpec.server
|
25
32
|
# Set up configuration so that clients will point to the server
|
26
33
|
Thin::Logging.silent = true
|
27
|
-
ChefZero::RSpec.server = ChefZero::Server.new(:port => 8889, :signals => false)
|
34
|
+
ChefZero::RSpec.server = ChefZero::Server.new(:port => 8889, :signals => false, :log_requests => true)
|
28
35
|
ChefZero::RSpec.client_key = Tempfile.new(['chef_zero_client_key', '.pem'])
|
29
36
|
ChefZero::RSpec.client_key.write(ChefZero::PRIVATE_KEY)
|
30
37
|
ChefZero::RSpec.client_key.close
|
31
38
|
# Start the server
|
32
39
|
ChefZero::RSpec.server.start_background
|
40
|
+
ChefZero::RSpec.server.on_response do |request, response|
|
41
|
+
ChefZero::RSpec.request_log << [ request, response ]
|
42
|
+
end
|
33
43
|
else
|
34
44
|
ChefZero::RSpec.server.clear_data
|
35
45
|
end
|
46
|
+
ChefZero::RSpec.clear_request_log
|
36
47
|
|
37
48
|
@old_chef_server_url = Chef::Config.chef_server_url
|
38
49
|
@old_node_name = Chef::Config.node_name
|
data/lib/chef_zero/server.rb
CHANGED
@@ -20,7 +20,7 @@ require 'rubygems'
|
|
20
20
|
require 'thin'
|
21
21
|
require 'openssl'
|
22
22
|
require 'chef_zero'
|
23
|
-
require 'chef_zero/
|
23
|
+
require 'chef_zero/rest_router'
|
24
24
|
require 'timeout'
|
25
25
|
require 'chef_zero/cookbook_data'
|
26
26
|
|
@@ -125,6 +125,14 @@ module ChefZero
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
+
def on_request(&block)
|
129
|
+
@on_request_proc = block
|
130
|
+
end
|
131
|
+
|
132
|
+
def on_response(&block)
|
133
|
+
@on_response_proc = block
|
134
|
+
end
|
135
|
+
|
128
136
|
# Load data in a nice, friendly form:
|
129
137
|
# {
|
130
138
|
# 'roles' => {
|
@@ -205,7 +213,7 @@ module ChefZero
|
|
205
213
|
private
|
206
214
|
|
207
215
|
def make_app
|
208
|
-
router =
|
216
|
+
router = RestRouter.new([
|
209
217
|
[ '/authenticate_user', AuthenticateUserEndpoint.new(self) ],
|
210
218
|
[ '/clients', ActorsEndpoint.new(self) ],
|
211
219
|
[ '/clients/*', ActorEndpoint.new(self) ],
|
@@ -240,7 +248,18 @@ module ChefZero
|
|
240
248
|
[ '/file_store/*', FileStoreFileEndpoint.new(self) ],
|
241
249
|
])
|
242
250
|
router.not_found = NotFoundEndpoint.new
|
243
|
-
|
251
|
+
|
252
|
+
return proc do |env|
|
253
|
+
request = RestRequest.new(env)
|
254
|
+
if @on_request_proc
|
255
|
+
@on_request_proc.call(request)
|
256
|
+
end
|
257
|
+
response = router.call(request)
|
258
|
+
if @on_response_proc
|
259
|
+
@on_response_proc.call(request, response)
|
260
|
+
end
|
261
|
+
response
|
262
|
+
end
|
244
263
|
end
|
245
264
|
|
246
265
|
def dejsonize_children(hash)
|
data/lib/chef_zero/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-zero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chef
|
@@ -90,7 +90,7 @@ files:
|
|
90
90
|
- lib/chef_zero/rest_base.rb
|
91
91
|
- lib/chef_zero/rest_error_response.rb
|
92
92
|
- lib/chef_zero/rest_request.rb
|
93
|
-
- lib/chef_zero/
|
93
|
+
- lib/chef_zero/rest_router.rb
|
94
94
|
- lib/chef_zero/rspec.rb
|
95
95
|
- lib/chef_zero/server.rb
|
96
96
|
- lib/chef_zero/solr/query/binary_operator.rb
|