Let load_module_metadata succeed on empty file

Some modules or module versions don't have a metadata.json file, but we
might still want to use the load_module_metadata function on them. The
lack of a file can still give us important information. For example, it
might tell us that the version of the module installed is "very old"
even if we can't read the version number directly. This patch adds a
parameter to let the user specify if an empty file is acceptable. To
preserve backwards compatibility it does not change the current default
behavior, which is to raise an error if metadata.json does not exist.
This commit is contained in:
Colleen Murphy 2015-10-14 16:09:05 -07:00
parent 0f8df10084
commit 25410c4598
3 changed files with 35 additions and 5 deletions

View file

@ -539,6 +539,15 @@ Loads the metadata.json of a target module. Can be used to determine module vers
notify { $metadata['author']: }
~~~
If you do not want to fail the catalog compilation if the metadata file for a module is not present:
~~~
$metadata = load_module_metadata('mysql', true)
if empty($metadata) {
notify { "This module does not have a metadata.json file.": }
}
~~~
*Type*: rvalue.
#### `lstrip`

View file

@ -2,14 +2,22 @@ module Puppet::Parser::Functions
newfunction(:load_module_metadata, :type => :rvalue, :doc => <<-EOT
EOT
) do |args|
raise(Puppet::ParseError, "load_module_metadata(): Wrong number of arguments, expects one") unless args.size == 1
raise(Puppet::ParseError, "load_module_metadata(): Wrong number of arguments, expects one or two") unless [1,2].include?(args.size)
mod = args[0]
allow_empty_metadata = args[1]
module_path = function_get_module_path([mod])
metadata_json = File.join(module_path, 'metadata.json')
raise(Puppet::ParseError, "load_module_metadata(): No metadata.json file for module #{mod}") unless File.exists?(metadata_json)
metadata = PSON.load(File.read(metadata_json))
metadata_exists = File.exists?(metadata_json)
if metadata_exists
metadata = PSON.load(File.read(metadata_json))
else
if allow_empty_metadata
metadata = {}
else
raise(Puppet::ParseError, "load_module_metadata(): No metadata.json file for module #{mod}")
end
end
return metadata
end

View file

@ -3,7 +3,7 @@ require 'spec_helper'
describe 'load_module_metadata' do
it { is_expected.not_to eq(nil) }
it { is_expected.to run.with_params().and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
it { is_expected.to run.with_params("one", "two").and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
it { is_expected.to run.with_params("one", "two", "three").and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
it "should json parse the file" do
allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
@ -13,4 +13,17 @@ describe 'load_module_metadata' do
result = subject.call(['science'])
expect(result['name']).to eq('spencer-science')
end
it "should fail by default if there is no metadata.json" do
allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
allow(File).to receive(:exists?).with(/metadata.json/).and_return(false)
expect {subject.call(['science'])}.to raise_error(Puppet::ParseError)
end
it "should return nil if user allows empty metadata.json" do
allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
allow(File).to receive(:exists?).with(/metadata.json/).and_return(false)
result = subject.call(['science', true])
expect(result).to eq({})
end
end