chef-zero 4.3.0 → 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +201 -201
- data/README.md +155 -155
- data/Rakefile +31 -31
- data/bin/chef-zero +100 -100
- data/lib/chef_zero.rb +10 -10
- data/lib/chef_zero/chef_data/acl_path.rb +139 -139
- data/lib/chef_zero/chef_data/cookbook_data.rb +240 -240
- data/lib/chef_zero/chef_data/data_normalizer.rb +208 -207
- data/lib/chef_zero/chef_data/default_creator.rb +446 -446
- data/lib/chef_zero/data_store/data_already_exists_error.rb +29 -29
- data/lib/chef_zero/data_store/data_error.rb +31 -31
- data/lib/chef_zero/data_store/data_not_found_error.rb +28 -28
- data/lib/chef_zero/data_store/default_facade.rb +149 -149
- data/lib/chef_zero/data_store/interface_v1.rb +67 -67
- data/lib/chef_zero/data_store/interface_v2.rb +18 -18
- data/lib/chef_zero/data_store/memory_store.rb +33 -33
- data/lib/chef_zero/data_store/memory_store_v2.rb +155 -155
- data/lib/chef_zero/data_store/raw_file_store.rb +147 -147
- data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +142 -142
- data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +107 -107
- data/lib/chef_zero/endpoints/acl_endpoint.rb +38 -38
- data/lib/chef_zero/endpoints/acls_endpoint.rb +29 -29
- data/lib/chef_zero/endpoints/actor_endpoint.rb +94 -94
- data/lib/chef_zero/endpoints/actors_endpoint.rb +64 -64
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +31 -31
- data/lib/chef_zero/endpoints/container_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/containers_endpoint.rb +13 -13
- data/lib/chef_zero/endpoints/cookbook_endpoint.rb +39 -39
- data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +119 -119
- data/lib/chef_zero/endpoints/cookbooks_base.rb +65 -65
- data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +19 -19
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +45 -45
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +25 -25
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +23 -23
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +24 -24
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +123 -123
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/environment_endpoint.rb +33 -33
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +23 -23
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +36 -36
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/group_endpoint.rb +20 -20
- data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -13
- data/lib/chef_zero/endpoints/license_endpoint.rb +25 -25
- data/lib/chef_zero/endpoints/node_endpoint.rb +17 -17
- data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +11 -11
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +30 -30
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -26
- data/lib/chef_zero/endpoints/organization_endpoint.rb +46 -46
- data/lib/chef_zero/endpoints/organization_user_base.rb +15 -15
- data/lib/chef_zero/endpoints/organization_user_endpoint.rb +26 -26
- data/lib/chef_zero/endpoints/organization_users_endpoint.rb +43 -43
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -20
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +62 -62
- data/lib/chef_zero/endpoints/policies_endpoint.rb +151 -151
- data/lib/chef_zero/endpoints/principal_endpoint.rb +42 -42
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +42 -42
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +63 -63
- data/lib/chef_zero/endpoints/role_endpoint.rb +16 -16
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +14 -14
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +27 -27
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +50 -50
- data/lib/chef_zero/endpoints/search_endpoint.rb +194 -194
- data/lib/chef_zero/endpoints/searches_endpoint.rb +18 -18
- data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +14 -14
- data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -30
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +40 -40
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -19
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -19
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -22
- data/lib/chef_zero/endpoints/version_endpoint.rb +12 -12
- data/lib/chef_zero/log.rb +7 -7
- data/lib/chef_zero/rest_base.rb +242 -242
- data/lib/chef_zero/rest_error_response.rb +11 -11
- data/lib/chef_zero/rest_request.rb +69 -69
- data/lib/chef_zero/rest_router.rb +45 -45
- data/lib/chef_zero/rspec.rb +308 -308
- data/lib/chef_zero/server.rb +642 -642
- data/lib/chef_zero/socketless_server_map.rb +92 -92
- data/lib/chef_zero/solr/query/binary_operator.rb +52 -52
- data/lib/chef_zero/solr/query/phrase.rb +23 -23
- data/lib/chef_zero/solr/query/range_query.rb +46 -46
- data/lib/chef_zero/solr/query/regexpable_query.rb +29 -29
- data/lib/chef_zero/solr/query/subquery.rb +37 -37
- data/lib/chef_zero/solr/query/term.rb +45 -45
- data/lib/chef_zero/solr/query/unary_operator.rb +43 -43
- data/lib/chef_zero/solr/solr_doc.rb +53 -53
- data/lib/chef_zero/solr/solr_parser.rb +203 -203
- data/lib/chef_zero/version.rb +3 -3
- data/spec/run_oc_pedant.rb +63 -63
- data/spec/search_spec.rb +32 -32
- data/spec/server_spec.rb +92 -92
- data/spec/socketless_server_map_spec.rb +76 -76
- data/spec/support/oc_pedant.rb +132 -132
- data/spec/support/stickywicket.pem +27 -27
- metadata +3 -3
@@ -1,240 +1,240 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
require 'hashie/mash'
|
3
|
-
|
4
|
-
module ChefZero
|
5
|
-
module ChefData
|
6
|
-
module CookbookData
|
7
|
-
def self.to_hash(cookbook, name, version=nil)
|
8
|
-
frozen = false
|
9
|
-
if cookbook.has_key?(:frozen)
|
10
|
-
frozen = cookbook[:frozen]
|
11
|
-
cookbook = cookbook.dup
|
12
|
-
cookbook.delete(:frozen)
|
13
|
-
end
|
14
|
-
|
15
|
-
result = files_from(cookbook)
|
16
|
-
recipe_names = result[:recipes].map do |recipe|
|
17
|
-
recipe_name = recipe[:name][0..-2]
|
18
|
-
recipe_name == 'default' ? name : "#{name}::#{recipe_name}"
|
19
|
-
end
|
20
|
-
result[:metadata] = metadata_from(cookbook, name, version, recipe_names)
|
21
|
-
result[:name] = "#{name}-#{result[:metadata][:version]}"
|
22
|
-
result[:json_class] = 'Chef::CookbookVersion'
|
23
|
-
result[:cookbook_name] = name
|
24
|
-
result[:version] = result[:metadata][:version]
|
25
|
-
result[:chef_type] = 'cookbook_version'
|
26
|
-
result[:frozen?] = true if frozen
|
27
|
-
result
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.metadata_from(directory, name, version, recipe_names)
|
31
|
-
metadata = PretendCookbookMetadata.new(PretendCookbook.new(name, recipe_names))
|
32
|
-
# If both .rb and .json exist, read .rb
|
33
|
-
# TODO if recipes has 3 recipes in it, and the Ruby/JSON has only one, should
|
34
|
-
# the resulting recipe list have 1, or 3-4 recipes in it?
|
35
|
-
if has_child(directory, 'metadata.rb')
|
36
|
-
begin
|
37
|
-
file = filename(directory, 'metadata.rb') || "(#{name}/metadata.rb)"
|
38
|
-
metadata.instance_eval(read_file(directory, 'metadata.rb'), file)
|
39
|
-
rescue
|
40
|
-
ChefZero::Log.error("Error loading cookbook #{name}: #{$!}\n #{$!.backtrace.join("\n ")}")
|
41
|
-
end
|
42
|
-
elsif has_child(directory, 'metadata.json')
|
43
|
-
metadata.from_json(read_file(directory, 'metadata.json'))
|
44
|
-
end
|
45
|
-
result = {}
|
46
|
-
metadata.to_hash.each_pair do |key,value|
|
47
|
-
result[key.to_sym] = value
|
48
|
-
end
|
49
|
-
result[:version] = version if version
|
50
|
-
result
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
# Just enough cookbook to make a Metadata object
|
56
|
-
class PretendCookbook
|
57
|
-
def initialize(name, fully_qualified_recipe_names)
|
58
|
-
@name = name
|
59
|
-
@fully_qualified_recipe_names = fully_qualified_recipe_names
|
60
|
-
end
|
61
|
-
attr_reader :name, :fully_qualified_recipe_names
|
62
|
-
end
|
63
|
-
|
64
|
-
# Handles loading configuration values from a Chef config file
|
65
|
-
#
|
66
|
-
# @author Justin Campbell <justin.campbell@riotgames.com>
|
67
|
-
class PretendCookbookMetadata < Hash
|
68
|
-
# @param [String] path
|
69
|
-
def initialize(cookbook)
|
70
|
-
self.name(cookbook.name)
|
71
|
-
self.recipes(cookbook.fully_qualified_recipe_names)
|
72
|
-
%w(attributes grouping dependencies supports recommendations suggestions conflicting providing replacing recipes).each do |hash_arg|
|
73
|
-
self[hash_arg.to_sym] = Hashie::Mash.new
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def from_json(json)
|
78
|
-
self.merge!(FFI_Yajl::Parser.parse(json))
|
79
|
-
end
|
80
|
-
|
81
|
-
private
|
82
|
-
|
83
|
-
def depends(cookbook, *version_constraints)
|
84
|
-
cookbook_arg(:dependencies, cookbook, version_constraints)
|
85
|
-
end
|
86
|
-
|
87
|
-
def supports(cookbook, *version_constraints)
|
88
|
-
cookbook_arg(:supports, cookbook, version_constraints)
|
89
|
-
end
|
90
|
-
|
91
|
-
def recommends(cookbook, *version_constraints)
|
92
|
-
cookbook_arg(:recommendations, cookbook, version_constraints)
|
93
|
-
end
|
94
|
-
|
95
|
-
def suggests(cookbook, *version_constraints)
|
96
|
-
cookbook_arg(:suggestions, cookbook, version_constraints)
|
97
|
-
end
|
98
|
-
|
99
|
-
def conflicts(cookbook, *version_constraints)
|
100
|
-
cookbook_arg(:conflicting, cookbook, version_constraints)
|
101
|
-
end
|
102
|
-
|
103
|
-
def provides(cookbook, *version_constraints)
|
104
|
-
cookbook_arg(:providing, cookbook, version_constraints)
|
105
|
-
end
|
106
|
-
|
107
|
-
def replaces(cookbook, *version_constraints)
|
108
|
-
cookbook_arg(:replacing, cookbook, version_constraints)
|
109
|
-
end
|
110
|
-
|
111
|
-
def recipe(recipe, description)
|
112
|
-
self[:recipes][recipe] = description
|
113
|
-
end
|
114
|
-
|
115
|
-
def attribute(name, options)
|
116
|
-
self[:attributes][name] = options
|
117
|
-
end
|
118
|
-
|
119
|
-
def grouping(name, options)
|
120
|
-
self[:grouping][name] = options
|
121
|
-
end
|
122
|
-
|
123
|
-
def cookbook_arg(key, cookbook, version_constraints)
|
124
|
-
self[key][cookbook] = version_constraints.first || ">= 0.0.0"
|
125
|
-
end
|
126
|
-
|
127
|
-
def method_missing(key, value = nil)
|
128
|
-
if value.nil?
|
129
|
-
self[key.to_sym]
|
130
|
-
else
|
131
|
-
store key.to_sym, value
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def self.files_from(directory)
|
137
|
-
# TODO some support .rb only
|
138
|
-
result = {
|
139
|
-
:attributes => load_child_files(directory, 'attributes', false),
|
140
|
-
:definitions => load_child_files(directory, 'definitions', false),
|
141
|
-
:recipes => load_child_files(directory, 'recipes', false),
|
142
|
-
:libraries => load_child_files(directory, 'libraries', false),
|
143
|
-
:templates => load_child_files(directory, 'templates', true),
|
144
|
-
:files => load_child_files(directory, 'files', true),
|
145
|
-
:resources => load_child_files(directory, 'resources', true),
|
146
|
-
:providers => load_child_files(directory, 'providers', true),
|
147
|
-
:root_files => load_files(directory, false)
|
148
|
-
}
|
149
|
-
set_specificity(result[:templates])
|
150
|
-
set_specificity(result[:files])
|
151
|
-
result
|
152
|
-
end
|
153
|
-
|
154
|
-
def self.has_child(directory, name)
|
155
|
-
if directory.is_a?(Hash)
|
156
|
-
directory.has_key?(name)
|
157
|
-
else
|
158
|
-
directory.child(name).exists?
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def self.read_file(directory, name)
|
163
|
-
if directory.is_a?(Hash)
|
164
|
-
directory[name]
|
165
|
-
else
|
166
|
-
directory.child(name).read
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def self.filename(directory, name)
|
171
|
-
if directory.respond_to?(:file_path)
|
172
|
-
File.join(directory.file_path, name)
|
173
|
-
else
|
174
|
-
nil
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
def self.get_directory(directory, name)
|
179
|
-
if directory.is_a?(Hash)
|
180
|
-
directory[name].is_a?(Hash) ? directory[name] : nil
|
181
|
-
else
|
182
|
-
result = directory.child(name)
|
183
|
-
result.dir? ? result : nil
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
def self.list(directory)
|
188
|
-
if directory.is_a?(Hash)
|
189
|
-
directory.keys
|
190
|
-
else
|
191
|
-
directory.children.map { |c| c.name }
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
def self.load_child_files(parent, key, recursive)
|
196
|
-
result = load_files(get_directory(parent, key), recursive)
|
197
|
-
result.each do |file|
|
198
|
-
file[:path] = "#{key}/#{file[:path]}"
|
199
|
-
end
|
200
|
-
result
|
201
|
-
end
|
202
|
-
|
203
|
-
def self.load_files(directory, recursive)
|
204
|
-
result = []
|
205
|
-
if directory
|
206
|
-
list(directory).each do |child_name|
|
207
|
-
dir = get_directory(directory, child_name)
|
208
|
-
if dir
|
209
|
-
if recursive
|
210
|
-
result += load_child_files(directory, child_name, recursive)
|
211
|
-
end
|
212
|
-
else
|
213
|
-
result += load_file(read_file(directory, child_name), child_name)
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
result
|
218
|
-
end
|
219
|
-
|
220
|
-
def self.load_file(value, name)
|
221
|
-
[{
|
222
|
-
:name => name,
|
223
|
-
:path => name,
|
224
|
-
:checksum => Digest::MD5.hexdigest(value),
|
225
|
-
:specificity => 'default'
|
226
|
-
}]
|
227
|
-
end
|
228
|
-
|
229
|
-
def self.set_specificity(files)
|
230
|
-
files.each do |file|
|
231
|
-
parts = file[:path].split('/')
|
232
|
-
raise "Only directories are allowed directly under templates or files: #{file[:path]}" if parts.size == 2
|
233
|
-
file[:specificity] = parts[1]
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
CookbookData = ChefData::CookbookData
|
240
|
-
end
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'hashie/mash'
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module ChefData
|
6
|
+
module CookbookData
|
7
|
+
def self.to_hash(cookbook, name, version=nil)
|
8
|
+
frozen = false
|
9
|
+
if cookbook.has_key?(:frozen)
|
10
|
+
frozen = cookbook[:frozen]
|
11
|
+
cookbook = cookbook.dup
|
12
|
+
cookbook.delete(:frozen)
|
13
|
+
end
|
14
|
+
|
15
|
+
result = files_from(cookbook)
|
16
|
+
recipe_names = result[:recipes].map do |recipe|
|
17
|
+
recipe_name = recipe[:name][0..-2]
|
18
|
+
recipe_name == 'default' ? name : "#{name}::#{recipe_name}"
|
19
|
+
end
|
20
|
+
result[:metadata] = metadata_from(cookbook, name, version, recipe_names)
|
21
|
+
result[:name] = "#{name}-#{result[:metadata][:version]}"
|
22
|
+
result[:json_class] = 'Chef::CookbookVersion'
|
23
|
+
result[:cookbook_name] = name
|
24
|
+
result[:version] = result[:metadata][:version]
|
25
|
+
result[:chef_type] = 'cookbook_version'
|
26
|
+
result[:frozen?] = true if frozen
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.metadata_from(directory, name, version, recipe_names)
|
31
|
+
metadata = PretendCookbookMetadata.new(PretendCookbook.new(name, recipe_names))
|
32
|
+
# If both .rb and .json exist, read .rb
|
33
|
+
# TODO if recipes has 3 recipes in it, and the Ruby/JSON has only one, should
|
34
|
+
# the resulting recipe list have 1, or 3-4 recipes in it?
|
35
|
+
if has_child(directory, 'metadata.rb')
|
36
|
+
begin
|
37
|
+
file = filename(directory, 'metadata.rb') || "(#{name}/metadata.rb)"
|
38
|
+
metadata.instance_eval(read_file(directory, 'metadata.rb'), file)
|
39
|
+
rescue
|
40
|
+
ChefZero::Log.error("Error loading cookbook #{name}: #{$!}\n #{$!.backtrace.join("\n ")}")
|
41
|
+
end
|
42
|
+
elsif has_child(directory, 'metadata.json')
|
43
|
+
metadata.from_json(read_file(directory, 'metadata.json'))
|
44
|
+
end
|
45
|
+
result = {}
|
46
|
+
metadata.to_hash.each_pair do |key,value|
|
47
|
+
result[key.to_sym] = value
|
48
|
+
end
|
49
|
+
result[:version] = version if version
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Just enough cookbook to make a Metadata object
|
56
|
+
class PretendCookbook
|
57
|
+
def initialize(name, fully_qualified_recipe_names)
|
58
|
+
@name = name
|
59
|
+
@fully_qualified_recipe_names = fully_qualified_recipe_names
|
60
|
+
end
|
61
|
+
attr_reader :name, :fully_qualified_recipe_names
|
62
|
+
end
|
63
|
+
|
64
|
+
# Handles loading configuration values from a Chef config file
|
65
|
+
#
|
66
|
+
# @author Justin Campbell <justin.campbell@riotgames.com>
|
67
|
+
class PretendCookbookMetadata < Hash
|
68
|
+
# @param [String] path
|
69
|
+
def initialize(cookbook)
|
70
|
+
self.name(cookbook.name)
|
71
|
+
self.recipes(cookbook.fully_qualified_recipe_names)
|
72
|
+
%w(attributes grouping dependencies supports recommendations suggestions conflicting providing replacing recipes).each do |hash_arg|
|
73
|
+
self[hash_arg.to_sym] = Hashie::Mash.new
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def from_json(json)
|
78
|
+
self.merge!(FFI_Yajl::Parser.parse(json))
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def depends(cookbook, *version_constraints)
|
84
|
+
cookbook_arg(:dependencies, cookbook, version_constraints)
|
85
|
+
end
|
86
|
+
|
87
|
+
def supports(cookbook, *version_constraints)
|
88
|
+
cookbook_arg(:supports, cookbook, version_constraints)
|
89
|
+
end
|
90
|
+
|
91
|
+
def recommends(cookbook, *version_constraints)
|
92
|
+
cookbook_arg(:recommendations, cookbook, version_constraints)
|
93
|
+
end
|
94
|
+
|
95
|
+
def suggests(cookbook, *version_constraints)
|
96
|
+
cookbook_arg(:suggestions, cookbook, version_constraints)
|
97
|
+
end
|
98
|
+
|
99
|
+
def conflicts(cookbook, *version_constraints)
|
100
|
+
cookbook_arg(:conflicting, cookbook, version_constraints)
|
101
|
+
end
|
102
|
+
|
103
|
+
def provides(cookbook, *version_constraints)
|
104
|
+
cookbook_arg(:providing, cookbook, version_constraints)
|
105
|
+
end
|
106
|
+
|
107
|
+
def replaces(cookbook, *version_constraints)
|
108
|
+
cookbook_arg(:replacing, cookbook, version_constraints)
|
109
|
+
end
|
110
|
+
|
111
|
+
def recipe(recipe, description)
|
112
|
+
self[:recipes][recipe] = description
|
113
|
+
end
|
114
|
+
|
115
|
+
def attribute(name, options)
|
116
|
+
self[:attributes][name] = options
|
117
|
+
end
|
118
|
+
|
119
|
+
def grouping(name, options)
|
120
|
+
self[:grouping][name] = options
|
121
|
+
end
|
122
|
+
|
123
|
+
def cookbook_arg(key, cookbook, version_constraints)
|
124
|
+
self[key][cookbook] = version_constraints.first || ">= 0.0.0"
|
125
|
+
end
|
126
|
+
|
127
|
+
def method_missing(key, value = nil)
|
128
|
+
if value.nil?
|
129
|
+
self[key.to_sym]
|
130
|
+
else
|
131
|
+
store key.to_sym, value
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.files_from(directory)
|
137
|
+
# TODO some support .rb only
|
138
|
+
result = {
|
139
|
+
:attributes => load_child_files(directory, 'attributes', false),
|
140
|
+
:definitions => load_child_files(directory, 'definitions', false),
|
141
|
+
:recipes => load_child_files(directory, 'recipes', false),
|
142
|
+
:libraries => load_child_files(directory, 'libraries', false),
|
143
|
+
:templates => load_child_files(directory, 'templates', true),
|
144
|
+
:files => load_child_files(directory, 'files', true),
|
145
|
+
:resources => load_child_files(directory, 'resources', true),
|
146
|
+
:providers => load_child_files(directory, 'providers', true),
|
147
|
+
:root_files => load_files(directory, false)
|
148
|
+
}
|
149
|
+
set_specificity(result[:templates])
|
150
|
+
set_specificity(result[:files])
|
151
|
+
result
|
152
|
+
end
|
153
|
+
|
154
|
+
def self.has_child(directory, name)
|
155
|
+
if directory.is_a?(Hash)
|
156
|
+
directory.has_key?(name)
|
157
|
+
else
|
158
|
+
directory.child(name).exists?
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.read_file(directory, name)
|
163
|
+
if directory.is_a?(Hash)
|
164
|
+
directory[name]
|
165
|
+
else
|
166
|
+
directory.child(name).read
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.filename(directory, name)
|
171
|
+
if directory.respond_to?(:file_path)
|
172
|
+
File.join(directory.file_path, name)
|
173
|
+
else
|
174
|
+
nil
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.get_directory(directory, name)
|
179
|
+
if directory.is_a?(Hash)
|
180
|
+
directory[name].is_a?(Hash) ? directory[name] : nil
|
181
|
+
else
|
182
|
+
result = directory.child(name)
|
183
|
+
result.dir? ? result : nil
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def self.list(directory)
|
188
|
+
if directory.is_a?(Hash)
|
189
|
+
directory.keys
|
190
|
+
else
|
191
|
+
directory.children.map { |c| c.name }
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.load_child_files(parent, key, recursive)
|
196
|
+
result = load_files(get_directory(parent, key), recursive)
|
197
|
+
result.each do |file|
|
198
|
+
file[:path] = "#{key}/#{file[:path]}"
|
199
|
+
end
|
200
|
+
result
|
201
|
+
end
|
202
|
+
|
203
|
+
def self.load_files(directory, recursive)
|
204
|
+
result = []
|
205
|
+
if directory
|
206
|
+
list(directory).each do |child_name|
|
207
|
+
dir = get_directory(directory, child_name)
|
208
|
+
if dir
|
209
|
+
if recursive
|
210
|
+
result += load_child_files(directory, child_name, recursive)
|
211
|
+
end
|
212
|
+
else
|
213
|
+
result += load_file(read_file(directory, child_name), child_name)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
result
|
218
|
+
end
|
219
|
+
|
220
|
+
def self.load_file(value, name)
|
221
|
+
[{
|
222
|
+
:name => name,
|
223
|
+
:path => name,
|
224
|
+
:checksum => Digest::MD5.hexdigest(value),
|
225
|
+
:specificity => 'default'
|
226
|
+
}]
|
227
|
+
end
|
228
|
+
|
229
|
+
def self.set_specificity(files)
|
230
|
+
files.each do |file|
|
231
|
+
parts = file[:path].split('/')
|
232
|
+
raise "Only directories are allowed directly under templates or files: #{file[:path]}" if parts.size == 2
|
233
|
+
file[:specificity] = parts[1]
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
CookbookData = ChefData::CookbookData
|
240
|
+
end
|