Parent

Class/Module Index [+]

Quicksearch

Chef::Environment

Attributes

couchdb[RW]
couchdb_id[R]
couchdb_rev[RW]

Public Class Methods

cdb_list(inflate=false, couchdb=nil) click to toggle source
# File lib/chef/environment.rb, line 260
def self.cdb_list(inflate=false, couchdb=nil)
  es = (couchdb || Chef::CouchDB.new).list("environments", inflate)
  lookup = (inflate ? "value" : "key")
  es["rows"].collect { |e| e[lookup] }
end
cdb_load(name, couchdb=nil) click to toggle source
# File lib/chef/environment.rb, line 278
def self.cdb_load(name, couchdb=nil)
  (couchdb || Chef::CouchDB.new).load("environment", name)
end
cdb_load_filtered_cookbook_versions(name, couchdb=nil) click to toggle source

Loads the set of Chef::CookbookVersion objects available to a given environment

Returns

Hash i.e. {

"cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest

}

There will be a key for every cookbook. If no CookbookVersions are available for the specified environment the value will be an empty list.

# File lib/chef/environment.rb, line 338
def self.cdb_load_filtered_cookbook_versions(name, couchdb=nil)
  version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}

  # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
  cookbook_list = Chef::CookbookVersion.cdb_list(true, couchdb)

  filtered_list = cookbook_list.inject({}) do |res, cookbook|
    # FIXME: should cookbook.version return a Chef::Version?
    version               = Chef::Version.new(cookbook.version)
    requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
    # we want a key for every cookbook, even if no versions are available
    res[cookbook.name] ||= []
    res[cookbook.name] << cookbook if requirement_satisfied
    res
  end

  sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
    res[cookbook_name] = versions.sort.reverse
    res
  end

  sorted_list
end
cdb_load_filtered_recipe_list(name, couchdb=nil) click to toggle source
# File lib/chef/environment.rb, line 403
def self.cdb_load_filtered_recipe_list(name, couchdb=nil)
  cdb_load_filtered_cookbook_versions(name, couchdb).map do |cb_name, cb|
    if cb.empty?            # no available versions
      []                    # empty list elided with flatten
    else
      latest_version = cb.first
      latest_version.recipe_filenames_by_name.keys.map do |recipe|
        case recipe
        when DEFAULT
          cb_name
        else
          "#{cb_name}::#{recipe}"
        end
      end
    end
  end.flatten
end
cdb_minimal_filtered_versions(name, couchdb=nil) click to toggle source

Like cdb_load_filtered_cookbook_versions, loads the set of cookbooks available in a given environment. The difference is that this method will load Chef::MinimalCookbookVersion objects that contain only the information necessary for solving a cookbook collection for a given run list. The user of this method must call Chef::MinimalCookbookVersion.load_full_versions_of() after solving the cookbook collection to get the full objects.

Returns

Hash i.e. {

"cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest

}

There will be a key for every cookbook. If no CookbookVersions are available for the specified environment the value will be an empty list.

# File lib/chef/environment.rb, line 379
def self.cdb_minimal_filtered_versions(name, couchdb=nil)
  version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}

  # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
  cookbook_list = Chef::MinimalCookbookVersion.load_all(couchdb)

  filtered_list = cookbook_list.inject({}) do |res, cookbook|
    # FIXME: should cookbook.version return a Chef::Version?
    version               = Chef::Version.new(cookbook.version)
    requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
    # we want a key for every cookbook, even if no versions are available
    res[cookbook.name] ||= []
    res[cookbook.name] << cookbook if requirement_satisfied
    res
  end

  sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
    res[cookbook_name] = versions.sort.reverse
    res
  end

  sorted_list
end
chef_server_rest() click to toggle source
# File lib/chef/environment.rb, line 88
def self.chef_server_rest
  Chef::REST.new(Chef::Config[:chef_server_url])
end
create_default_environment(couchdb=nil) click to toggle source
# File lib/chef/environment.rb, line 446
def self.create_default_environment(couchdb=nil)
  couchdb = couchdb || Chef::CouchDB.new
  begin
    Chef::Environment.cdb_load('_default', couchdb)
  rescue Chef::Exceptions::CouchDBNotFound
    env = Chef::Environment.new(couchdb)
    env.name '_default'
    env.description 'The default Chef environment'
    env.cdb_save
  end
end
create_design_document(couchdb=nil) click to toggle source

Set up our CouchDB design document

# File lib/chef/environment.rb, line 322
def self.create_design_document(couchdb=nil)
  (couchdb || Chef::CouchDB.new).create_design_document("environments", DESIGN_DOCUMENT)
end
exists?(name, couchdb) click to toggle source
# File lib/chef/environment.rb, line 286
def self.exists?(name, couchdb)
  begin
    self.cdb_load(name, couchdb)
  rescue Chef::Exceptions::CouchDBNotFound
    nil
  end
end
json_create(o) click to toggle source
# File lib/chef/environment.rb, line 248
def self.json_create(o)
  environment = new
  environment.name(o["name"])
  environment.description(o["description"])
  environment.cookbook_versions(o["cookbook_versions"])
  environment.default_attributes(o["default_attributes"])
  environment.override_attributes(o["override_attributes"])
  environment.couchdb_rev = o["_rev"] if o.has_key?("_rev")
  environment.couchdb_id = o["_id"] if o.has_key?("_id")
  environment
end
list(inflate=false) click to toggle source
# File lib/chef/environment.rb, line 266
def self.list(inflate=false)
  if inflate
    response = Hash.new
    Chef::Search::Query.new.search(:environment) do |e|
      response[e.name] = e unless e.nil?
    end
    response
  else
    chef_server_rest.get_rest("environments")
  end
end
load(name) click to toggle source
# File lib/chef/environment.rb, line 282
def self.load(name)
  chef_server_rest.get_rest("environments/#{name}")
end
load_filtered_recipe_list(environment) click to toggle source
# File lib/chef/environment.rb, line 421
def self.load_filtered_recipe_list(environment)
  chef_server_rest.get_rest("environments/#{environment}/recipes")
end
new(couchdb=nil) click to toggle source
# File lib/chef/environment.rb, line 68
def initialize(couchdb=nil)
  @name = ''
  @description = ''
  @default_attributes = Mash.new
  @override_attributes = Mash.new
  @cookbook_versions = Hash.new
  @couchdb_rev = nil
  @couchdb_id = nil
  @couchdb = couchdb || Chef::CouchDB.new
end
validate_cookbook_version(version) click to toggle source
# File lib/chef/environment.rb, line 437
def self.validate_cookbook_version(version)
  begin
    Chef::VersionConstraint.new version
    true
  rescue ArgumentError
    false
  end
end
validate_cookbook_versions(cv) click to toggle source
# File lib/chef/environment.rb, line 429
def self.validate_cookbook_versions(cv)
  return false unless cv.kind_of?(Hash)
  cv.each do |cookbook, version|
    return false unless Chef::Environment.validate_cookbook_version(version)
  end
  true
end

Public Instance Methods

add_cookbook_constraint_error(index, cookbook_constraint_spec) click to toggle source
# File lib/chef/environment.rb, line 229
def add_cookbook_constraint_error(index, cookbook_constraint_spec)
  invalid_fields[:cookbook_version] ||= {}
  invalid_fields[:cookbook_version][index] = "#{cookbook_constraint_spec} is not a valid cookbook constraint"
end
cdb_destroy() click to toggle source
# File lib/chef/environment.rb, line 294
def cdb_destroy
  couchdb.delete("environment", @name, couchdb_rev)
end
cdb_save() click to toggle source
# File lib/chef/environment.rb, line 302
def cdb_save
  self.couchdb_rev = couchdb.store("environment", @name, self)["rev"]
end
chef_server_rest() click to toggle source
# File lib/chef/environment.rb, line 84
def chef_server_rest
  Chef::REST.new(Chef::Config[:chef_server_url])
end
cookbook(cookbook, version) click to toggle source
# File lib/chef/environment.rb, line 137
def cookbook(cookbook, version)
  validate({
    :version => version
  },{
    :version => {
      :callbacks => { "should be a valid version requirement" => lambda { |v| Chef::Environment.validate_cookbook_version(v) } }
    }
  })
  @cookbook_versions[cookbook] = version
end
cookbook_versions(arg=nil) click to toggle source
# File lib/chef/environment.rb, line 124
def cookbook_versions(arg=nil)
  set_or_return(
    :cookbook_versions,
    arg,
    {
      :kind_of => Hash,
      :callbacks => {
        "should be a valid set of cookbook version requirements" => lambda { |cv| Chef::Environment.validate_cookbook_versions(cv) }
      }
    }
  )
end
couchdb_id=(value) click to toggle source
# File lib/chef/environment.rb, line 79
def couchdb_id=(value)
  @couchdb_id = value
  self.index_id = value
end
create() click to toggle source
# File lib/chef/environment.rb, line 316
def create
  chef_server_rest.post_rest("environments", self)
  self
end
default_attributes(arg=nil) click to toggle source
# File lib/chef/environment.rb, line 108
def default_attributes(arg=nil)
  set_or_return(
    :default_attributes,
    arg,
    :kind_of => Hash
  )
end
description(arg=nil) click to toggle source
# File lib/chef/environment.rb, line 100
def description(arg=nil)
  set_or_return(
    :description,
    arg,
    :kind_of => String
  )
end
destroy() click to toggle source
# File lib/chef/environment.rb, line 298
def destroy
  chef_server_rest.delete_rest("environments/#{@name}")
end
invalid_fields() click to toggle source
# File lib/chef/environment.rb, line 234
def invalid_fields
  @invalid_fields ||= {}
end
name(arg=nil) click to toggle source
# File lib/chef/environment.rb, line 92
def name(arg=nil)
  set_or_return(
    :name,
    arg,
    { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
  )
end
override_attributes(arg=nil) click to toggle source
# File lib/chef/environment.rb, line 116
def override_attributes(arg=nil)
  set_or_return(
    :override_attributes,
    arg,
    :kind_of => Hash
  )
end
save() click to toggle source
# File lib/chef/environment.rb, line 306
def save
  begin
    chef_server_rest.put_rest("environments/#{@name}", self)
  rescue Net::HTTPServerException => e
    raise e unless e.response.code == "404"
    chef_server_rest.post_rest("environments", self)
  end
  self
end
to_hash() click to toggle source
# File lib/chef/environment.rb, line 148
def to_hash
  result = {
    "name" => @name,
    "description" => @description,
    "cookbook_versions" =>  @cookbook_versions,
    "json_class" => self.class.name,
    "chef_type" => "environment",
    "default_attributes" => @default_attributes,
    "override_attributes" => @override_attributes
  }
  result["_rev"] = couchdb_rev if couchdb_rev
  result
end
to_json(*a) click to toggle source
# File lib/chef/environment.rb, line 162
def to_json(*a)
  to_hash.to_json(*a)
end
to_s() click to toggle source
# File lib/chef/environment.rb, line 425
def to_s
  @name
end
update_attributes_from_params(params) click to toggle source
# File lib/chef/environment.rb, line 175
def update_attributes_from_params(params)
  unless params[:default_attributes].nil? || params[:default_attributes].size == 0
    default_attributes(Chef::JSONCompat.from_json(params[:default_attributes]))
  end
  unless params[:override_attributes].nil? || params[:override_attributes].size == 0
    override_attributes(Chef::JSONCompat.from_json(params[:override_attributes]))
  end
end
update_cookbook_constraint_from_param(index, cookbook_constraint_spec) click to toggle source
# File lib/chef/environment.rb, line 214
def update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
  valid = true
  md = cookbook_constraint_spec.match(COMBINED_COOKBOOK_CONSTRAINT)
  if md.nil? || md[2].nil?
    valid = false
    add_cookbook_constraint_error(index, cookbook_constraint_spec)
  elsif self.class.validate_cookbook_version(md[2])
    cookbook_versions[md[1]] = md[2]
  else
    valid = false
    add_cookbook_constraint_error(index, cookbook_constraint_spec)
  end
  valid
end
update_from!(o) click to toggle source
# File lib/chef/environment.rb, line 166
def update_from!(o)
  description(o.description)
  cookbook_versions(o.cookbook_versions)
  default_attributes(o.default_attributes)
  override_attributes(o.override_attributes)
  self
end
update_from_params(params) click to toggle source
# File lib/chef/environment.rb, line 184
def update_from_params(params)
  # reset because everything we need will be in the params, this is necessary because certain constraints
  # may have been removed in the params and need to be removed from cookbook_versions as well.
  bkup_cb_versions = cookbook_versions
  cookbook_versions(Hash.new)
  valid = true

  begin
    name(params[:name])
  rescue Chef::Exceptions::ValidationFailed => e
    invalid_fields[:name] = e.message
    valid = false
  end
  description(params[:description])

  unless params[:cookbook_version].nil?
    params[:cookbook_version].each do |index, cookbook_constraint_spec|
      unless (cookbook_constraint_spec.nil? || cookbook_constraint_spec.size == 0)
        valid = valid && update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
      end
    end
  end

  update_attributes_from_params(params)

  valid = validate_required_attrs_present && valid
  cookbook_versions(bkup_cb_versions) unless valid # restore the old cookbook_versions if valid is false
  valid
end
validate_required_attrs_present() click to toggle source
# File lib/chef/environment.rb, line 238
def validate_required_attrs_present
  if name.nil? || name.size == 0
    invalid_fields[:name] ||= "name cannot be empty"
    false
  else
    true
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.