Class: Chef::DataBagItem
Constant Summary
collapse
- VALID_ID =
/^[\.\-[:alnum:]_]+$/.freeze
Instance Attribute Summary collapse
#source_file
Class Method Summary
collapse
Instance Method Summary
collapse
#lazy, #set_or_return, #validate
#class_from_file, #from_file
Constructor Details
#initialize(chef_server_rest: nil) ⇒ DataBagItem
Create a new Chef::DataBagItem
62
63
64
65
66
|
# File 'lib/chef/data_bag_item.rb', line 62
def initialize(chef_server_rest: nil)
@data_bag = nil
@raw_data = Mash.new
@chef_server_rest = chef_server_rest
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *arguments, &block) ⇒ Object
delegate missing methods to the @raw_data Hash
48
49
50
51
52
53
|
# File 'lib/chef/data_bag_item.rb', line 48
def method_missing(method_name, *arguments, &block)
@raw_data.send(method_name, *arguments, &block)
rescue
super
end
|
Instance Attribute Details
#raw_data ⇒ Object
Returns the value of attribute raw_data.
59
60
61
|
# File 'lib/chef/data_bag_item.rb', line 59
def raw_data
@raw_data
end
|
Class Method Details
.chef_server_rest ⇒ Object
72
73
74
|
# File 'lib/chef/data_bag_item.rb', line 72
def self.chef_server_rest
Chef::ServerAPI.new(Chef::Config[:chef_server_url])
end
|
.from_hash(h) ⇒ Object
135
136
137
138
139
140
141
142
143
144
145
146
147
|
# File 'lib/chef/data_bag_item.rb', line 135
def self.from_hash(h)
h.delete("chef_type")
h.delete("json_class")
item = new
item.data_bag(h.delete("data_bag")) if h.key?("data_bag")
if h.key?("raw_data")
item.raw_data = h["raw_data"]
else
item.raw_data = h
end
item
end
|
.load(data_bag, name) ⇒ Object
Load a Data Bag Item by name via either the RESTful API or local data_bag_path if run in solo mode
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
# File 'lib/chef/data_bag_item.rb', line 150
def self.load(data_bag, name)
if Chef::Config[:solo_legacy_mode]
bag = Chef::DataBag.load(data_bag)
raise Exceptions::InvalidDataBagItemID, "Item #{name} not found in data bag #{data_bag}. Other items found: #{bag.keys.join(", ")}" unless bag.include?(name)
item = bag[name]
else
item = Chef::ServerAPI.new(Chef::Config[:chef_server_url]).get("data/#{data_bag}/#{name}")
end
if item.is_a?(DataBagItem)
item
else
item = from_hash(item)
item.data_bag(data_bag)
item
end
end
|
.object_name(data_bag_name, id) ⇒ Object
110
111
112
|
# File 'lib/chef/data_bag_item.rb', line 110
def self.object_name(data_bag_name, id)
"data_bag_item_#{data_bag_name}_#{id}"
end
|
.validate_id!(id_str) ⇒ Object
41
42
43
44
45
|
# File 'lib/chef/data_bag_item.rb', line 41
def self.validate_id!(id_str)
if id_str.nil? || ( id_str !~ VALID_ID )
raise Exceptions::InvalidDataBagItemID, "Data Bag items must have an id matching #{VALID_ID.inspect}, you gave: #{id_str.inspect}"
end
end
|
Instance Method Details
#==(other) ⇒ Object
196
197
198
199
200
201
|
# File 'lib/chef/data_bag_item.rb', line 196
def ==(other)
other.respond_to?(:to_h) &&
other.respond_to?(:data_bag) &&
(other.to_h == to_h) &&
(other.data_bag.to_s == data_bag.to_s)
end
|
#chef_server_rest ⇒ Object
68
69
70
|
# File 'lib/chef/data_bag_item.rb', line 68
def chef_server_rest
@chef_server_rest ||= Chef::ServerAPI.new(Chef::Config[:chef_server_url])
end
|
#create ⇒ Object
Create this Data Bag Item via RESTful API
191
192
193
194
|
# File 'lib/chef/data_bag_item.rb', line 191
def create
chef_server_rest.post("data/#{data_bag}", self)
self
end
|
#data_bag(arg = nil) ⇒ Object
90
91
92
93
94
95
96
|
# File 'lib/chef/data_bag_item.rb', line 90
def data_bag(arg = nil)
set_or_return(
:data_bag,
arg,
regex: /^[\-[:alnum:]_]+$/
)
end
|
#destroy(data_bag = self.data_bag, databag_item = name) ⇒ Object
169
170
171
|
# File 'lib/chef/data_bag_item.rb', line 169
def destroy(data_bag = self.data_bag, databag_item = name)
chef_server_rest.delete("data/#{data_bag}/#{databag_item}")
end
|
#id ⇒ Object
216
217
218
|
# File 'lib/chef/data_bag_item.rb', line 216
def id
@raw_data["id"]
end
|
#inspect ⇒ Object
208
209
210
|
# File 'lib/chef/data_bag_item.rb', line 208
def inspect
"data_bag_item[#{data_bag.inspect}, #{raw_data["id"].inspect}, #{raw_data.inspect}]"
end
|
#name ⇒ Object
98
99
100
|
# File 'lib/chef/data_bag_item.rb', line 98
def name
object_name
end
|
#object_name ⇒ Object
102
103
104
105
106
107
108
|
# File 'lib/chef/data_bag_item.rb', line 102
def object_name
raise Exceptions::ValidationFailed, "You must have an 'id' or :id key in the raw data" unless raw_data.key?("id")
raise Exceptions::ValidationFailed, "You must have declared what bag this item belongs to!" unless data_bag
id = raw_data["id"]
"data_bag_item_#{data_bag}_#{id}"
end
|
#pretty_print(pretty_printer) ⇒ Object
212
213
214
|
# File 'lib/chef/data_bag_item.rb', line 212
def pretty_print(pretty_printer)
pretty_printer.pp({ "data_bag_item('#{data_bag}', '#{id}')" => to_hash })
end
|
#respond_to_missing?(method_name, include_private = false) ⇒ Boolean
55
56
57
|
# File 'lib/chef/data_bag_item.rb', line 55
def respond_to_missing?(method_name, include_private = false)
@raw_data.respond_to?(method_name, include_private) || super
end
|
#save(item_id = ) ⇒ Object
Save this Data Bag Item via RESTful API
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
# File 'lib/chef/data_bag_item.rb', line 174
def save(item_id = @raw_data["id"])
r = chef_server_rest
begin
if Chef::Config[:why_run]
Chef::Log.warn("In why-run mode, so NOT performing data bag item save.")
else
r.put("data/#{data_bag}/#{item_id}", self)
end
rescue Net::HTTPClientException => e
raise e unless e.response.code == "404"
r.post("data/#{data_bag}", self)
end
self
end
|
#to_h ⇒ Object
Also known as:
to_hash
114
115
116
117
118
119
|
# File 'lib/chef/data_bag_item.rb', line 114
def to_h
result = raw_data.dup
result["chef_type"] = "data_bag_item"
result["data_bag"] = data_bag.to_s
result
end
|
#to_json(*a) ⇒ Object
Serialize this object as a hash
124
125
126
127
128
129
130
131
132
133
|
# File 'lib/chef/data_bag_item.rb', line 124
def to_json(*a)
result = {
"name" => object_name,
"json_class" => self.class.name,
"chef_type" => "data_bag_item",
"data_bag" => data_bag,
"raw_data" => raw_data,
}
Chef::JSONCompat.to_json(result, *a)
end
|
#to_s ⇒ Object
204
205
206
|
# File 'lib/chef/data_bag_item.rb', line 204
def to_s
"data_bag_item[#{id}]"
end
|
#validate_id!(id_str) ⇒ Object
76
77
78
|
# File 'lib/chef/data_bag_item.rb', line 76
def validate_id!(id_str)
self.class.validate_id!(id_str)
end
|