class Chef::Environment

Constants

COMBINED_COOKBOOK_CONSTRAINT
DEFAULT

Public Class Methods

chef_server_rest() click to toggle source
# File lib/chef/environment.rb, line 53
def self.chef_server_rest
  Chef::ServerAPI.new(Chef::Config[:chef_server_url])
end
from_hash(o) click to toggle source
# File lib/chef/environment.rb, line 219
def self.from_hash(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
end
list(inflate = false) click to toggle source
# File lib/chef/environment.rb, line 229
def self.list(inflate = false)
  if inflate
    response = {}
    Chef::Search::Query.new.search(:environment) do |e|
      response[e.name] = e unless e.nil?
    end
    response
  else
    chef_server_rest.get("environments")
  end
end
load(name) click to toggle source
# File lib/chef/environment.rb, line 241
def self.load(name)
  if Chef::Config[:solo_legacy_mode]
    load_from_file(name)
  else
    from_hash(chef_server_rest.get("environments/#{name}"))
  end
end
load_filtered_recipe_list(environment) click to toggle source
# File lib/chef/environment.rb, line 291
def self.load_filtered_recipe_list(environment)
  chef_server_rest.get("environments/#{environment}/recipes")
end
load_from_file(name) click to toggle source
# File lib/chef/environment.rb, line 249
def self.load_from_file(name)
  unless File.directory?(Chef::Config[:environment_path])
    raise Chef::Exceptions::InvalidEnvironmentPath, "Environment path '#{Chef::Config[:environment_path]}' is invalid"
  end

  js_file = File.join(Chef::Config[:environment_path], "#{name}.json")
  rb_file = File.join(Chef::Config[:environment_path], "#{name}.rb")

  if File.exist?(js_file)
    # from_json returns object.class => json_class in the JSON.
    hash = Chef::JSONCompat.parse(IO.read(js_file))
    from_hash(hash)
  elsif File.exist?(rb_file)
    environment = Chef::Environment.new
    environment.name(name)
    environment.from_file(rb_file)
    environment
  else
    raise Chef::Exceptions::EnvironmentNotFound, "Environment '#{name}' could not be loaded from disk"
  end
end
new(chef_server_rest: nil) click to toggle source
# File lib/chef/environment.rb, line 40
def initialize(chef_server_rest: nil)
  @name = ""
  @description = ""
  @default_attributes = Mash.new
  @override_attributes = Mash.new
  @cookbook_versions = {}
  @chef_server_rest = chef_server_rest
end
validate_cookbook_version(version) click to toggle source
# File lib/chef/environment.rb, line 308
def self.validate_cookbook_version(version)
  if Chef::Config[:solo_legacy_mode]
    raise Chef::Exceptions::IllegalVersionConstraint,
      "Environment cookbook version constraints not allowed in #{ChefUtils::Dist::Solo::PRODUCT}"
  else
    Chef::VersionConstraint.new version
    true
  end
rescue ArgumentError
  false
end
validate_cookbook_versions(cv) click to toggle source
# File lib/chef/environment.rb, line 299
def self.validate_cookbook_versions(cv)
  return false unless cv.is_a?(Hash)

  cv.each_value do |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 201
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
chef_server_rest() click to toggle source
# File lib/chef/environment.rb, line 49
def chef_server_rest
  @chef_server_rest ||= Chef::ServerAPI.new(Chef::Config[:chef_server_url])
end
cookbook(cookbook, version) click to toggle source
# File lib/chef/environment.rb, line 110
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 97
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
create() click to toggle source
# File lib/chef/environment.rb, line 286
def create
  chef_server_rest.post("environments", self)
  self
end
default_attributes(arg = nil) click to toggle source
# File lib/chef/environment.rb, line 73
def default_attributes(arg = nil)
  set_or_return(
    :default_attributes,
    arg,
    kind_of: Hash
  )
end
default_attributes=(attrs) click to toggle source
# File lib/chef/environment.rb, line 81
def default_attributes=(attrs)
  default_attributes(attrs)
end
description(arg = nil) click to toggle source
# File lib/chef/environment.rb, line 65
def description(arg = nil)
  set_or_return(
    :description,
    arg,
    kind_of: String
  )
end
destroy() click to toggle source
# File lib/chef/environment.rb, line 271
def destroy
  chef_server_rest.delete("environments/#{@name}")
end
invalid_fields() click to toggle source
# File lib/chef/environment.rb, line 206
def invalid_fields
  @invalid_fields ||= {}
end
name(arg = nil) click to toggle source
# File lib/chef/environment.rb, line 57
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 85
def override_attributes(arg = nil)
  set_or_return(
    :override_attributes,
    arg,
    kind_of: Hash
  )
end
override_attributes=(attrs) click to toggle source
# File lib/chef/environment.rb, line 93
def override_attributes=(attrs)
  override_attributes(attrs)
end
save() click to toggle source
# File lib/chef/environment.rb, line 275
def save
  begin
    chef_server_rest.put("environments/#{@name}", self)
  rescue Net::HTTPClientException => e
    raise e unless e.response.code == "404"

    chef_server_rest.post("environments", self)
  end
  self
end
to_h() click to toggle source
# File lib/chef/environment.rb, line 121
def to_h
  {
    "name" => @name,
    "description" => @description,
    "cookbook_versions" => @cookbook_versions,
    "json_class" => self.class.name,
    "chef_type" => "environment",
    "default_attributes" => @default_attributes,
    "override_attributes" => @override_attributes,
  }
end
Also aliased as: to_hash
to_hash()
Alias for: to_h
to_json(*a) click to toggle source
# File lib/chef/environment.rb, line 135
def to_json(*a)
  Chef::JSONCompat.to_json(to_h, *a)
end
to_s() click to toggle source
# File lib/chef/environment.rb, line 295
def to_s
  @name
end
update_attributes_from_params(params) click to toggle source
# File lib/chef/environment.rb, line 147
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 186
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 139
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 156
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({})
  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 &&= 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 210
def validate_required_attrs_present
  if name.nil? || name.size == 0
    invalid_fields[:name] ||= "name cannot be empty"
    false
  else
    true
  end
end