Class: Chef::DataBagItem

Inherits:
Object show all
Extended by:
Forwardable
Includes:
Mixin::FromFile, Mixin::ParamsValidate
Defined in:
lib/chef/data_bag_item.rb

Constant Summary collapse

VALID_ID =
/^[\-[:alnum:]_]+$/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixin::ParamsValidate

#set_or_return, #validate

Methods included from Mixin::FromFile

#class_from_file, #from_file

Constructor Details

#initializeDataBagItem

Create a new Chef::DataBagItem



52
53
54
55
# File 'lib/chef/data_bag_item.rb', line 52

def initialize
  @data_bag = nil
  @raw_data = Mash.new
end

Instance Attribute Details

#raw_dataObject

Returns the value of attribute raw_data.



49
50
51
# File 'lib/chef/data_bag_item.rb', line 49

def raw_data
  @raw_data
end

Class Method Details

.chef_server_restObject



61
62
63
# File 'lib/chef/data_bag_item.rb', line 61

def self.chef_server_rest
  Chef::REST.new(Chef::Config[:chef_server_url])
end

.from_hash(h) ⇒ Object



124
125
126
127
128
# File 'lib/chef/data_bag_item.rb', line 124

def self.from_hash(h)
  item = new
  item.raw_data = h
  item
end

.json_create(o) ⇒ Object

Create a Chef::DataBagItem from JSON



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/chef/data_bag_item.rb', line 131

def self.json_create(o)
  bag_item = new
  bag_item.data_bag(o["data_bag"])
  o.delete("data_bag")
  o.delete("chef_type")
  o.delete("json_class")
  o.delete("name")

  bag_item.raw_data = Mash.new(o["raw_data"])
  bag_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



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/chef/data_bag_item.rb', line 144

def self.load(data_bag, name)
  if Chef::Config[:solo]
    bag = Chef::DataBag.load(data_bag)
    item = bag[name]
  else
    item = Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("data/#{data_bag}/#{name}")
  end

  if item.kind_of?(DataBagItem)
    item
  else
    item = from_hash(item)
    item.data_bag(data_bag)
    item
  end
end

.object_name(data_bag_name, id) ⇒ Object



101
102
103
# File 'lib/chef/data_bag_item.rb', line 101

def self.object_name(data_bag_name, id)
  "data_bag_item_#{data_bag_name}_#{id}"
end

.validate_id!(id_str) ⇒ Object



40
41
42
43
44
# File 'lib/chef/data_bag_item.rb', line 40

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



187
188
189
190
191
192
# File 'lib/chef/data_bag_item.rb', line 187

def ==(other)
  other.respond_to?(:to_hash) &&
  other.respond_to?(:data_bag) &&
  (other.to_hash == to_hash) &&
  (other.data_bag.to_s == data_bag.to_s)
end

#chef_server_restObject



57
58
59
# File 'lib/chef/data_bag_item.rb', line 57

def chef_server_rest
  Chef::REST.new(Chef::Config[:chef_server_url])
end

#createObject

Create this Data Bag Item via RESTful API



182
183
184
185
# File 'lib/chef/data_bag_item.rb', line 182

def create
  chef_server_rest.post_rest("data/#{data_bag}", self)
  self
end

#data_bag(arg = nil) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/chef/data_bag_item.rb', line 81

def data_bag(arg=nil)
  set_or_return(
    :data_bag,
    arg,
    :regex => /^[\-[:alnum:]_]+$/
  )
end

#destroy(data_bag = data_bag, databag_item = name) ⇒ Object



161
162
163
# File 'lib/chef/data_bag_item.rb', line 161

def destroy(data_bag=data_bag, databag_item=name)
  chef_server_rest.delete_rest("data/#{data_bag}/#{databag_item}")
end

#idObject



207
208
209
# File 'lib/chef/data_bag_item.rb', line 207

def id
  @raw_data['id']
end

#inspectObject



199
200
201
# File 'lib/chef/data_bag_item.rb', line 199

def inspect
  "data_bag_item[#{data_bag.inspect}, #{raw_data['id'].inspect}, #{raw_data.inspect}]"
end

#nameObject



89
90
91
# File 'lib/chef/data_bag_item.rb', line 89

def name
  object_name
end

#object_nameObject



93
94
95
96
97
98
99
# File 'lib/chef/data_bag_item.rb', line 93

def object_name
  raise Exceptions::ValidationFailed, "You must have an 'id' or :id key in the raw data" unless raw_data.has_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



203
204
205
# File 'lib/chef/data_bag_item.rb', line 203

def pretty_print(pretty_printer)
  pretty_printer.pp({"data_bag_item('#{data_bag}', '#{id}')" => self.to_hash})
end

#save(item_id = ) ⇒ Object

Save this Data Bag Item via RESTful API



166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/chef/data_bag_item.rb', line 166

def save(item_id=@raw_data['id'])
  r = chef_server_rest
  begin
    if Chef::Config[:why_run]
      Chef::Log.warn("In whyrun mode, so NOT performing data bag item save.")
    else
      r.put_rest("data/#{data_bag}/#{item_id}", self)
    end
  rescue Net::HTTPServerException => e
    raise e unless e.response.code == "404"
    r.post_rest("data/#{data_bag}", self)
  end
  self
end

#to_hashObject



105
106
107
108
109
110
# File 'lib/chef/data_bag_item.rb', line 105

def to_hash
  result = self.raw_data
  result["chef_type"] = "data_bag_item"
  result["data_bag"] = self.data_bag
  result
end

#to_json(*a) ⇒ Object

Serialize this object as a hash



113
114
115
116
117
118
119
120
121
122
# File 'lib/chef/data_bag_item.rb', line 113

def to_json(*a)
  result = {
    "name" => self.object_name,
    "json_class" => self.class.name,
    "chef_type" => "data_bag_item",
    "data_bag" => self.data_bag,
    "raw_data" => self.raw_data
  }
  result.to_json(*a)
end

#to_sObject

As a string



195
196
197
# File 'lib/chef/data_bag_item.rb', line 195

def to_s
  "data_bag_item[#{id}]"
end

#validate_id!(id_str) ⇒ Object



69
70
71
# File 'lib/chef/data_bag_item.rb', line 69

def validate_id!(id_str)
  self.class.validate_id!(id_str)
end