chef-zero 2.2.1 → 3.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
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