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


#1

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


#2

I just copy-pasta’d the java.java_home and java.openjdk_packages logic for a pr to the nexus cookbook: https://github.com/RiotGames/nexus-cookbook/pull/43

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

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


#4

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


#5

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:
https://github.com/RiotGames/nexus-cookbook/pull/43

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


#6

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: https://github.com/RiotGames/nexus-cookbook/pull/43

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


#7

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:
https://github.com/RiotGames/nexus-cookbook/pull/43

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


#8

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: https://github.com/RiotGames/nexus-cookbook/pull/43

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


#9

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:
https://github.com/RiotGames/nexus-cookbook/pull/43

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


#10

<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: https://github.com/RiotGames/nexus-cookbook/pull/43

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