summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColleen Murphy <colleen@gazlene.net>2015-10-14 16:09:05 -0700
committerColleen Murphy <colleen@gazlene.net>2015-10-14 16:16:01 -0700
commit25410c4598d3c0029fcd05adc2e305dbf5f8d902 (patch)
tree556730758a11a2e2d42a60d43e553b7abcdf5c4c
parent0f8df10084c875edac521a2307ce4caf7317b636 (diff)
downloadpuppet-stdlib-25410c4598d3c0029fcd05adc2e305dbf5f8d902.tar.gz
puppet-stdlib-25410c4598d3c0029fcd05adc2e305dbf5f8d902.tar.bz2
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.
-rw-r--r--README.markdown9
-rw-r--r--lib/puppet/parser/functions/load_module_metadata.rb16
-rwxr-xr-xspec/functions/load_module_metadata_spec.rb15
3 files changed, 35 insertions, 5 deletions
diff --git a/README.markdown b/README.markdown
index b6f586e..d86d91f 100644
--- a/README.markdown
+++ b/README.markdown
@@ -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`
diff --git a/lib/puppet/parser/functions/load_module_metadata.rb b/lib/puppet/parser/functions/load_module_metadata.rb
index 0664a23..c9b8488 100644
--- a/lib/puppet/parser/functions/load_module_metadata.rb
+++ b/lib/puppet/parser/functions/load_module_metadata.rb
@@ -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
diff --git a/spec/functions/load_module_metadata_spec.rb b/spec/functions/load_module_metadata_spec.rb
index ba542eb..fe665fb 100755
--- a/spec/functions/load_module_metadata_spec.rb
+++ b/spec/functions/load_module_metadata_spec.rb
@@ -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