chef-zero 14.0.12 → 15.0.2
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 +4 -4
- data/Gemfile +4 -6
- data/Rakefile +9 -1
- data/bin/chef-zero +5 -4
- data/chef-zero.gemspec +2 -5
- data/lib/chef_zero.rb +1 -1
- data/lib/chef_zero/chef_data/cookbook_data.rb +2 -2
- data/lib/chef_zero/chef_data/data_normalizer.rb +9 -7
- data/lib/chef_zero/chef_data/default_creator.rb +8 -5
- data/lib/chef_zero/data_store/data_already_exists_error.rb +1 -1
- data/lib/chef_zero/data_store/data_error.rb +1 -1
- data/lib/chef_zero/data_store/data_not_found_error.rb +1 -1
- data/lib/chef_zero/data_store/default_facade.rb +4 -4
- data/lib/chef_zero/data_store/interface_v2.rb +1 -1
- data/lib/chef_zero/data_store/memory_store.rb +3 -3
- data/lib/chef_zero/data_store/memory_store_v2.rb +22 -14
- data/lib/chef_zero/data_store/raw_file_store.rb +7 -5
- data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +11 -1
- data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +1 -1
- data/lib/chef_zero/dist.rb +9 -0
- data/lib/chef_zero/endpoints/acl_endpoint.rb +4 -3
- data/lib/chef_zero/endpoints/acls_endpoint.rb +6 -5
- data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/actor_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/actor_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/actor_keys_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/actors_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/container_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/containers_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/controls_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/cookbook_artifact_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_artifact_identifier_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/cookbook_artifacts_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +8 -6
- data/lib/chef_zero/endpoints/cookbooks_base.rb +5 -3
- data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +14 -11
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/group_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/groups_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/license_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/node_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/nodes_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_endpoint.rb +4 -3
- data/lib/chef_zero/endpoints/organization_user_base.rb +2 -2
- data/lib/chef_zero/endpoints/organization_user_default_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_user_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_user_key_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_user_keys_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_users_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/policies_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_group_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/policy_revision_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_revisions_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/principal_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +4 -3
- data/lib/chef_zero/endpoints/role_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/search_endpoint.rb +9 -9
- data/lib/chef_zero/endpoints/searches_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/universe_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/version_endpoint.rb +3 -2
- data/lib/chef_zero/rest_base.rb +20 -16
- data/lib/chef_zero/rest_request.rb +10 -6
- data/lib/chef_zero/rest_router.rb +3 -3
- data/lib/chef_zero/rspec.rb +6 -5
- data/lib/chef_zero/server.rb +100 -95
- data/lib/chef_zero/socketless_server_map.rb +4 -2
- data/lib/chef_zero/solr/query/phrase.rb +2 -2
- data/lib/chef_zero/solr/query/range_query.rb +3 -3
- data/lib/chef_zero/solr/query/term.rb +1 -1
- data/lib/chef_zero/solr/solr_parser.rb +12 -10
- data/lib/chef_zero/version.rb +1 -1
- data/spec/run_oc_pedant.rb +8 -6
- data/spec/search_spec.rb +2 -2
- data/spec/server_spec.rb +2 -2
- data/spec/socketless_server_map_spec.rb +1 -1
- data/spec/support/oc_pedant.rb +1 -1
- metadata +7 -34
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require "ffi_yajl"
|
|
2
|
-
|
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
|
2
|
+
require_relative "../rest_base"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -10,13 +10,13 @@ module ChefZero
|
|
|
10
10
|
name = request_json["username"]
|
|
11
11
|
password = request_json["password"]
|
|
12
12
|
user = get_data(request, request.rest_path[0..-2] + ["users", name], :nil)
|
|
13
|
-
|
|
13
|
+
unless user
|
|
14
14
|
raise RestErrorResponse.new(403, "Nonexistent user")
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
user = FFI_Yajl::Parser.parse(user)
|
|
18
18
|
user = ChefData::DataNormalizer.normalize_user(user, name, [ "username" ], server.options[:osc_compat])
|
|
19
|
-
|
|
19
|
+
unless user["recovery_authentication_enabled"]
|
|
20
20
|
raise RestErrorResponse.new(403, "Only users with recovery_authentication_enabled=true may use /system_recovery to log in")
|
|
21
21
|
end
|
|
22
22
|
if user["password"] != password
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require "ffi_yajl"
|
|
2
|
-
|
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
|
2
|
+
require_relative "../rest_base"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -11,6 +11,7 @@ module ChefZero
|
|
|
11
11
|
if id !~ /^#{username}-(.+)/
|
|
12
12
|
raise RestErrorResponse.new(400, "Association request #{id} is invalid. Must be #{username}-orgname.")
|
|
13
13
|
end
|
|
14
|
+
|
|
14
15
|
orgname = $1
|
|
15
16
|
|
|
16
17
|
json = FFI_Yajl::Parser.parse(request.body)
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../rest_base"
|
|
2
|
+
require_relative "../dist"
|
|
2
3
|
|
|
3
4
|
module ChefZero
|
|
4
5
|
module Endpoints
|
|
5
6
|
# /version
|
|
6
7
|
class VersionEndpoint < RestBase
|
|
7
8
|
def get(request)
|
|
8
|
-
text_response(200, "
|
|
9
|
+
text_response(200, "#{ChefZero::Dist::CLIENT} #{ChefZero::VERSION}\n")
|
|
9
10
|
end
|
|
10
11
|
end
|
|
11
12
|
end
|
data/lib/chef_zero/rest_base.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
require_relative "rest_request"
|
|
2
|
+
require_relative "rest_error_response"
|
|
3
|
+
require_relative "data_store/data_not_found_error"
|
|
4
|
+
require_relative "chef_data/acl_path"
|
|
5
5
|
|
|
6
6
|
module ChefZero
|
|
7
7
|
class RestBase
|
|
@@ -30,15 +30,13 @@ module ChefZero
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
return json_response(406,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
)
|
|
33
|
+
response,
|
|
34
|
+
request_version: version, response_version: -1)
|
|
36
35
|
end
|
|
37
36
|
rescue ArgumentError
|
|
38
37
|
json_response(406,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
)
|
|
38
|
+
{ "username" => request.requestor },
|
|
39
|
+
request_version: -1, response_version: -1)
|
|
42
40
|
end
|
|
43
41
|
|
|
44
42
|
def call(request)
|
|
@@ -46,14 +44,15 @@ module ChefZero
|
|
|
46
44
|
return response unless response.nil?
|
|
47
45
|
|
|
48
46
|
method = request.method.downcase.to_sym
|
|
49
|
-
|
|
50
|
-
accept_methods =
|
|
47
|
+
unless respond_to?(method)
|
|
48
|
+
accept_methods = %i{get put post delete}.select { |m| respond_to?(m) }
|
|
51
49
|
accept_methods_str = accept_methods.map { |m| m.to_s.upcase }.join(", ")
|
|
52
|
-
return [405, { "Content-Type" => "text/plain", "Allow" => accept_methods_str }, "Bad request method for '#{request.env[
|
|
50
|
+
return [405, { "Content-Type" => "text/plain", "Allow" => accept_methods_str }, "Bad request method for '#{request.env["REQUEST_PATH"]}': #{request.env["REQUEST_METHOD"]}"]
|
|
53
51
|
end
|
|
54
52
|
if json_only && !accepts?(request, "application", "json")
|
|
55
53
|
return [406, { "Content-Type" => "text/plain" }, "Must accept application/json"]
|
|
56
54
|
end
|
|
55
|
+
|
|
57
56
|
# Dispatch to get()/post()/put()/delete()
|
|
58
57
|
begin
|
|
59
58
|
send(method, request)
|
|
@@ -70,14 +69,15 @@ module ChefZero
|
|
|
70
69
|
def accepts?(request, category, type)
|
|
71
70
|
# If HTTP_ACCEPT is not sent at all, assume it accepts anything
|
|
72
71
|
# This parses as per http://tools.ietf.org/html/rfc7231#section-5.3
|
|
73
|
-
return true
|
|
72
|
+
return true unless request.env["HTTP_ACCEPT"]
|
|
73
|
+
|
|
74
74
|
accepts = request.env["HTTP_ACCEPT"].split(/,\s*/).map { |x| x.split(";", 2)[0].strip }
|
|
75
75
|
accepts.include?("#{category}/#{type}") || accepts.include?("#{category}/*") || accepts.include?("*/*")
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def get_data(request, rest_path = nil, *options)
|
|
79
79
|
rest_path ||= request.rest_path
|
|
80
|
-
rest_path = rest_path.map { |v|
|
|
80
|
+
rest_path = rest_path.map { |v| self.class.rfc2396_parser.unescape(v) }
|
|
81
81
|
begin
|
|
82
82
|
data_store.get(rest_path, request)
|
|
83
83
|
rescue DataStore::DataNotFoundError
|
|
@@ -284,7 +284,7 @@ module ChefZero
|
|
|
284
284
|
end
|
|
285
285
|
|
|
286
286
|
def self.build_uri(base_uri, rest_path)
|
|
287
|
-
"#{base_uri}/#{rest_path.map { |v|
|
|
287
|
+
"#{base_uri}/#{rest_path.map { |v| rfc2396_parser.escape(v) }.join("/")}"
|
|
288
288
|
end
|
|
289
289
|
|
|
290
290
|
def populate_defaults(request, response)
|
|
@@ -324,5 +324,9 @@ module ChefZero
|
|
|
324
324
|
name.size > 255 ||
|
|
325
325
|
name =~ /[+ !]/
|
|
326
326
|
end
|
|
327
|
+
|
|
328
|
+
def self.rfc2396_parser
|
|
329
|
+
@parser ||= URI::RFC2396_Parser.new
|
|
330
|
+
end
|
|
327
331
|
end
|
|
328
332
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "rack/request"
|
|
2
|
+
require "cgi" unless defined?(CGI)
|
|
2
3
|
|
|
3
4
|
module ChefZero
|
|
4
5
|
class RestRequest
|
|
5
|
-
|
|
6
6
|
def initialize(env, rest_base_prefix = [])
|
|
7
7
|
@env = env
|
|
8
8
|
@rest_base_prefix = rest_base_prefix
|
|
@@ -18,7 +18,7 @@ module ChefZero
|
|
|
18
18
|
else
|
|
19
19
|
scheme = env["rack.url_scheme"]
|
|
20
20
|
end
|
|
21
|
-
@base_uri ||= "#{scheme}://#{env[
|
|
21
|
+
@base_uri ||= "#{scheme}://#{env["HTTP_HOST"]}#{env["SCRIPT_NAME"]}"
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def base_uri=(value)
|
|
@@ -61,24 +61,28 @@ module ChefZero
|
|
|
61
61
|
@query_params ||= begin
|
|
62
62
|
params = Rack::Request.new(env).GET
|
|
63
63
|
params.keys.each do |key|
|
|
64
|
-
params[key] =
|
|
64
|
+
params[key] = self.class.rfc2396_parser.unescape(params[key])
|
|
65
65
|
end
|
|
66
66
|
params
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
def to_s
|
|
71
|
-
result = "#{method} #{rest_path.join(
|
|
71
|
+
result = "#{method} #{rest_path.join("/")}"
|
|
72
72
|
if query_params.size > 0
|
|
73
|
-
result << "?#{query_params.map { |k, v| "#{k}=#{v}" }.join(
|
|
73
|
+
result << "?#{query_params.map { |k, v| "#{k}=#{v}" }.join("&")}"
|
|
74
74
|
end
|
|
75
75
|
if body.chomp != ""
|
|
76
76
|
result << "\n--- #{method} BODY ---\n"
|
|
77
77
|
result << body
|
|
78
|
-
result << "\n"
|
|
78
|
+
result << "\n" unless body.end_with?("\n")
|
|
79
79
|
result << "--- END #{method} BODY ---"
|
|
80
80
|
end
|
|
81
81
|
result
|
|
82
82
|
end
|
|
83
|
+
|
|
84
|
+
def self.rfc2396_parser
|
|
85
|
+
@parser ||= URI::RFC2396_Parser.new
|
|
86
|
+
end
|
|
83
87
|
end
|
|
84
88
|
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
require "pp"
|
|
1
|
+
require "pp" unless defined?(PP)
|
|
2
2
|
|
|
3
3
|
module ChefZero
|
|
4
4
|
class RestRouter
|
|
5
5
|
def initialize(routes)
|
|
6
6
|
@routes = routes.map do |route, endpoint|
|
|
7
7
|
if route =~ /\*\*$/
|
|
8
|
-
pattern = Regexp.new("^#{route[0..-3].gsub(
|
|
8
|
+
pattern = Regexp.new("^#{route[0..-3].gsub("*", "[^/]*")}")
|
|
9
9
|
else
|
|
10
|
-
pattern = Regexp.new("^#{route.gsub(
|
|
10
|
+
pattern = Regexp.new("^#{route.gsub("*", "[^/]*")}$")
|
|
11
11
|
end
|
|
12
12
|
[ pattern, endpoint ]
|
|
13
13
|
end
|
data/lib/chef_zero/rspec.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require "tempfile"
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
require "tempfile" unless defined?(Tempfile)
|
|
2
|
+
require_relative "server"
|
|
3
|
+
require_relative "rest_request"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module RSpec
|
|
@@ -42,7 +42,7 @@ module ChefZero
|
|
|
42
42
|
extend RSpecClassMethods
|
|
43
43
|
|
|
44
44
|
def when_the_chef_server(description, *tags, &block)
|
|
45
|
-
context "When the
|
|
45
|
+
context "When the #{ChefZero::Dist::PRODUCT} server #{description}", *tags do
|
|
46
46
|
extend WhenTheChefServerClassMethods
|
|
47
47
|
include WhenTheChefServerInstanceMethods
|
|
48
48
|
|
|
@@ -69,7 +69,8 @@ module ChefZero
|
|
|
69
69
|
if chef_server_options[:server_scope] != self.class.chef_server_options[:server_scope]
|
|
70
70
|
raise "server_scope: #{chef_server_options[:server_scope]} will not be honored: it can only be set on when_the_chef_server!"
|
|
71
71
|
end
|
|
72
|
-
|
|
72
|
+
|
|
73
|
+
Log.info("Starting #{ChefZero::Dist::PRODUCT} server with options #{chef_server_options}")
|
|
73
74
|
|
|
74
75
|
ChefZero::RSpec.set_server_options(chef_server_options)
|
|
75
76
|
|
data/lib/chef_zero/server.rb
CHANGED
|
@@ -16,96 +16,97 @@
|
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
#
|
|
18
18
|
|
|
19
|
-
require "openssl"
|
|
20
|
-
require "open-uri"
|
|
21
|
-
require "rubygems"
|
|
22
|
-
require "timeout"
|
|
23
|
-
require "stringio"
|
|
24
|
-
|
|
25
|
-
require "rack"
|
|
26
|
-
require "webrick"
|
|
19
|
+
require "openssl" unless defined?(OpenSSL)
|
|
20
|
+
require "open-uri" unless defined?(OpenURI)
|
|
21
|
+
require "rubygems" unless defined?(Gem)
|
|
22
|
+
require "timeout" unless defined?(Timeout)
|
|
23
|
+
require "stringio" unless defined?(StringIO)
|
|
24
|
+
|
|
25
|
+
require "rack" unless defined?(Rack)
|
|
26
|
+
require "webrick" unless defined?(WEBrick)
|
|
27
27
|
require "webrick/https"
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
29
|
+
require_relative "../chef_zero"
|
|
30
|
+
require_relative "socketless_server_map"
|
|
31
|
+
require_relative "chef_data/cookbook_data"
|
|
32
|
+
require_relative "chef_data/acl_path"
|
|
33
|
+
require_relative "rest_router"
|
|
34
|
+
require_relative "data_store/memory_store_v2"
|
|
35
|
+
require_relative "data_store/v1_to_v2_adapter"
|
|
36
|
+
require_relative "data_store/default_facade"
|
|
37
|
+
require_relative "version"
|
|
38
|
+
require "chef_zero/dist.rb"
|
|
39
|
+
|
|
40
|
+
require_relative "endpoints/rest_list_endpoint"
|
|
41
|
+
require_relative "endpoints/authenticate_user_endpoint"
|
|
42
|
+
require_relative "endpoints/acls_endpoint"
|
|
43
|
+
require_relative "endpoints/acl_endpoint"
|
|
44
|
+
require_relative "endpoints/actor_endpoint"
|
|
45
|
+
require_relative "endpoints/actors_endpoint"
|
|
46
|
+
require_relative "endpoints/actor_key_endpoint"
|
|
47
|
+
require_relative "endpoints/organization_user_key_endpoint"
|
|
48
|
+
require_relative "endpoints/organization_user_default_key_endpoint"
|
|
49
|
+
require_relative "endpoints/organization_user_keys_endpoint"
|
|
50
|
+
require_relative "endpoints/actor_default_key_endpoint"
|
|
51
|
+
require_relative "endpoints/actor_keys_endpoint"
|
|
52
|
+
require_relative "endpoints/cookbooks_endpoint"
|
|
53
|
+
require_relative "endpoints/cookbook_endpoint"
|
|
54
|
+
require_relative "endpoints/cookbook_version_endpoint"
|
|
55
|
+
require_relative "endpoints/cookbook_artifacts_endpoint"
|
|
56
|
+
require_relative "endpoints/cookbook_artifact_endpoint"
|
|
57
|
+
require_relative "endpoints/cookbook_artifact_identifier_endpoint"
|
|
58
|
+
require_relative "endpoints/containers_endpoint"
|
|
59
|
+
require_relative "endpoints/container_endpoint"
|
|
60
|
+
require_relative "endpoints/controls_endpoint"
|
|
61
|
+
require_relative "endpoints/dummy_endpoint"
|
|
62
|
+
require_relative "endpoints/data_bags_endpoint"
|
|
63
|
+
require_relative "endpoints/data_bag_endpoint"
|
|
64
|
+
require_relative "endpoints/data_bag_item_endpoint"
|
|
65
|
+
require_relative "endpoints/groups_endpoint"
|
|
66
|
+
require_relative "endpoints/group_endpoint"
|
|
67
|
+
require_relative "endpoints/environment_endpoint"
|
|
68
|
+
require_relative "endpoints/environment_cookbooks_endpoint"
|
|
69
|
+
require_relative "endpoints/environment_cookbook_endpoint"
|
|
70
|
+
require_relative "endpoints/environment_cookbook_versions_endpoint"
|
|
71
|
+
require_relative "endpoints/environment_nodes_endpoint"
|
|
72
|
+
require_relative "endpoints/environment_recipes_endpoint"
|
|
73
|
+
require_relative "endpoints/environment_role_endpoint"
|
|
74
|
+
require_relative "endpoints/license_endpoint"
|
|
75
|
+
require_relative "endpoints/node_endpoint"
|
|
76
|
+
require_relative "endpoints/nodes_endpoint"
|
|
77
|
+
require_relative "endpoints/node_identifiers_endpoint"
|
|
78
|
+
require_relative "endpoints/organizations_endpoint"
|
|
79
|
+
require_relative "endpoints/organization_endpoint"
|
|
80
|
+
require_relative "endpoints/organization_association_requests_endpoint"
|
|
81
|
+
require_relative "endpoints/organization_association_request_endpoint"
|
|
82
|
+
require_relative "endpoints/organization_authenticate_user_endpoint"
|
|
83
|
+
require_relative "endpoints/organization_users_endpoint"
|
|
84
|
+
require_relative "endpoints/organization_user_endpoint"
|
|
85
|
+
require_relative "endpoints/organization_validator_key_endpoint"
|
|
86
|
+
require_relative "endpoints/policies_endpoint"
|
|
87
|
+
require_relative "endpoints/policy_endpoint"
|
|
88
|
+
require_relative "endpoints/policy_revisions_endpoint"
|
|
89
|
+
require_relative "endpoints/policy_revision_endpoint"
|
|
90
|
+
require_relative "endpoints/policy_groups_endpoint"
|
|
91
|
+
require_relative "endpoints/policy_group_endpoint"
|
|
92
|
+
require_relative "endpoints/policy_group_policy_endpoint"
|
|
93
|
+
require_relative "endpoints/principal_endpoint"
|
|
94
|
+
require_relative "endpoints/role_endpoint"
|
|
95
|
+
require_relative "endpoints/role_environments_endpoint"
|
|
96
|
+
require_relative "endpoints/sandboxes_endpoint"
|
|
97
|
+
require_relative "endpoints/sandbox_endpoint"
|
|
98
|
+
require_relative "endpoints/searches_endpoint"
|
|
99
|
+
require_relative "endpoints/search_endpoint"
|
|
100
|
+
require_relative "endpoints/system_recovery_endpoint"
|
|
101
|
+
require_relative "endpoints/user_association_requests_endpoint"
|
|
102
|
+
require_relative "endpoints/user_association_requests_count_endpoint"
|
|
103
|
+
require_relative "endpoints/user_association_request_endpoint"
|
|
104
|
+
require_relative "endpoints/user_organizations_endpoint"
|
|
105
|
+
require_relative "endpoints/file_store_file_endpoint"
|
|
106
|
+
require_relative "endpoints/not_found_endpoint"
|
|
107
|
+
require_relative "endpoints/version_endpoint"
|
|
108
|
+
require_relative "endpoints/server_api_version_endpoint"
|
|
109
|
+
require_relative "endpoints/universe_endpoint"
|
|
109
110
|
|
|
110
111
|
module ChefZero
|
|
111
112
|
|
|
@@ -175,7 +176,8 @@ module ChefZero
|
|
|
175
176
|
end
|
|
176
177
|
|
|
177
178
|
def local_mode_url
|
|
178
|
-
raise "Port not yet set, cannot generate URL" unless port.
|
|
179
|
+
raise "Port not yet set, cannot generate URL" unless port.is_a?(Integer)
|
|
180
|
+
|
|
179
181
|
"chefzero://localhost:#{port}"
|
|
180
182
|
end
|
|
181
183
|
|
|
@@ -231,7 +233,7 @@ module ChefZero
|
|
|
231
233
|
if publish
|
|
232
234
|
output = publish.respond_to?(:puts) ? publish : STDOUT
|
|
233
235
|
output.puts <<-EOH.gsub(/^ {10}/, "")
|
|
234
|
-
>> Starting
|
|
236
|
+
>> Starting #{ChefZero::Dist::PRODUCT} (v#{ChefZero::VERSION})...
|
|
235
237
|
EOH
|
|
236
238
|
end
|
|
237
239
|
|
|
@@ -248,7 +250,7 @@ module ChefZero
|
|
|
248
250
|
|
|
249
251
|
%w{INT TERM}.each do |signal|
|
|
250
252
|
Signal.trap(signal) do
|
|
251
|
-
puts "\n>> Stopping
|
|
253
|
+
puts "\n>> Stopping #{ChefZero::Dist::PRODUCT}..."
|
|
252
254
|
@server.shutdown
|
|
253
255
|
end
|
|
254
256
|
end
|
|
@@ -274,7 +276,7 @@ module ChefZero
|
|
|
274
276
|
true
|
|
275
277
|
rescue Errno::EADDRINUSE
|
|
276
278
|
ChefZero::Log.warn("Port #{port} not available")
|
|
277
|
-
@server.listeners.each
|
|
279
|
+
@server.listeners.each(&:close)
|
|
278
280
|
@server.listeners.clear
|
|
279
281
|
false
|
|
280
282
|
end
|
|
@@ -304,7 +306,7 @@ module ChefZero
|
|
|
304
306
|
break
|
|
305
307
|
end
|
|
306
308
|
end
|
|
307
|
-
|
|
309
|
+
unless @port
|
|
308
310
|
raise Errno::EADDRINUSE,
|
|
309
311
|
"No port in :port range #{options[:port]} is available"
|
|
310
312
|
end
|
|
@@ -362,7 +364,7 @@ module ChefZero
|
|
|
362
364
|
end
|
|
363
365
|
rescue Timeout::Error
|
|
364
366
|
if @thread
|
|
365
|
-
ChefZero::Log.error("
|
|
367
|
+
ChefZero::Log.error("#{ChefZero::Dist::PRODUCT} did not stop within #{wait} seconds! Killing...")
|
|
366
368
|
@thread.kill
|
|
367
369
|
SocketlessServerMap.deregister(port)
|
|
368
370
|
end
|
|
@@ -500,11 +502,13 @@ module ChefZero
|
|
|
500
502
|
else
|
|
501
503
|
cookbook_data = ChefData::CookbookData.to_hash(cookbook, name_version)
|
|
502
504
|
end
|
|
503
|
-
raise "No version specified"
|
|
505
|
+
raise "No version specified" unless cookbook_data[:version]
|
|
506
|
+
|
|
504
507
|
data_store.create_dir(["organizations", org_name, cookbook_type], cookbook_data[:cookbook_name], :recursive)
|
|
505
508
|
data_store.set(["organizations", org_name, cookbook_type, cookbook_data[:cookbook_name], cookbook_data[:version]], FFI_Yajl::Encoder.encode(cookbook_data, pretty: true), :create)
|
|
506
509
|
cookbook_data.values.each do |files|
|
|
507
510
|
next unless files.is_a? Array
|
|
511
|
+
|
|
508
512
|
files.each do |file|
|
|
509
513
|
data_store.set(["organizations", org_name, "file_store", "checksums", file[:checksum]], get_file(cookbook, file[:path]), :create)
|
|
510
514
|
end
|
|
@@ -641,6 +645,7 @@ module ChefZero
|
|
|
641
645
|
|
|
642
646
|
def app
|
|
643
647
|
return @app if @app
|
|
648
|
+
|
|
644
649
|
router = RestRouter.new(endpoints)
|
|
645
650
|
router.not_found = NotFoundEndpoint.new
|
|
646
651
|
|