chef-zero 15.0.17 → 15.0.21
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 +36 -31
- data/LICENSE +201 -201
- data/Rakefile +73 -68
- data/bin/chef-zero +111 -111
- data/chef-zero.gemspec +34 -33
- data/lib/chef_zero/chef_data/acl_path.rb +140 -140
- data/lib/chef_zero/chef_data/cookbook_data.rb +237 -237
- data/lib/chef_zero/chef_data/data_normalizer.rb +276 -276
- data/lib/chef_zero/chef_data/default_creator.rb +476 -476
- data/lib/chef_zero/data_store/data_already_exists_error.rb +29 -29
- data/lib/chef_zero/data_store/data_error.rb +32 -32
- data/lib/chef_zero/data_store/data_not_found_error.rb +29 -29
- data/lib/chef_zero/data_store/default_facade.rb +143 -147
- data/lib/chef_zero/data_store/interface_v1.rb +67 -67
- data/lib/chef_zero/data_store/interface_v2.rb +18 -18
- data/lib/chef_zero/data_store/memory_store.rb +33 -33
- data/lib/chef_zero/data_store/memory_store_v2.rb +159 -159
- data/lib/chef_zero/data_store/raw_file_store.rb +143 -143
- data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +150 -150
- data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +105 -105
- data/lib/chef_zero/dist.rb +9 -9
- data/lib/chef_zero/endpoints/acl_endpoint.rb +39 -39
- data/lib/chef_zero/endpoints/acls_endpoint.rb +41 -41
- data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +78 -78
- data/lib/chef_zero/endpoints/actor_endpoint.rb +184 -184
- data/lib/chef_zero/endpoints/actor_key_endpoint.rb +62 -62
- data/lib/chef_zero/endpoints/actor_keys_endpoint.rb +129 -129
- data/lib/chef_zero/endpoints/actors_endpoint.rb +104 -104
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +32 -32
- data/lib/chef_zero/endpoints/container_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/containers_endpoint.rb +25 -25
- data/lib/chef_zero/endpoints/controls_endpoint.rb +16 -16
- data/lib/chef_zero/endpoints/cookbook_artifact_endpoint.rb +24 -24
- data/lib/chef_zero/endpoints/cookbook_artifact_identifier_endpoint.rb +68 -68
- data/lib/chef_zero/endpoints/cookbook_artifacts_endpoint.rb +34 -34
- data/lib/chef_zero/endpoints/cookbook_endpoint.rb +39 -39
- data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +136 -136
- data/lib/chef_zero/endpoints/cookbooks_base.rb +80 -80
- data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +19 -19
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +45 -45
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +25 -25
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +23 -23
- data/lib/chef_zero/endpoints/dummy_endpoint.rb +29 -29
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +24 -24
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +126 -126
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/environment_endpoint.rb +33 -33
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +23 -23
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +36 -36
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/group_endpoint.rb +20 -20
- data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -13
- data/lib/chef_zero/endpoints/license_endpoint.rb +25 -25
- data/lib/chef_zero/endpoints/node_endpoint.rb +34 -34
- data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/nodes_endpoint.rb +34 -34
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +11 -11
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +30 -30
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -26
- data/lib/chef_zero/endpoints/organization_endpoint.rb +47 -47
- data/lib/chef_zero/endpoints/organization_user_base.rb +15 -15
- data/lib/chef_zero/endpoints/organization_user_default_key_endpoint.rb +16 -16
- data/lib/chef_zero/endpoints/organization_user_endpoint.rb +26 -26
- data/lib/chef_zero/endpoints/organization_user_key_endpoint.rb +17 -17
- data/lib/chef_zero/endpoints/organization_user_keys_endpoint.rb +17 -17
- data/lib/chef_zero/endpoints/organization_users_endpoint.rb +43 -43
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -20
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +61 -61
- data/lib/chef_zero/endpoints/policies_endpoint.rb +26 -26
- data/lib/chef_zero/endpoints/policy_endpoint.rb +24 -24
- data/lib/chef_zero/endpoints/policy_group_endpoint.rb +46 -46
- data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +83 -83
- data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +38 -38
- data/lib/chef_zero/endpoints/policy_revision_endpoint.rb +66 -66
- data/lib/chef_zero/endpoints/policy_revisions_endpoint.rb +15 -15
- data/lib/chef_zero/endpoints/principal_endpoint.rb +55 -55
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +42 -42
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +78 -78
- data/lib/chef_zero/endpoints/role_endpoint.rb +16 -16
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +14 -14
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +27 -27
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +51 -51
- data/lib/chef_zero/endpoints/search_endpoint.rb +208 -208
- data/lib/chef_zero/endpoints/searches_endpoint.rb +18 -18
- data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +14 -14
- data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -30
- data/lib/chef_zero/endpoints/universe_endpoint.rb +15 -15
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +41 -41
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -19
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -19
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/version_endpoint.rb +13 -13
- data/lib/chef_zero/log.rb +7 -7
- data/lib/chef_zero/rest_base.rb +332 -332
- data/lib/chef_zero/rest_error_response.rb +11 -11
- data/lib/chef_zero/rest_request.rb +84 -88
- data/lib/chef_zero/rest_router.rb +72 -72
- data/lib/chef_zero/rspec.rb +355 -355
- data/lib/chef_zero/server.rb +730 -730
- data/lib/chef_zero/socketless_server_map.rb +92 -93
- data/lib/chef_zero/solr/query/binary_operator.rb +52 -52
- data/lib/chef_zero/solr/query/phrase.rb +23 -23
- data/lib/chef_zero/solr/query/range_query.rb +46 -46
- data/lib/chef_zero/solr/query/regexpable_query.rb +30 -30
- data/lib/chef_zero/solr/query/subquery.rb +37 -37
- data/lib/chef_zero/solr/query/term.rb +45 -45
- data/lib/chef_zero/solr/query/unary_operator.rb +41 -41
- data/lib/chef_zero/solr/solr_doc.rb +53 -53
- data/lib/chef_zero/solr/solr_parser.rb +208 -208
- data/lib/chef_zero/version.rb +3 -3
- data/lib/chef_zero.rb +10 -10
- data/spec/run_oc_pedant.rb +226 -226
- data/spec/search_spec.rb +36 -36
- data/spec/server_spec.rb +96 -96
- data/spec/socketless_server_map_spec.rb +74 -74
- data/spec/support/oc_pedant.rb +149 -149
- data/spec/support/secrets.json +6 -6
- data/spec/support/stickywicket.pem +27 -27
- metadata +35 -18
@@ -1,78 +1,78 @@
|
|
1
|
-
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
-
require_relative "../rest_base"
|
3
|
-
require_relative "../rest_error_response"
|
4
|
-
|
5
|
-
module ChefZero
|
6
|
-
module Endpoints
|
7
|
-
# Typical REST leaf endpoint (/roles/NAME or /data/BAG/NAME)
|
8
|
-
class RestObjectEndpoint < RestBase
|
9
|
-
def initialize(server, identity_keys = [ "name" ])
|
10
|
-
super(server)
|
11
|
-
identity_keys = [ identity_keys ] if identity_keys.is_a?(String)
|
12
|
-
@identity_keys = identity_keys
|
13
|
-
end
|
14
|
-
|
15
|
-
attr_reader :identity_keys
|
16
|
-
|
17
|
-
def get(request)
|
18
|
-
already_json_response(200, populate_defaults(request, get_data(request)))
|
19
|
-
end
|
20
|
-
|
21
|
-
def put(request)
|
22
|
-
# We grab the old body to trigger a 404 if it doesn't exist
|
23
|
-
get_data(request)
|
24
|
-
|
25
|
-
# If it's a rename, check for conflict and delete the old value
|
26
|
-
if is_rename?(request)
|
27
|
-
key = identity_key_value(request)
|
28
|
-
|
29
|
-
begin
|
30
|
-
create_data(request, request.rest_path[0..-2], key, request.body, :data_store_exceptions)
|
31
|
-
rescue DataStore::DataAlreadyExistsError
|
32
|
-
return error(409, "Cannot rename '#{request.rest_path[-1]}' to '#{key}': '#{key}' already exists")
|
33
|
-
end
|
34
|
-
delete_data(request)
|
35
|
-
already_json_response(201, populate_defaults(request, request.body))
|
36
|
-
else
|
37
|
-
set_data(request, request.rest_path, request.body)
|
38
|
-
already_json_response(200, populate_defaults(request, request.body))
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def delete(request)
|
43
|
-
result = get_data(request)
|
44
|
-
delete_data(request)
|
45
|
-
already_json_response(200, populate_defaults(request, result))
|
46
|
-
end
|
47
|
-
|
48
|
-
def patch_request_body(request)
|
49
|
-
existing_value = get_data(request, nil, :nil)
|
50
|
-
if existing_value
|
51
|
-
request_json = FFI_Yajl::Parser.parse(request.body)
|
52
|
-
existing_json = FFI_Yajl::Parser.parse(existing_value)
|
53
|
-
merged_json = existing_json.merge(request_json)
|
54
|
-
if merged_json.size > request_json.size
|
55
|
-
return FFI_Yajl::Encoder.encode(merged_json, pretty: true)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
request.body
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
# Get the value of the (first existing) identity key from the request body or nil
|
65
|
-
def identity_key_value(request)
|
66
|
-
request_json = parse_json(request.body)
|
67
|
-
identity_keys.map { |k| request_json[k] }.compact.first
|
68
|
-
end
|
69
|
-
|
70
|
-
# Does this request change the value of the identity key?
|
71
|
-
def is_rename?(request)
|
72
|
-
return false unless (key = identity_key_value(request))
|
73
|
-
|
74
|
-
key != request.rest_path[-1]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
+
require_relative "../rest_base"
|
3
|
+
require_relative "../rest_error_response"
|
4
|
+
|
5
|
+
module ChefZero
|
6
|
+
module Endpoints
|
7
|
+
# Typical REST leaf endpoint (/roles/NAME or /data/BAG/NAME)
|
8
|
+
class RestObjectEndpoint < RestBase
|
9
|
+
def initialize(server, identity_keys = [ "name" ])
|
10
|
+
super(server)
|
11
|
+
identity_keys = [ identity_keys ] if identity_keys.is_a?(String)
|
12
|
+
@identity_keys = identity_keys
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :identity_keys
|
16
|
+
|
17
|
+
def get(request)
|
18
|
+
already_json_response(200, populate_defaults(request, get_data(request)))
|
19
|
+
end
|
20
|
+
|
21
|
+
def put(request)
|
22
|
+
# We grab the old body to trigger a 404 if it doesn't exist
|
23
|
+
get_data(request)
|
24
|
+
|
25
|
+
# If it's a rename, check for conflict and delete the old value
|
26
|
+
if is_rename?(request)
|
27
|
+
key = identity_key_value(request)
|
28
|
+
|
29
|
+
begin
|
30
|
+
create_data(request, request.rest_path[0..-2], key, request.body, :data_store_exceptions)
|
31
|
+
rescue DataStore::DataAlreadyExistsError
|
32
|
+
return error(409, "Cannot rename '#{request.rest_path[-1]}' to '#{key}': '#{key}' already exists")
|
33
|
+
end
|
34
|
+
delete_data(request)
|
35
|
+
already_json_response(201, populate_defaults(request, request.body))
|
36
|
+
else
|
37
|
+
set_data(request, request.rest_path, request.body)
|
38
|
+
already_json_response(200, populate_defaults(request, request.body))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def delete(request)
|
43
|
+
result = get_data(request)
|
44
|
+
delete_data(request)
|
45
|
+
already_json_response(200, populate_defaults(request, result))
|
46
|
+
end
|
47
|
+
|
48
|
+
def patch_request_body(request)
|
49
|
+
existing_value = get_data(request, nil, :nil)
|
50
|
+
if existing_value
|
51
|
+
request_json = FFI_Yajl::Parser.parse(request.body)
|
52
|
+
existing_json = FFI_Yajl::Parser.parse(existing_value)
|
53
|
+
merged_json = existing_json.merge(request_json)
|
54
|
+
if merged_json.size > request_json.size
|
55
|
+
return FFI_Yajl::Encoder.encode(merged_json, pretty: true)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
request.body
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Get the value of the (first existing) identity key from the request body or nil
|
65
|
+
def identity_key_value(request)
|
66
|
+
request_json = parse_json(request.body)
|
67
|
+
identity_keys.map { |k| request_json[k] }.compact.first
|
68
|
+
end
|
69
|
+
|
70
|
+
# Does this request change the value of the identity key?
|
71
|
+
def is_rename?(request)
|
72
|
+
return false unless (key = identity_key_value(request))
|
73
|
+
|
74
|
+
key != request.rest_path[-1]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
-
require_relative "rest_object_endpoint"
|
3
|
-
require_relative "../chef_data/data_normalizer"
|
4
|
-
|
5
|
-
module ChefZero
|
6
|
-
module Endpoints
|
7
|
-
# /roles/NAME
|
8
|
-
class RoleEndpoint < RestObjectEndpoint
|
9
|
-
def populate_defaults(request, response_json)
|
10
|
-
role = FFI_Yajl::Parser.parse(response_json)
|
11
|
-
role = ChefData::DataNormalizer.normalize_role(role, request.rest_path[3])
|
12
|
-
FFI_Yajl::Encoder.encode(role, pretty: true)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
+
require_relative "rest_object_endpoint"
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
4
|
+
|
5
|
+
module ChefZero
|
6
|
+
module Endpoints
|
7
|
+
# /roles/NAME
|
8
|
+
class RoleEndpoint < RestObjectEndpoint
|
9
|
+
def populate_defaults(request, response_json)
|
10
|
+
role = FFI_Yajl::Parser.parse(response_json)
|
11
|
+
role = ChefData::DataNormalizer.normalize_role(role, request.rest_path[3])
|
12
|
+
FFI_Yajl::Encoder.encode(role, pretty: true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
-
require_relative "../rest_base"
|
3
|
-
|
4
|
-
module ChefZero
|
5
|
-
module Endpoints
|
6
|
-
# /roles/NAME/environments
|
7
|
-
class RoleEnvironmentsEndpoint < RestBase
|
8
|
-
def get(request)
|
9
|
-
role = FFI_Yajl::Parser.parse(get_data(request, request.rest_path[0..3]))
|
10
|
-
json_response(200, [ "_default" ] + (role["env_run_lists"].keys || []))
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
+
require_relative "../rest_base"
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module Endpoints
|
6
|
+
# /roles/NAME/environments
|
7
|
+
class RoleEnvironmentsEndpoint < RestBase
|
8
|
+
def get(request)
|
9
|
+
role = FFI_Yajl::Parser.parse(get_data(request, request.rest_path[0..3]))
|
10
|
+
json_response(200, [ "_default" ] + (role["env_run_lists"].keys || []))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,27 +1,27 @@
|
|
1
|
-
require_relative "../rest_base"
|
2
|
-
require_relative "../rest_error_response"
|
3
|
-
require "ffi_yajl" unless defined?(FFI_Yajl)
|
4
|
-
|
5
|
-
module ChefZero
|
6
|
-
module Endpoints
|
7
|
-
# /sandboxes/ID
|
8
|
-
class SandboxEndpoint < RestBase
|
9
|
-
def put(request)
|
10
|
-
existing_sandbox = FFI_Yajl::Parser.parse(get_data(request))
|
11
|
-
existing_sandbox["checksums"].each do |checksum|
|
12
|
-
unless exists_data?(request, request.rest_path[0..1] + ["file_store", "checksums", checksum])
|
13
|
-
raise RestErrorResponse.new(503, "Checksum not uploaded: #{checksum}")
|
14
|
-
end
|
15
|
-
end
|
16
|
-
delete_data(request)
|
17
|
-
json_response(200, {
|
18
|
-
guid: request.rest_path[3],
|
19
|
-
name: request.rest_path[3],
|
20
|
-
checksums: existing_sandbox["checksums"],
|
21
|
-
create_time: existing_sandbox["create_time"],
|
22
|
-
is_completed: true,
|
23
|
-
})
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
1
|
+
require_relative "../rest_base"
|
2
|
+
require_relative "../rest_error_response"
|
3
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
4
|
+
|
5
|
+
module ChefZero
|
6
|
+
module Endpoints
|
7
|
+
# /sandboxes/ID
|
8
|
+
class SandboxEndpoint < RestBase
|
9
|
+
def put(request)
|
10
|
+
existing_sandbox = FFI_Yajl::Parser.parse(get_data(request))
|
11
|
+
existing_sandbox["checksums"].each do |checksum|
|
12
|
+
unless exists_data?(request, request.rest_path[0..1] + ["file_store", "checksums", checksum])
|
13
|
+
raise RestErrorResponse.new(503, "Checksum not uploaded: #{checksum}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
delete_data(request)
|
17
|
+
json_response(200, {
|
18
|
+
guid: request.rest_path[3],
|
19
|
+
name: request.rest_path[3],
|
20
|
+
checksums: existing_sandbox["checksums"],
|
21
|
+
create_time: existing_sandbox["create_time"],
|
22
|
+
is_completed: true,
|
23
|
+
})
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,51 +1,51 @@
|
|
1
|
-
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
-
require_relative "../rest_base"
|
3
|
-
|
4
|
-
module ChefZero
|
5
|
-
module Endpoints
|
6
|
-
# /sandboxes
|
7
|
-
class SandboxesEndpoint < RestBase
|
8
|
-
def initialize(server)
|
9
|
-
super(server)
|
10
|
-
@next_id = 1
|
11
|
-
end
|
12
|
-
|
13
|
-
def post(request)
|
14
|
-
sandbox_checksums = []
|
15
|
-
|
16
|
-
needed_checksums = FFI_Yajl::Parser.parse(request.body)["checksums"]
|
17
|
-
result_checksums = {}
|
18
|
-
available_checksums = list_data(request, request.rest_path[0..1] + %w{file_store checksums})
|
19
|
-
needed_checksums.keys.each do |needed_checksum|
|
20
|
-
if available_checksums.include?(needed_checksum)
|
21
|
-
result_checksums[needed_checksum] = { needs_upload: false }
|
22
|
-
else
|
23
|
-
result_checksums[needed_checksum] = {
|
24
|
-
needs_upload: true,
|
25
|
-
url: build_uri(request.base_uri, request.rest_path[0..1] + ["file_store", "checksums", needed_checksum]),
|
26
|
-
}
|
27
|
-
sandbox_checksums << needed_checksum
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# There is an obvious race condition here.
|
32
|
-
id = @next_id.to_s
|
33
|
-
@next_id += 1
|
34
|
-
|
35
|
-
time_str = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S%z")
|
36
|
-
time_str = "#{time_str[0..21]}:#{time_str[22..23]}"
|
37
|
-
|
38
|
-
create_data(request, request.rest_path, id, FFI_Yajl::Encoder.encode({
|
39
|
-
create_time: time_str,
|
40
|
-
checksums: sandbox_checksums,
|
41
|
-
}, pretty: true))
|
42
|
-
|
43
|
-
json_response(201, {
|
44
|
-
uri: build_uri(request.base_uri, request.rest_path + [id]),
|
45
|
-
checksums: result_checksums,
|
46
|
-
sandbox_id: id,
|
47
|
-
})
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
1
|
+
require "ffi_yajl" unless defined?(FFI_Yajl)
|
2
|
+
require_relative "../rest_base"
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module Endpoints
|
6
|
+
# /sandboxes
|
7
|
+
class SandboxesEndpoint < RestBase
|
8
|
+
def initialize(server)
|
9
|
+
super(server)
|
10
|
+
@next_id = 1
|
11
|
+
end
|
12
|
+
|
13
|
+
def post(request)
|
14
|
+
sandbox_checksums = []
|
15
|
+
|
16
|
+
needed_checksums = FFI_Yajl::Parser.parse(request.body)["checksums"]
|
17
|
+
result_checksums = {}
|
18
|
+
available_checksums = list_data(request, request.rest_path[0..1] + %w{file_store checksums})
|
19
|
+
needed_checksums.keys.each do |needed_checksum|
|
20
|
+
if available_checksums.include?(needed_checksum)
|
21
|
+
result_checksums[needed_checksum] = { needs_upload: false }
|
22
|
+
else
|
23
|
+
result_checksums[needed_checksum] = {
|
24
|
+
needs_upload: true,
|
25
|
+
url: build_uri(request.base_uri, request.rest_path[0..1] + ["file_store", "checksums", needed_checksum]),
|
26
|
+
}
|
27
|
+
sandbox_checksums << needed_checksum
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# There is an obvious race condition here.
|
32
|
+
id = @next_id.to_s
|
33
|
+
@next_id += 1
|
34
|
+
|
35
|
+
time_str = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S%z")
|
36
|
+
time_str = "#{time_str[0..21]}:#{time_str[22..23]}"
|
37
|
+
|
38
|
+
create_data(request, request.rest_path, id, FFI_Yajl::Encoder.encode({
|
39
|
+
create_time: time_str,
|
40
|
+
checksums: sandbox_checksums,
|
41
|
+
}, pretty: true))
|
42
|
+
|
43
|
+
json_response(201, {
|
44
|
+
uri: build_uri(request.base_uri, request.rest_path + [id]),
|
45
|
+
checksums: result_checksums,
|
46
|
+
sandbox_id: id,
|
47
|
+
})
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|