]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
Let load_module_metadata succeed on empty file
authorColleen Murphy <colleen@gazlene.net>
Wed, 14 Oct 2015 23:09:05 +0000 (16:09 -0700)
committerColleen Murphy <colleen@gazlene.net>
Wed, 14 Oct 2015 23:16:01 +0000 (16:16 -0700)
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.

README.markdown
lib/puppet/parser/functions/load_module_metadata.rb
spec/functions/load_module_metadata_spec.rb

index b6f586e169735288fff1e5920ebcbc81df363e73..d86d91fea7e39a1c2549b34d8e1b6723d8cdf5ff 100644 (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`
index 0664a2318d4e313d1033c8c3651bc85880d1d191..c9b84885b2cf955e7346d9e30b8fa0f0bd7a1316 100644 (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
index ba542eb7e84a424d695958bff5c301033d7988a7..fe665fb50b5e1b5ee4fa7fc5e48b5dada8e21522 100755 (executable)
@@ -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