chef-zero 4.8.0 → 4.9.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 +8 -4
- data/Rakefile +20 -10
- data/bin/chef-zero +12 -12
- data/chef-zero.gemspec +24 -24
- data/lib/chef_zero.rb +1 -1
- data/lib/chef_zero/chef_data/acl_path.rb +16 -16
- data/lib/chef_zero/chef_data/cookbook_data.rb +24 -24
- data/lib/chef_zero/chef_data/data_normalizer.rb +120 -120
- data/lib/chef_zero/chef_data/default_creator.rb +145 -145
- data/lib/chef_zero/data_store/data_already_exists_error.rb +1 -1
- data/lib/chef_zero/data_store/data_not_found_error.rb +2 -2
- data/lib/chef_zero/data_store/default_facade.rb +5 -5
- data/lib/chef_zero/data_store/interface_v1.rb +1 -1
- data/lib/chef_zero/data_store/interface_v2.rb +1 -1
- data/lib/chef_zero/data_store/memory_store.rb +4 -4
- data/lib/chef_zero/data_store/memory_store_v2.rb +8 -8
- data/lib/chef_zero/data_store/raw_file_store.rb +10 -10
- data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +9 -9
- data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +5 -5
- data/lib/chef_zero/endpoints/acl_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/acls_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/actor_endpoint.rb +20 -20
- data/lib/chef_zero/endpoints/actor_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/actor_keys_endpoint.rb +5 -6
- data/lib/chef_zero/endpoints/actors_endpoint.rb +12 -12
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +10 -10
- data/lib/chef_zero/endpoints/container_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/containers_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/cookbook_artifact_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_artifact_identifier_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_artifacts_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +20 -16
- data/lib/chef_zero/endpoints/cookbooks_base.rb +13 -13
- data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +12 -12
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/dummy_endpoint.rb +0 -2
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +16 -16
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/environment_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +8 -8
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/group_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/groups_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/license_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/node_endpoint.rb +3 -4
- data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +7 -7
- data/lib/chef_zero/endpoints/nodes_endpoint.rb +3 -4
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +8 -8
- data/lib/chef_zero/endpoints/organization_endpoint.rb +10 -10
- 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 +5 -5
- 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 +12 -12
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +12 -13
- data/lib/chef_zero/endpoints/policies_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/policy_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_group_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +3 -4
- data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +4 -4
- 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 +15 -15
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/role_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +8 -8
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +9 -9
- data/lib/chef_zero/endpoints/search_endpoint.rb +51 -49
- data/lib/chef_zero/endpoints/searches_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +8 -8
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +12 -12
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/version_endpoint.rb +1 -1
- data/lib/chef_zero/log.rb +1 -1
- data/lib/chef_zero/rest_base.rb +25 -25
- data/lib/chef_zero/rest_request.rb +11 -11
- data/lib/chef_zero/rest_router.rb +30 -30
- data/lib/chef_zero/rspec.rb +33 -33
- data/lib/chef_zero/server.rb +188 -189
- data/lib/chef_zero/socketless_server_map.rb +2 -3
- data/lib/chef_zero/solr/query/binary_operator.rb +8 -8
- data/lib/chef_zero/solr/query/phrase.rb +1 -1
- data/lib/chef_zero/solr/query/range_query.rb +2 -2
- data/lib/chef_zero/solr/query/regexpable_query.rb +1 -0
- data/lib/chef_zero/solr/query/term.rb +5 -5
- data/lib/chef_zero/solr/query/unary_operator.rb +4 -4
- data/lib/chef_zero/solr/solr_doc.rb +4 -4
- data/lib/chef_zero/solr/solr_parser.rb +34 -33
- data/lib/chef_zero/version.rb +1 -1
- data/spec/run_oc_pedant.rb +61 -60
- data/spec/search_spec.rb +11 -11
- data/spec/server_spec.rb +35 -35
- data/spec/socketless_server_map_spec.rb +1 -3
- data/spec/support/oc_pedant.rb +20 -21
- metadata +2 -2
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
6
6
|
# Typical REST list endpoint (/roles or /data/BAG)
|
7
7
|
class RestListEndpoint < RestBase
|
8
|
-
def initialize(server, identity_keys = [
|
8
|
+
def initialize(server, identity_keys = [ "name" ])
|
9
9
|
super(server)
|
10
10
|
identity_keys = [ identity_keys ] if identity_keys.is_a?(String)
|
11
11
|
@identity_keys = identity_keys
|
@@ -29,7 +29,7 @@ module ChefZero
|
|
29
29
|
error(400, "Must specify #{identity_keys.map { |k| k.inspect }.join(' or ')} in JSON")
|
30
30
|
else
|
31
31
|
create_data(request, request.rest_path, key, contents)
|
32
|
-
json_response(201, {
|
32
|
+
json_response(201, { "uri" => "#{build_uri(request.base_uri, request.rest_path + [key])}" })
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
|
+
require "chef_zero/rest_error_response"
|
4
4
|
|
5
5
|
module ChefZero
|
6
6
|
module Endpoints
|
7
7
|
# Typical REST leaf endpoint (/roles/NAME or /data/BAG/NAME)
|
8
8
|
class RestObjectEndpoint < RestBase
|
9
|
-
def initialize(server, identity_keys = [
|
9
|
+
def initialize(server, identity_keys = [ "name" ])
|
10
10
|
super(server)
|
11
11
|
identity_keys = [ identity_keys ] if identity_keys.is_a?(String)
|
12
12
|
@identity_keys = identity_keys
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/endpoints/rest_object_endpoint"
|
3
|
+
require "chef_zero/chef_data/data_normalizer"
|
4
4
|
|
5
5
|
module ChefZero
|
6
6
|
module Endpoints
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
@@ -7,7 +7,7 @@ module ChefZero
|
|
7
7
|
class RoleEnvironmentsEndpoint < RestBase
|
8
8
|
def get(request)
|
9
9
|
role = FFI_Yajl::Parser.parse(get_data(request, request.rest_path[0..3]), :create_additions => false)
|
10
|
-
json_response(200, [
|
10
|
+
json_response(200, [ "_default" ] + (role["env_run_lists"].keys || []))
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "chef_zero/rest_base"
|
2
|
+
require "chef_zero/rest_error_response"
|
3
|
+
require "ffi_yajl"
|
4
4
|
|
5
5
|
module ChefZero
|
6
6
|
module Endpoints
|
@@ -8,8 +8,8 @@ module ChefZero
|
|
8
8
|
class SandboxEndpoint < RestBase
|
9
9
|
def put(request)
|
10
10
|
existing_sandbox = FFI_Yajl::Parser.parse(get_data(request), :create_additions => false)
|
11
|
-
existing_sandbox[
|
12
|
-
if !exists_data?(request, request.rest_path[0..1] + [
|
11
|
+
existing_sandbox["checksums"].each do |checksum|
|
12
|
+
if !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
|
@@ -17,9 +17,9 @@ module ChefZero
|
|
17
17
|
json_response(200, {
|
18
18
|
:guid => request.rest_path[3],
|
19
19
|
:name => request.rest_path[3],
|
20
|
-
:checksums => existing_sandbox[
|
21
|
-
:create_time => existing_sandbox[
|
22
|
-
:is_completed => true
|
20
|
+
:checksums => existing_sandbox["checksums"],
|
21
|
+
:create_time => existing_sandbox["create_time"],
|
22
|
+
:is_completed => true,
|
23
23
|
})
|
24
24
|
end
|
25
25
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
@@ -13,15 +13,15 @@ module ChefZero
|
|
13
13
|
def post(request)
|
14
14
|
sandbox_checksums = []
|
15
15
|
|
16
|
-
needed_checksums = FFI_Yajl::Parser.parse(request.body, :create_additions => false)[
|
16
|
+
needed_checksums = FFI_Yajl::Parser.parse(request.body, :create_additions => false)["checksums"]
|
17
17
|
result_checksums = {}
|
18
18
|
needed_checksums.keys.each do |needed_checksum|
|
19
|
-
if list_data(request, request.rest_path[0..1] +
|
19
|
+
if list_data(request, request.rest_path[0..1] + %w{file_store checksums}).include?(needed_checksum)
|
20
20
|
result_checksums[needed_checksum] = { :needs_upload => false }
|
21
21
|
else
|
22
22
|
result_checksums[needed_checksum] = {
|
23
23
|
:needs_upload => true,
|
24
|
-
:url => build_uri(request.base_uri, request.rest_path[0..1] + [
|
24
|
+
:url => build_uri(request.base_uri, request.rest_path[0..1] + ["file_store", "checksums", needed_checksum]),
|
25
25
|
}
|
26
26
|
sandbox_checksums << needed_checksum
|
27
27
|
end
|
@@ -29,20 +29,20 @@ module ChefZero
|
|
29
29
|
|
30
30
|
# There is an obvious race condition here.
|
31
31
|
id = @next_id.to_s
|
32
|
-
@next_id+=1
|
32
|
+
@next_id += 1
|
33
33
|
|
34
|
-
time_str = Time.now.utc.strftime(
|
34
|
+
time_str = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S%z")
|
35
35
|
time_str = "#{time_str[0..21]}:#{time_str[22..23]}"
|
36
36
|
|
37
37
|
create_data(request, request.rest_path, id, FFI_Yajl::Encoder.encode({
|
38
38
|
:create_time => time_str,
|
39
|
-
:checksums => sandbox_checksums
|
39
|
+
:checksums => sandbox_checksums,
|
40
40
|
}, :pretty => true))
|
41
41
|
|
42
42
|
json_response(201, {
|
43
43
|
:uri => build_uri(request.base_uri, request.rest_path + [id]),
|
44
44
|
:checksums => result_checksums,
|
45
|
-
:sandbox_id => id
|
45
|
+
:sandbox_id => id,
|
46
46
|
})
|
47
47
|
end
|
48
48
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/endpoints/rest_object_endpoint"
|
3
|
+
require "chef_zero/chef_data/data_normalizer"
|
4
|
+
require "chef_zero/rest_error_response"
|
5
|
+
require "chef_zero/solr/solr_parser"
|
6
|
+
require "chef_zero/solr/solr_doc"
|
7
7
|
|
8
8
|
module ChefZero
|
9
9
|
module Endpoints
|
@@ -12,7 +12,7 @@ module ChefZero
|
|
12
12
|
def get(request)
|
13
13
|
orgname = request.rest_path[1]
|
14
14
|
results = search(request, orgname)
|
15
|
-
results[
|
15
|
+
results["rows"] = results["rows"].map { |name, uri, value, search_value| value }
|
16
16
|
json_response(200, results)
|
17
17
|
rescue ChefZero::Solr::ParseError
|
18
18
|
bad_search_request(request)
|
@@ -22,7 +22,7 @@ module ChefZero
|
|
22
22
|
orgname = request.rest_path[1]
|
23
23
|
full_results = search(request, orgname)
|
24
24
|
keys = FFI_Yajl::Parser.parse(request.body, :create_additions => false)
|
25
|
-
partial_results = full_results[
|
25
|
+
partial_results = full_results["rows"].map do |name, uri, doc, search_value|
|
26
26
|
data = {}
|
27
27
|
keys.each_pair do |key, path|
|
28
28
|
if path.size > 0
|
@@ -36,14 +36,14 @@ module ChefZero
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
{
|
39
|
-
|
40
|
-
|
39
|
+
"url" => uri,
|
40
|
+
"data" => data,
|
41
41
|
}
|
42
42
|
end
|
43
43
|
json_response(200, {
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
"rows" => partial_results,
|
45
|
+
"start" => full_results["start"],
|
46
|
+
"total" => full_results["total"],
|
47
47
|
})
|
48
48
|
rescue ChefZero::Solr::ParseError
|
49
49
|
bad_search_request(request)
|
@@ -52,53 +52,55 @@ module ChefZero
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def bad_search_request(request)
|
55
|
-
query_string = request.query_params[
|
56
|
-
resp = {"error" => ["invalid search query: '#{query_string}'"]}
|
55
|
+
query_string = request.query_params["q"]
|
56
|
+
resp = { "error" => ["invalid search query: '#{query_string}'"] }
|
57
57
|
json_response(400, resp)
|
58
58
|
end
|
59
59
|
|
60
60
|
def search_container(request, index, orgname)
|
61
|
-
relative_parts, normalize_proc =
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
61
|
+
relative_parts, normalize_proc =
|
62
|
+
case index
|
63
|
+
when "client"
|
64
|
+
[ ["clients"], Proc.new { |client, name| ChefData::DataNormalizer.normalize_client(client, name, orgname) } ]
|
65
|
+
when "node"
|
66
|
+
[ ["nodes"], Proc.new { |node, name| ChefData::DataNormalizer.normalize_node(node, name) } ]
|
67
|
+
when "environment"
|
68
|
+
[ ["environments"], Proc.new { |environment, name| ChefData::DataNormalizer.normalize_environment(environment, name) } ]
|
69
|
+
when "role"
|
70
|
+
[ ["roles"], Proc.new { |role, name| ChefData::DataNormalizer.normalize_role(role, name) } ]
|
71
|
+
else
|
72
|
+
[ ["data", index], Proc.new { |data_bag_item, id| ChefData::DataNormalizer.normalize_data_bag_item(data_bag_item, index, id, "DELETE") } ]
|
73
|
+
end
|
74
|
+
|
73
75
|
[
|
74
76
|
request.rest_path[0..1] + relative_parts,
|
75
|
-
normalize_proc
|
77
|
+
normalize_proc,
|
76
78
|
]
|
77
79
|
end
|
78
80
|
|
79
81
|
def expand_for_indexing(value, index, id)
|
80
|
-
if index ==
|
82
|
+
if index == "node"
|
81
83
|
result = {}
|
82
|
-
deep_merge!(value[
|
83
|
-
deep_merge!(value[
|
84
|
-
deep_merge!(value[
|
85
|
-
deep_merge!(value[
|
86
|
-
result[
|
87
|
-
result[
|
88
|
-
if value[
|
89
|
-
value[
|
84
|
+
deep_merge!(value["default"] || {}, result)
|
85
|
+
deep_merge!(value["normal"] || {}, result)
|
86
|
+
deep_merge!(value["override"] || {}, result)
|
87
|
+
deep_merge!(value["automatic"] || {}, result)
|
88
|
+
result["recipe"] = []
|
89
|
+
result["role"] = []
|
90
|
+
if value["run_list"]
|
91
|
+
value["run_list"].each do |run_list_entry|
|
90
92
|
if run_list_entry =~ /^(recipe|role)\[(.*)\]/
|
91
93
|
result[$1] << $2
|
92
94
|
end
|
93
95
|
end
|
94
96
|
end
|
95
97
|
value.each_pair do |key, value|
|
96
|
-
result[key] = value unless %w
|
98
|
+
result[key] = value unless %w{default normal override automatic}.include?(key)
|
97
99
|
end
|
98
100
|
result
|
99
101
|
|
100
|
-
elsif !%w
|
101
|
-
ChefData::DataNormalizer.normalize_data_bag_item(value, index, id,
|
102
|
+
elsif !%w{client environment role}.include?(index)
|
103
|
+
ChefData::DataNormalizer.normalize_data_bag_item(value, index, id, "GET")
|
102
104
|
else
|
103
105
|
value
|
104
106
|
end
|
@@ -107,12 +109,12 @@ module ChefZero
|
|
107
109
|
def search(request, orgname = nil)
|
108
110
|
# Extract parameters
|
109
111
|
index = request.rest_path[3]
|
110
|
-
query_string = request.query_params[
|
112
|
+
query_string = request.query_params["q"] || "*:*"
|
111
113
|
solr_query = ChefZero::Solr::SolrParser.new(query_string).parse
|
112
|
-
sort_string = request.query_params[
|
113
|
-
start = request.query_params[
|
114
|
+
sort_string = request.query_params["sort"]
|
115
|
+
start = request.query_params["start"]
|
114
116
|
start = start.to_i if start
|
115
|
-
rows = request.query_params[
|
117
|
+
rows = request.query_params["rows"]
|
116
118
|
rows = rows.to_i if rows
|
117
119
|
|
118
120
|
# Get the search container
|
@@ -133,18 +135,18 @@ module ChefZero
|
|
133
135
|
# Sort
|
134
136
|
if sort_string
|
135
137
|
sort_key, sort_order = sort_string.split(/\s+/, 2)
|
136
|
-
result = result.sort_by { |name,uri,value,search_value| ChefZero::Solr::SolrDoc.new(search_value, name)[sort_key] }
|
138
|
+
result = result.sort_by { |name, uri, value, search_value| ChefZero::Solr::SolrDoc.new(search_value, name)[sort_key] }
|
137
139
|
result = result.reverse if sort_order == "DESC"
|
138
140
|
end
|
139
141
|
|
140
142
|
# Paginate
|
141
143
|
if start
|
142
|
-
result = result[start..start+(rows
|
144
|
+
result = result[start..start + (rows || -1)]
|
143
145
|
end
|
144
146
|
{
|
145
|
-
|
146
|
-
|
147
|
-
|
147
|
+
"rows" => result,
|
148
|
+
"start" => start || 0,
|
149
|
+
"total" => total,
|
148
150
|
}
|
149
151
|
end
|
150
152
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "chef_zero/rest_base"
|
2
2
|
|
3
3
|
module ChefZero
|
4
4
|
module Endpoints
|
@@ -7,7 +7,7 @@ module ChefZero
|
|
7
7
|
def get(request)
|
8
8
|
# Get the result
|
9
9
|
result_hash = {}
|
10
|
-
indices = (%w
|
10
|
+
indices = (%w{client environment node role} + data_store.list(request.rest_path[0..1] + ["data"])).sort
|
11
11
|
indices.each do |index|
|
12
12
|
result_hash[index] = build_uri(request.base_uri, request.rest_path + [index])
|
13
13
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "chef_zero/rest_base"
|
2
2
|
|
3
3
|
module ChefZero
|
4
4
|
module Endpoints
|
@@ -6,7 +6,7 @@ module ChefZero
|
|
6
6
|
class ServerAPIVersionEndpoint < RestBase
|
7
7
|
API_VERSION = 1
|
8
8
|
def get(request)
|
9
|
-
json_response(200, {"min_api_version"=>MIN_API_VERSION, "max_api_version"=>MAX_API_VERSION},
|
9
|
+
json_response(200, { "min_api_version" => MIN_API_VERSION, "max_api_version" => MAX_API_VERSION },
|
10
10
|
request_version: request.api_version, response_version: API_VERSION)
|
11
11
|
end
|
12
12
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
@@ -7,19 +7,19 @@ module ChefZero
|
|
7
7
|
class SystemRecoveryEndpoint < RestBase
|
8
8
|
def post(request)
|
9
9
|
request_json = FFI_Yajl::Parser.parse(request.body, :create_additions => false)
|
10
|
-
name = request_json[
|
11
|
-
password = request_json[
|
12
|
-
user = get_data(request, request.rest_path[0..-2] + [
|
10
|
+
name = request_json["username"]
|
11
|
+
password = request_json["password"]
|
12
|
+
user = get_data(request, request.rest_path[0..-2] + ["users", name], :nil)
|
13
13
|
if !user
|
14
14
|
raise RestErrorResponse.new(403, "Nonexistent user")
|
15
15
|
end
|
16
16
|
|
17
17
|
user = FFI_Yajl::Parser.parse(user, :create_additions => false)
|
18
|
-
user = ChefData::DataNormalizer.normalize_user(user, name, [
|
19
|
-
if !user[
|
18
|
+
user = ChefData::DataNormalizer.normalize_user(user, name, [ "username" ], server.options[:osc_compat])
|
19
|
+
if !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
|
-
if user[
|
22
|
+
if user["password"] != password
|
23
23
|
raise RestErrorResponse.new(401, "Incorrect password")
|
24
24
|
end
|
25
25
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
@@ -14,26 +14,26 @@ module ChefZero
|
|
14
14
|
orgname = $1
|
15
15
|
|
16
16
|
json = FFI_Yajl::Parser.parse(request.body, :create_additions => false)
|
17
|
-
association_request_path = [
|
18
|
-
if json[
|
19
|
-
users = get_data(request, [
|
17
|
+
association_request_path = [ "organizations", orgname, "association_requests", username ]
|
18
|
+
if json["response"] == "accept"
|
19
|
+
users = get_data(request, [ "organizations", orgname, "groups", "users" ])
|
20
20
|
users = FFI_Yajl::Parser.parse(users, :create_additions => false)
|
21
21
|
|
22
22
|
delete_data(request, association_request_path)
|
23
|
-
create_data(request, [
|
23
|
+
create_data(request, [ "organizations", orgname, "users" ], username, "{}")
|
24
24
|
|
25
25
|
# Add the user to the users group if it isn't already there
|
26
|
-
if !users[
|
27
|
-
users[
|
28
|
-
users[
|
29
|
-
set_data(request, [
|
26
|
+
if !users["users"] || !users["users"].include?(username)
|
27
|
+
users["users"] ||= []
|
28
|
+
users["users"] |= [ username ]
|
29
|
+
set_data(request, [ "organizations", orgname, "groups", "users" ], FFI_Yajl::Encoder.encode(users, :pretty => true))
|
30
30
|
end
|
31
|
-
elsif json[
|
31
|
+
elsif json["response"] == "reject"
|
32
32
|
delete_data(request, association_request_path)
|
33
33
|
else
|
34
34
|
raise RestErrorResponse.new(400, "response parameter was missing or set to the wrong value (must be accept or reject)")
|
35
35
|
end
|
36
|
-
json_response(200, {
|
36
|
+
json_response(200, { "organization" => { "name" => orgname } })
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "ffi_yajl"
|
2
|
+
require "chef_zero/rest_base"
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
@@ -9,8 +9,8 @@ module ChefZero
|
|
9
9
|
get_data(request, request.rest_path[0..-3])
|
10
10
|
|
11
11
|
username = request.rest_path[1]
|
12
|
-
result = list_data(request, [
|
13
|
-
exists_data?(request, [
|
12
|
+
result = list_data(request, [ "organizations" ]).select do |org|
|
13
|
+
exists_data?(request, [ "organizations", org, "association_requests", username ])
|
14
14
|
end
|
15
15
|
json_response(200, { "value" => result.size })
|
16
16
|
end
|