summaryrefslogtreecommitdiff
path: root/lib/chef/data_bag.rb
diff options
context:
space:
mode:
authorIvan Larionov <ivan.larionov@skype.net>2014-05-31 03:21:17 +0400
committerIvan Larionov <ivan.larionov@skype.net>2014-05-31 03:21:59 +0400
commit58de779995ec2f3adff739ec5170aedf0366ada2 (patch)
treed8581022249cc558f095310a091a48cd402ab8da /lib/chef/data_bag.rb
parentab216f0ee10022b2d9c2a65b6c13c9e75d456ad4 (diff)
downloadchef-58de779995ec2f3adff739ec5170aedf0366ada2.tar.gz
[CHEF-3399] Raise in case of data bag items conflict. Tests.
Diffstat (limited to 'lib/chef/data_bag.rb')
-rw-r--r--lib/chef/data_bag.rb12
1 files changed, 8 insertions, 4 deletions
diff --git a/lib/chef/data_bag.rb b/lib/chef/data_bag.rb
index 91c0fb6869..1133aa3e73 100644
--- a/lib/chef/data_bag.rb
+++ b/lib/chef/data_bag.rb
@@ -116,12 +116,16 @@ class Chef
raise Chef::Exceptions::InvalidDataBagPath, "Data bag path '#{path}' is invalid"
end
- data = Dir.glob(File.join(path, name.to_s, "*.json")).inject({}) do |bag, f|
+ Dir.glob(File.join(path, name.to_s, "*.json")).inject({}) do |bag, f|
item = Chef::JSONCompat.from_json(IO.read(f))
- bag[item["id"]] = item
- bag
+
+ # Check if we have multiple items with similar names (ids) and raise if their content differs
+ if data_bag.has_key?(item["id"]) && data_bag[item["id"]] != item
+ raise Chef::Exceptions::DuplicateDataBagItem, "Data bag '#{name}' has items with the same name '#{item["id"]}' but different content."
+ else
+ data_bag[item["id"]] = item
+ end
end
- data_bag = data.merge(data_bag)
end
return data_bag
else