chef-zero 3.0 → 3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 83e05e7b0517be8935b4af74e0c58d9cf78ce8bd
4
- data.tar.gz: f30965d59c0e64b199fe6a75fe8b3f49088fad80
3
+ metadata.gz: 73fbe4d3eaf0c4c2c3eb17ebea721a97752812cc
4
+ data.tar.gz: 1e847cf609c0abfd313ce377378b69bceeba1e26
5
5
  SHA512:
6
- metadata.gz: 758d4e0787bf4d4b956e852f32d9da538deb5b6bdf190e2280731a01667d488761841ff6c5313880f9b5e5dbba12e7e63bc89cc10d0aa63c1c7f9750d7a13d2e
7
- data.tar.gz: 1936f4c6f1a1ab04b59a44b5d6e2c741edf3d83bb8f1f12c6a057240e35bb3b45beb57a31b08940cc72e15945107669c8d4ab0963be5da42cdcdcb65084cf76c
6
+ metadata.gz: ca10f03c87e923b6a1b58c858eb6016129037f808ceb8531fdd33a9072ad021c65447c3931f80e60a310eb83ac8d5a4588b406d93b8cac00eef59d6fae6f77f5
7
+ data.tar.gz: fe9cf680382bf5c3717544608cd355395c96d3c46160ae9b9140f46bdc7392363070428173e2623cd533a4712393d3853313df952da2753e6046a9933247d912
@@ -16,9 +16,9 @@ module ChefZero
16
16
  # Where PERM is create,read,update,delete,grant
17
17
  class AclEndpoint < RestBase
18
18
  def validate_request(request)
19
- path = request.rest_path[0..-3]
19
+ path = request.rest_path[0..-3] # Strip off _acl/PERM
20
20
  path = path[0..1] if path.size == 3 && path[0] == 'organizations' && %w(organization organizations).include?(path[2])
21
- acl_path = ChefData::AclPath.get_acl_data_path(path) # Strip off _acl/PERM
21
+ acl_path = ChefData::AclPath.get_acl_data_path(path)
22
22
  perm = request.rest_path[-1]
23
23
  if !acl_path || !%w(read create update delete grant).include?(perm)
24
24
  raise RestErrorResponse.new(404, "Object not found: #{build_uri(request.base_uri, request.rest_path)}")
@@ -31,7 +31,7 @@ module ChefZero
31
31
 
32
32
  # /organizations/ORG/association_requests/USERNAME-ORG
33
33
  begin
34
- delete_data(request, [ 'organizations', orgname, 'association_requests', "#{username}-#{orgname}"], :data_store_exceptions)
34
+ delete_data(request, [ 'organizations', orgname, 'association_requests', username], :data_store_exceptions)
35
35
  rescue DataStore::DataNotFoundError
36
36
  end
37
37
 
@@ -15,8 +15,8 @@ module ChefZero
15
15
  end
16
16
 
17
17
  def post(request)
18
- contents = request.body
19
- name = JSON.parse(contents, :create_additions => false)['name']
18
+ contents = JSON.parse(request.body, :create_additions => false)
19
+ name = contents['name']
20
20
  if name.nil?
21
21
  error(400, "Must specify 'name' in JSON")
22
22
  elsif exists_data_dir?(request, request.rest_path + [ name ])
@@ -27,7 +27,7 @@ module ChefZero
27
27
  org = {
28
28
  "guid" => UUIDTools::UUID.random_create.to_s.gsub('-', ''),
29
29
  "assigned_at" => Time.now.to_s
30
- }
30
+ }.merge(contents)
31
31
  org_path = request.rest_path + [ name ]
32
32
  set_data(request, org_path + [ 'org' ], JSON.pretty_generate(org))
33
33
 
@@ -24,6 +24,11 @@ module ChefZero
24
24
  end
25
25
 
26
26
  def when_the_chef_server(description, *tags, &block)
27
+ if tags.last.is_a?(Hash)
28
+ opts = tags.last
29
+ else
30
+ opts = {}
31
+ end
27
32
  context "When the Chef server #{description}", *tags do
28
33
  before :each do
29
34
 
@@ -33,6 +38,7 @@ module ChefZero
33
38
  else
34
39
  default_opts
35
40
  end
41
+ server_opts = server_opts.merge(opts)
36
42
 
37
43
  if ChefZero::RSpec.server && server_opts != ChefZero::RSpec.server.options
38
44
  ChefZero::RSpec.server.stop
@@ -77,79 +83,194 @@ module ChefZero
77
83
  end
78
84
  end
79
85
 
80
- def self.organization(name, org = '{}')
81
- before(:each) do
82
- ChefZero::RSpec.server.data_store.set([ 'organizations', name, 'org' ], dejsonize(org), :create_dir, :create)
83
- @current_org = name
86
+ def self.organization(name, org = '{}', &block)
87
+ before(:each) { organization(name, org, &block) }
88
+ end
89
+
90
+ def organization(name, org = '{}', &block)
91
+ ChefZero::RSpec.server.data_store.set([ 'organizations', name, 'org' ], dejsonize(org), :create_dir, :create)
92
+ prev_org_name = @current_org
93
+ @current_org = name
94
+ prev_object_path = @current_object_path
95
+ @current_object_path = "organizations/#{name}"
96
+ if block_given?
97
+ begin
98
+ instance_eval(&block)
99
+ ensure
100
+ @current_org = prev_org_name
101
+ @current_object_path = prev_object_path
102
+ end
84
103
  end
85
104
  end
86
105
 
87
- def self.acl(path, acl)
88
- before(:each) do
89
- path = [ 'organizations', @current_org || 'chef' ] + path.split('/')
90
- ChefZero::RSpec.server.data_store.set(ChefData::AclPath.get_acl_data_path(path), acl)
106
+ def self.acl_for(path, data)
107
+ before(:each) { acl_for(path, data) }
108
+ end
109
+
110
+ def acl_for(path, data)
111
+ ChefZero::RSpec.server.load_data({ 'acls' => { path => data } }, current_org)
112
+ end
113
+
114
+ def acl(data)
115
+ acl_for(@current_object_path, data)
116
+ end
117
+
118
+ def self.client(name, data, &block)
119
+ before(:each) { client(name, data, &block) }
120
+ end
121
+
122
+ def client(name, data, &block)
123
+ with_object_path("clients/#{name}") do
124
+ ChefZero::RSpec.server.load_data({ 'clients' => { name => data } }, current_org)
125
+ instance_eval(&block) if block_given?
91
126
  end
92
127
  end
93
128
 
94
- def self.group(name, group)
95
- before(:each) do
96
- path = [ 'organizations', @current_org || 'chef' ] + path.split('/')
97
- ChefZero::RSpec.server.data_store.set([ 'organizations', @current_org || 'chef', 'groups', name ], dejsonize(group), :create)
129
+ def self.container(name, data, &block)
130
+ before(:each) { container(name, data, &block) }
131
+ end
132
+
133
+ def container(name, data, &block)
134
+ with_object_path("containers/#{name}") do
135
+ ChefZero::RSpec.server.load_data({ 'containers' => { name => data } }, current_org)
136
+ instance_eval(&block) if block_given?
98
137
  end
99
138
  end
100
139
 
101
- def self.org_invite(username)
102
- before(:each) do
103
- ChefZero::RSpec.server.data_store.set([ 'organizations', @current_org || 'chef', 'users', username ], '{}', :create)
140
+ def self.cookbook(name, version, data, options = {}, &block)
141
+ before(:each) { cookbook(name, version, data, &block) }
142
+ end
143
+
144
+ def cookbook(name, version, data, options = {}, &block)
145
+ with_object_path("cookbooks/#{name}") do
146
+ ChefZero::RSpec.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => data.merge(options) }}, current_org)
147
+ instance_eval(&block) if block_given?
104
148
  end
105
149
  end
106
150
 
107
- def self.org_members(name, *members)
108
- before(:each) do
109
- members.each do |member|
110
- ChefZero::RSpec.server.set([ 'organizations', @current_org || 'chef', 'users', member], '{}')
111
- end
151
+ def self.data_bag(name, data, &block)
152
+ before(:each) { data_bag(name, data, &block) }
153
+ end
154
+
155
+ def data_bag(name, data, &block)
156
+ with_object_path("data/#{name}") do
157
+ ChefZero::RSpec.server.load_data({ 'data' => { name => data }}, current_org)
158
+ instance_eval(&block) if block_given?
112
159
  end
113
160
  end
114
161
 
115
- def self.client(name, client)
116
- before(:each) { ChefZero::RSpec.server.load_data({ 'clients' => { name => client }}, @current_org) }
162
+ def self.environment(name, data, &block)
163
+ before(:each) { environment(name, data, &block) }
117
164
  end
118
165
 
119
- def self.cookbook(name, version, cookbook, options = {})
120
- before(:each) { ChefZero::RSpec.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => cookbook.merge(options) }}, @current_org) }
166
+ def environment(name, data, &block)
167
+ with_object_path("environments/#{name}") do
168
+ ChefZero::RSpec.server.load_data({ 'environments' => { name => data } }, current_org)
169
+ instance_eval(&block) if block_given?
170
+ end
171
+ end
172
+
173
+ def self.group(name, data, &block)
174
+ before(:each) { group(name, data, &block) }
121
175
  end
122
176
 
123
- def self.data_bag(name, data_bag)
124
- before(:each) { ChefZero::RSpec.server.load_data({ 'data' => { name => data_bag }}, @current_org) }
177
+ def group(name, data, &block)
178
+ with_object_path("groups/#{name}") do
179
+ ChefZero::RSpec.server.load_data({ 'groups' => { name => data } }, current_org)
180
+ instance_eval(&block) if block_given?
181
+ end
125
182
  end
126
183
 
127
- def self.environment(name, environment)
128
- before(:each) { ChefZero::RSpec.server.load_data({ 'environments' => { name => environment }}, @current_org) }
184
+ def self.node(name, data, &block)
185
+ before(:each) { node(name, data, &block) }
129
186
  end
130
187
 
131
- def self.node(name, node)
132
- before(:each) { ChefZero::RSpec.server.load_data({ 'nodes' => { name => node }}, @current_org) }
188
+ def node(name, data, &block)
189
+ with_object_path("nodes/#{name}") do
190
+ ChefZero::RSpec.server.load_data({ 'nodes' => { name => data } }, current_org)
191
+ instance_eval(&block) if block_given?
192
+ end
133
193
  end
134
194
 
135
- def self.role(name, role)
136
- before(:each) { ChefZero::RSpec.server.load_data({ 'roles' => { name => role }}, @current_org) }
195
+ def self.org_invite(*usernames)
196
+ before(:each) { org_invite(*usernames) }
137
197
  end
138
198
 
139
- def self.user(name, user)
199
+ def org_invite(*usernames)
200
+ ChefZero::RSpec.server.load_data({ 'invites' => usernames }, current_org)
201
+ end
202
+
203
+ def self.org_member(*usernames)
204
+ before(:each) { org_member(*usernames) }
205
+ end
206
+
207
+ def org_member(*usernames)
208
+ ChefZero::RSpec.server.load_data({ 'members' => usernames }, current_org)
209
+ end
210
+
211
+ def self.role(name, data, &block)
212
+ before(:each) { role(name, data, &block) }
213
+ end
214
+
215
+ def role(name, data, &block)
216
+ with_object_path("roles/#{name}") do
217
+ ChefZero::RSpec.server.load_data({ 'roles' => { name => data } }, current_org)
218
+ instance_eval(&block) if block_given?
219
+ end
220
+ end
221
+
222
+ def self.sandbox(name, data, &block)
223
+ before(:each) { sandbox(name, data, &block) }
224
+ end
225
+
226
+ def sandbox(name, data, &block)
227
+ with_object_path("sandboxes/#{name}") do
228
+ ChefZero::RSpec.server.load_data({ 'sandboxes' => { name => data } }, current_org)
229
+ instance_eval(&block) if block_given?
230
+ end
231
+ end
232
+
233
+ def self.user(name, data, &block)
234
+ before(:each) { user(name, data, &block) }
235
+ end
236
+
237
+ def user(name, data, &block)
140
238
  if ChefZero::RSpec.server.options[:osc_compat]
141
- before(:each) { ChefZero::RSpec.server.load_data({ 'users' => { name => user }}, @current_org) }
239
+ with_object_path("users/#{name}") do
240
+ ChefZero::RSpec.server.load_data({ 'users' => { name => data }}, current_org)
241
+ instance_eval(&block) if block_given?
242
+ end
142
243
  else
143
- before(:each) { ChefZero::RSpec.server.set([ 'users', name ], dejsonize(user)) }
244
+ old_object_path = @current_object_path
245
+ @current_object_path = "users/#{name}"
246
+ begin
247
+ ChefZero::RSpec.server.load_data({ 'users' => { name => data }}, current_org)
248
+ instance_eval(&block) if block_given?
249
+ ensure
250
+ @current_object_path = old_object_path
251
+ end
144
252
  end
145
253
  end
146
254
 
147
- def self.dejsonize(data)
255
+ def dejsonize(data)
148
256
  if data.is_a?(String)
149
257
  data
150
258
  else
151
- JSON.pretty_generate(value)
259
+ JSON.pretty_generate(data)
260
+ end
261
+ end
262
+
263
+ def current_org
264
+ @current_org || ChefZero::RSpec.server.options[:single_org] || nil
265
+ end
266
+
267
+ def with_object_path(object_path)
268
+ old_object_path = @current_object_path
269
+ @current_object_path = object_path
270
+ begin
271
+ yield if block_given?
152
272
  end
273
+ @current_object_path = old_object_path
153
274
  end
154
275
 
155
276
  # after :each do
@@ -28,6 +28,7 @@ require 'webrick/https'
28
28
 
29
29
  require 'chef_zero'
30
30
  require 'chef_zero/chef_data/cookbook_data'
31
+ require 'chef_zero/chef_data/acl_path'
31
32
  require 'chef_zero/rest_router'
32
33
  require 'chef_zero/data_store/memory_store_v2'
33
34
  require 'chef_zero/data_store/v1_to_v2_adapter'
@@ -99,7 +100,6 @@ module ChefZero
99
100
  @options[:osc_compat] = true
100
101
  end
101
102
  @options.freeze
102
-
103
103
  ChefZero::Log.level = @options[:log_level].to_sym
104
104
  end
105
105
 
@@ -356,14 +356,55 @@ module ChefZero
356
356
  # }
357
357
  # }
358
358
  # }
359
- def load_data(contents, org_name = 'chef')
360
- %w(clients environments nodes roles users).each do |data_type|
359
+ def load_data(contents, org_name = nil)
360
+ passed_org = !!org_name
361
+ org_name ||= options[:single_org]
362
+ if org_name.nil? && contents.keys != [ 'users' ]
363
+ raise "Must pass an org name to load_data or run in single_org mode"
364
+ end
365
+
366
+ %w(clients containers environments groups nodes roles sandboxes).each do |data_type|
361
367
  if contents[data_type]
362
368
  dejsonize_children(contents[data_type]).each_pair do |name, data|
363
369
  data_store.set(['organizations', org_name, data_type, name], data, :create)
364
370
  end
365
371
  end
366
372
  end
373
+
374
+ if contents['users']
375
+ dejsonize_children(contents['users']).each_pair do |name, data|
376
+ if options[:osc_compat]
377
+ data_store.set(['organizations', org_name, 'users', name], data, :create)
378
+ else
379
+ # Create the user and put them in the org
380
+ data_store.set(['users', name], data, :create)
381
+ if org_name
382
+ data_store.set(['organizations', org_name, 'users', name], '{}', :create)
383
+ end
384
+ end
385
+ end
386
+ end
387
+
388
+ if contents['members']
389
+ contents['members'].each do |name|
390
+ data_store.set(['organizations', org_name, 'users', name], '{}', :create)
391
+ end
392
+ end
393
+
394
+ if contents['invites']
395
+ contents['invites'].each do |name|
396
+ data_store.set(['organizations', org_name, 'association_requests', name], '{}', :create)
397
+ end
398
+ end
399
+
400
+ if contents['acls']
401
+ dejsonize_children(contents['acls']).each do |path, acl|
402
+ path = [ 'organizations', org_name ] + path.split('/')
403
+ path = ChefData::AclPath.get_acl_data_path(path)
404
+ ChefZero::RSpec.server.data_store.set(path, acl)
405
+ end
406
+ end
407
+
367
408
  if contents['data']
368
409
  contents['data'].each_pair do |key, data_bag|
369
410
  data_store.create_dir(['organizations', org_name, 'data'], key, :recursive)
@@ -372,6 +413,7 @@ module ChefZero
372
413
  end
373
414
  end
374
415
  end
416
+
375
417
  if contents['cookbooks']
376
418
  contents['cookbooks'].each_pair do |name_version, cookbook|
377
419
  if name_version =~ /(.+)-(\d+\.\d+\.\d+)$/
@@ -425,8 +467,8 @@ module ChefZero
425
467
  [ "/organizations/*/users/*", OrganizationUserEndpoint.new(self) ],
426
468
  [ "/users", ActorsEndpoint.new(self, 'username') ],
427
469
  [ "/users/*", ActorEndpoint.new(self, 'username') ],
428
- [ "/users/_acl", AclsEndpoint.new(self) ],
429
- [ "/users/_acl/*", AclEndpoint.new(self) ],
470
+ [ "/users/*/_acl", AclsEndpoint.new(self) ],
471
+ [ "/users/*/_acl/*", AclEndpoint.new(self) ],
430
472
  [ "/users/*/association_requests", UserAssociationRequestsEndpoint.new(self) ],
431
473
  [ "/users/*/association_requests/count", UserAssociationRequestsCountEndpoint.new(self) ],
432
474
  [ "/users/*/association_requests/*", UserAssociationRequestEndpoint.new(self) ],
@@ -533,11 +575,15 @@ module ChefZero
533
575
  def dejsonize_children(hash)
534
576
  result = {}
535
577
  hash.each_pair do |key, value|
536
- result[key] = value.is_a?(Hash) ? JSON.pretty_generate(value) : value
578
+ result[key] = dejsonize(value)
537
579
  end
538
580
  result
539
581
  end
540
582
 
583
+ def dejsonize(value)
584
+ value.is_a?(Hash) ? JSON.pretty_generate(value) : value
585
+ end
586
+
541
587
  def get_file(directory, path)
542
588
  value = directory
543
589
  path.split('/').each do |part|
@@ -1,3 +1,3 @@
1
1
  module ChefZero
2
- VERSION = '3.0'
2
+ VERSION = '3.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: '3.0'
4
+ version: '3.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-22 00:00:00.000000000 Z
11
+ date: 2014-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-log