Class: Chef::DataBag

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

Constant Summary collapse

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

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



43
44
45
# File 'lib/chef/data_bag.rb', line 43

def initialize
  @name = ''
end

Class Method Details

.chef_server_restObject



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

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

.json_create(o) ⇒ Object

Create a Chef::Role from JSON



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

def self.json_create(o)
  bag = new
  bag.name(o["name"])
  bag
end

.list(inflate = false) ⇒ Object



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

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 either the RESTful API or local data_bag_path if run in solo mode



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/chef/data_bag.rb', line 97

def self.load(name)
  if Chef::Config[:solo]
    unless File.directory?(Chef::Config[:data_bag_path])
      raise Chef::Exceptions::InvalidDataBagPath, "Data bag path '#{Chef::Config[:data_bag_path]}' is invalid"
    end

    Dir.glob(File.join(Chef::Config[:data_bag_path], "#{name}", "*.json")).inject({}) do |bag, f|
      item = Chef::JSONCompat.from_json(IO.read(f))
      bag[item['id']] = item
      bag
    end
  else
    Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("data/#{name}")
  end
end

.validate_name!(name) ⇒ Object



36
37
38
39
40
# File 'lib/chef/data_bag.rb', line 36

def self.validate_name!(name)
  unless name =~ VALID_NAME
    raise Exceptions::InvalidDataBagName, "DataBags must have a name matching #{VALID_NAME.inspect}, you gave #{name.inspect}"
  end
end

Instance Method Details

#chef_server_restObject



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

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

#createObject

create a data bag via RESTful API



133
134
135
136
# File 'lib/chef/data_bag.rb', line 133

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

#destroyObject



113
114
115
# File 'lib/chef/data_bag.rb', line 113

def destroy
  chef_server_rest.delete_rest("data/#{@name}")
end

#name(arg = nil) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/chef/data_bag.rb', line 47

def name(arg=nil)
  set_or_return(
    :name,
    arg,
    :regex => VALID_NAME
  )
end

#saveObject

Save the Data Bag via RESTful API



118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/chef/data_bag.rb', line 118

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

#to_hashObject



55
56
57
58
59
60
61
62
# File 'lib/chef/data_bag.rb', line 55

def to_hash
  result = {
    "name" => @name,
    'json_class' => self.class.name,
    "chef_type" => "data_bag",
  }
  result
end

#to_json(*a) ⇒ Object

Serialize this object as a hash



65
66
67
# File 'lib/chef/data_bag.rb', line 65

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

#to_sObject

As a string



139
140
141
# File 'lib/chef/data_bag.rb', line 139

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