Using platform_family in a provider?

Ohai Chefs,

I'm doing some Christmas Eve hacking, and I think I'm not approaching
something properly.

Here is what I'm trying to do:
https://github.com/socrata-cookbooks/java/pull/111/files

Essentially, I need to conditionalize code in a provider based on the
node's platform_family, but I don't believe I have access to the node
objects or methods within a provider. I could pass it in as a parameter,
but that seems clunky - the user of the provider shouldn't care about this
detail. It's something I want to abstract.

Could someone point me in the right direction? I still get confused about
what Chef methods are available in recipes, libraries, providers, etc.

Happy Holidays!

Chris

Hi Chris,

Providers do have access to the node object, but you must refer to it
directly e.g. node['platform_family'] . I don't believe the syntactic
sugar of platform_family? is available.

In library context you don't have access to the node object, so you
can either pass it in on object initialization (e.g.
https://github.com/socrata-cookbooks/java/blob/master/libraries/helpers.rb#L27)
or passing parameters on method invocation.

  • Julian

On Tue, Dec 24, 2013 at 2:14 PM, Christopher Armstrong
chris@chrisarmstrong.me wrote:

Ohai Chefs,

I'm doing some Christmas Eve hacking, and I think I'm not approaching
something properly.

Here is what I'm trying to do:
Fix alternatives for centos by carmstrong · Pull Request #111 · sous-chefs/java · GitHub

Essentially, I need to conditionalize code in a provider based on the node's
platform_family, but I don't believe I have access to the node objects or
methods within a provider. I could pass it in as a parameter, but that seems
clunky - the user of the provider shouldn't care about this detail. It's
something I want to abstract.

Could someone point me in the right direction? I still get confused about
what Chef methods are available in recipes, libraries, providers, etc.

Happy Holidays!

Chris

--
[ Julian C. Dunn jdunn@aquezada.com * Sorry, I'm ]
[ WWW: Julian Dunn's Blog - Commentary on media, technology, and everything in between. * only Web 1.0 ]
[ gopher://sdf.org/1/users/keymaker/ * compliant! ]
[ PGP: 91B3 7A9D 683C 7C16 715F 442C 6065 D533 FDC2 05B9 ]

Cool. Thanks Julian!

On Tue, Dec 24, 2013 at 5:41 PM, Julian C. Dunn jdunn@aquezada.com wrote:

Hi Chris,

Providers do have access to the node object, but you must refer to it
directly e.g. node['platform_family'] . I don't believe the syntactic
sugar of platform_family? is available.

In library context you don't have access to the node object, so you
can either pass it in on object initialization (e.g.

https://github.com/socrata-cookbooks/java/blob/master/libraries/helpers.rb#L27
)
or passing parameters on method invocation.

  • Julian

On Tue, Dec 24, 2013 at 2:14 PM, Christopher Armstrong
chris@chrisarmstrong.me wrote:

Ohai Chefs,

I'm doing some Christmas Eve hacking, and I think I'm not approaching
something properly.

Here is what I'm trying to do:
Fix alternatives for centos by carmstrong · Pull Request #111 · sous-chefs/java · GitHub

Essentially, I need to conditionalize code in a provider based on the
node's
platform_family, but I don't believe I have access to the node objects or
methods within a provider. I could pass it in as a parameter, but that
seems
clunky - the user of the provider shouldn't care about this detail. It's
something I want to abstract.

Could someone point me in the right direction? I still get confused about
what Chef methods are available in recipes, libraries, providers, etc.

Happy Holidays!

Chris

--
[ Julian C. Dunn jdunn@aquezada.com * Sorry, I'm ]
[ WWW: Julian Dunn's Blog - Commentary on media, technology, and everything in between. * only Web 1.0 ]
[ gopher://sdf.org/1/users/keymaker/ * compliant! ]
[ PGP: 91B3 7A9D 683C 7C16 715F 442C 6065 D533 FDC2 05B9 ]

Hmmm... maybe I need to put it in the library after all?

NameError
---------
undefined local variable or method `node' for
#Class:0x00000003117670

   Cookbook Trace:
   ---------------
     /tmp/kitchen/cookbooks/java/providers/alternatives.rb:20:in

`class_from_file'

   Relevant File Content:
   ----------------------
   /tmp/kitchen/cookbooks/java/providers/alternatives.rb:

    13:  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express

or implied.
14: # See the License for the specific language governing
permissions and
15: # limitations under the License.
16:
17: require 'chef/mixin/shell_out'
18: include Chef::Mixin::ShellOut
19:
20>> alternatives_cmd = node['platform_family'] == 'rhel' ?
'alternatives' : 'update-alternatives'
21:
22: action :set do
23: if new_resource.bin_cmds
24: new_resource.bin_cmds.each do |cmd|
25:
26: bin_path = "/usr/bin/#{cmd}"
27: alt_path = "#{new_resource.java_location}/bin/#{cmd}"
28: priority = new_resource.priority
29:

On Tue, Dec 24, 2013 at 8:34 PM, Christopher Armstrong <
chris@chrisarmstrong.me> wrote:

Cool. Thanks Julian!

On Tue, Dec 24, 2013 at 5:41 PM, Julian C. Dunn jdunn@aquezada.comwrote:

Hi Chris,

Providers do have access to the node object, but you must refer to it
directly e.g. node['platform_family'] . I don't believe the syntactic
sugar of platform_family? is available.

In library context you don't have access to the node object, so you
can either pass it in on object initialization (e.g.

https://github.com/socrata-cookbooks/java/blob/master/libraries/helpers.rb#L27
)
or passing parameters on method invocation.

  • Julian

On Tue, Dec 24, 2013 at 2:14 PM, Christopher Armstrong
chris@chrisarmstrong.me wrote:

Ohai Chefs,

I'm doing some Christmas Eve hacking, and I think I'm not approaching
something properly.

Here is what I'm trying to do:
Fix alternatives for centos by carmstrong · Pull Request #111 · sous-chefs/java · GitHub

Essentially, I need to conditionalize code in a provider based on the
node's
platform_family, but I don't believe I have access to the node objects
or
methods within a provider. I could pass it in as a parameter, but that
seems
clunky - the user of the provider shouldn't care about this detail. It's
something I want to abstract.

Could someone point me in the right direction? I still get confused
about
what Chef methods are available in recipes, libraries, providers, etc.

Happy Holidays!

Chris

--
[ Julian C. Dunn jdunn@aquezada.com * Sorry, I'm ]
[ WWW: Julian Dunn's Blog - Commentary on media, technology, and everything in between. * only Web 1.0 ]
[ gopher://sdf.org/1/users/keymaker/ * compliant! ]
[ PGP: 91B3 7A9D 683C 7C16 715F 442C 6065 D533 FDC2 05B9 ]

You have to do it in the action block, or rather inside a method of the provider class which is what #action creates.

--Noah

On Dec 24, 2013, at 9:10 PM, Christopher Armstrong chris@chrisarmstrong.me wrote:

Hmmm... maybe I need to put it in the library after all?

NameError
---------
undefined local variable or method `node' for #Class:0x00000003117670

   Cookbook Trace:
   ---------------
     /tmp/kitchen/cookbooks/java/providers/alternatives.rb:20:in `class_from_file'


   Relevant File Content:
   ----------------------
   /tmp/kitchen/cookbooks/java/providers/alternatives.rb:

    13:  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14:  # See the License for the specific language governing permissions and
    15:  # limitations under the License.
    16:
    17:  require 'chef/mixin/shell_out'
    18:  include Chef::Mixin::ShellOut
    19:
    20>> alternatives_cmd = node['platform_family'] == 'rhel' ? 'alternatives' : 'update-alternatives'
    21:
    22:  action :set do
    23:    if new_resource.bin_cmds
    24:      new_resource.bin_cmds.each do |cmd|
    25:
    26:        bin_path = "/usr/bin/#{cmd}"
    27:        alt_path = "#{new_resource.java_location}/bin/#{cmd}"
    28:        priority = new_resource.priority
    29:

On Tue, Dec 24, 2013 at 8:34 PM, Christopher Armstrong chris@chrisarmstrong.me wrote:
Cool. Thanks Julian!

On Tue, Dec 24, 2013 at 5:41 PM, Julian C. Dunn jdunn@aquezada.com wrote:
Hi Chris,

Providers do have access to the node object, but you must refer to it
directly e.g. node['platform_family'] . I don't believe the syntactic
sugar of platform_family? is available.

In library context you don't have access to the node object, so you
can either pass it in on object initialization (e.g.
https://github.com/socrata-cookbooks/java/blob/master/libraries/helpers.rb#L27)
or passing parameters on method invocation.

  • Julian

On Tue, Dec 24, 2013 at 2:14 PM, Christopher Armstrong
chris@chrisarmstrong.me wrote:

Ohai Chefs,

I'm doing some Christmas Eve hacking, and I think I'm not approaching
something properly.

Here is what I'm trying to do:
Fix alternatives for centos by carmstrong · Pull Request #111 · sous-chefs/java · GitHub

Essentially, I need to conditionalize code in a provider based on the node's
platform_family, but I don't believe I have access to the node objects or
methods within a provider. I could pass it in as a parameter, but that seems
clunky - the user of the provider shouldn't care about this detail. It's
something I want to abstract.

Could someone point me in the right direction? I still get confused about
what Chef methods are available in recipes, libraries, providers, etc.

Happy Holidays!

Chris

--
[ Julian C. Dunn jdunn@aquezada.com * Sorry, I'm ]
[ WWW: Julian Dunn's Blog - Commentary on media, technology, and everything in between. * only Web 1.0 ]
[ gopher://sdf.org/1/users/keymaker/ * compliant! ]
[ PGP: 91B3 7A9D 683C 7C16 715F 442C 6065 D533 FDC2 05B9 ]

Gotcha. Thanks Noah.

On Wed, Dec 25, 2013 at 12:11 AM, Noah Kantrowitz noah@coderanger.netwrote:

You have to do it in the action block, or rather inside a method of the
provider class which is what #action creates.

--Noah

On Dec 24, 2013, at 9:10 PM, Christopher Armstrong <
chris@chrisarmstrong.me> wrote:

Hmmm... maybe I need to put it in the library after all?

NameError
---------
undefined local variable or method `node' for
#Class:0x00000003117670

   Cookbook Trace:
   ---------------
     /tmp/kitchen/cookbooks/java/providers/alternatives.rb:20:in

`class_from_file'

   Relevant File Content:
   ----------------------
   /tmp/kitchen/cookbooks/java/providers/alternatives.rb:

    13:  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either

express or implied.

    14:  # See the License for the specific language governing

permissions and

    15:  # limitations under the License.
    16:
    17:  require 'chef/mixin/shell_out'
    18:  include Chef::Mixin::ShellOut
    19:
    20>> alternatives_cmd = node['platform_family'] == 'rhel' ?

'alternatives' : 'update-alternatives'

    21:
    22:  action :set do
    23:    if new_resource.bin_cmds
    24:      new_resource.bin_cmds.each do |cmd|
    25:
    26:        bin_path = "/usr/bin/#{cmd}"
    27:        alt_path = "#{new_resource.java_location}/bin/#{cmd}"
    28:        priority = new_resource.priority
    29:

On Tue, Dec 24, 2013 at 8:34 PM, Christopher Armstrong <
chris@chrisarmstrong.me> wrote:
Cool. Thanks Julian!

On Tue, Dec 24, 2013 at 5:41 PM, Julian C. Dunn jdunn@aquezada.com
wrote:
Hi Chris,

Providers do have access to the node object, but you must refer to it
directly e.g. node['platform_family'] . I don't believe the syntactic
sugar of platform_family? is available.

In library context you don't have access to the node object, so you
can either pass it in on object initialization (e.g.

https://github.com/socrata-cookbooks/java/blob/master/libraries/helpers.rb#L27
)

or passing parameters on method invocation.

  • Julian

On Tue, Dec 24, 2013 at 2:14 PM, Christopher Armstrong
chris@chrisarmstrong.me wrote:

Ohai Chefs,

I'm doing some Christmas Eve hacking, and I think I'm not approaching
something properly.

Here is what I'm trying to do:
Fix alternatives for centos by carmstrong · Pull Request #111 · sous-chefs/java · GitHub

Essentially, I need to conditionalize code in a provider based on the
node's
platform_family, but I don't believe I have access to the node objects
or
methods within a provider. I could pass it in as a parameter, but that
seems
clunky - the user of the provider shouldn't care about this detail.
It's
something I want to abstract.

Could someone point me in the right direction? I still get confused
about
what Chef methods are available in recipes, libraries, providers, etc.

Happy Holidays!

Chris

--
[ Julian C. Dunn jdunn@aquezada.com * Sorry, I'm ]
[ WWW: Julian Dunn's Blog - Commentary on media, technology, and everything in between. * only Web 1.0 ]
[ gopher://sdf.org/1/users/keymaker/ * compliant! ]
[ PGP: 91B3 7A9D 683C 7C16 715F 442C 6065 D533 FDC2 05B9 ]

In case an example was helpful;

Scott

On 12/24/13, 9:18 PM, Christopher Armstrong wrote:

Gotcha. Thanks Noah.

On Wed, Dec 25, 2013 at 12:11 AM, Noah Kantrowitz <noah@coderanger.net
mailto:noah@coderanger.net> wrote:

You have to do it in the action block, or rather inside a method
of the provider class which is what #action creates.

--Noah

On Dec 24, 2013, at 9:10 PM, Christopher Armstrong
<chris@chrisarmstrong.me <mailto:chris@chrisarmstrong.me>> wrote:

> Hmmm... maybe I need to put it in the library after all?
>
>  NameError
>        ---------
>        undefined local variable or method `node' for
#<Class:0x00000003117670>
>
>
>        Cookbook Trace:
>        ---------------
>  /tmp/kitchen/cookbooks/java/providers/alternatives.rb:20:in
`class_from_file'
>
>
>        Relevant File Content:
>        ----------------------
>  /tmp/kitchen/cookbooks/java/providers/alternatives.rb:
>
>         13:  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
either express or implied.
>         14:  # See the License for the specific language
governing permissions and
>         15:  # limitations under the License.
>         16:
>         17:  require 'chef/mixin/shell_out'
>         18:  include Chef::Mixin::ShellOut
>         19:
>         20>> alternatives_cmd = node['platform_family'] ==
'rhel' ? 'alternatives' : 'update-alternatives'
>         21:
>         22:  action :set do
>         23:    if new_resource.bin_cmds
>         24:      new_resource.bin_cmds.each do |cmd|
>         25:
>         26:        bin_path = "/usr/bin/#{cmd}"
>         27:        alt_path =
"#{new_resource.java_location}/bin/#{cmd}"
>         28:        priority = new_resource.priority
>         29:
>
>
>
> On Tue, Dec 24, 2013 at 8:34 PM, Christopher Armstrong
<chris@chrisarmstrong.me <mailto:chris@chrisarmstrong.me>> wrote:
> Cool. Thanks Julian!
>
>
> On Tue, Dec 24, 2013 at 5:41 PM, Julian C. Dunn
<jdunn@aquezada.com <mailto:jdunn@aquezada.com>> wrote:
> Hi Chris,
>
> Providers do have access to the node object, but you must refer
to it
> directly e.g. node['platform_family'] . I don't believe the
syntactic
> sugar of platform_family? is available.
>
> In library context you don't have access to the node object, so you
> can either pass it in on object initialization (e.g.
>
https://github.com/socrata-cookbooks/java/blob/master/libraries/helpers.rb#L27)
> or passing parameters on method invocation.
>
> - Julian
>
> On Tue, Dec 24, 2013 at 2:14 PM, Christopher Armstrong
> <chris@chrisarmstrong.me <mailto:chris@chrisarmstrong.me>> wrote:
> > Ohai Chefs,
> >
> > I'm doing some Christmas Eve hacking, and I think I'm not
approaching
> > something properly.
> >
> > Here is what I'm trying to do:
> > https://github.com/socrata-cookbooks/java/pull/111/files
> >
> > Essentially, I need to conditionalize code in a provider based
on the node's
> > platform_family, but I don't believe I have access to the node
objects or
> > methods within a provider. I could pass it in as a parameter,
but that seems
> > clunky - the user of the provider shouldn't care about this
detail. It's
> > something I want to abstract.
> >
> > Could someone point me in the right direction? I still get
confused about
> > what Chef methods are available in recipes, libraries,
providers, etc.
> >
> > Happy Holidays!
> >
> > Chris
>
>
>
> --
> [ Julian C. Dunn <jdunn@aquezada.com
<mailto:jdunn@aquezada.com>>          * Sorry, I'm    ]
> [ WWW: http://www.aquezada.com/staff/julian    * only Web 1.0  ]
> [ gopher://sdf.org/1/users/keymaker/
<http://sdf.org/1/users/keymaker/>   * compliant!    ]
> [ PGP: 91B3 7A9D 683C 7C16 715F 442C 6065 D533 FDC2 05B9       ]
>
>

!DSPAM:52ba6ad6157492105246341!