From cdf3b05f35f78971203dfd9fadd2552ad5a41bd4 Mon Sep 17 00:00:00 2001 From: Matthaus Owens Date: Tue, 23 Oct 2012 14:13:11 -0700 Subject: Add PE facts to stdlib As many PE modules have PE specific functionality, but are deployed to all nodes, including FOSS nodes, it is valuable to be able to selectively enable those PE specific functions. These facts allow modules to use the is_pe fact to determine whether the module should be used or not. The facts include is_pe, pe_version, pe_major_version, pe_minor_version, and pe_patch_version. For PE 2.6.0 those facts would have values true, 2.6.0, 2, 6, and 0, respectively. --- lib/facter/pe_version.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 lib/facter/pe_version.rb (limited to 'lib/facter') diff --git a/lib/facter/pe_version.rb b/lib/facter/pe_version.rb new file mode 100644 index 0000000..7c31e84 --- /dev/null +++ b/lib/facter/pe_version.rb @@ -0,0 +1,47 @@ +# Fact: is_pe, pe_version, pe_major_version, pe_minor_version, pe_patch_version +# +# Purpose: Return various facts about the PE state of the system +# +# Resolution: Uses a regex match against puppetversion to determine whether the +# machine has Puppet Enterprise installed, and what version (overall, major, +# minor, patch) is installed. +# +# Caveats: +# +Facter.add("pe_version") do + setcode do + pe_ver = Facter.value("puppetversion").match(/Puppet Enterprise (\d+\.\d+\.\d+)/) + pe_ver[1] if pe_ver + end +end + +Facter.add("is_pe") do + setcode do + if Facter.value(:pe_version).to_s.empty? then + false + else + true + end + end +end + +Facter.add("pe_major_version") do + confine :is_pe => true + setcode do + Facter.value(:pe_version).split('.')[0] + end +end + +Facter.add("pe_minor_version") do + confine :is_pe => true + setcode do + Facter.value(:pe_version).split('.')[1] + end +end + +Facter.add("pe_patch_version") do + confine :is_pe => true + setcode do + Facter.value(:pe_version).split('.')[2] + end +end -- cgit v1.2.3 From e68677976b671eb8b7f81393dc6dac6c6d86410c Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Thu, 25 Oct 2012 10:00:42 -0700 Subject: Prevent undefined method `split' for nil:NilClass with pe_foo_version facts Without this patch the pe_major_version, pe_minor_version, and pe_patch_version facts directly depend on the pe_version fact in a manner that calls split directly on the return value. This is a problem because Fact values are not always guaranteed to return strings, or objects that respond to split. This patch is a defensive measure to ensure we're always calling the split method on a string object. If the Fact returns nil, this will be converted to an empty string responding to split. --- lib/facter/pe_version.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'lib/facter') diff --git a/lib/facter/pe_version.rb b/lib/facter/pe_version.rb index 7c31e84..0cc0f64 100644 --- a/lib/facter/pe_version.rb +++ b/lib/facter/pe_version.rb @@ -28,20 +28,26 @@ end Facter.add("pe_major_version") do confine :is_pe => true setcode do - Facter.value(:pe_version).split('.')[0] + if pe_version = Facter.value(:pe_version) + pe_version.to_s.split('.')[0] + end end end Facter.add("pe_minor_version") do confine :is_pe => true setcode do - Facter.value(:pe_version).split('.')[1] + if pe_version = Facter.value(:pe_version) + pe_version.to_s.split('.')[1] + end end end Facter.add("pe_patch_version") do confine :is_pe => true setcode do - Facter.value(:pe_version).split('.')[2] + if pe_version = Facter.value(:pe_version) + pe_version.to_s.split('.')[2] + end end end -- cgit v1.2.3 From d6d23b495cda0e154b4e73982acc43e586564c0e Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Thu, 25 Oct 2012 10:41:52 -0700 Subject: Revert "Merge branch 'haus-add_pe_facts_to_stdlib' into 2.4.x" This reverts commit 74e6411157b8df1af9a24c17971e3236f3096529, reversing changes made to 417d219aa6e42f2a16af42c98aa063fc1d9d2ecd. Here's why: Actually... I just screwed this up. I merged this new fact into 2.4.x but it's not fixing any bug. It's adding a new fact, so this should go into master and we should release 2.5 since this is new, backwards-compatible functionality. --- lib/facter/pe_version.rb | 53 ----------------------------- spec/spec_helper.rb | 14 -------- spec/unit/facter/pe_version_spec.rb | 68 ------------------------------------- 3 files changed, 135 deletions(-) delete mode 100644 lib/facter/pe_version.rb delete mode 100644 spec/unit/facter/pe_version_spec.rb (limited to 'lib/facter') diff --git a/lib/facter/pe_version.rb b/lib/facter/pe_version.rb deleted file mode 100644 index 0cc0f64..0000000 --- a/lib/facter/pe_version.rb +++ /dev/null @@ -1,53 +0,0 @@ -# Fact: is_pe, pe_version, pe_major_version, pe_minor_version, pe_patch_version -# -# Purpose: Return various facts about the PE state of the system -# -# Resolution: Uses a regex match against puppetversion to determine whether the -# machine has Puppet Enterprise installed, and what version (overall, major, -# minor, patch) is installed. -# -# Caveats: -# -Facter.add("pe_version") do - setcode do - pe_ver = Facter.value("puppetversion").match(/Puppet Enterprise (\d+\.\d+\.\d+)/) - pe_ver[1] if pe_ver - end -end - -Facter.add("is_pe") do - setcode do - if Facter.value(:pe_version).to_s.empty? then - false - else - true - end - end -end - -Facter.add("pe_major_version") do - confine :is_pe => true - setcode do - if pe_version = Facter.value(:pe_version) - pe_version.to_s.split('.')[0] - end - end -end - -Facter.add("pe_minor_version") do - confine :is_pe => true - setcode do - if pe_version = Facter.value(:pe_version) - pe_version.to_s.split('.')[1] - end - end -end - -Facter.add("pe_patch_version") do - confine :is_pe => true - setcode do - if pe_version = Facter.value(:pe_version) - pe_version.to_s.split('.')[2] - end - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 931d35c..8ae9ad3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,17 +12,3 @@ require 'rspec/expectations' require 'puppetlabs_spec_helper/module_spec_helper' -RSpec.configure do |config| - # FIXME REVISIT - We may want to delegate to Facter like we do in - # Puppet::PuppetSpecInitializer.initialize_via_testhelper(config) because - # this behavior is a duplication of the spec_helper in Facter. - config.before :each do - # Ensure that we don't accidentally cache facts and environment between - # test cases. This requires each example group to explicitly load the - # facts being exercised with something like - # Facter.collection.loader.load(:ipaddress) - Facter::Util::Loader.any_instance.stubs(:load_all) - Facter.clear - Facter.clear_messages - end -end diff --git a/spec/unit/facter/pe_version_spec.rb b/spec/unit/facter/pe_version_spec.rb deleted file mode 100644 index 202a0e5..0000000 --- a/spec/unit/facter/pe_version_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env rspec - -require 'spec_helper' - -describe "PE Version specs" do - before :each do - Facter.collection.loader.load(:pe_version) - end - - context "If PE is installed" do - %w{ 2.6.1 2.10.300 }.each do |version| - puppetversion = "2.7.19 (Puppet Enterprise #{version})" - context "puppetversion => #{puppetversion}" do - before :each do - Facter.fact(:puppetversion).stubs(:value).returns(puppetversion) - end - - (major,minor,patch) = version.split(".") - - it "Should return true" do - Facter.fact(:is_pe).value.should == true - end - - it "Should have a version of #{version}" do - Facter.fact(:pe_version).value.should == version - end - - it "Should have a major version of #{major}" do - Facter.fact(:pe_major_version).value.should == major - end - - it "Should have a minor version of #{minor}" do - Facter.fact(:pe_minor_version).value.should == minor - end - - it "Should have a patch version of #{patch}" do - Facter.fact(:pe_patch_version).value.should == patch - end - end - end - end - - context "When PE is not installed" do - before :each do - Facter.fact(:puppetversion).stubs(:value).returns("2.7.19") - end - - it "is_pe is false" do - Facter.fact(:is_pe).value.should == false - end - - it "pe_version is nil" do - Facter.fact(:pe_version).value.should be_nil - end - - it "pe_major_version is nil" do - Facter.fact(:pe_major_version).value.should be_nil - end - - it "pe_minor_version is nil" do - Facter.fact(:pe_minor_version).value.should be_nil - end - - it "Should have a patch version" do - Facter.fact(:pe_patch_version).value.should be_nil - end - end -end -- cgit v1.2.3 From 9693c04c9d877e0f877418bc41e16f01aaf784cd Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Thu, 25 Oct 2012 10:46:57 -0700 Subject: Revert "Revert "Merge branch 'haus-add_pe_facts_to_stdlib' into 2.4.x"" This reverts commit d6d23b495cda0e154b4e73982acc43e586564c0e. This backwards-compatible additional functionality is targeted at the next minor release. There are already backwards-incompatible changes in the master branch so we need to establish a new minor branch. --- lib/facter/pe_version.rb | 53 +++++++++++++++++++++++++++++ spec/spec_helper.rb | 14 ++++++++ spec/unit/facter/pe_version_spec.rb | 68 +++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 lib/facter/pe_version.rb create mode 100644 spec/unit/facter/pe_version_spec.rb (limited to 'lib/facter') diff --git a/lib/facter/pe_version.rb b/lib/facter/pe_version.rb new file mode 100644 index 0000000..0cc0f64 --- /dev/null +++ b/lib/facter/pe_version.rb @@ -0,0 +1,53 @@ +# Fact: is_pe, pe_version, pe_major_version, pe_minor_version, pe_patch_version +# +# Purpose: Return various facts about the PE state of the system +# +# Resolution: Uses a regex match against puppetversion to determine whether the +# machine has Puppet Enterprise installed, and what version (overall, major, +# minor, patch) is installed. +# +# Caveats: +# +Facter.add("pe_version") do + setcode do + pe_ver = Facter.value("puppetversion").match(/Puppet Enterprise (\d+\.\d+\.\d+)/) + pe_ver[1] if pe_ver + end +end + +Facter.add("is_pe") do + setcode do + if Facter.value(:pe_version).to_s.empty? then + false + else + true + end + end +end + +Facter.add("pe_major_version") do + confine :is_pe => true + setcode do + if pe_version = Facter.value(:pe_version) + pe_version.to_s.split('.')[0] + end + end +end + +Facter.add("pe_minor_version") do + confine :is_pe => true + setcode do + if pe_version = Facter.value(:pe_version) + pe_version.to_s.split('.')[1] + end + end +end + +Facter.add("pe_patch_version") do + confine :is_pe => true + setcode do + if pe_version = Facter.value(:pe_version) + pe_version.to_s.split('.')[2] + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8ae9ad3..931d35c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,3 +12,17 @@ require 'rspec/expectations' require 'puppetlabs_spec_helper/module_spec_helper' +RSpec.configure do |config| + # FIXME REVISIT - We may want to delegate to Facter like we do in + # Puppet::PuppetSpecInitializer.initialize_via_testhelper(config) because + # this behavior is a duplication of the spec_helper in Facter. + config.before :each do + # Ensure that we don't accidentally cache facts and environment between + # test cases. This requires each example group to explicitly load the + # facts being exercised with something like + # Facter.collection.loader.load(:ipaddress) + Facter::Util::Loader.any_instance.stubs(:load_all) + Facter.clear + Facter.clear_messages + end +end diff --git a/spec/unit/facter/pe_version_spec.rb b/spec/unit/facter/pe_version_spec.rb new file mode 100644 index 0000000..202a0e5 --- /dev/null +++ b/spec/unit/facter/pe_version_spec.rb @@ -0,0 +1,68 @@ +#!/usr/bin/env rspec + +require 'spec_helper' + +describe "PE Version specs" do + before :each do + Facter.collection.loader.load(:pe_version) + end + + context "If PE is installed" do + %w{ 2.6.1 2.10.300 }.each do |version| + puppetversion = "2.7.19 (Puppet Enterprise #{version})" + context "puppetversion => #{puppetversion}" do + before :each do + Facter.fact(:puppetversion).stubs(:value).returns(puppetversion) + end + + (major,minor,patch) = version.split(".") + + it "Should return true" do + Facter.fact(:is_pe).value.should == true + end + + it "Should have a version of #{version}" do + Facter.fact(:pe_version).value.should == version + end + + it "Should have a major version of #{major}" do + Facter.fact(:pe_major_version).value.should == major + end + + it "Should have a minor version of #{minor}" do + Facter.fact(:pe_minor_version).value.should == minor + end + + it "Should have a patch version of #{patch}" do + Facter.fact(:pe_patch_version).value.should == patch + end + end + end + end + + context "When PE is not installed" do + before :each do + Facter.fact(:puppetversion).stubs(:value).returns("2.7.19") + end + + it "is_pe is false" do + Facter.fact(:is_pe).value.should == false + end + + it "pe_version is nil" do + Facter.fact(:pe_version).value.should be_nil + end + + it "pe_major_version is nil" do + Facter.fact(:pe_major_version).value.should be_nil + end + + it "pe_minor_version is nil" do + Facter.fact(:pe_minor_version).value.should be_nil + end + + it "Should have a patch version" do + Facter.fact(:pe_patch_version).value.should be_nil + end + end +end -- cgit v1.2.3