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

#lazy, #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
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/chef/data_bag.rb', line 84

def self.list(inflate=false)
  if Chef::Config[:solo]
    paths = Array(Chef::Config[:data_bag_path])
    names = []
    paths.each do |path|
      unless File.directory?(path)
        raise Chef::Exceptions::InvalidDataBagPath, "Data bag path '#{path}' is invalid"
      end

      names += Dir.glob(File.join(Chef::Util::PathHelper.escape_glob(path), "*")).map{|f|File.basename(f)}.sort
    end
    names.inject({}) {|h, n| h[n] = n; h}
  else
    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
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



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/chef/data_bag.rb', line 110

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

      Dir.glob(File.join(Chef::Util::PathHelper.escape_glob(path, name.to_s), "*.json")).inject({}) do |bag, f|
        item = Chef::JSONCompat.from_json(IO.read(f))

        # Check if we have multiple items with similar names (ids) and raise if their content differs
        if data_bag.has_key?(item["id"]) && data_bag[item["id"]] != item
          raise Chef::Exceptions::DuplicateDataBagItem, "Data bag '#{name}' has items with the same name '#{item["id"]}' but different content."
        else
          data_bag[item["id"]] = item
        end
      end
    end
    return data_bag
  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



155
156
157
158
# File 'lib/chef/data_bag.rb', line 155

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

#destroyObject



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

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



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/chef/data_bag.rb', line 141

def save
  begin
    if Chef::Config[:why_run]
      Chef::Log.warn("In whyrun mode, so NOT performing data bag save.")
    else
      create
    end
  rescue Net::HTTPServerException => e
    raise e unless e.response.code == "409"
  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)
  Chef::JSONCompat.to_json(to_hash, *a)
end

#to_sObject

As a string



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

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