Class: Chef::DataBag

Inherits:
Object
  • Object
show all
Includes:
IndexQueue::Indexable, 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

Attributes included from IndexQueue::Indexable

#index_id

Class Method Summary collapse

Instance Method Summary collapse

Methods included from IndexQueue::Indexable

#add_to_index, #delete_from_index, included, #index_object_type, #with_indexer_metadata

Methods included from Mixin::ParamsValidate

#set_or_return, #validate

Methods included from Mixin::FromFile

#class_from_file, #from_file

Constructor Details

#initialize(couchdb = nil) ⇒ DataBag

Create a new Chef::DataBag



74
75
76
77
78
79
# File 'lib/chef/data_bag.rb', line 74

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

Instance Attribute Details

#couchdbObject

Returns the value of attribute couchdb.



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

def couchdb
  @couchdb
end

#couchdb_idObject

Returns the value of attribute couchdb_id.



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

def couchdb_id
  @couchdb_id
end

#couchdb_revObject

Returns the value of attribute couchdb_rev.



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

def couchdb_rev
  @couchdb_rev
end

Class Method Details

.cdb_list(inflate = false, couchdb = nil) ⇒ 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.



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

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

.cdb_load(name, couchdb = nil) ⇒ Object

Load a Data Bag by name from CouchDB



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

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

.chef_server_restObject



108
109
110
# File 'lib/chef/data_bag.rb', line 108

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

.create_design_document(couchdb = nil) ⇒ Object

Set up our CouchDB design document



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

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

.json_create(o) ⇒ Object

Create a Chef::Role from JSON



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

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.index_id = bag.couchdb_id
  bag
end

.list(inflate = false) ⇒ Object



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

def self.list(inflate=false)
  if inflate
    # Can't search for all data bags like other objects, fall back to N+1 :(
    list(false).inject({}) do |response, bag_and_uri|
      response[bag_and_uri.first] = load(bag_and_uri.first)
      response
    end
  else
    Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("data")
  end
end

.load(name) ⇒ Object

Load a Data Bag by name via the RESTful API



148
149
150
# File 'lib/chef/data_bag.rb', line 148

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

Instance Method Details

#cdb_destroyObject

Remove this Data Bag from CouchDB



153
154
155
156
157
158
159
160
161
# File 'lib/chef/data_bag.rb', line 153

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"].couchdb = couchdb
    row["doc"].cdb_destroy
  end
  removed
end

#cdb_saveObject

Save this Data Bag to the CouchDB



168
169
170
171
# File 'lib/chef/data_bag.rb', line 168

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

#chef_server_restObject



104
105
106
# File 'lib/chef/data_bag.rb', line 104

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

#createObject

create a data bag via RESTful API



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

def create
  chef_server_rest.post_rest("data", self)
  self
end

#destroyObject



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

def destroy
  chef_server_rest.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



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

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

#saveObject

Save the Data Bag via RESTful API



174
175
176
177
178
179
180
181
182
# File 'lib/chef/data_bag.rb', line 174

def save
  begin
    chef_server_rest.put_rest("data/#{@name}", self)
  rescue Net::HTTPServerException => e
    raise e unless e.response.code == "404"
    chef_server_rest.post_rest("data", self)
  end
  self
end

#to_hashObject



89
90
91
92
93
94
95
96
97
# File 'lib/chef/data_bag.rb', line 89

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



100
101
102
# File 'lib/chef/data_bag.rb', line 100

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

#to_sObject

As a string



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

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