chef-zero 14.0.12 → 15.0.0
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 +3 -2
- data/chef-zero.gemspec +2 -5
- data/lib/chef_zero/chef_data/cookbook_data.rb +1 -1
- 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 +6 -4
- 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 +3 -2
- data/lib/chef_zero/endpoints/acls_endpoint.rb +5 -4
- data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/actor_endpoint.rb +3 -3
- 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 +1 -1
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/container_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/containers_endpoint.rb +2 -2
- 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 +7 -5
- data/lib/chef_zero/endpoints/cookbooks_base.rb +4 -2
- data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +13 -10
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/group_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/groups_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/license_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/node_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/nodes_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/organization_user_base.rb +1 -1
- data/lib/chef_zero/endpoints/organization_user_default_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_user_endpoint.rb +1 -1
- 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 +2 -2
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +1 -1
- 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 +2 -2
- data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +2 -2
- 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 +2 -2
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/role_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/search_endpoint.rb +8 -8
- 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 +3 -3
- data/lib/chef_zero/endpoints/universe_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +1 -1
- 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 +2 -2
- data/lib/chef_zero/rspec.rb +5 -4
- data/lib/chef_zero/server.rb +92 -87
- data/lib/chef_zero/socketless_server_map.rb +3 -1
- 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/lib/chef_zero.rb +1 -1
- data/spec/run_oc_pedant.rb +5 -3
- data/spec/search_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,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../rest_error_response"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -70,6 +70,7 @@ module ChefZero
|
|
|
70
70
|
# Does this request change the value of the identity key?
|
|
71
71
|
def is_rename?(request)
|
|
72
72
|
return false unless (key = identity_key_value(request))
|
|
73
|
+
|
|
73
74
|
key != request.rest_path[-1]
|
|
74
75
|
end
|
|
75
76
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
require_relative "../rest_base"
|
|
2
|
+
require_relative "../rest_error_response"
|
|
3
3
|
require "ffi_yajl"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
@@ -9,7 +9,7 @@ module ChefZero
|
|
|
9
9
|
def put(request)
|
|
10
10
|
existing_sandbox = FFI_Yajl::Parser.parse(get_data(request))
|
|
11
11
|
existing_sandbox["checksums"].each do |checksum|
|
|
12
|
-
|
|
12
|
+
unless exists_data?(request, request.rest_path[0..1] + ["file_store", "checksums", checksum])
|
|
13
13
|
raise RestErrorResponse.new(503, "Checksum not uploaded: #{checksum}")
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
|
+
require_relative "../rest_error_response"
|
|
5
|
+
require_relative "../solr/solr_parser"
|
|
6
|
+
require_relative "../solr/solr_doc"
|
|
7
7
|
|
|
8
8
|
module ChefZero
|
|
9
9
|
module Endpoints
|
|
@@ -30,7 +30,7 @@ module ChefZero
|
|
|
30
30
|
if path.size > 0
|
|
31
31
|
value = search_value
|
|
32
32
|
path.each do |path_part|
|
|
33
|
-
value = value[path_part]
|
|
33
|
+
value = value[path_part] unless value.nil?
|
|
34
34
|
end
|
|
35
35
|
data[key] = value
|
|
36
36
|
else
|
|
@@ -180,7 +180,7 @@ module ChefZero
|
|
|
180
180
|
dest
|
|
181
181
|
when Hash
|
|
182
182
|
source.each do |src_key, src_value|
|
|
183
|
-
if dest.
|
|
183
|
+
if dest.is_a?(Hash)
|
|
184
184
|
if dest[src_key]
|
|
185
185
|
dest[src_key] = deep_merge!(src_value, dest[src_key])
|
|
186
186
|
else # dest[src_key] doesn't exist so we take whatever source has
|
|
@@ -191,7 +191,7 @@ module ChefZero
|
|
|
191
191
|
end
|
|
192
192
|
end
|
|
193
193
|
when Array
|
|
194
|
-
if dest.
|
|
194
|
+
if dest.is_a?(Array)
|
|
195
195
|
dest |= source
|
|
196
196
|
else
|
|
197
197
|
dest = source
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
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,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
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"
|
|
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
|
|
@@ -5,9 +5,9 @@ module ChefZero
|
|
|
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
1
|
require "tempfile"
|
|
2
|
-
|
|
3
|
-
|
|
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
|
@@ -26,86 +26,87 @@ require "rack"
|
|
|
26
26
|
require "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
|
|