chef-zero 2.2.1 → 3.0.0.rc.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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/Rakefile +5 -1
  4. data/bin/chef-zero +17 -0
  5. data/lib/chef_zero/chef_data/acl_path.rb +139 -0
  6. data/lib/chef_zero/chef_data/cookbook_data.rb +240 -0
  7. data/lib/chef_zero/chef_data/data_normalizer.rb +207 -0
  8. data/lib/chef_zero/chef_data/default_creator.rb +446 -0
  9. data/lib/chef_zero/data_store/default_facade.rb +149 -0
  10. data/lib/chef_zero/data_store/interface_v1.rb +18 -0
  11. data/lib/chef_zero/data_store/memory_store.rb +2 -1
  12. data/lib/chef_zero/data_store/memory_store_v2.rb +3 -36
  13. data/lib/chef_zero/data_store/raw_file_store.rb +147 -0
  14. data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +39 -103
  15. data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +1 -1
  16. data/lib/chef_zero/endpoints/acl_endpoint.rb +38 -0
  17. data/lib/chef_zero/endpoints/acls_endpoint.rb +29 -0
  18. data/lib/chef_zero/endpoints/actor_endpoint.rb +36 -10
  19. data/lib/chef_zero/endpoints/actors_endpoint.rb +38 -6
  20. data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +15 -9
  21. data/lib/chef_zero/endpoints/container_endpoint.rb +22 -0
  22. data/lib/chef_zero/endpoints/containers_endpoint.rb +13 -0
  23. data/lib/chef_zero/endpoints/cookbook_endpoint.rb +1 -1
  24. data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +15 -14
  25. data/lib/chef_zero/endpoints/cookbooks_base.rb +2 -2
  26. data/lib/chef_zero/endpoints/data_bag_endpoint.rb +4 -4
  27. data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +5 -5
  28. data/lib/chef_zero/endpoints/data_bags_endpoint.rb +5 -4
  29. data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +2 -2
  30. data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +6 -6
  31. data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +2 -2
  32. data/lib/chef_zero/endpoints/environment_endpoint.rb +5 -5
  33. data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +2 -2
  34. data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +3 -3
  35. data/lib/chef_zero/endpoints/environment_role_endpoint.rb +2 -2
  36. data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +1 -1
  37. data/lib/chef_zero/endpoints/group_endpoint.rb +20 -0
  38. data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -0
  39. data/lib/chef_zero/endpoints/license_endpoint.rb +25 -0
  40. data/lib/chef_zero/endpoints/node_endpoint.rb +5 -5
  41. data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
  42. data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -0
  43. data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +29 -0
  44. data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -0
  45. data/lib/chef_zero/endpoints/organization_endpoint.rb +41 -0
  46. data/lib/chef_zero/endpoints/organization_user_endpoint.rb +48 -0
  47. data/lib/chef_zero/endpoints/organization_users_endpoint.rb +14 -0
  48. data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -0
  49. data/lib/chef_zero/endpoints/organizations_endpoint.rb +55 -0
  50. data/lib/chef_zero/endpoints/principal_endpoint.rb +15 -3
  51. data/lib/chef_zero/endpoints/rest_list_endpoint.rb +8 -6
  52. data/lib/chef_zero/endpoints/rest_object_endpoint.rb +12 -10
  53. data/lib/chef_zero/endpoints/role_endpoint.rb +5 -5
  54. data/lib/chef_zero/endpoints/role_environments_endpoint.rb +2 -2
  55. data/lib/chef_zero/endpoints/sandbox_endpoint.rb +2 -2
  56. data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +4 -4
  57. data/lib/chef_zero/endpoints/search_endpoint.rb +10 -10
  58. data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -0
  59. data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +40 -0
  60. data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -0
  61. data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -0
  62. data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -0
  63. data/lib/chef_zero/rest_base.rb +79 -13
  64. data/lib/chef_zero/rest_error_response.rb +1 -1
  65. data/lib/chef_zero/rest_request.rb +4 -0
  66. data/lib/chef_zero/rest_router.rb +1 -0
  67. data/lib/chef_zero/rspec.rb +55 -8
  68. data/lib/chef_zero/server.rb +87 -21
  69. data/lib/chef_zero/version.rb +1 -1
  70. data/spec/run_oc_pedant.rb +53 -0
  71. data/spec/{run.rb → run_pedant.rb} +13 -4
  72. data/spec/server_spec.rb +54 -0
  73. data/spec/support/oc_pedant.rb +134 -0
  74. data/spec/support/pedant.rb +1 -1
  75. metadata +54 -13
  76. data/lib/chef_zero/cookbook_data.rb +0 -236
  77. data/lib/chef_zero/data_normalizer.rb +0 -146
@@ -0,0 +1,149 @@
1
+ require 'chef_zero/data_store/interface_v2'
2
+ require 'chef_zero/chef_data/default_creator'
3
+
4
+ module ChefZero
5
+ module DataStore
6
+ #
7
+ # The DefaultFacade exists to layer defaults on top of an existing data
8
+ # store. When you create an org, you just create the directory itself:
9
+ # the rest of the org (such as environments/_default) will not actually
10
+ # exist anywhere, but when you get(/organizations/org/environments/_default),
11
+ # the DefaultFacade will create one for you on the fly.
12
+ #
13
+ # acls in particular are instantiated on the fly using this method.
14
+ #
15
+ class DefaultFacade < ChefZero::DataStore::InterfaceV2
16
+ def initialize(real_store, single_org, osc_compat, superusers = nil)
17
+ @real_store = real_store
18
+ @default_creator = ChefData::DefaultCreator.new(self, single_org, osc_compat, superusers)
19
+ clear
20
+ end
21
+
22
+ attr_reader :real_store
23
+ attr_reader :default_creator
24
+
25
+ def clear
26
+ real_store.clear if real_store.respond_to?(:clear)
27
+ default_creator.clear
28
+ end
29
+
30
+ def create_dir(path, name, *options)
31
+ if default_creator.exists?(path + [ name ]) && !options.include?(:recursive)
32
+ raise DataAlreadyExistsError.new(path + [name])
33
+ end
34
+
35
+ begin
36
+ real_store.create_dir(path, name, *options)
37
+ rescue DataNotFoundError
38
+ if default_creator.exists?(path)
39
+ real_store.create_dir(path, name, :recursive, *options)
40
+ else
41
+ raise
42
+ end
43
+ end
44
+
45
+ options_hash = options.last.is_a?(Hash) ? options.last : {}
46
+ default_creator.created(path + [ name ], options_hash[:requestor], options.include?(:recursive))
47
+ end
48
+
49
+ def create(path, name, data, *options)
50
+ if default_creator.exists?(path + [ name ]) && !options.include?(:create_dir)
51
+ raise DataAlreadyExistsError.new(path + [name])
52
+ end
53
+
54
+ begin
55
+ real_store.create(path, name, data, *options)
56
+ rescue DataNotFoundError
57
+ if default_creator.exists?(path)
58
+ real_store.create(path, name, data, :create_dir, *options)
59
+ else
60
+ raise
61
+ end
62
+ end
63
+
64
+ options_hash = options.last.is_a?(Hash) ? options.last : {}
65
+ default_creator.created(path + [ name ], options_hash[:requestor], options.include?(:recursive))
66
+ end
67
+
68
+ def get(path, request=nil)
69
+ begin
70
+ real_store.get(path, request)
71
+ rescue DataNotFoundError
72
+ result = default_creator.get(path)
73
+ if result
74
+ JSON.pretty_generate(result)
75
+ else
76
+ raise
77
+ end
78
+ end
79
+ end
80
+
81
+ def set(path, data, *options)
82
+ begin
83
+ real_store.set(path, data, *options)
84
+ rescue DataNotFoundError
85
+ if options.include?(:create_dir) ||
86
+ options.include?(:create) && default_creator.exists?(path[0..-2]) ||
87
+ default_creator.exists?(path)
88
+ real_store.set(path, data, :create, :create_dir, *options)
89
+ else
90
+ raise
91
+ end
92
+ end
93
+
94
+ if options.include?(:create)
95
+ options_hash = options.last.is_a?(Hash) ? options.last : {}
96
+ default_creator.created(path, options_hash[:requestor], options.include?(:create_dir))
97
+ end
98
+ end
99
+
100
+ def delete(path, *options)
101
+ deleted = default_creator.deleted(path)
102
+ begin
103
+ real_store.delete(path)
104
+ rescue DataNotFoundError
105
+ if !deleted
106
+ raise
107
+ end
108
+ end
109
+ end
110
+
111
+ def delete_dir(path, *options)
112
+ deleted = default_creator.deleted(path)
113
+ begin
114
+ real_store.delete_dir(path, *options)
115
+ rescue DataNotFoundError
116
+ if !deleted
117
+ raise
118
+ end
119
+ end
120
+ end
121
+
122
+ def list(path)
123
+ default_results = default_creator.list(path)
124
+ begin
125
+ real_results = real_store.list(path)
126
+ if default_results
127
+ (real_results + default_results).uniq
128
+ else
129
+ real_results
130
+ end
131
+ rescue DataNotFoundError
132
+ if default_results
133
+ default_results
134
+ else
135
+ raise
136
+ end
137
+ end
138
+ end
139
+
140
+ def exists?(path)
141
+ real_store.exists?(path) || default_creator.exists?(path)
142
+ end
143
+
144
+ def exists_dir?(path)
145
+ real_store.exists_dir?(path) || default_creator.exists?(path)
146
+ end
147
+ end
148
+ end
149
+ end
@@ -9,38 +9,56 @@ module ChefZero
9
9
  raise "clear not implemented by class #{self.class}"
10
10
  end
11
11
 
12
+ # Create a directory.
13
+ # options is a list of symbols, including:
14
+ # :recursive - create any parents needed
12
15
  def create_dir(path, name, *options)
13
16
  raise "create_dir not implemented by class #{self.class}"
14
17
  end
15
18
 
19
+ # Create a file.
20
+ # options is a list of symbols, including:
21
+ # :create_dir - create any parents needed
16
22
  def create(path, name, data, *options)
17
23
  raise "create not implemented by class #{self.class}"
18
24
  end
19
25
 
26
+ # Get a file.
20
27
  def get(path, request=nil)
21
28
  raise "get not implemented by class #{self.class}"
22
29
  end
23
30
 
31
+ # Set a file's value.
32
+ # options is a list of symbols, including:
33
+ # :create - create the file if it does not exist
34
+ # :create_dir - create the directory if it does not exist
24
35
  def set(path, data, *options)
25
36
  raise "set not implemented by class #{self.class}"
26
37
  end
27
38
 
39
+ # Delete a file.
28
40
  def delete(path)
29
41
  raise "delete not implemented by class #{self.class}"
30
42
  end
31
43
 
44
+ # Delete a directory.
45
+ # options is a list of symbols, including:
46
+ # :recursive - delete even if empty
32
47
  def delete_dir(path, *options)
33
48
  raise "delete_dir not implemented by class #{self.class}"
34
49
  end
35
50
 
51
+ # List a directory.
36
52
  def list(path)
37
53
  raise "list not implemented by class #{self.class}"
38
54
  end
39
55
 
56
+ # Check a file's existence.
40
57
  def exists?(path)
41
58
  raise "exists? not implemented by class #{self.class}"
42
59
  end
43
60
 
61
+ # Check a directory's existence.
44
62
  def exists_dir?(path)
45
63
  raise "exists_dir? not implemented by class #{self.class}"
46
64
  end
@@ -18,13 +18,14 @@
18
18
 
19
19
  require 'chef_zero/data_store/v2_to_v1_adapter'
20
20
  require 'chef_zero/data_store/memory_store_v2'
21
+ require 'chef_zero/data_store/default_facade'
21
22
 
22
23
  module ChefZero
23
24
  module DataStore
24
25
  class MemoryStore < ChefZero::DataStore::V2ToV1Adapter
25
26
  def initialize
26
27
  super
27
- @real_store = ChefZero::DataStore::MemoryStoreV2.new
28
+ @real_store = ChefZero::DataStore::DefaultFacade.new(ChefZero::DataStore::MemoryStoreV2.new, 'chef', true)
28
29
  clear
29
30
  end
30
31
  end
@@ -31,31 +31,6 @@ module ChefZero
31
31
 
32
32
  def clear
33
33
  @data = {}
34
-
35
- create_dir([], 'organizations')
36
- end
37
-
38
- def create_org
39
- org = {
40
- 'clients' => {
41
- 'chef-validator' => '{ "validator": true }',
42
- 'chef-webui' => '{ "admin": true }'
43
- },
44
- 'cookbooks' => {},
45
- 'data' => {},
46
- 'environments' => {
47
- '_default' => '{ "description": "The default Chef environment" }'
48
- },
49
- 'file_store' => {
50
- 'checksums' => {}
51
- },
52
- 'nodes' => {},
53
- 'roles' => {},
54
- 'sandboxes' => {},
55
- 'users' => {
56
- 'admin' => '{ "admin": "true" }'
57
- }
58
- }
59
34
  end
60
35
 
61
36
  def create_dir(path, name, *options)
@@ -66,7 +41,7 @@ module ChefZero
66
41
  raise DataAlreadyExistsError.new(path + [name])
67
42
  end
68
43
  else
69
- _create_dir(path, parent, name)
44
+ parent[name] = {}
70
45
  end
71
46
  end
72
47
 
@@ -139,7 +114,7 @@ module ChefZero
139
114
  begin
140
115
  value = _get(path)
141
116
  if value.is_a?(Hash) && !options[:allow_dirs]
142
- raise "exists? does not work with directories (#{path} = #{dir.class})"
117
+ raise "exists? does not work with directories (#{path} = #{value.class})"
143
118
  end
144
119
  return true
145
120
  rescue DataNotFoundError
@@ -166,7 +141,7 @@ module ChefZero
166
141
  path.each_with_index do |path_part, index|
167
142
  if !value.has_key?(path_part)
168
143
  if create_dir
169
- _create_dir(path[0,index], value, path_part)
144
+ value[path_part] = {}
170
145
  else
171
146
  raise DataNotFoundError.new(path[0,index+1])
172
147
  end
@@ -175,14 +150,6 @@ module ChefZero
175
150
  end
176
151
  value
177
152
  end
178
-
179
- def _create_dir(parent_path, parent, name)
180
- if parent_path == [ 'organizations' ]
181
- parent[name] = create_org
182
- else
183
- parent[name] = {}
184
- end
185
- end
186
153
  end
187
154
  end
188
155
  end
@@ -0,0 +1,147 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef_zero/data_store/data_already_exists_error'
20
+ require 'chef_zero/data_store/data_not_found_error'
21
+ require 'chef_zero/data_store/interface_v2'
22
+ require 'fileutils'
23
+
24
+ module ChefZero
25
+ module DataStore
26
+ class RawFileStore < ChefZero::DataStore::InterfaceV2
27
+ def initialize(root, destructible = false)
28
+ @root = root
29
+ @destructible = destructible
30
+ end
31
+
32
+ attr_reader :root
33
+ attr_reader :destructible
34
+
35
+ def path_to(path, name=nil)
36
+ if name
37
+ File.join(root, *path, name)
38
+ else
39
+ File.join(root, *path)
40
+ end
41
+ end
42
+
43
+ def clear
44
+ if destructible
45
+ Dir.entries(root).each do |entry|
46
+ next if entry == '.' || entry == '..'
47
+ FileUtils.rm_rf(Path.join(root, entry))
48
+ end
49
+ end
50
+ end
51
+
52
+ def create_dir(path, name, *options)
53
+ real_path = path_to(path, name)
54
+ if options.include?(:recursive)
55
+ FileUtils.mkdir_p(real_path)
56
+ else
57
+ begin
58
+ Dir.mkdir(File.join(path, name))
59
+ rescue Errno::ENOENT
60
+ raise DataNotFoundError.new(path)
61
+ rescue Errno::EEXIST
62
+ raise DataAlreadyExistsError.new(path + [name])
63
+ end
64
+ end
65
+ end
66
+
67
+ def create(path, name, data, *options)
68
+ if options.include?(:create_dir)
69
+ FileUtils.mkdir_p(path_to(path))
70
+ end
71
+ begin
72
+ File.open(path_to(path, name), File::WRONLY|File::CREAT|File::EXCL|File::BINARY, :internal_encoding => nil) do |file|
73
+ file.write data
74
+ end
75
+ rescue Errno::ENOENT
76
+ raise DataNotFoundError.new(path)
77
+ rescue Errno::EEXIST
78
+ raise DataAlreadyExistsError.new(path + [name])
79
+ end
80
+ end
81
+
82
+ def get(path, request=nil)
83
+ begin
84
+ return IO.read(path_to(path))
85
+ rescue Errno::ENOENT
86
+ raise DataNotFoundError.new(path)
87
+ end
88
+ end
89
+
90
+ def set(path, data, *options)
91
+ if options.include?(:create_dir)
92
+ FileUtils.mkdir_p(path_to(path[0..-2]))
93
+ end
94
+ begin
95
+ mode = File::WRONLY|File::TRUNC|File::BINARY
96
+ if options.include?(:create)
97
+ mode |= File::CREAT
98
+ end
99
+ File.open(path_to(path), mode, :internal_encoding => nil) do |file|
100
+ file.write data
101
+ end
102
+ rescue Errno::ENOENT
103
+ raise DataNotFoundError.new(path)
104
+ end
105
+ end
106
+
107
+ def delete(path)
108
+ begin
109
+ File.delete(path_to(path))
110
+ rescue Errno::ENOENT
111
+ raise DataNotFoundError.new(path)
112
+ end
113
+ end
114
+
115
+ def delete_dir(path, *options)
116
+ if options.include?(:recursive)
117
+ if !File.exist?(path_to(path))
118
+ raise DataNotFoundError.new(path)
119
+ end
120
+ FileUtils.rm_rf(path_to(path))
121
+ else
122
+ begin
123
+ Dir.rmdir(path_to(path))
124
+ rescue Errno::ENOENT
125
+ raise DataNotFoundError.new(path)
126
+ end
127
+ end
128
+ end
129
+
130
+ def list(path)
131
+ begin
132
+ Dir.entries(path_to(path)).select { |entry| entry != '.' && entry != '..' }.to_a
133
+ rescue Errno::ENOENT
134
+ raise DataNotFoundError.new(path)
135
+ end
136
+ end
137
+
138
+ def exists?(path, options = {})
139
+ File.exists?(path_to(path))
140
+ end
141
+
142
+ def exists_dir?(path)
143
+ File.exists?(path_to(path))
144
+ end
145
+ end
146
+ end
147
+ end
@@ -10,117 +10,87 @@ module ChefZero
10
10
  clear
11
11
  end
12
12
 
13
- ORG_DEFAULTS = {
14
- 'clients' => {
15
- 'chef-validator' => '{ "validator": true }',
16
- 'chef-webui' => '{ "admin": true }'
17
- },
18
- 'environments' => {
19
- '_default' => '{ "description": "The default Chef environment" }'
20
- },
21
- 'users' => {
22
- 'admin' => '{ "admin": "true" }'
23
- }
24
- }
25
-
26
13
  attr_reader :real_store
27
14
  attr_reader :single_org
28
15
 
29
16
  def clear
30
- if @options[:org_defaults]
31
- @defaults = { 'organizations' => { @single_org => @options[:org_defaults] }}
32
- else
33
- @defaults = {}
34
- end
35
17
  real_store.clear if real_store.respond_to?(:clear)
36
18
  end
37
19
 
38
20
  def create_dir(path, name, *options)
39
- return nil if skip_organizations?(path, name)
40
- if using_default?(path, name)
41
- raise DataAlreadyExistsError.new(path + [name])
42
- end
21
+ raise DataNotFoundError.new(path) if skip_organizations?(path)
22
+ raise "Cannot create #{name} at #{path} with V1ToV2Adapter: only handles a single org named #{single_org}." if skip_organizations?(path, name)
23
+ raise DataAlreadyExistsError.new(path + [ name ]) if path.size < 2
43
24
  fix_exceptions do
44
25
  real_store.create_dir(path[2..-1], name, *options)
45
26
  end
46
27
  end
47
28
 
48
29
  def create(path, name, data, *options)
49
- return nil if skip_organizations?(path, name)
50
- if using_default?(path, name)
51
- raise DataAlreadyExistsError.new(path + [name])
52
- end
53
- remove_default(path, name)
54
-
30
+ raise DataNotFoundError.new(path) if skip_organizations?(path)
31
+ raise "Cannot create #{name} at #{path} with V1ToV2Adapter: only handles a single org named #{single_org}." if skip_organizations?(path, name)
32
+ raise DataAlreadyExistsError.new(path + [ name ]) if path.size < 2
55
33
  fix_exceptions do
56
34
  real_store.create(path[2..-1], name, data, *options)
57
35
  end
58
36
  end
59
37
 
60
38
  def get(path, request=nil)
61
- return nil if skip_organizations?(path)
62
- if using_default?(path)
63
- get_default(path)
64
- else
65
- fix_exceptions do
66
- real_store.get(path[2..-1], request)
67
- end
39
+ raise DataNotFoundError.new(path) if skip_organizations?(path)
40
+ fix_exceptions do
41
+ real_store.get(path[2..-1], request)
68
42
  end
69
43
  end
70
44
 
71
45
  def set(path, data, *options)
72
- return nil if skip_organizations?(path)
73
- remove_default(path)
46
+ raise DataNotFoundError.new(path) if skip_organizations?(path)
74
47
  fix_exceptions do
75
48
  real_store.set(path[2..-1], data, *options)
76
49
  end
77
50
  end
78
51
 
79
- def delete(path)
80
- return nil if skip_organizations?(path)
81
- remove_default(path)
52
+ def delete(path, *options)
53
+ raise DataNotFoundError.new(path) if skip_organizations?(path) && !options.include?(:recursive)
82
54
  fix_exceptions do
83
55
  real_store.delete(path[2..-1])
84
56
  end
85
57
  end
86
58
 
87
59
  def delete_dir(path, *options)
88
- return nil if skip_organizations?(path)
60
+ raise DataNotFoundError.new(path) if skip_organizations?(path) && !options.include?(:recursive)
89
61
  fix_exceptions do
90
62
  real_store.delete_dir(path[2..-1], *options)
91
63
  end
92
64
  end
93
65
 
94
66
  def list(path)
95
- return nil if skip_organizations?(path)
96
- fix_exceptions do
97
- result = real_store.list(path[2..-1])
98
- if using_default?(path)
99
- result ||= []
100
- get_default(path).keys.each do |value|
101
- result << value if !result.include?(value)
102
- end
67
+ raise DataNotFoundError.new(path) if skip_organizations?(path)
68
+ if path == []
69
+ [ 'organizations' ]
70
+ elsif path == [ 'organizations' ]
71
+ [ single_org ]
72
+ else
73
+ fix_exceptions do
74
+ real_store.list(path[2..-1])
103
75
  end
104
- result
105
76
  end
106
77
  end
107
78
 
108
79
  def exists?(path)
109
- return nil if skip_organizations?(path)
110
- if using_default?(path)
111
- true
112
- else
113
- fix_exceptions do
114
- real_store.exists?(path[2..-1])
115
- end
80
+ return false if skip_organizations?(path)
81
+ fix_exceptions do
82
+ real_store.exists?(path[2..-1])
116
83
  end
117
84
  end
118
85
 
119
86
  def exists_dir?(path)
120
- return nil if skip_organizations?(path)
121
- if using_default?(path)
87
+ return false if skip_organizations?(path)
88
+ if path == []
89
+ true
90
+ elsif path == [ 'organizations' ] || path == [ 'users' ]
122
91
  true
123
92
  else
93
+ return false if skip_organizations?(path)
124
94
  fix_exceptions do
125
95
  real_store.exists_dir?(path[2..-1])
126
96
  end
@@ -129,40 +99,6 @@ module ChefZero
129
99
 
130
100
  private
131
101
 
132
- def using_default?(path, name = nil)
133
- path = path + [name] if name
134
- result = @defaults
135
- path.each do |part|
136
- return false if !result.has_key?(part)
137
- result = result[part]
138
- end
139
- !result.nil?
140
- end
141
-
142
- def get_default(path, name = nil)
143
- path = path + [name] if name
144
- result = @defaults
145
- path.each do |part|
146
- return nil if !result.has_key?(part)
147
- result = result[part]
148
- end
149
- result
150
- end
151
-
152
- def remove_default(path, name = nil)
153
- dir = name ? path[0..-2] : path
154
- default = @defaults
155
- dir.each do |part|
156
- return if !default.has_key?(part)
157
- default = default[part]
158
- end
159
-
160
- name = name || path.last
161
- if name
162
- default.delete(name)
163
- end
164
- end
165
-
166
102
  def fix_exceptions
167
103
  begin
168
104
  yield
@@ -175,17 +111,17 @@ module ChefZero
175
111
 
176
112
  def skip_organizations?(path, name = nil)
177
113
  if path == []
178
- raise "" if name == nil || name != 'organizations'
179
- true
180
- elsif path == ['organizations']
181
- raise "" if name == nil || name != single_org
182
- true
183
- else
184
- raise "Path #{path} must start with /organizations/#{single_org}" if path[0..1] != [ 'organizations', single_org ]
185
- if !name
186
- raise "Path #{path} must start with /organizations/#{single_org}/<something>" if path.size <= 2
187
- end
188
114
  false
115
+ elsif path[0] == 'organizations'
116
+ if path.size == 1
117
+ false
118
+ elsif path.size >= 2 && path[1] != single_org
119
+ true
120
+ else
121
+ false
122
+ end
123
+ else
124
+ true
189
125
  end
190
126
  end
191
127
  end