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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +36 -31
  3. data/LICENSE +201 -201
  4. data/Rakefile +73 -68
  5. data/bin/chef-zero +111 -111
  6. data/chef-zero.gemspec +34 -33
  7. data/lib/chef_zero/chef_data/acl_path.rb +140 -140
  8. data/lib/chef_zero/chef_data/cookbook_data.rb +237 -237
  9. data/lib/chef_zero/chef_data/data_normalizer.rb +276 -276
  10. data/lib/chef_zero/chef_data/default_creator.rb +476 -476
  11. data/lib/chef_zero/data_store/data_already_exists_error.rb +29 -29
  12. data/lib/chef_zero/data_store/data_error.rb +32 -32
  13. data/lib/chef_zero/data_store/data_not_found_error.rb +29 -29
  14. data/lib/chef_zero/data_store/default_facade.rb +143 -147
  15. data/lib/chef_zero/data_store/interface_v1.rb +67 -67
  16. data/lib/chef_zero/data_store/interface_v2.rb +18 -18
  17. data/lib/chef_zero/data_store/memory_store.rb +33 -33
  18. data/lib/chef_zero/data_store/memory_store_v2.rb +159 -159
  19. data/lib/chef_zero/data_store/raw_file_store.rb +143 -143
  20. data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +150 -150
  21. data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +105 -105
  22. data/lib/chef_zero/dist.rb +9 -9
  23. data/lib/chef_zero/endpoints/acl_endpoint.rb +39 -39
  24. data/lib/chef_zero/endpoints/acls_endpoint.rb +41 -41
  25. data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +78 -78
  26. data/lib/chef_zero/endpoints/actor_endpoint.rb +184 -184
  27. data/lib/chef_zero/endpoints/actor_key_endpoint.rb +62 -62
  28. data/lib/chef_zero/endpoints/actor_keys_endpoint.rb +129 -129
  29. data/lib/chef_zero/endpoints/actors_endpoint.rb +104 -104
  30. data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +32 -32
  31. data/lib/chef_zero/endpoints/container_endpoint.rb +22 -22
  32. data/lib/chef_zero/endpoints/containers_endpoint.rb +25 -25
  33. data/lib/chef_zero/endpoints/controls_endpoint.rb +16 -16
  34. data/lib/chef_zero/endpoints/cookbook_artifact_endpoint.rb +24 -24
  35. data/lib/chef_zero/endpoints/cookbook_artifact_identifier_endpoint.rb +68 -68
  36. data/lib/chef_zero/endpoints/cookbook_artifacts_endpoint.rb +34 -34
  37. data/lib/chef_zero/endpoints/cookbook_endpoint.rb +39 -39
  38. data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +136 -136
  39. data/lib/chef_zero/endpoints/cookbooks_base.rb +80 -80
  40. data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +19 -19
  41. data/lib/chef_zero/endpoints/data_bag_endpoint.rb +45 -45
  42. data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +25 -25
  43. data/lib/chef_zero/endpoints/data_bags_endpoint.rb +23 -23
  44. data/lib/chef_zero/endpoints/dummy_endpoint.rb +29 -29
  45. data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +24 -24
  46. data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +126 -126
  47. data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +22 -22
  48. data/lib/chef_zero/endpoints/environment_endpoint.rb +33 -33
  49. data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +23 -23
  50. data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +22 -22
  51. data/lib/chef_zero/endpoints/environment_role_endpoint.rb +36 -36
  52. data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +22 -22
  53. data/lib/chef_zero/endpoints/group_endpoint.rb +20 -20
  54. data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -13
  55. data/lib/chef_zero/endpoints/license_endpoint.rb +25 -25
  56. data/lib/chef_zero/endpoints/node_endpoint.rb +34 -34
  57. data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +22 -22
  58. data/lib/chef_zero/endpoints/nodes_endpoint.rb +34 -34
  59. data/lib/chef_zero/endpoints/not_found_endpoint.rb +11 -11
  60. data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -22
  61. data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +30 -30
  62. data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -26
  63. data/lib/chef_zero/endpoints/organization_endpoint.rb +47 -47
  64. data/lib/chef_zero/endpoints/organization_user_base.rb +15 -15
  65. data/lib/chef_zero/endpoints/organization_user_default_key_endpoint.rb +16 -16
  66. data/lib/chef_zero/endpoints/organization_user_endpoint.rb +26 -26
  67. data/lib/chef_zero/endpoints/organization_user_key_endpoint.rb +17 -17
  68. data/lib/chef_zero/endpoints/organization_user_keys_endpoint.rb +17 -17
  69. data/lib/chef_zero/endpoints/organization_users_endpoint.rb +43 -43
  70. data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -20
  71. data/lib/chef_zero/endpoints/organizations_endpoint.rb +61 -61
  72. data/lib/chef_zero/endpoints/policies_endpoint.rb +26 -26
  73. data/lib/chef_zero/endpoints/policy_endpoint.rb +24 -24
  74. data/lib/chef_zero/endpoints/policy_group_endpoint.rb +46 -46
  75. data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +83 -83
  76. data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +38 -38
  77. data/lib/chef_zero/endpoints/policy_revision_endpoint.rb +66 -66
  78. data/lib/chef_zero/endpoints/policy_revisions_endpoint.rb +15 -15
  79. data/lib/chef_zero/endpoints/principal_endpoint.rb +55 -55
  80. data/lib/chef_zero/endpoints/rest_list_endpoint.rb +42 -42
  81. data/lib/chef_zero/endpoints/rest_object_endpoint.rb +78 -78
  82. data/lib/chef_zero/endpoints/role_endpoint.rb +16 -16
  83. data/lib/chef_zero/endpoints/role_environments_endpoint.rb +14 -14
  84. data/lib/chef_zero/endpoints/sandbox_endpoint.rb +27 -27
  85. data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +51 -51
  86. data/lib/chef_zero/endpoints/search_endpoint.rb +208 -208
  87. data/lib/chef_zero/endpoints/searches_endpoint.rb +18 -18
  88. data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +14 -14
  89. data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -30
  90. data/lib/chef_zero/endpoints/universe_endpoint.rb +15 -15
  91. data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +41 -41
  92. data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -19
  93. data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -19
  94. data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -22
  95. data/lib/chef_zero/endpoints/version_endpoint.rb +13 -13
  96. data/lib/chef_zero/log.rb +7 -7
  97. data/lib/chef_zero/rest_base.rb +332 -332
  98. data/lib/chef_zero/rest_error_response.rb +11 -11
  99. data/lib/chef_zero/rest_request.rb +84 -88
  100. data/lib/chef_zero/rest_router.rb +72 -72
  101. data/lib/chef_zero/rspec.rb +355 -355
  102. data/lib/chef_zero/server.rb +730 -730
  103. data/lib/chef_zero/socketless_server_map.rb +92 -93
  104. data/lib/chef_zero/solr/query/binary_operator.rb +52 -52
  105. data/lib/chef_zero/solr/query/phrase.rb +23 -23
  106. data/lib/chef_zero/solr/query/range_query.rb +46 -46
  107. data/lib/chef_zero/solr/query/regexpable_query.rb +30 -30
  108. data/lib/chef_zero/solr/query/subquery.rb +37 -37
  109. data/lib/chef_zero/solr/query/term.rb +45 -45
  110. data/lib/chef_zero/solr/query/unary_operator.rb +41 -41
  111. data/lib/chef_zero/solr/solr_doc.rb +53 -53
  112. data/lib/chef_zero/solr/solr_parser.rb +208 -208
  113. data/lib/chef_zero/version.rb +3 -3
  114. data/lib/chef_zero.rb +10 -10
  115. data/spec/run_oc_pedant.rb +226 -226
  116. data/spec/search_spec.rb +36 -36
  117. data/spec/server_spec.rb +96 -96
  118. data/spec/socketless_server_map_spec.rb +74 -74
  119. data/spec/support/oc_pedant.rb +149 -149
  120. data/spec/support/secrets.json +6 -6
  121. data/spec/support/stickywicket.pem +27 -27
  122. 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