[chef] node.set, knife node show, and deep merging arrays


Chronological Thread 
  • From: Faiz Kazi < >
  • To:
  • Subject: [chef] node.set, knife node show, and deep merging arrays
  • Date: Mon, 22 Aug 2011 13:05:23 +0900
  • Organization: DreamArts Corporation


If a cookbook defines attributes such as:

  default[:foo] = {
    :bar => %w( one )
  }


And in the recipe, ':foo' is explicitly set:

  node.set[:foo][:bar] = %w( two )

  log "node.foo.bar is #{node[:foo][:bar]}"  # Logs 'two'


Then the node gets a 'normal' attribute of 
node.foo.bar == ['two']

So this is not a deep merge of node.foo.bar, but rather
an explicit 'set'.

Which seems right, and that's what it evaluates to in the
recipe and it's templates.


The issue: 'knife node show' displays inconsistent values.

  knife node show the-node --attrib foo --format json
  # # displays:
  # { 
  #   "foo": { 
  #     "bar": ["one", "two"]  # <- deep merge default+normal
  #   } 
  # }

  knife node show the-node --attrib foo.bar --format json
  # # displays:
  { "foo.bar": ["two"] }      # the explicitly set value



Unless I'm missing something, this appears to be a bug.
'knife node show' with the --attrib option must display
the value of the given attribute as evaluated in the 
recipe, should it not?


F



  • [chef] node.set, knife node show, and deep merging arrays, Faiz Kazi, 08/21/2011

Archive powered by MHonArc 2.6.16.

§