Case condition for template resource path


#1

Hello guys,
In a recipe i have to create a file from a template using
template "app.xml" do
path "/local/app/bin/app.xml"
source "app.xml.erb"
owner node['app']['user']
group node['app']['group']
mode "0644"
end

Having in mind that i have an attribute which sets the app version to install (allowing downgrade) and that the previous version it’s installed from an old rpm in another folder structure, I would need to use the same template resource, but when it’s the old version of app, to set another path, like (pseudo code):
template "app.xml" do
case new version:
path "/local/app/bin/app.xml"
case old version:
path "/anotherfolder/app/bin/app.xml"

source "app.xml.erb"
owner node['app']['user']
group node['app']['group']
mode "0644"
end

Any help would be appreciated.

Thank you,
Gabriel


#2

I thought about it and the first solution that came to my mind was to create the same resource twice like in:
template "app.xml" do
path "/local/app/bin/app.xml"
source "app.xml.erb"
owner node['app']['user']
group node['app']['group']
mode "0644"
only_if node['app']['appversion']=4
end

and for the old version
template "app.xml" do
path "/anotherfolder/app/bin/app.xml"
source "app.xml.erb"
owner node['app']['user']
group node['app']['group']
mode "0644"
only_if node['app']['appversion']=3
end

Is there a better solution?

Thank you


#3

One solution would be to move the logic to inside your erb template.

template 'app.xml' do
  source 'app.xml.erb'
  variables(:version => 3)
end

Then use xml “foo” if version 3 and “bar” if version 4
app.xml.erb

<xml>
<% if @version == 3 -%>
  <foo>
  </foo>
<% elseif @version == 4 -%>
  <bar>
  </bar>
<% end -%>
</xml>

#4

Thank you, but the xml files are quite big, so i decided to create a dedicated xml file for the old version which could be installed, using the same attributes where needed.

Your idea is great and i’ll remember to use it some other time

Thanks again,
Gabriel


#5

For large xml files, it is best to keep a separate copy of each version, and use a variable in the source name

template 'app.xml' do
  source "app.xml-#{version}.erb"
end

app.xml-3.erb

<xml>
<foo/>
</xml>

app.xml-4.erb

<xml>
<bar/>
</xml>