The Application Cookbook Pattern vs. String / Node Attribute Interpolation in Attributes files

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from the
Java cookbook have already been interpolated when the sample-app recipe is
evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] =
["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]
...

The only way to “correctly” pass in the java/jdk_version attribute is from
external, e.g. via environment files or dna.json etc… That works, but
actually I consider the JDK version an implementation detail of the
application cookbook and don’t want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you
include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

I just copy-pasta'd the java.java_home and java.openjdk_packages logic for a pr to the nexus cookbook: Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make it work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from the Java cookbook have already been interpolated when the sample-app recipe is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] = ["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]
...

The only way to "correctly" pass in the java/jdk_version attribute is from external, e.g. via environment files or dna.json etc... That works, but actually I consider the JDK version an implementation detail of the application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

The usual way to fix this is to put the attribute override in your cookbook's attribute file and then force Chef to re-execute the java cookbook attributes file. Unfortunately that snippet is in a ticket so I can't get to it right now.

--Noah

On Aug 5, 2013, at 9:56 AM, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from the Java cookbook have already been interpolated when the sample-app recipe is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] = ["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]
...

The only way to "correctly" pass in the java/jdk_version attribute is from external, e.g. via environment files or dna.json etc... That works, but actually I consider the JDK version an implementation detail of the application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

On Mon, Aug 5, 2013 at 7:52 PM, Noah Kantrowitz noah@coderanger.net wrote:

The usual way to fix this is to put the attribute override in your
cookbook's attribute file and then force Chef to re-execute the java
cookbook attributes file. Unfortunately that snippet is in a ticket so I
can't get to it right now.

Oh, that sounds good. I'd be highly interested in how to do that and the
ticket you mentioned.

Cheers, Torben

I also played around with include_attribute in the recipe, in the
attributes file etc. but couldn't make it work. I also tried renaming my
application cookbook and attribute files so that they come alphabetically
before "java", but that didn't make any difference too (surely because of
the include_recipe "java").

I'm looking forward to the workaround mentioned by Noah, couldn't find it
via Google so far.

Btw: have you considered forking and "fixing" the Java cookbook rather than
duplicating the attributes logic?

On Mon, Aug 5, 2013 at 7:48 PM, Joseph Holsten joseph@josephholsten.comwrote:

I just copy-pasta'd the java.java_home and java.openjdk_packages logic for
a pr to the nexus cookbook:
Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make it
work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from
the Java cookbook have already been interpolated when the sample-app recipe
is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] =

["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]

...


The only way to "correctly" pass in the java/jdk_version attribute is

from external, e.g. via environment files or dna.json etc... That works,
but actually I consider the JDK version an implementation detail of the
application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you
include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

Now that Jira is back, just add this to the bottom of your attributes file: node.from_file(run_context.resolve_attribute(*parse_attribute_file_spec("java")))

--Noah

On Aug 6, 2013, at 7:30 AM, Torben Knerr wrote:

I also played around with include_attribute in the recipe, in the attributes file etc. but couldn't make it work. I also tried renaming my application cookbook and attribute files so that they come alphabetically before "java", but that didn't make any difference too (surely because of the include_recipe "java").

I'm looking forward to the workaround mentioned by Noah, couldn't find it via Google so far.

Btw: have you considered forking and "fixing" the Java cookbook rather than duplicating the attributes logic?

On Mon, Aug 5, 2013 at 7:48 PM, Joseph Holsten joseph@josephholsten.com wrote:
I just copy-pasta'd the java.java_home and java.openjdk_packages logic for a pr to the nexus cookbook: Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make it work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from the Java cookbook have already been interpolated when the sample-app recipe is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] = ["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]
...

The only way to "correctly" pass in the java/jdk_version attribute is from external, e.g. via environment files or dna.json etc... That works, but actually I consider the JDK version an implementation detail of the application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

Thanks, that works!

I'm using a slightly modified variant now which I find a bit more readable:
node.from_file(run_context.resolve_attribute("java", "default"))

Found the hint here:
http://docs.opscode.com/chef/essentials_cookbook_recipes.html#reload-attributes

Btw: mind posting the link to the Jira issue?

Cheers, Torben

On Tue, Aug 6, 2013 at 7:46 PM, Noah Kantrowitz noah@coderanger.net wrote:

Now that Jira is back, just add this to the bottom of your attributes
file:
node.from_file(run_context.resolve_attribute(*parse_attribute_file_spec("java")))

--Noah

On Aug 6, 2013, at 7:30 AM, Torben Knerr wrote:

I also played around with include_attribute in the recipe, in the
attributes file etc. but couldn't make it work. I also tried renaming my
application cookbook and attribute files so that they come alphabetically
before "java", but that didn't make any difference too (surely because of
the include_recipe "java").

I'm looking forward to the workaround mentioned by Noah, couldn't find
it via Google so far.

Btw: have you considered forking and "fixing" the Java cookbook rather
than duplicating the attributes logic?

On Mon, Aug 5, 2013 at 7:48 PM, Joseph Holsten joseph@josephholsten.com
wrote:
I just copy-pasta'd the java.java_home and java.openjdk_packages logic
for a pr to the nexus cookbook:
Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make
it work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from
the Java cookbook have already been interpolated when the sample-app recipe
is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] =

["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]

...


The only way to "correctly" pass in the java/jdk_version attribute is

from external, e.g. via environment files or dna.json etc... That works,
but actually I consider the JDK version an implementation detail of the
application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you
include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

http://tickets.opscode.com/browse/CHEF-4234

--Noah

On Aug 6, 2013, at 11:08 AM, Torben Knerr wrote:

Thanks, that works!

I'm using a slightly modified variant now which I find a bit more readable: node.from_file(run_context.resolve_attribute("java", "default"))

Found the hint here:
http://docs.opscode.com/chef/essentials_cookbook_recipes.html#reload-attributes

Btw: mind posting the link to the Jira issue?

Cheers, Torben

On Tue, Aug 6, 2013 at 7:46 PM, Noah Kantrowitz noah@coderanger.net wrote:
Now that Jira is back, just add this to the bottom of your attributes file: node.from_file(run_context.resolve_attribute(*parse_attribute_file_spec("java")))

--Noah

On Aug 6, 2013, at 7:30 AM, Torben Knerr wrote:

I also played around with include_attribute in the recipe, in the attributes file etc. but couldn't make it work. I also tried renaming my application cookbook and attribute files so that they come alphabetically before "java", but that didn't make any difference too (surely because of the include_recipe "java").

I'm looking forward to the workaround mentioned by Noah, couldn't find it via Google so far.

Btw: have you considered forking and "fixing" the Java cookbook rather than duplicating the attributes logic?

On Mon, Aug 5, 2013 at 7:48 PM, Joseph Holsten joseph@josephholsten.com wrote:
I just copy-pasta'd the java.java_home and java.openjdk_packages logic for a pr to the nexus cookbook: Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make it work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from the Java cookbook have already been interpolated when the sample-app recipe is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] = ["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]
...

The only way to "correctly" pass in the java/jdk_version attribute is from external, e.g. via environment files or dna.json etc... That works, but actually I consider the JDK version an implementation detail of the application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

Thanks!

On Tue, Aug 6, 2013 at 8:09 PM, Noah Kantrowitz noah@coderanger.net wrote:

http://tickets.opscode.com/browse/CHEF-4234

--Noah

On Aug 6, 2013, at 11:08 AM, Torben Knerr wrote:

Thanks, that works!

I'm using a slightly modified variant now which I find a bit more
readable: node.from_file(run_context.resolve_attribute("java", "default"))

Found the hint here:

http://docs.opscode.com/chef/essentials_cookbook_recipes.html#reload-attributes

Btw: mind posting the link to the Jira issue?

Cheers, Torben

On Tue, Aug 6, 2013 at 7:46 PM, Noah Kantrowitz noah@coderanger.net
wrote:
Now that Jira is back, just add this to the bottom of your attributes
file:
node.from_file(run_context.resolve_attribute(*parse_attribute_file_spec("java")))

--Noah

On Aug 6, 2013, at 7:30 AM, Torben Knerr wrote:

I also played around with include_attribute in the recipe, in the
attributes file etc. but couldn't make it work. I also tried renaming my
application cookbook and attribute files so that they come alphabetically
before "java", but that didn't make any difference too (surely because of
the include_recipe "java").

I'm looking forward to the workaround mentioned by Noah, couldn't find
it via Google so far.

Btw: have you considered forking and "fixing" the Java cookbook rather
than duplicating the attributes logic?

On Mon, Aug 5, 2013 at 7:48 PM, Joseph Holsten <
joseph@josephholsten.com> wrote:
I just copy-pasta'd the java.java_home and java.openjdk_packages logic
for a pr to the nexus cookbook:
Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make
it work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes
from the Java cookbook have already been interpolated when the sample-app
recipe is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] =

["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]

...


The only way to "correctly" pass in the java/jdk_version attribute

is from external, e.g. via environment files or dna.json etc... That works,
but actually I consider the JDK version an implementation detail of the
application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you
include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben

<3 I almost certainly will, eventually. I'm not entirely sure if I want to attempt to fully extract it into a resource/provider. Seems like if I'm going through the effort, I might as well.

On 2013-08-06, at 07:30, Torben Knerr ukio@gmx.de wrote:

I also played around with include_attribute in the recipe, in the attributes file etc. but couldn't make it work. I also tried renaming my application cookbook and attribute files so that they come alphabetically before "java", but that didn't make any difference too (surely because of the include_recipe "java").

I'm looking forward to the workaround mentioned by Noah, couldn't find it via Google so far.

Btw: have you considered forking and "fixing" the Java cookbook rather than duplicating the attributes logic?

On Mon, Aug 5, 2013 at 7:48 PM, Joseph Holsten joseph@josephholsten.com wrote:
I just copy-pasta'd the java.java_home and java.openjdk_packages logic for a pr to the nexus cookbook: Use nexus 2.6. Fixes #41. by josephholsten · Pull Request #43 · RiotGamesCookbooks/nexus-cookbook · GitHub

I attempted a well timed include_attribute 'java', but couldn't make it work.

If there is a less terrible way, I'd love to know.

~j

On 2013-08-05, at 09:56, Torben Knerr ukio@gmx.de wrote:

Ohai Chefs,

given an application cookbook trying to installing Java 7:

node.set['java']['jdk_version'] = "7"
include_recipe "java"

It will always install Java version 6 because the node attributes from the Java cookbook have already been interpolated when the sample-app recipe is evaluated:

...
default['java']['jdk_version'] = '6'
...
when "debian"
  ...
  default['java']['openjdk_packages'] = ["openjdk-#{node['java']['jdk_version']}-jdk", "default-jre-headless"]
...

The only way to "correctly" pass in the java/jdk_version attribute is from external, e.g. via environment files or dna.json etc... That works, but actually I consider the JDK version an implementation detail of the application cookbook and don't want to expose it via the above files.

How can you deal with that?

Is there a possibility to re-evaluate the attributes file before you include_recipe it? And would this be a good idea at all?!?

Any ideas or workarounds?

Cheers,
Torben