Class: Chef::DataBag

Inherits:
Object show all
Includes:
Mixin::FromFile, Mixin::ParamsValidate
Defined in:
lib/chef/data_bag.rb

Constant Summary collapse

DESIGN_DOCUMENT =
{
  "version" => 2,
  "language" => "javascript",
  "views" => {
    "all" => {
      "map" => <<-EOJS
      function(doc) { 
        if (doc.chef_type == "data_bag") {
          emit(doc.name, doc);
        }
      }
      EOJS
    },
    "all_id" => {
      "map" => <<-EOJS
      function(doc) { 
        if (doc.chef_type == "data_bag") {
          emit(doc.name, doc.name);
        }
      }
      EOJS
    },
    "entries" => {
      "map" => <<-EOJS
      function(doc) {
        if (doc.chef_type == "data_bag_item") {
          emit(doc.data_bag, doc.raw_data.id);
        }
      }
      EOJS
    }
  }
}

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

#initializeDataBag

Create a new Chef::DataBag



71
72
73
74
75
76
# File 'lib/chef/data_bag.rb', line 71

def initialize
  @name = '' 
  @couchdb_rev = nil
  @couchdb_id = nil
  @couchdb = Chef::CouchDB.new 
end

Instance Attribute Details

#couchdb_idObject

Returns the value of attribute couchdb_id.



68
69
70
# File 'lib/chef/data_bag.rb', line 68

def couchdb_id
  @couchdb_id
end

#couchdb_revObject

Returns the value of attribute couchdb_rev.



68
69
70
# File 'lib/chef/data_bag.rb', line 68

def couchdb_rev
  @couchdb_rev
end

Class Method Details

.cdb_list(inflate = false) ⇒ Object

List all the Chef::DataBag objects in the CouchDB. If inflate is set to true, you will get the full list of all Roles, fully inflated.



112
113
114
115
116
117
118
119
120
# File 'lib/chef/data_bag.rb', line 112

def self.cdb_list(inflate=false)
  couchdb = Chef::CouchDB.new
  rs = couchdb.list("data_bags", inflate)
  if inflate
    rs["rows"].collect { |r| r["value"] }
  else
    rs["rows"].collect { |r| r["key"] }
  end
end

.cdb_load(name) ⇒ Object

Load a Data Bag by name from CouchDB



136
137
138
139
# File 'lib/chef/data_bag.rb', line 136

def self.cdb_load(name)
  couchdb = Chef::CouchDB.new
  couchdb.load("data_bag", name)
end

.create_design_documentObject

Set up our CouchDB design document



204
205
206
207
# File 'lib/chef/data_bag.rb', line 204

def self.create_design_document
  couchdb = Chef::CouchDB.new
  couchdb.create_design_document("data_bags", DESIGN_DOCUMENT)
end

.json_create(o) ⇒ Object

Create a Chef::Role from JSON



102
103
104
105
106
107
108
# File 'lib/chef/data_bag.rb', line 102

def self.json_create(o)
  bag = new
  bag.name(o["name"])
  bag.couchdb_rev = o["_rev"] if o.has_key?("_rev")
  bag.couchdb_id = o["_id"] if o.has_key?("_id")
  bag
end

.list(inflate = false) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/chef/data_bag.rb', line 122

def self.list(inflate=false)
  r = Chef::REST.new(Chef::Config[:chef_server_url])
  if inflate
    response = Hash.new
    Chef::Search::Query.new.search(:data) do |n|
      response[n.name] = n
    end
    response
  else
    r.get_rest("data")
  end
end

.load(name) ⇒ Object

Load a Data Bag by name via the RESTful API



142
143
144
145
# File 'lib/chef/data_bag.rb', line 142

def self.load(name)
  r = Chef::REST.new(Chef::Config[:chef_server_url])
  r.get_rest("data/#{name}")
end

Instance Method Details

#cdb_destroyObject

Remove this Data Bag from CouchDB



148
149
150
151
152
153
154
155
# File 'lib/chef/data_bag.rb', line 148

def cdb_destroy
  removed = @couchdb.delete("data_bag", @name, @couchdb_rev)
  rs = @couchdb.get_view("data_bags", "entries", :include_docs => true, :startkey => @name, :endkey => @name)
  rs["rows"].each do |row|
    row["doc"].cdb_destroy
  end
  removed
end

#cdb_saveObject

Save this Data Bag to the CouchDB



163
164
165
166
# File 'lib/chef/data_bag.rb', line 163

def cdb_save
  results = @couchdb.store("data_bag", @name, self)
  @couchdb_rev = results["rev"]
end

#createObject

create a data bag via RESTful API



184
185
186
187
188
# File 'lib/chef/data_bag.rb', line 184

def create
  r = Chef::REST.new(Chef::Config[:chef_server_url])
  r.post_rest("data", self)
  self
end

#destroyObject



157
158
159
160
# File 'lib/chef/data_bag.rb', line 157

def destroy
  r = Chef::REST.new(Chef::Config[:chef_server_url])
  r.delete_rest("data/#{@name}")
end

#list(inflate = false) ⇒ Object

List all the items in this Bag from CouchDB The self.load method does this through the REST API



192
193
194
195
196
197
198
199
200
201
# File 'lib/chef/data_bag.rb', line 192

def list(inflate=false)
  rs = nil 
  if inflate
    rs = @couchdb.get_view("data_bags", "entries", :include_docs => true, :startkey => @name, :endkey => @name)
    rs["rows"].collect { |r| r["doc"] }
  else
    rs = @couchdb.get_view("data_bags", "entries", :startkey => @name, :endkey => @name)
    rs["rows"].collect { |r| r["value"] }
  end
end

#name(arg = nil) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/chef/data_bag.rb', line 78

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

#saveObject

Save the Data Bag via RESTful API



169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/chef/data_bag.rb', line 169

def save
  r = Chef::REST.new(Chef::Config[:chef_server_url])
  begin
    r.put_rest("data/#{@name}", self)
  rescue Net::HTTPServerException => e
    if e.response.code == "404"
      r.post_rest("data", self)
    else
      raise e
    end
  end
  self
end

#to_hashObject



86
87
88
89
90
91
92
93
94
# File 'lib/chef/data_bag.rb', line 86

def to_hash
  result = {
    "name" => @name,
    'json_class' => self.class.name,
    "chef_type" => "data_bag",
  }
  result["_rev"] = @couchdb_rev if @couchdb_rev
  result
end

#to_json(*a) ⇒ Object

Serialize this object as a hash



97
98
99
# File 'lib/chef/data_bag.rb', line 97

def to_json(*a)
  to_hash.to_json(*a)
end

#to_sObject

As a string



210
211
212
# File 'lib/chef/data_bag.rb', line 210

def to_s
  "data_bag[#{@name}]"
end