class Chef::DataBag

Constants

RESERVED_NAMES
VALID_NAME

Public Class Methods

chef_server_rest() click to toggle source
# File lib/chef/data_bag.rb, line 81
def self.chef_server_rest
  Chef::ServerAPI.new(Chef::Config[:chef_server_url])
end
from_hash(o) click to toggle source
# File lib/chef/data_bag.rb, line 85
def self.from_hash(o)
  bag = new
  bag.name(o["name"])
  bag
end
list(inflate = false) click to toggle source
# File lib/chef/data_bag.rb, line 91
def self.list(inflate = false)
  if Chef::Config[:solo_legacy_mode]
    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_dir(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::ServerAPI.new(Chef::Config[:chef_server_url]).get("data")
    end
  end
end
load(name) click to toggle source

Load a Data Bag by name via either the RESTful API or local data_bag_path if run in solo mode

# File lib/chef/data_bag.rb, line 118
def self.load(name)
  if Chef::Config[:solo_legacy_mode]
    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_dir(path, name.to_s), "*.json")).inject({}) do |bag, f|
        item = Chef::JSONCompat.parse(IO.read(f))

        # Check if we have multiple items with similar names (ids) and raise if their content differs
        if data_bag.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
    data_bag
  else
    Chef::ServerAPI.new(Chef::Config[:chef_server_url]).get("data/#{name}")
  end
end
new(chef_server_rest: nil) click to toggle source

Create a new Chef::DataBag

# File lib/chef/data_bag.rb, line 48
def initialize(chef_server_rest: nil)
  @name = ""
  @chef_server_rest = chef_server_rest
end
validate_name!(name) click to toggle source
# File lib/chef/data_bag.rb, line 38
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
  if name =~ RESERVED_NAMES
    raise Exceptions::InvalidDataBagName, "DataBags may not have a name matching #{RESERVED_NAMES.inspect}, you gave #{name.inspect}"
  end
end

Public Instance Methods

chef_server_rest() click to toggle source
# File lib/chef/data_bag.rb, line 77
def chef_server_rest
  @chef_server_rest ||= Chef::ServerAPI.new(Chef::Config[:chef_server_url])
end
create() click to toggle source

create a data bag via RESTful API

# File lib/chef/data_bag.rb, line 163
def create
  chef_server_rest.post("data", self)
  self
end
destroy() click to toggle source
# File lib/chef/data_bag.rb, line 144
def destroy
  chef_server_rest.delete("data/#{@name}")
end
name(arg = nil) click to toggle source
# File lib/chef/data_bag.rb, line 53
def name(arg = nil)
  set_or_return(
    :name,
    arg,
    regex: VALID_NAME
  )
end
save() click to toggle source

Save the Data Bag via RESTful API

# File lib/chef/data_bag.rb, line 149
def save
  begin
    if Chef::Config[:why_run]
      Chef::Log.warn("In why-run mode, so NOT performing data bag save.")
    else
      create
    end
  rescue Net::HTTPClientException => e
    raise e unless e.response.code == "409"
  end
  self
end
to_h() click to toggle source
# File lib/chef/data_bag.rb, line 61
def to_h
  result = {
    "name" => @name,
    "json_class" => self.class.name,
    "chef_type" => "data_bag",
  }
  result
end
Also aliased as: to_hash
to_hash()
Alias for: to_h
to_json(*a) click to toggle source

Serialize this object as a hash

# File lib/chef/data_bag.rb, line 73
def to_json(*a)
  Chef::JSONCompat.to_json(to_h, *a)
end
to_s() click to toggle source

As a string

# File lib/chef/data_bag.rb, line 169
def to_s
  "data_bag[#{@name}]"
end