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 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 4442f1edb5c3566e832b3b10ac6181793d7502e5 Mon Sep 17 00:00:00 2001 From: Matthaus Owens Date: Tue, 23 Oct 2012 14:14:06 -0700 Subject: Add spec tests for pe_version facts This commit adds some basic spec tests for the pe_version facts. There are basic postitive and negative cases. --- spec/unit/facter/pe_version_spec.rb | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 spec/unit/facter/pe_version_spec.rb 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 From ba70a3885af452aea72d408f447c5bc7fd8bf0c0 Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Wed, 24 Oct 2012 16:59:43 -0700 Subject: (maint) Clear all facts before each example Without this patch example groups must explicitly call `Facter.clear` to clear any cached values between examples. This is a problem because this behavior is not the concern of the example groups, the behavior is the concern of the spec_helper or whatever facility we have in place to initialize the system for testing. This patch fixes the problem by duplicating the logic in the Facter spec_helper to ensure facts are cleared out before each example. This patch requires the example groups to explicitly load the facts they require if the fact name does not match the filename. --- spec/spec_helper.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 -- 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(-) 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