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,355 +1,355 @@
1
- require "tempfile" unless defined?(Tempfile)
2
- require_relative "server"
3
- require_relative "rest_request"
4
-
5
- module ChefZero
6
- module RSpec
7
- module RSpecClassMethods
8
- attr_accessor :server
9
- attr_accessor :client_key
10
- attr_reader :request_log
11
-
12
- def clear_request_log
13
- @request_log = []
14
- end
15
-
16
- def set_server_options(chef_server_options)
17
- if server && chef_server_options != server.options
18
- server.stop
19
- self.server = nil
20
- end
21
-
22
- unless server
23
- # TODO: can this be logged easily?
24
- # pp :zero_opts => chef_server_options
25
-
26
- # Set up configuration so that clients will point to the server
27
- self.server = ChefZero::Server.new(chef_server_options)
28
- self.client_key = Tempfile.new(["chef_zero_client_key", ".pem"])
29
- client_key.write(ChefZero::PRIVATE_KEY)
30
- client_key.close
31
- # Start the server
32
- server.start_background
33
- server.on_response do |request, response|
34
- request_log << [ request, response ]
35
- end
36
- else
37
- server.clear_data
38
- end
39
- clear_request_log
40
- end
41
- end
42
- extend RSpecClassMethods
43
-
44
- def when_the_chef_server(description, *tags, &block)
45
- context "When the #{ChefZero::Dist::PRODUCT} server #{description}", *tags do
46
- extend WhenTheChefServerClassMethods
47
- include WhenTheChefServerInstanceMethods
48
-
49
- # Take the passed-in options
50
-
51
- # rubocop:disable Lint/UnderscorePrefixedVariableName
52
- define_singleton_method(:chef_server_options) do
53
- @chef_server_options ||= begin
54
- _chef_server_options = { port: 8900, signals: false, log_requests: true }
55
- _chef_server_options = _chef_server_options.merge(tags.last) if tags.last.is_a?(Hash)
56
- _chef_server_options = _chef_server_options.freeze
57
- end
58
- end
59
- # rubocop:enable Lint/UnderscorePrefixedVariableName
60
-
61
- # Merge in chef_server_options from let(:chef_server_options)
62
- def chef_server_options # rubocop:disable Lint/NestedMethodDefinition
63
- chef_server_options = self.class.chef_server_options.dup
64
- chef_server_options = chef_server_options.merge(chef_zero_opts) if respond_to?(:chef_zero_opts)
65
- chef_server_options
66
- end
67
-
68
- before chef_server_options[:server_scope] do
69
- if chef_server_options[:server_scope] != self.class.chef_server_options[:server_scope]
70
- raise "server_scope: #{chef_server_options[:server_scope]} will not be honored: it can only be set on when_the_chef_server!"
71
- end
72
-
73
- Log.info("Starting #{ChefZero::Dist::PRODUCT} server with options #{chef_server_options}")
74
-
75
- ChefZero::RSpec.set_server_options(chef_server_options)
76
-
77
- if chef_server_options[:organization]
78
- organization chef_server_options[:organization]
79
- end
80
-
81
- if defined?(Chef::Config)
82
- @old_chef_server_url = Chef::Config.chef_server_url
83
- @old_node_name = Chef::Config.node_name
84
- @old_client_key = Chef::Config.client_key
85
- if chef_server_options[:organization]
86
- Chef::Config.chef_server_url = "#{ChefZero::RSpec.server.url}/organizations/#{chef_server_options[:organization]}"
87
- else
88
- Chef::Config.chef_server_url = ChefZero::RSpec.server.url
89
- end
90
- Chef::Config.node_name = "admin"
91
- Chef::Config.client_key = ChefZero::RSpec.client_key.path
92
- Chef::Config.http_retry_count = 0
93
- end
94
- end
95
-
96
- if defined?(Chef::Config)
97
- after chef_server_options[:server_scope] do
98
- Chef::Config.chef_server_url = @old_chef_server_url
99
- Chef::Config.node_name = @old_node_name
100
- Chef::Config.client_key = @old_client_key
101
- end
102
- end
103
-
104
- instance_eval(&block)
105
- end
106
- end
107
-
108
- module WhenTheChefServerClassMethods
109
- def organization(name, org = "{}", &block)
110
- before(chef_server_options[:server_scope]) { organization(name, org, &block) }
111
- end
112
-
113
- def acl_for(path, data)
114
- before(chef_server_options[:server_scope]) { acl_for(path, data) }
115
- end
116
-
117
- def client(name, data, &block)
118
- before(chef_server_options[:server_scope]) { client(name, data, &block) }
119
- end
120
-
121
- def container(name, data, &block)
122
- before(chef_server_options[:server_scope]) { container(name, data, &block) }
123
- end
124
-
125
- def cookbook(name, version, data = {}, options = {}, &block)
126
- before(chef_server_options[:server_scope]) do
127
- cookbook(name, version, data, &block)
128
- end
129
- end
130
-
131
- def cookbook_artifact(name, identifier, data = {}, &block)
132
- before(chef_server_options[:server_scope]) { cookbook_artifact(name, identifier, data, &block) }
133
- end
134
-
135
- def data_bag(name, data, &block)
136
- before(chef_server_options[:server_scope]) { data_bag(name, data, &block) }
137
- end
138
-
139
- def environment(name, data, &block)
140
- before(chef_server_options[:server_scope]) { environment(name, data, &block) }
141
- end
142
-
143
- def group(name, data, &block)
144
- before(chef_server_options[:server_scope]) { group(name, data, &block) }
145
- end
146
-
147
- def node(name, data, &block)
148
- before(chef_server_options[:server_scope]) { node(name, data, &block) }
149
- end
150
-
151
- def org_invite(*usernames)
152
- before(chef_server_options[:server_scope]) { org_invite(*usernames) }
153
- end
154
-
155
- def org_member(*usernames)
156
- before(chef_server_options[:server_scope]) { org_member(*usernames) }
157
- end
158
-
159
- def policy(name, data, &block)
160
- before(chef_server_options[:server_scope]) { policy(name, data, &block) }
161
- end
162
-
163
- def policy_group(name, data, &block)
164
- before(chef_server_options[:server_scope]) { policy_group(name, data, &block) }
165
- end
166
-
167
- def role(name, data, &block)
168
- before(chef_server_options[:server_scope]) { role(name, data, &block) }
169
- end
170
-
171
- def sandbox(name, data, &block)
172
- before(chef_server_options[:server_scope]) { sandbox(name, data, &block) }
173
- end
174
-
175
- def user(name, data, &block)
176
- before(chef_server_options[:server_scope]) { user(name, data, &block) }
177
- end
178
- end
179
-
180
- module WhenTheChefServerInstanceMethods
181
- def organization(name, org = "{}", &block)
182
- ChefZero::RSpec.server.data_store.set([ "organizations", name, "org" ], dejsonize(org), :create_dir, :create)
183
- prev_org_name = @current_org
184
- @current_org = name
185
- prev_object_path = @current_object_path
186
- @current_object_path = "organizations/#{name}"
187
- if block_given?
188
- begin
189
- instance_eval(&block)
190
- ensure
191
- @current_org = prev_org_name
192
- @current_object_path = prev_object_path
193
- end
194
- end
195
- end
196
-
197
- def acl_for(path, data)
198
- ChefZero::RSpec.server.load_data({ "acls" => { path => data } }, current_org)
199
- end
200
-
201
- def acl(data)
202
- acl_for(@current_object_path, data)
203
- end
204
-
205
- def client(name, data, &block)
206
- with_object_path("clients/#{name}") do
207
- ChefZero::RSpec.server.load_data({ "clients" => { name => data } }, current_org)
208
- instance_eval(&block) if block_given?
209
- end
210
- end
211
-
212
- def container(name, data, &block)
213
- with_object_path("containers/#{name}") do
214
- ChefZero::RSpec.server.load_data({ "containers" => { name => data } }, current_org)
215
- instance_eval(&block) if block_given?
216
- end
217
- end
218
-
219
- def cookbook(name, version, data = {}, options = {}, &block)
220
- with_object_path("cookbooks/#{name}") do
221
- # If you didn't specify metadata.rb, we generate it for you. If you
222
- # explicitly set it to nil, that means you don't want it at all.
223
- if data.key?("metadata.rb")
224
- if data["metadata.rb"].nil?
225
- data.delete("metadata.rb")
226
- end
227
- else
228
- data["metadata.rb"] = "name #{name.inspect}; version #{version.inspect}"
229
- end
230
- ChefZero::RSpec.server.load_data({ "cookbooks" => { "#{name}-#{version}" => data.merge(options) } }, current_org)
231
- instance_eval(&block) if block_given?
232
- end
233
- end
234
-
235
- def cookbook_artifact(name, identifier, data = {}, &block)
236
- with_object_path("cookbook_artifacts/#{name}") do
237
- # If you didn't specify metadata.rb, we generate it for you. If you
238
- # explicitly set it to nil, that means you don't want it at all.
239
- if data.key?("metadata.rb")
240
- if data["metadata.rb"].nil?
241
- data.delete("metadata.rb")
242
- end
243
- else
244
- data["metadata.rb"] = "name #{name.inspect}"
245
- end
246
- ChefZero::RSpec.server.load_data({ "cookbook_artifacts" => { "#{name}-#{identifier}" => data } }, current_org)
247
- instance_eval(&block) if block_given?
248
- end
249
- end
250
-
251
- def data_bag(name, data, &block)
252
- with_object_path("data/#{name}") do
253
- ChefZero::RSpec.server.load_data({ "data" => { name => data } }, current_org)
254
- instance_eval(&block) if block_given?
255
- end
256
- end
257
-
258
- def environment(name, data, &block)
259
- with_object_path("environments/#{name}") do
260
- ChefZero::RSpec.server.load_data({ "environments" => { name => data } }, current_org)
261
- instance_eval(&block) if block_given?
262
- end
263
- end
264
-
265
- def group(name, data, &block)
266
- with_object_path("groups/#{name}") do
267
- ChefZero::RSpec.server.load_data({ "groups" => { name => data } }, current_org)
268
- instance_eval(&block) if block_given?
269
- end
270
- end
271
-
272
- def node(name, data, &block)
273
- with_object_path("nodes/#{name}") do
274
- ChefZero::RSpec.server.load_data({ "nodes" => { name => data } }, current_org)
275
- instance_eval(&block) if block_given?
276
- end
277
- end
278
-
279
- def org_invite(*usernames)
280
- ChefZero::RSpec.server.load_data({ "invites" => usernames }, current_org)
281
- end
282
-
283
- def org_member(*usernames)
284
- ChefZero::RSpec.server.load_data({ "members" => usernames }, current_org)
285
- end
286
-
287
- def policy(name, version, data, &block)
288
- with_object_path("policies/#{name}") do
289
- ChefZero::RSpec.server.load_data({ "policies" => { name => { version => data } } }, current_org)
290
- instance_eval(&block) if block_given?
291
- end
292
- end
293
-
294
- def policy_group(name, data, &block)
295
- with_object_path("policy_groups/#{name}") do
296
- ChefZero::RSpec.server.load_data({ "policy_groups" => { name => data } }, current_org)
297
- instance_eval(&block) if block_given?
298
- end
299
- end
300
-
301
- def role(name, data, &block)
302
- with_object_path("roles/#{name}") do
303
- ChefZero::RSpec.server.load_data({ "roles" => { name => data } }, current_org)
304
- instance_eval(&block) if block_given?
305
- end
306
- end
307
-
308
- def sandbox(name, data, &block)
309
- with_object_path("sandboxes/#{name}") do
310
- ChefZero::RSpec.server.load_data({ "sandboxes" => { name => data } }, current_org)
311
- instance_eval(&block) if block_given?
312
- end
313
- end
314
-
315
- def user(name, data, &block)
316
- if ChefZero::RSpec.server.options[:osc_compat]
317
- with_object_path("users/#{name}") do
318
- ChefZero::RSpec.server.load_data({ "users" => { name => data } }, current_org)
319
- instance_eval(&block) if block_given?
320
- end
321
- else
322
- old_object_path = @current_object_path
323
- @current_object_path = "users/#{name}"
324
- begin
325
- ChefZero::RSpec.server.load_data({ "users" => { name => data } }, current_org)
326
- instance_eval(&block) if block_given?
327
- ensure
328
- @current_object_path = old_object_path
329
- end
330
- end
331
- end
332
-
333
- def dejsonize(data)
334
- if data.is_a?(String)
335
- data
336
- else
337
- FFI_Yajl::Encoder.encode(data, pretty: true)
338
- end
339
- end
340
-
341
- def current_org
342
- @current_org || ChefZero::RSpec.server.options[:single_org] || nil
343
- end
344
-
345
- def with_object_path(object_path)
346
- old_object_path = @current_object_path
347
- @current_object_path = object_path
348
- begin
349
- yield if block_given?
350
- end
351
- @current_object_path = old_object_path
352
- end
353
- end
354
- end
355
- end
1
+ require "tempfile" unless defined?(Tempfile)
2
+ require_relative "server"
3
+ require_relative "rest_request"
4
+
5
+ module ChefZero
6
+ module RSpec
7
+ module RSpecClassMethods
8
+ attr_accessor :server
9
+ attr_accessor :client_key
10
+ attr_reader :request_log
11
+
12
+ def clear_request_log
13
+ @request_log = []
14
+ end
15
+
16
+ def set_server_options(chef_server_options)
17
+ if server && chef_server_options != server.options
18
+ server.stop
19
+ self.server = nil
20
+ end
21
+
22
+ unless server
23
+ # TODO: can this be logged easily?
24
+ # pp :zero_opts => chef_server_options
25
+
26
+ # Set up configuration so that clients will point to the server
27
+ self.server = ChefZero::Server.new(chef_server_options)
28
+ self.client_key = Tempfile.new(["chef_zero_client_key", ".pem"])
29
+ client_key.write(ChefZero::PRIVATE_KEY)
30
+ client_key.close
31
+ # Start the server
32
+ server.start_background
33
+ server.on_response do |request, response|
34
+ request_log << [ request, response ]
35
+ end
36
+ else
37
+ server.clear_data
38
+ end
39
+ clear_request_log
40
+ end
41
+ end
42
+ extend RSpecClassMethods
43
+
44
+ def when_the_chef_server(description, *tags, &block)
45
+ context "When the #{ChefZero::Dist::PRODUCT} server #{description}", *tags do
46
+ extend WhenTheChefServerClassMethods
47
+ include WhenTheChefServerInstanceMethods
48
+
49
+ # Take the passed-in options
50
+
51
+ # rubocop:disable Lint/UnderscorePrefixedVariableName
52
+ define_singleton_method(:chef_server_options) do
53
+ @chef_server_options ||= begin
54
+ _chef_server_options = { port: 8900, signals: false, log_requests: true }
55
+ _chef_server_options = _chef_server_options.merge(tags.last) if tags.last.is_a?(Hash)
56
+ _chef_server_options = _chef_server_options.freeze
57
+ end
58
+ end
59
+ # rubocop:enable Lint/UnderscorePrefixedVariableName
60
+
61
+ # Merge in chef_server_options from let(:chef_server_options)
62
+ def chef_server_options # rubocop:disable Lint/NestedMethodDefinition
63
+ chef_server_options = self.class.chef_server_options.dup
64
+ chef_server_options = chef_server_options.merge(chef_zero_opts) if respond_to?(:chef_zero_opts)
65
+ chef_server_options
66
+ end
67
+
68
+ before chef_server_options[:server_scope] do
69
+ if chef_server_options[:server_scope] != self.class.chef_server_options[:server_scope]
70
+ raise "server_scope: #{chef_server_options[:server_scope]} will not be honored: it can only be set on when_the_chef_server!"
71
+ end
72
+
73
+ Log.info("Starting #{ChefZero::Dist::PRODUCT} server with options #{chef_server_options}")
74
+
75
+ ChefZero::RSpec.set_server_options(chef_server_options)
76
+
77
+ if chef_server_options[:organization]
78
+ organization chef_server_options[:organization]
79
+ end
80
+
81
+ if defined?(Chef::Config)
82
+ @old_chef_server_url = Chef::Config.chef_server_url
83
+ @old_node_name = Chef::Config.node_name
84
+ @old_client_key = Chef::Config.client_key
85
+ if chef_server_options[:organization]
86
+ Chef::Config.chef_server_url = "#{ChefZero::RSpec.server.url}/organizations/#{chef_server_options[:organization]}"
87
+ else
88
+ Chef::Config.chef_server_url = ChefZero::RSpec.server.url
89
+ end
90
+ Chef::Config.node_name = "admin"
91
+ Chef::Config.client_key = ChefZero::RSpec.client_key.path
92
+ Chef::Config.http_retry_count = 0
93
+ end
94
+ end
95
+
96
+ if defined?(Chef::Config)
97
+ after chef_server_options[:server_scope] do
98
+ Chef::Config.chef_server_url = @old_chef_server_url
99
+ Chef::Config.node_name = @old_node_name
100
+ Chef::Config.client_key = @old_client_key
101
+ end
102
+ end
103
+
104
+ instance_eval(&block)
105
+ end
106
+ end
107
+
108
+ module WhenTheChefServerClassMethods
109
+ def organization(name, org = "{}", &block)
110
+ before(chef_server_options[:server_scope]) { organization(name, org, &block) }
111
+ end
112
+
113
+ def acl_for(path, data)
114
+ before(chef_server_options[:server_scope]) { acl_for(path, data) }
115
+ end
116
+
117
+ def client(name, data, &block)
118
+ before(chef_server_options[:server_scope]) { client(name, data, &block) }
119
+ end
120
+
121
+ def container(name, data, &block)
122
+ before(chef_server_options[:server_scope]) { container(name, data, &block) }
123
+ end
124
+
125
+ def cookbook(name, version, data = {}, options = {}, &block)
126
+ before(chef_server_options[:server_scope]) do
127
+ cookbook(name, version, data, &block)
128
+ end
129
+ end
130
+
131
+ def cookbook_artifact(name, identifier, data = {}, &block)
132
+ before(chef_server_options[:server_scope]) { cookbook_artifact(name, identifier, data, &block) }
133
+ end
134
+
135
+ def data_bag(name, data, &block)
136
+ before(chef_server_options[:server_scope]) { data_bag(name, data, &block) }
137
+ end
138
+
139
+ def environment(name, data, &block)
140
+ before(chef_server_options[:server_scope]) { environment(name, data, &block) }
141
+ end
142
+
143
+ def group(name, data, &block)
144
+ before(chef_server_options[:server_scope]) { group(name, data, &block) }
145
+ end
146
+
147
+ def node(name, data, &block)
148
+ before(chef_server_options[:server_scope]) { node(name, data, &block) }
149
+ end
150
+
151
+ def org_invite(*usernames)
152
+ before(chef_server_options[:server_scope]) { org_invite(*usernames) }
153
+ end
154
+
155
+ def org_member(*usernames)
156
+ before(chef_server_options[:server_scope]) { org_member(*usernames) }
157
+ end
158
+
159
+ def policy(name, data, &block)
160
+ before(chef_server_options[:server_scope]) { policy(name, data, &block) }
161
+ end
162
+
163
+ def policy_group(name, data, &block)
164
+ before(chef_server_options[:server_scope]) { policy_group(name, data, &block) }
165
+ end
166
+
167
+ def role(name, data, &block)
168
+ before(chef_server_options[:server_scope]) { role(name, data, &block) }
169
+ end
170
+
171
+ def sandbox(name, data, &block)
172
+ before(chef_server_options[:server_scope]) { sandbox(name, data, &block) }
173
+ end
174
+
175
+ def user(name, data, &block)
176
+ before(chef_server_options[:server_scope]) { user(name, data, &block) }
177
+ end
178
+ end
179
+
180
+ module WhenTheChefServerInstanceMethods
181
+ def organization(name, org = "{}", &block)
182
+ ChefZero::RSpec.server.data_store.set([ "organizations", name, "org" ], dejsonize(org), :create_dir, :create)
183
+ prev_org_name = @current_org
184
+ @current_org = name
185
+ prev_object_path = @current_object_path
186
+ @current_object_path = "organizations/#{name}"
187
+ if block_given?
188
+ begin
189
+ instance_eval(&block)
190
+ ensure
191
+ @current_org = prev_org_name
192
+ @current_object_path = prev_object_path
193
+ end
194
+ end
195
+ end
196
+
197
+ def acl_for(path, data)
198
+ ChefZero::RSpec.server.load_data({ "acls" => { path => data } }, current_org)
199
+ end
200
+
201
+ def acl(data)
202
+ acl_for(@current_object_path, data)
203
+ end
204
+
205
+ def client(name, data, &block)
206
+ with_object_path("clients/#{name}") do
207
+ ChefZero::RSpec.server.load_data({ "clients" => { name => data } }, current_org)
208
+ instance_eval(&block) if block_given?
209
+ end
210
+ end
211
+
212
+ def container(name, data, &block)
213
+ with_object_path("containers/#{name}") do
214
+ ChefZero::RSpec.server.load_data({ "containers" => { name => data } }, current_org)
215
+ instance_eval(&block) if block_given?
216
+ end
217
+ end
218
+
219
+ def cookbook(name, version, data = {}, options = {}, &block)
220
+ with_object_path("cookbooks/#{name}") do
221
+ # If you didn't specify metadata.rb, we generate it for you. If you
222
+ # explicitly set it to nil, that means you don't want it at all.
223
+ if data.key?("metadata.rb")
224
+ if data["metadata.rb"].nil?
225
+ data.delete("metadata.rb")
226
+ end
227
+ else
228
+ data["metadata.rb"] = "name #{name.inspect}; version #{version.inspect}"
229
+ end
230
+ ChefZero::RSpec.server.load_data({ "cookbooks" => { "#{name}-#{version}" => data.merge(options) } }, current_org)
231
+ instance_eval(&block) if block_given?
232
+ end
233
+ end
234
+
235
+ def cookbook_artifact(name, identifier, data = {}, &block)
236
+ with_object_path("cookbook_artifacts/#{name}") do
237
+ # If you didn't specify metadata.rb, we generate it for you. If you
238
+ # explicitly set it to nil, that means you don't want it at all.
239
+ if data.key?("metadata.rb")
240
+ if data["metadata.rb"].nil?
241
+ data.delete("metadata.rb")
242
+ end
243
+ else
244
+ data["metadata.rb"] = "name #{name.inspect}"
245
+ end
246
+ ChefZero::RSpec.server.load_data({ "cookbook_artifacts" => { "#{name}-#{identifier}" => data } }, current_org)
247
+ instance_eval(&block) if block_given?
248
+ end
249
+ end
250
+
251
+ def data_bag(name, data, &block)
252
+ with_object_path("data/#{name}") do
253
+ ChefZero::RSpec.server.load_data({ "data" => { name => data } }, current_org)
254
+ instance_eval(&block) if block_given?
255
+ end
256
+ end
257
+
258
+ def environment(name, data, &block)
259
+ with_object_path("environments/#{name}") do
260
+ ChefZero::RSpec.server.load_data({ "environments" => { name => data } }, current_org)
261
+ instance_eval(&block) if block_given?
262
+ end
263
+ end
264
+
265
+ def group(name, data, &block)
266
+ with_object_path("groups/#{name}") do
267
+ ChefZero::RSpec.server.load_data({ "groups" => { name => data } }, current_org)
268
+ instance_eval(&block) if block_given?
269
+ end
270
+ end
271
+
272
+ def node(name, data, &block)
273
+ with_object_path("nodes/#{name}") do
274
+ ChefZero::RSpec.server.load_data({ "nodes" => { name => data } }, current_org)
275
+ instance_eval(&block) if block_given?
276
+ end
277
+ end
278
+
279
+ def org_invite(*usernames)
280
+ ChefZero::RSpec.server.load_data({ "invites" => usernames }, current_org)
281
+ end
282
+
283
+ def org_member(*usernames)
284
+ ChefZero::RSpec.server.load_data({ "members" => usernames }, current_org)
285
+ end
286
+
287
+ def policy(name, version, data, &block)
288
+ with_object_path("policies/#{name}") do
289
+ ChefZero::RSpec.server.load_data({ "policies" => { name => { version => data } } }, current_org)
290
+ instance_eval(&block) if block_given?
291
+ end
292
+ end
293
+
294
+ def policy_group(name, data, &block)
295
+ with_object_path("policy_groups/#{name}") do
296
+ ChefZero::RSpec.server.load_data({ "policy_groups" => { name => data } }, current_org)
297
+ instance_eval(&block) if block_given?
298
+ end
299
+ end
300
+
301
+ def role(name, data, &block)
302
+ with_object_path("roles/#{name}") do
303
+ ChefZero::RSpec.server.load_data({ "roles" => { name => data } }, current_org)
304
+ instance_eval(&block) if block_given?
305
+ end
306
+ end
307
+
308
+ def sandbox(name, data, &block)
309
+ with_object_path("sandboxes/#{name}") do
310
+ ChefZero::RSpec.server.load_data({ "sandboxes" => { name => data } }, current_org)
311
+ instance_eval(&block) if block_given?
312
+ end
313
+ end
314
+
315
+ def user(name, data, &block)
316
+ if ChefZero::RSpec.server.options[:osc_compat]
317
+ with_object_path("users/#{name}") do
318
+ ChefZero::RSpec.server.load_data({ "users" => { name => data } }, current_org)
319
+ instance_eval(&block) if block_given?
320
+ end
321
+ else
322
+ old_object_path = @current_object_path
323
+ @current_object_path = "users/#{name}"
324
+ begin
325
+ ChefZero::RSpec.server.load_data({ "users" => { name => data } }, current_org)
326
+ instance_eval(&block) if block_given?
327
+ ensure
328
+ @current_object_path = old_object_path
329
+ end
330
+ end
331
+ end
332
+
333
+ def dejsonize(data)
334
+ if data.is_a?(String)
335
+ data
336
+ else
337
+ FFI_Yajl::Encoder.encode(data, pretty: true)
338
+ end
339
+ end
340
+
341
+ def current_org
342
+ @current_org || ChefZero::RSpec.server.options[:single_org] || nil
343
+ end
344
+
345
+ def with_object_path(object_path)
346
+ old_object_path = @current_object_path
347
+ @current_object_path = object_path
348
+
349
+ yield if block_given?
350
+
351
+ @current_object_path = old_object_path
352
+ end
353
+ end
354
+ end
355
+ end