Class: Chef::Node
- Inherits:
-
Object
- Object
- Chef::Node
- Extended by:
- Forwardable
- Defined in:
- lib/chef/node.rb,
lib/chef/node/attribute.rb,
lib/chef/node/common_api.rb,
lib/chef/node/mixin/state_tracking.rb,
lib/chef/node/attribute_collections.rb,
lib/chef/node/immutable_collections.rb,
lib/chef/node/mixin/deep_merge_cache.rb,
lib/chef/node/mixin/immutablize_hash.rb,
lib/chef/node/mixin/immutablize_array.rb
Defined Under Namespace
Modules: CommonAPI, Immutablize, Mixin Classes: AttrArray, Attribute, ImmutableArray, ImmutableMash, VividMash
Constant Summary collapse
- NULL_ARG =
Object.new
Instance Attribute Summary collapse
-
#chef_server_rest ⇒ Object
Returns the value of attribute chef_server_rest.
-
#override_runlist(*args) ⇒ Object
Returns the value of attribute override_runlist.
-
#recipe_list ⇒ Object
Returns the value of attribute recipe_list.
-
#run_context ⇒ Object
RunContext will set itself as run_context via this setter when initialized.
-
#run_state ⇒ Object
Returns the value of attribute run_state.
Class Method Summary collapse
- .build(node_name) ⇒ Object
- .find_or_create(node_name) ⇒ Object
- .from_hash(o) ⇒ Object
- .list(inflate = false) ⇒ Object
- .list_by_environment(environment, inflate = false) ⇒ Object
-
.load(name) ⇒ Object
Load a node by name.
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #==(other) ⇒ Object
-
#[](attrib) ⇒ Object
Return an attribute of this node.
-
#apply_expansion_attributes(expansion) ⇒ Object
Apply the default and overrides attributes from the expansion passed in, which came from roles.
-
#attribute?(attrib) ⇒ Boolean
Return true if this Node has a given attribute, false if not.
- #attributes ⇒ Object (also: #attribute, #construct_attributes)
- #automatic_attrs ⇒ Object
- #automatic_attrs=(new_values) ⇒ Object
- #chef_environment(arg = nil) ⇒ Object (also: #environment)
- #chef_environment=(environment) ⇒ Object
-
#consume_attributes(attrs) ⇒ Object
Consumes the combined run_list and other attributes in
attrs. -
#consume_chef_environment(attrs) ⇒ Object
chef_environment when set in -j JSON will take precedence over -E ENVIRONMENT.
-
#consume_external_attrs(ohai_data, json_cli_attrs) ⇒ Object
Consume data from ohai and Attributes provided as JSON on the command line.
- #consume_ohai_data(ohai_data) ⇒ Object
-
#consume_run_list(attrs) ⇒ Object
Extracts the run list from
attrsand applies it. -
#create ⇒ Object
Create the node via the REST API.
-
#default ⇒ Object
(also: #default_attrs)
Set a default of this node, but auto-vivify any Mashes that might be missing.
- #default_attrs=(new_values) ⇒ Object
-
#destroy ⇒ Object
Remove this node via the REST API.
- #display_hash ⇒ Object
-
#each(&block) ⇒ Object
Yield each key of the top level to the block.
-
#each_attribute(&block) ⇒ Object
Iterates over each attribute, passing the attribute and value to the block.
-
#expand!(data_source = "server") ⇒ Object
Expands the node’s run list and sets the default and override attributes.
- #for_json ⇒ Object
-
#initialize(chef_server_rest: nil) ⇒ Node
constructor
Create a new Chef::Node object.
-
#loaded_recipe(cookbook, recipe) ⇒ Object
used by include_recipe to add recipes to the expanded run_list to be saved back to the node and be searchable.
-
#method_missing(method, *args, &block) ⇒ Object
Only works for attribute fetches, setting is no longer supported XXX: this should be deprecated.
-
#name(arg = nil) ⇒ Object
Set the name of this Node, or return the current name.
-
#node ⇒ Object
Used by DSL.
-
#normal ⇒ Object
(also: #normal_attrs)
Set a normal attribute of this node, but auto-vivify any Mashes that might be missing.
- #normal_attrs=(new_values) ⇒ Object
-
#override ⇒ Object
(also: #override_attrs)
Set an override attribute of this node, but auto-vivify any Mashes that might be missing.
- #override_attrs=(new_values) ⇒ Object
-
#policy_group(arg = NULL_ARG) ⇒ String
The ‘policy_group` for this node.
-
#policy_group=(policy_group) ⇒ Object
A “non-DSL-style” setter for ‘policy_group`.
-
#policy_name(arg = NULL_ARG) ⇒ String
The ‘policy_name` for this node.
-
#policy_name=(policy_name) ⇒ Object
A “non-DSL-style” setter for ‘policy_name`.
- #primary_runlist ⇒ Object
-
#recipe?(recipe_name) ⇒ Boolean
Returns true if this Node expects a given recipe, false if not.
-
#reset_defaults_and_overrides ⇒ Object
Clear defaults and overrides, so that any deleted attributes between runs are still gone.
-
#respond_to_missing?(method, include_private = false) ⇒ Boolean
Fix respond_to + method so that it works with method_missing delegation.
-
#role?(role_name) ⇒ Boolean
Returns true if this Node expects a given role, false if not.
-
#run_list(*args) ⇒ Object
Returns an Array of roles and recipes, in the order they will be applied.
- #run_list=(list) ⇒ Object
-
#run_list?(item) ⇒ Boolean
Returns true if this Node expects a given role, false if not.
-
#save ⇒ Object
Save this node via the REST API.
- #select_run_list ⇒ Object
- #set ⇒ Object
-
#set_cookbook_attribute ⇒ Object
after the run_context has been set on the node, go through the cookbook_collection and setup the node attribute so that it is published in the node object.
- #tag(*args) ⇒ Object
-
#tags ⇒ Object
Lazy initializer for tags attribute.
-
#to_hash ⇒ Object
Transform the node to a Hash.
-
#to_json(*a) ⇒ Object
Serialize this object as a hash.
- #to_s ⇒ Object
- #update_from!(o) ⇒ Object
Methods included from Mixin::ParamsValidate
#lazy, #set_or_return, #validate
Methods included from Mixin::ShellOut
#a_to_s, #clean_array, #shell_out, #shell_out!, #shell_out_compact, #shell_out_compact!, #shell_out_compact_timeout, #shell_out_compact_timeout!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!
Methods included from Mixin::PathSanity
#enforce_path_sanity, #sanitized_path
Methods included from Mixin::PowershellOut
#powershell_out, #powershell_out!
Methods included from Mixin::WindowsArchitectureHelper
#assert_valid_windows_architecture!, #disable_wow64_file_redirection, #forced_32bit_override_required?, #is_i386_process_on_x86_64_windows?, #node_supports_windows_architecture?, #node_windows_architecture, #restore_wow64_file_redirection, #valid_windows_architecture?, #with_os_architecture, #wow64_architecture_override_required?, #wow64_directory
Methods included from DSL::PlatformIntrospection
#docker?, #platform?, #platform_family?, #value_for_platform, #value_for_platform_family
Methods included from DSL::IncludeAttribute
#include_attribute, #parse_attribute_file_spec
Methods included from Mixin::FromFile
Constructor Details
#initialize(chef_server_rest: nil) ⇒ Node
Create a new Chef::Node object.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/chef/node.rb', line 71 def initialize(chef_server_rest: nil) @chef_server_rest = chef_server_rest @name = nil @chef_environment = "_default" @primary_runlist = Chef::RunList.new @override_runlist = Chef::RunList.new @policy_name = nil @policy_group = nil @attributes = Chef::Node::Attribute.new({}, {}, {}, {}, self) @run_state = {} end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
Only works for attribute fetches, setting is no longer supported XXX: this should be deprecated
266 267 268 |
# File 'lib/chef/node.rb', line 266 def method_missing(method, *args, &block) attributes.public_send(method, *args, &block) end |
Instance Attribute Details
#chef_server_rest ⇒ Object
Returns the value of attribute chef_server_rest.
52 53 54 |
# File 'lib/chef/node.rb', line 52 def chef_server_rest @chef_server_rest end |
#override_runlist(*args) ⇒ Object
Returns the value of attribute override_runlist.
50 51 52 |
# File 'lib/chef/node.rb', line 50 def override_runlist @override_runlist end |
#recipe_list ⇒ Object
Returns the value of attribute recipe_list.
50 51 52 |
# File 'lib/chef/node.rb', line 50 def recipe_list @recipe_list end |
#run_context ⇒ Object
RunContext will set itself as run_context via this setter when initialized. This is needed so DSL::IncludeAttribute (in particular, #include_recipe) can access the run_context to determine if an attributes file has been seen yet. – TODO: This is a pretty ugly way to solve that problem.
60 61 62 |
# File 'lib/chef/node.rb', line 60 def run_context @run_context end |
#run_state ⇒ Object
Returns the value of attribute run_state.
50 51 52 |
# File 'lib/chef/node.rb', line 50 def run_state @run_state end |
Class Method Details
.build(node_name) ⇒ Object
571 572 573 574 575 576 |
# File 'lib/chef/node.rb', line 571 def self.build(node_name) node = new node.name(node_name) node.chef_environment(Chef::Config[:environment]) unless Chef::Config[:environment].nil? || Chef::Config[:environment].chomp.empty? node end |
.find_or_create(node_name) ⇒ Object
563 564 565 566 567 568 569 |
# File 'lib/chef/node.rb', line 563 def self.find_or_create(node_name) load(node_name) rescue Net::HTTPServerException => e raise unless e.response.code == "404" node = build(node_name) node.create end |
.from_hash(o) ⇒ Object
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
# File 'lib/chef/node.rb', line 515 def self.from_hash(o) return o if o.kind_of? Chef::Node node = new node.name(o["name"]) node.chef_environment(o["chef_environment"]) if o.has_key?("attributes") node.normal_attrs = o["attributes"] end node.automatic_attrs = Mash.new(o["automatic"]) if o.has_key?("automatic") node.normal_attrs = Mash.new(o["normal"]) if o.has_key?("normal") node.default_attrs = Mash.new(o["default"]) if o.has_key?("default") node.override_attrs = Mash.new(o["override"]) if o.has_key?("override") if o.has_key?("run_list") node.run_list.reset!(o["run_list"]) elsif o.has_key?("recipes") o["recipes"].each { |r| node.recipes << r } end node.policy_name = o["policy_name"] if o.has_key?("policy_name") node.policy_group = o["policy_group"] if o.has_key?("policy_group") node end |
.list(inflate = false) ⇒ Object
550 551 552 553 554 555 556 557 558 559 560 561 |
# File 'lib/chef/node.rb', line 550 def self.list(inflate = false) if inflate response = Hash.new Chef::Search::Query.new.search(:node) do |n| n = Chef::Node.from_hash(n) response[n.name] = n unless n.nil? end response else Chef::ServerAPI.new(Chef::Config[:chef_server_url]).get("nodes") end end |
.list_by_environment(environment, inflate = false) ⇒ Object
540 541 542 543 544 545 546 547 548 |
# File 'lib/chef/node.rb', line 540 def self.list_by_environment(environment, inflate = false) if inflate response = Hash.new Chef::Search::Query.new.search(:node, "chef_environment:#{environment}") { |n| response[n.name] = n unless n.nil? } response else Chef::ServerAPI.new(Chef::Config[:chef_server_url]).get("environments/#{environment}/nodes") end end |
.load(name) ⇒ Object
Load a node by name
579 580 581 |
# File 'lib/chef/node.rb', line 579 def self.load(name) from_hash(Chef::ServerAPI.new(Chef::Config[:chef_server_url]).get("nodes/#{name}")) end |
Instance Method Details
#<=>(other) ⇒ Object
635 636 637 |
# File 'lib/chef/node.rb', line 635 def <=>(other) name <=> other.name end |
#==(other) ⇒ Object
627 628 629 630 631 632 633 |
# File 'lib/chef/node.rb', line 627 def ==(other) if other.kind_of?(self.class) name == other.name else false end end |
#[](attrib) ⇒ Object
Return an attribute of this node. Returns nil if the attribute is not found.
194 195 196 |
# File 'lib/chef/node.rb', line 194 def [](attrib) attributes[attrib] end |
#apply_expansion_attributes(expansion) ⇒ Object
Apply the default and overrides attributes from the expansion passed in, which came from roles.
435 436 437 438 439 440 441 442 443 444 445 446 447 |
# File 'lib/chef/node.rb', line 435 def apply_expansion_attributes(expansion) loaded_environment = if chef_environment == "_default" Chef::Environment.new.tap { |e| e.name("_default") } else Chef::Environment.load(chef_environment) end attributes.env_default = loaded_environment.default_attributes attributes.env_override = loaded_environment.override_attributes attribute.role_default = expansion.default_attrs attributes.role_override = expansion.override_attrs end |
#attribute?(attrib) ⇒ Boolean
Return true if this Node has a given attribute, false if not. Takes either a symbol or a string.
Only works on the top level. Preferred way is to use the normal [] style lookup and call attribute?()
250 251 252 |
# File 'lib/chef/node.rb', line 250 def attribute?(attrib) attributes.attribute?(attrib) end |
#attributes ⇒ Object Also known as: attribute, construct_attributes
186 187 188 |
# File 'lib/chef/node.rb', line 186 def attributes @attributes end |
#automatic_attrs ⇒ Object
237 238 239 |
# File 'lib/chef/node.rb', line 237 def automatic_attrs attributes.automatic end |
#automatic_attrs=(new_values) ⇒ Object
241 242 243 |
# File 'lib/chef/node.rb', line 241 def automatic_attrs=(new_values) attributes.automatic = new_values end |
#chef_environment(arg = nil) ⇒ Object Also known as: environment
128 129 130 131 132 133 134 |
# File 'lib/chef/node.rb', line 128 def chef_environment(arg = nil) set_or_return( :chef_environment, arg, { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String } ) end |
#chef_environment=(environment) ⇒ Object
136 137 138 |
# File 'lib/chef/node.rb', line 136 def chef_environment=(environment) chef_environment(environment) end |
#consume_attributes(attrs) ⇒ Object
Consumes the combined run_list and other attributes in attrs
346 347 348 349 350 351 352 |
# File 'lib/chef/node.rb', line 346 def consume_attributes(attrs) normal_attrs_to_merge = consume_run_list(attrs) normal_attrs_to_merge = consume_chef_environment(normal_attrs_to_merge) Chef::Log.debug("Applying attributes from json file") self.normal_attrs = Chef::Mixin::DeepMerge.merge(normal_attrs, normal_attrs_to_merge) # make sure they're defined end |
#consume_chef_environment(attrs) ⇒ Object
chef_environment when set in -j JSON will take precedence over -E ENVIRONMENT. Ideally, IMO, the order of precedence should be (lowest to
highest):
config_file
-j JSON
-E ENVIRONMENT
so that users could reuse their JSON and override the chef_environment configured within it with -E ENVIRONMENT. Because command line options are merged with Chef::Config there is currently no way to distinguish between an environment set via config from an environment set via command line.
391 392 393 394 395 396 397 |
# File 'lib/chef/node.rb', line 391 def consume_chef_environment(attrs) attrs = attrs ? attrs.dup : {} if env = attrs.delete("chef_environment") chef_environment(env) end attrs end |
#consume_external_attrs(ohai_data, json_cli_attrs) ⇒ Object
Consume data from ohai and Attributes provided as JSON on the command line.
329 330 331 332 333 334 335 336 337 338 339 |
# File 'lib/chef/node.rb', line 329 def consume_external_attrs(ohai_data, json_cli_attrs) Chef::Log.debug("Extracting run list from JSON attributes provided on command line") consume_attributes(json_cli_attrs) self.automatic_attrs = ohai_data platform, version = Chef::Platform.find_platform_and_version(self) Chef::Log.debug("Platform is #{platform} version #{version}") automatic[:platform] = platform automatic[:platform_version] = version end |
#consume_ohai_data(ohai_data) ⇒ Object
341 342 343 |
# File 'lib/chef/node.rb', line 341 def consume_ohai_data(ohai_data) self.automatic_attrs = Chef::Mixin::DeepMerge.merge(automatic_attrs, ohai_data) end |
#consume_run_list(attrs) ⇒ Object
Extracts the run list from attrs and applies it. Returns the remaining attributes
369 370 371 372 373 374 375 376 377 378 379 |
# File 'lib/chef/node.rb', line 369 def consume_run_list(attrs) attrs = attrs ? attrs.dup : {} if new_run_list = attrs.delete("recipes") || attrs.delete("run_list") if attrs.key?("recipes") || attrs.key?("run_list") raise Chef::Exceptions::AmbiguousRunlistSpecification, "please set the node's run list using the 'run_list' attribute only." end Chef::Log.info("Setting the run_list to #{new_run_list} from CLI options") run_list(new_run_list) end attrs end |
#create ⇒ Object
Create the node via the REST API
609 610 611 612 613 614 615 616 617 618 619 620 621 |
# File 'lib/chef/node.rb', line 609 def create chef_server_rest.post("nodes", data_for_save) self rescue Net::HTTPServerException => e # Chef Server before 12.3 rejects node JSON with 'policy_name' or # 'policy_group' keys, but 'policy_name' will be detected first. # Backcompat can be removed in 13.0 if e.response.code == "400" && e.response.body.include?("Invalid key policy_name") chef_server_rest.post("nodes", data_for_save_without_policyfile_attrs) else raise end end |
#default ⇒ Object Also known as: default_attrs
Set a default of this node, but auto-vivify any Mashes that might be missing
211 212 213 |
# File 'lib/chef/node.rb', line 211 def default attributes.default end |
#default_attrs=(new_values) ⇒ Object
229 230 231 |
# File 'lib/chef/node.rb', line 229 def default_attrs=(new_values) attributes.default = new_values end |
#destroy ⇒ Object
Remove this node via the REST API
584 585 586 |
# File 'lib/chef/node.rb', line 584 def destroy chef_server_rest.delete("nodes/#{name}") end |
#display_hash ⇒ Object
464 465 466 467 468 469 470 471 472 473 474 |
# File 'lib/chef/node.rb', line 464 def display_hash display = {} display["name"] = name display["chef_environment"] = chef_environment display["automatic"] = automatic_attrs display["normal"] = normal_attrs display["default"] = attributes.combined_default display["override"] = attributes.combined_override display["run_list"] = run_list.run_list_items display end |
#each(&block) ⇒ Object
Yield each key of the top level to the block.
255 256 257 |
# File 'lib/chef/node.rb', line 255 def each(&block) attributes.each(&block) end |
#each_attribute(&block) ⇒ Object
Iterates over each attribute, passing the attribute and value to the block.
260 261 262 |
# File 'lib/chef/node.rb', line 260 def each_attribute(&block) attributes.each_attribute(&block) end |
#expand!(data_source = "server") ⇒ Object
Expands the node’s run list and sets the default and override attributes. Also applies stored attributes (from json provided on the command line)
Returns the fully-expanded list of recipes, a RunListExpansion.
– TODO: timh/cw, 5-14-2010: Should this method exist? Should we instead modify default_attrs and override_attrs whenever our run_list is mutated? Or perhaps do something smarter like on-demand generation of default_attrs and override_attrs, invalidated only when run_list is mutated?
418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
# File 'lib/chef/node.rb', line 418 def (data_source = "server") expansion = run_list.(chef_environment, data_source) raise Chef::Exceptions::MissingRole, expansion if expansion.errors? # make sure they're defined automatic_attrs[:recipes] = expansion.recipes.with_duplicate_names automatic_attrs[:expanded_run_list] = expansion.recipes.with_fully_qualified_names_and_version_constraints automatic_attrs[:roles] = expansion.roles apply_expansion_attributes(expansion) expansion end |
#for_json ⇒ Object
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
# File 'lib/chef/node.rb', line 481 def for_json result = { "name" => name, "chef_environment" => chef_environment, "json_class" => self.class.name, "automatic" => attributes.automatic, "normal" => attributes.normal, "chef_type" => "node", "default" => attributes.combined_default, "override" => attributes.combined_override, #Render correctly for run_list items so malformed json does not result "run_list" => @primary_runlist.run_list.map { |item| item.to_s }, } # Chef Server rejects node JSON with extra keys; prior to 12.3, # "policy_name" and "policy_group" are unknown; after 12.3 they are # optional, therefore only including them in the JSON if present # maximizes compatibility for most people. unless policy_group.nil? && policy_name.nil? result["policy_name"] = policy_name result["policy_group"] = policy_group end result end |
#loaded_recipe(cookbook, recipe) ⇒ Object
used by include_recipe to add recipes to the expanded run_list to be saved back to the node and be searchable
288 289 290 291 292 |
# File 'lib/chef/node.rb', line 288 def loaded_recipe(cookbook, recipe) fully_qualified_recipe = "#{cookbook}::#{recipe}" automatic_attrs[:recipes] << fully_qualified_recipe unless Array(self[:recipes]).include?(fully_qualified_recipe) end |
#name(arg = nil) ⇒ Object
Set the name of this Node, or return the current name.
114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/chef/node.rb', line 114 def name(arg = nil) if !arg.nil? validate( { :name => arg }, { :name => { :kind_of => String, :cannot_be => :blank, :regex => /^[\-[:alnum:]_:.]+$/ }, }) @name = arg else @name end end |
#node ⇒ Object
Used by DSL
97 98 99 |
# File 'lib/chef/node.rb', line 97 def node self end |
#normal ⇒ Object Also known as: normal_attrs
Set a normal attribute of this node, but auto-vivify any Mashes that might be missing
200 201 202 |
# File 'lib/chef/node.rb', line 200 def normal attributes.normal end |
#normal_attrs=(new_values) ⇒ Object
233 234 235 |
# File 'lib/chef/node.rb', line 233 def normal_attrs=(new_values) attributes.normal = new_values end |
#override ⇒ Object Also known as: override_attrs
Set an override attribute of this node, but auto-vivify any Mashes that might be missing
217 218 219 |
# File 'lib/chef/node.rb', line 217 def override attributes.override end |
#override_attrs=(new_values) ⇒ Object
225 226 227 |
# File 'lib/chef/node.rb', line 225 def override_attrs=(new_values) attributes.override = new_values end |
#policy_group(arg = NULL_ARG) ⇒ String
The ‘policy_group` for this node. Setting this to a non-nil value will enable policyfile mode when `chef-client` is run. If set in the config file or in node json, running `chef-client` will update this value.
173 174 175 176 177 |
# File 'lib/chef/node.rb', line 173 def policy_group(arg = NULL_ARG) return @policy_group if arg.equal?(NULL_ARG) validate({ policy_group: arg }, { policy_group: { kind_of: [ String, NilClass ], regex: /^[\-:.[:alnum:]_]+$/ } }) @policy_group = arg end |
#policy_group=(policy_group) ⇒ Object
A “non-DSL-style” setter for ‘policy_group`
182 183 184 |
# File 'lib/chef/node.rb', line 182 def policy_group=(policy_group) policy_group(policy_group) end |
#policy_name(arg = NULL_ARG) ⇒ String
The ‘policy_name` for this node. Setting this to a non-nil value will enable policyfile mode when `chef-client` is run. If set in the config file or in node json, running `chef-client` will update this value.
151 152 153 154 155 |
# File 'lib/chef/node.rb', line 151 def policy_name(arg = NULL_ARG) return @policy_name if arg.equal?(NULL_ARG) validate({ policy_name: arg }, { policy_name: { kind_of: [ String, NilClass ], regex: /^[\-:.[:alnum:]_]+$/ } }) @policy_name = arg end |
#policy_name=(policy_name) ⇒ Object
A “non-DSL-style” setter for ‘policy_name`
160 161 162 |
# File 'lib/chef/node.rb', line 160 def policy_name=(policy_name) policy_name(policy_name) end |
#primary_runlist ⇒ Object
299 300 301 |
# File 'lib/chef/node.rb', line 299 def primary_runlist @primary_runlist end |
#recipe?(recipe_name) ⇒ Boolean
Returns true if this Node expects a given recipe, false if not.
First, the run list is consulted to see whether the recipe is explicitly included. If it’s not there, it looks in ‘node`, which is populated when the run_list is expanded
NOTE: It’s used by cookbook authors
282 283 284 |
# File 'lib/chef/node.rb', line 282 def recipe?(recipe_name) run_list.include?(recipe_name) || Array(self[:recipes]).include?(recipe_name) end |
#reset_defaults_and_overrides ⇒ Object
Clear defaults and overrides, so that any deleted attributes between runs are still gone.
401 402 403 404 |
# File 'lib/chef/node.rb', line 401 def reset_defaults_and_overrides default.clear override.clear end |
#respond_to_missing?(method, include_private = false) ⇒ Boolean
Fix respond_to + method so that it works with method_missing delegation
271 272 273 |
# File 'lib/chef/node.rb', line 271 def respond_to_missing?(method, include_private = false) attributes.respond_to?(method, false) end |
#role?(role_name) ⇒ Boolean
Returns true if this Node expects a given role, false if not.
295 296 297 |
# File 'lib/chef/node.rb', line 295 def role?(role_name) run_list.include?("role[#{role_name}]") end |
#run_list(*args) ⇒ Object
Returns an Array of roles and recipes, in the order they will be applied. If you call it with arguments, they will become the new list of roles and recipes.
313 314 315 316 |
# File 'lib/chef/node.rb', line 313 def run_list(*args) rl = select_run_list args.length > 0 ? rl.reset!(args) : rl end |
#run_list=(list) ⇒ Object
318 319 320 321 |
# File 'lib/chef/node.rb', line 318 def run_list=(list) rl = select_run_list rl = list end |
#run_list?(item) ⇒ Boolean
Returns true if this Node expects a given role, false if not.
324 325 326 |
# File 'lib/chef/node.rb', line 324 def run_list?(item) run_list.detect { |r| r == item } ? true : false end |
#save ⇒ Object
Save this node via the REST API
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 |
# File 'lib/chef/node.rb', line 589 def save # Try PUT. If the node doesn't yet exist, PUT will return 404, # so then POST to create. begin if Chef::Config[:why_run] Chef::Log.warn("In why-run mode, so NOT performing node save.") else chef_server_rest.put("nodes/#{name}", data_for_save) end rescue Net::HTTPServerException => e if e.response.code == "404" chef_server_rest.post("nodes", data_for_save) else raise end end self end |
#select_run_list ⇒ Object
307 308 309 |
# File 'lib/chef/node.rb', line 307 def select_run_list @override_runlist.empty? ? @primary_runlist : @override_runlist end |
#set ⇒ Object
204 205 206 207 |
# File 'lib/chef/node.rb', line 204 def set Chef.deprecated(:attributes, "node.set is deprecated and will be removed in Chef 14, please use node.default/node.override (or node.normal only if you really need persistence)") normal end |
#set_cookbook_attribute ⇒ Object
after the run_context has been set on the node, go through the cookbook_collection and setup the node attribute so that it is published in the node object
89 90 91 92 93 94 |
# File 'lib/chef/node.rb', line 89 def set_cookbook_attribute return unless run_context.cookbook_collection run_context.cookbook_collection.each do |cookbook_name, cookbook| automatic_attrs[:cookbooks][cookbook_name][:version] = cookbook.version end end |
#tag(*args) ⇒ Object
360 361 362 363 364 365 366 |
# File 'lib/chef/node.rb', line 360 def tag(*args) args.each do |tag| .push(tag.to_s) unless .include? tag.to_s end end |
#tags ⇒ Object
Lazy initializer for tags attribute
355 356 357 358 |
# File 'lib/chef/node.rb', line 355 def normal[:tags] = Array(normal[:tags]) normal[:tags] end |
#to_hash ⇒ Object
Transform the node to a Hash
450 451 452 453 454 455 456 457 458 459 460 461 462 |
# File 'lib/chef/node.rb', line 450 def to_hash index_hash = Hash.new index_hash["chef_type"] = "node" index_hash["name"] = name index_hash["chef_environment"] = chef_environment attribute.each do |key, value| index_hash[key] = value end index_hash["recipe"] = run_list.recipe_names if run_list.recipe_names.length > 0 index_hash["role"] = run_list.role_names if run_list.role_names.length > 0 index_hash["run_list"] = run_list.run_list_items index_hash end |
#to_json(*a) ⇒ Object
Serialize this object as a hash
477 478 479 |
# File 'lib/chef/node.rb', line 477 def to_json(*a) Chef::JSONCompat.to_json(for_json, *a) end |
#to_s ⇒ Object
623 624 625 |
# File 'lib/chef/node.rb', line 623 def to_s "node[#{name}]" end |
#update_from!(o) ⇒ Object
505 506 507 508 509 510 511 512 513 |
# File 'lib/chef/node.rb', line 505 def update_from!(o) run_list.reset!(o.run_list) self.automatic_attrs = o.automatic_attrs self.normal_attrs = o.normal_attrs self.override_attrs = o.override_attrs self.default_attrs = o.default_attrs chef_environment(o.chef_environment) self end |