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,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -19,6 +19,7 @@ module ChefZero
|
|
|
19
19
|
if user["password"] != password
|
|
20
20
|
raise RestErrorResponse.new(401, "Bad username or password")
|
|
21
21
|
end
|
|
22
|
+
|
|
22
23
|
# Include only particular user data in the response
|
|
23
24
|
user.keep_if { |key, value| %w{first_name last_name display_name email username}.include?(key) }
|
|
24
25
|
json_response(200, {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
2
|
+
require_relative "rest_list_endpoint"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -15,7 +15,7 @@ module ChefZero
|
|
|
15
15
|
data = parse_json(request.body)
|
|
16
16
|
# if they don't match, id wins.
|
|
17
17
|
container_name = data["id"] || data["containername"]
|
|
18
|
-
container_path_suffix = data["containerpath"].split("/").reject
|
|
18
|
+
container_path_suffix = data["containerpath"].split("/").reject(&:empty?)
|
|
19
19
|
create_data(request, request.rest_path, container_name, to_json({}), :create_dir)
|
|
20
20
|
|
|
21
21
|
json_response(201, { uri: build_uri(request.base_uri, request.rest_path + container_path_suffix + [container_name]) })
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
require_relative "../dist"
|
|
1
2
|
module ChefZero
|
|
2
3
|
module Endpoints
|
|
3
4
|
# /organizations/ORG/controls
|
|
4
5
|
class ControlsEndpoint < RestBase
|
|
5
6
|
# ours is not to wonder why; ours is but to make the pedant specs pass.
|
|
6
7
|
def get(request)
|
|
7
|
-
error(410, "Server says 410,
|
|
8
|
+
error(410, "Server says 410, #{ChefZero::Dist::CLIENT} says 410.")
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def post(request)
|
|
11
|
-
error(410, "Server says 410,
|
|
12
|
+
error(410, "Server says 410, #{ChefZero::Dist::CLIENT} says 410.")
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
15
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../chef_data/data_normalizer"
|
|
2
2
|
|
|
3
3
|
module ChefZero
|
|
4
4
|
module Endpoints
|
|
@@ -60,8 +60,8 @@ module ChefZero
|
|
|
60
60
|
def normalize(request, cookbook_artifact_data)
|
|
61
61
|
cookbook = parse_json(cookbook_artifact_data)
|
|
62
62
|
ChefData::DataNormalizer.normalize_cookbook(self, request.rest_path[0..1],
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
cookbook, request.rest_path[3], request.rest_path[4],
|
|
64
|
+
request.base_uri, request.method, true, api_version: request.api_version)
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "../rest_error_response"
|
|
4
|
+
require_relative "../chef_data/data_normalizer"
|
|
5
|
+
require_relative "../data_store/data_not_found_error"
|
|
6
6
|
|
|
7
7
|
module ChefZero
|
|
8
8
|
module Endpoints
|
|
@@ -27,9 +27,10 @@ module ChefZero
|
|
|
27
27
|
if request.query_params["force"] != "true"
|
|
28
28
|
raise RestErrorResponse.new(409, "The cookbook #{name} at version #{version} is frozen. Use the 'force' option to override.")
|
|
29
29
|
end
|
|
30
|
+
|
|
30
31
|
# For some reason, you are forever unable to modify "frozen?" on a frozen cookbook.
|
|
31
32
|
request_body = FFI_Yajl::Parser.parse(request.body)
|
|
32
|
-
|
|
33
|
+
unless request_body["frozen?"]
|
|
33
34
|
request_body["frozen?"] = true
|
|
34
35
|
request.body = FFI_Yajl::Encoder.encode(request_body, pretty: true)
|
|
35
36
|
end
|
|
@@ -92,6 +93,7 @@ module ChefZero
|
|
|
92
93
|
rescue ChefZero::DataStore::DataNotFoundError
|
|
93
94
|
# Not all chef versions support cookbook_artifacts
|
|
94
95
|
raise unless cookbook_type == "cookbook_artifacts"
|
|
96
|
+
|
|
95
97
|
cookbooks = []
|
|
96
98
|
end
|
|
97
99
|
cookbooks.each do |cookbook_name|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -54,6 +54,7 @@ module ChefZero
|
|
|
54
54
|
versions = []
|
|
55
55
|
cookbooks_list[name].sort_by { |version| Gem::Version.new(version.dup) }.reverse_each do |version|
|
|
56
56
|
break if num_versions && versions.size >= num_versions
|
|
57
|
+
|
|
57
58
|
if constraint.satisfied_by?(Gem::Version.new(version.dup))
|
|
58
59
|
versions << version
|
|
59
60
|
end
|
|
@@ -66,6 +67,7 @@ module ChefZero
|
|
|
66
67
|
cookbook["all_files"].inject([]) do |acc, file|
|
|
67
68
|
part, name = file["name"].split("/")
|
|
68
69
|
next acc unless part == "recipes" || File.extname(name) != ".rb"
|
|
70
|
+
|
|
69
71
|
if name == "default.rb"
|
|
70
72
|
acc << cookbook_name
|
|
71
73
|
else
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require_relative "rest_list_endpoint"
|
|
3
|
+
require_relative "data_bag_item_endpoint"
|
|
4
|
+
require_relative "../rest_error_response"
|
|
5
5
|
|
|
6
6
|
module ChefZero
|
|
7
7
|
module Endpoints
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "data_bag_item_endpoint"
|
|
4
|
+
require_relative "../chef_data/data_normalizer"
|
|
5
5
|
|
|
6
6
|
module ChefZero
|
|
7
7
|
module Endpoints
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
2
|
+
require_relative "rest_list_endpoint"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -10,7 +10,7 @@ module ChefZero
|
|
|
10
10
|
json = FFI_Yajl::Parser.parse(contents)
|
|
11
11
|
name = identity_keys.map { |k| json[k] }.select { |v| v }.first
|
|
12
12
|
if name.nil?
|
|
13
|
-
error(400, "Must specify #{identity_keys.map
|
|
13
|
+
error(400, "Must specify #{identity_keys.map(&:inspect).join(" or ")} in JSON")
|
|
14
14
|
elsif exists_data_dir?(request, request.rest_path[0..1] + ["data", name])
|
|
15
15
|
error(409, "Object already exists")
|
|
16
16
|
else
|
|
@@ -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
|
|
@@ -15,12 +15,14 @@ module ChefZero
|
|
|
15
15
|
run_list = FFI_Yajl::Parser.parse(request.body)["run_list"]
|
|
16
16
|
run_list.each do |run_list_entry|
|
|
17
17
|
if run_list_entry =~ /(.+)::.+\@(.+)/ || run_list_entry =~ /(.+)\@(.+)/
|
|
18
|
-
raise RestErrorResponse.new(412, "No such cookbook: #{$1}")
|
|
19
|
-
raise RestErrorResponse.new(412, "No such cookbook version for cookbook #{$1}: #{$2}")
|
|
18
|
+
raise RestErrorResponse.new(412, "No such cookbook: #{$1}") unless cookbook_names.include?($1)
|
|
19
|
+
raise RestErrorResponse.new(412, "No such cookbook version for cookbook #{$1}: #{$2}") unless list_data(request, request.rest_path[0..1] + ["cookbooks", $1]).include?($2)
|
|
20
|
+
|
|
20
21
|
desired_versions[$1] = [ $2 ]
|
|
21
22
|
else
|
|
22
23
|
desired_cookbook = run_list_entry.split("::")[0]
|
|
23
|
-
raise RestErrorResponse.new(412, "No such cookbook: #{desired_cookbook}")
|
|
24
|
+
raise RestErrorResponse.new(412, "No such cookbook: #{desired_cookbook}") unless cookbook_names.include?(desired_cookbook)
|
|
25
|
+
|
|
24
26
|
desired_versions[desired_cookbook] = list_data(request, request.rest_path[0..1] + ["cookbooks", desired_cookbook])
|
|
25
27
|
end
|
|
26
28
|
end
|
|
@@ -35,7 +37,7 @@ module ChefZero
|
|
|
35
37
|
|
|
36
38
|
# Depsolve!
|
|
37
39
|
solved = depsolve(request, desired_versions.keys, desired_versions, environment_constraints)
|
|
38
|
-
|
|
40
|
+
unless solved
|
|
39
41
|
if @last_missing_dep && !cookbook_names.include?(@last_missing_dep)
|
|
40
42
|
return raise RestErrorResponse.new(412, "No such cookbook: #{@last_missing_dep}")
|
|
41
43
|
elsif @last_constraint_failure
|
|
@@ -64,7 +66,7 @@ module ChefZero
|
|
|
64
66
|
|
|
65
67
|
# If everything is already
|
|
66
68
|
solve_for = unsolved[0]
|
|
67
|
-
return desired_versions
|
|
69
|
+
return desired_versions unless solve_for
|
|
68
70
|
|
|
69
71
|
# Go through each desired version of this cookbook, starting with the latest,
|
|
70
72
|
# until we find one we can solve successfully with
|
|
@@ -81,10 +83,10 @@ module ChefZero
|
|
|
81
83
|
cookbook_dependencies.each_pair do |dep_name, dep_constraint|
|
|
82
84
|
# If the dep is not already in the list, add it to the list to solve
|
|
83
85
|
# and bring in all environment-allowed cookbook versions to desired_versions
|
|
84
|
-
|
|
86
|
+
unless new_desired_versions.key?(dep_name)
|
|
85
87
|
new_unsolved += [dep_name]
|
|
86
88
|
# If the dep is missing, we will try other versions of the cookbook that might not have the bad dep.
|
|
87
|
-
|
|
89
|
+
unless exists_data_dir?(request, request.rest_path[0..1] + ["cookbooks", dep_name])
|
|
88
90
|
@last_missing_dep = dep_name.to_s
|
|
89
91
|
dep_not_found = true
|
|
90
92
|
break
|
|
@@ -110,7 +112,8 @@ module ChefZero
|
|
|
110
112
|
end
|
|
111
113
|
|
|
112
114
|
def filter_by_constraint(versions, cookbook_name, constraint)
|
|
113
|
-
return versions
|
|
115
|
+
return versions unless constraint
|
|
116
|
+
|
|
114
117
|
constraint = Gem::Requirement.new(constraint)
|
|
115
118
|
new_versions = versions[cookbook_name]
|
|
116
119
|
new_versions = new_versions.select { |version| constraint.satisfied_by?(Gem::Version.new(version.dup)) }
|
|
@@ -4,7 +4,7 @@ module ChefZero
|
|
|
4
4
|
module Endpoints
|
|
5
5
|
class NotFoundEndpoint
|
|
6
6
|
def call(request)
|
|
7
|
-
[404, { "Content-Type" => "application/json" }, FFI_Yajl::Encoder.encode({ "error" => ["Object not found: #{request.env[
|
|
7
|
+
[404, { "Content-Type" => "application/json" }, FFI_Yajl::Encoder.encode({ "error" => ["Object not found: #{request.env["REQUEST_PATH"]}"] }, pretty: true)]
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
10
|
end
|
|
@@ -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 !~ /(.+)-#{orgname}$/
|
|
12
12
|
raise HttpErrorResponse.new(404, "Invalid ID #{id}. Must be of the form username-#{orgname}")
|
|
13
13
|
end
|
|
14
|
+
|
|
14
15
|
username = $1
|
|
15
16
|
path = request.rest_path[0..-2] + [username]
|
|
16
17
|
delete_data(request, path)
|
|
@@ -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
|
|
@@ -19,8 +19,9 @@ module ChefZero
|
|
|
19
19
|
save_org = FFI_Yajl::Encoder.encode(org, pretty: true)
|
|
20
20
|
if new_org["name"] != request.rest_path[-1]
|
|
21
21
|
# This is a rename
|
|
22
|
-
return error(400, "Cannot rename org #{request.rest_path[-1]} to #{new_org[
|
|
22
|
+
return error(400, "Cannot rename org #{request.rest_path[-1]} to #{new_org["name"]}: rename not supported for orgs")
|
|
23
23
|
end
|
|
24
|
+
|
|
24
25
|
set_data(request, request.rest_path + [ "org" ], save_org)
|
|
25
26
|
json_response(200, {
|
|
26
27
|
"uri" => (build_uri(request.base_uri, request.rest_path)).to_s,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -48,7 +48,7 @@ module ChefZero
|
|
|
48
48
|
# If the policy revision being submitted does not exist, create it.
|
|
49
49
|
# Storage: /organizations/ORG/policies/POLICY/revisions/REVISION
|
|
50
50
|
policyfile_path = request.rest_path[0..1] + ["policies", policy_name, "revisions", revision_id]
|
|
51
|
-
|
|
51
|
+
unless exists_data?(request, policyfile_path)
|
|
52
52
|
create_data(request, policyfile_path[0..-2], revision_id, request.body, :create_dir)
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -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
|
|
@@ -26,7 +26,7 @@ module ChefZero
|
|
|
26
26
|
contents = request.body
|
|
27
27
|
key = get_key(contents)
|
|
28
28
|
if key.nil?
|
|
29
|
-
error(400, "Must specify #{identity_keys.map
|
|
29
|
+
error(400, "Must specify #{identity_keys.map(&:inspect).join(" or ")} in JSON")
|
|
30
30
|
else
|
|
31
31
|
create_data(request, request.rest_path, key, contents)
|
|
32
32
|
json_response(201, { "uri" => (build_uri(request.base_uri, request.rest_path + [key])).to_s })
|