Getting CookbookVersion at runtime


#1

Obligatory first line greeting that is apparently acceptable to ignore-

I have a need to determine a Chef cookbook version at runtime, so I can
compare it with a local file but I haven’t found the secret sauce to make
that work. Since I’ve run out of time that I can work on it until later
today or tomorrow, I thought I’d put this out to the community. I thought
there was something I could do with Chef::CookbookVersion but now I think
that’s off track.

I have a hacky way that uses file system paths but that makes me kinda sad
to use.

–tucker


#2

node.run_context.cookbook_collection[cookbook_name].metadata.version

cool, isnt it?

On Thu, Apr 24, 2014 at 1:29 PM, Tucker junk@gmail.com wrote:

Obligatory first line greeting that is apparently acceptable to ignore-

I have a need to determine a Chef cookbook version at runtime, so I can
compare it with a local file but I haven’t found the secret sauce to make
that work. Since I’ve run out of time that I can work on it until later
today or tomorrow, I thought I’d put this out to the community. I thought
there was something I could do with Chef::CookbookVersion but now I think
that’s off track.

I have a hacky way that uses file system paths but that makes me kinda sad
to use.

–tucker


#3

hm interesting. I had posed a similar question a couple of months ago and
the response i got was from Julian Dunn to use his handler.[1].

Ranjib, how long has that been there?

[1]https://github.com/juliandunn/cookbook_versions_handler

On Thu, Apr 24, 2014 at 5:15 PM, Ranjib Dey dey.ranjib@gmail.com wrote:

node.run_context.cookbook_collection[cookbook_name].metadata.version

cool, isnt it?

On Thu, Apr 24, 2014 at 1:29 PM, Tucker junk@gmail.com wrote:

Obligatory first line greeting that is apparently acceptable to ignore-

I have a need to determine a Chef cookbook version at runtime, so I can
compare it with a local file but I haven’t found the secret sauce to make
that work. Since I’ve run out of time that I can work on it until later
today or tomorrow, I thought I’d put this out to the community. I thought
there was something I could do with Chef::CookbookVersion but now I think
that’s off track.

I have a hacky way that uses file system paths but that makes me kinda
sad to use.

–tucker


Elvin Abordo
Mobile: (845) 475-8744


#4

pretty long i think. the handler uses the same api. cookbook_name and
recipe_name are two attribute present in any chef recipe, and automatically
populated with the current name while run_context is the central object
that ties together everything(including the cookbook collection) and
available from node, recipe etc.

given we are inside the current recipe, it assumes that the current recipe
is already loaded and available in resource collection, i.e.
node.run_context.cookbook_collection[cookbook_name] is not nil. this will
fail with chef-apply but should be safe within chef-solo or client runs

On Thu, Apr 24, 2014 at 2:22 PM, Elvin Abordo elvin159@gmail.com wrote:

hm interesting. I had posed a similar question a couple of months ago and
the response i got was from Julian Dunn to use his handler.[1].

Ranjib, how long has that been there?

[1]https://github.com/juliandunn/cookbook_versions_handler

On Thu, Apr 24, 2014 at 5:15 PM, Ranjib Dey dey.ranjib@gmail.com wrote:

node.run_context.cookbook_collection[cookbook_name].metadata.version

cool, isnt it?

On Thu, Apr 24, 2014 at 1:29 PM, Tucker junk@gmail.com wrote:

Obligatory first line greeting that is apparently acceptable to ignore-

I have a need to determine a Chef cookbook version at runtime, so I can
compare it with a local file but I haven’t found the secret sauce to make
that work. Since I’ve run out of time that I can work on it until later
today or tomorrow, I thought I’d put this out to the community. I thought
there was something I could do with Chef::CookbookVersion but now I think
that’s off track.

I have a hacky way that uses file system paths but that makes me kinda
sad to use.

–tucker


Elvin Abordo
Mobile: (845) 475-8744


#5

Awesome. That’s much simpler than what we have been doing and avoids the
issue of different version of Chef doing different things. For reference,
this is what I just scrapped:

“”"
cookbook_path = File.join(File.dirname(File.expand_path(FILE)),
’…’)

  if File.exist?(File.join(cookbook_path, 'metadata.rb'))
    metadata_file = File.join(cookbook_path, 'metadata.rb')
    metadata = Chef::Cookbook::Metadata.new
    metadata.from_file(metadata_file)
  else
    metadata_file = File.join(cookbook_path, 'metadata.json')
    metadata = Chef::Cookbook::Metadata.new
    metadata.from_json(File.read(metadata_file))
  end

  @version = Chef::Version.new(metadata.version)

“”"

On Thu, Apr 24, 2014 at 2:38 PM, Ranjib Dey dey.ranjib@gmail.com wrote:

pretty long i think. the handler uses the same api. cookbook_name and
recipe_name are two attribute present in any chef recipe, and automatically
populated with the current name while run_context is the central object
that ties together everything(including the cookbook collection) and
available from node, recipe etc.

given we are inside the current recipe, it assumes that the current recipe
is already loaded and available in resource collection, i.e.
node.run_context.cookbook_collection[cookbook_name] is not nil. this will
fail with chef-apply but should be safe within chef-solo or client runs

On Thu, Apr 24, 2014 at 2:22 PM, Elvin Abordo elvin159@gmail.com wrote:

hm interesting. I had posed a similar question a couple of months ago and
the response i got was from Julian Dunn to use his handler.[1].

Ranjib, how long has that been there?

[1]https://github.com/juliandunn/cookbook_versions_handler

On Thu, Apr 24, 2014 at 5:15 PM, Ranjib Dey dey.ranjib@gmail.com wrote:

node.run_context.cookbook_collection[cookbook_name].metadata.version

cool, isnt it?

On Thu, Apr 24, 2014 at 1:29 PM, Tucker junk@gmail.com wrote:

Obligatory first line greeting that is apparently acceptable to ignore-

I have a need to determine a Chef cookbook version at runtime, so I can
compare it with a local file but I haven’t found the secret sauce to make
that work. Since I’ve run out of time that I can work on it until later
today or tomorrow, I thought I’d put this out to the community. I thought
there was something I could do with Chef::CookbookVersion but now I think
that’s off track.

I have a hacky way that uses file system paths but that makes me kinda
sad to use.

–tucker


Elvin Abordo
Mobile: (845) 475-8744

–tucker


#6

There’s an obvious Recipe DSL enhancement to add cookbook_version as a
method that does that. PRs encouraged.

On 4/24/14, 2:15 PM, Ranjib Dey wrote:

node.run_context.cookbook_collection[cookbook_name].metadata.version

cool, isnt it?

On Thu, Apr 24, 2014 at 1:29 PM, Tucker <junk@gmail.com
mailto:junk@gmail.com> wrote:

Obligatory first line greeting that is apparently acceptable to
ignore-

I have a need to determine a Chef cookbook version at runtime, so
I can compare it with a local file but I haven't found the secret
sauce to make that work.  Since I've run out of time that I can
work on it until later today or tomorrow, I thought I'd put this
out to the community.  I thought there was something I could do
with Chef::CookbookVersion but now I think that's off track.

I have a hacky way that uses file system paths but that makes me
kinda sad to use.

-- 

--tucker