    # File lib/chef/client.rb, line 228
        def build_node
          Chef::Log.debug("Building node object for #{node_name}")

          if Chef::Config[:solo]
            @node = Chef::Node.build(node_name)
          else
            @node = Chef::Node.find_or_create(node_name)
          end

          # Allow user to override the environment of a node by specifying
          # a config parameter.
          if Chef::Config[:environment] && !Chef::Config[:environment].chop.empty?
            @node.chef_environment(Chef::Config[:environment])
          end

          # consume_external_attrs may add items to the run_list. Save the
          # expanded run_list, which we will pass to the server later to
          # determine which versions of cookbooks to use.
          @node.reset_defaults_and_overrides
          @node.consume_external_attrs(ohai.data, @json_attribs)
          if Chef::Config[:solo]
            @run_list_expansion = @node.expand!('disk')
          else
            @run_list_expansion = @node.expand!('server')
          end

          # @run_list_expansion is a RunListExpansion.
          #
          # Convert @expanded_run_list, which is an
          # Array of Hashes of the form
          #   {:name => NAME, :version_constraint => Chef::VersionConstraint },
          # into @expanded_run_list_with_versions, an
          # Array of Strings of the form
          #   "#{NAME}@#{VERSION}"
          @expanded_run_list_with_versions = @run_list_expansion.recipes.with_version_constraints_strings

          Chef::Log.info("Run List is [#{@node.run_list}]")
          Chef::Log.info("Run List expands to [#{@expanded_run_list_with_versions.join(', ')}]")

          @run_status = Chef::RunStatus.new(@node)

          @node
        end