summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Helwig <jacob@puppetlabs.com>2011-03-17 16:08:41 -0700
committerJacob Helwig <jacob@puppetlabs.com>2011-03-17 16:08:41 -0700
commit9d4f793f12961409f7fcca9e475454284bf5945c (patch)
treed9ac9b6ca936a0cd5cb121ae992e96a2652e7e03
parent43f82efd24564862952a715cba4424d6f0c92e48 (diff)
parent330d3992744b80187223e5b6af2a58219e4610f6 (diff)
downloadfacter-9d4f793f12961409f7fcca9e475454284bf5945c.tar.gz
facter-9d4f793f12961409f7fcca9e475454284bf5945c.tar.xz
facter-9d4f793f12961409f7fcca9e475454284bf5945c.zip
Merge branch 'next'
* next: Clean up indentation, and alignment in macaddress_spec.rb (#6716) fix facter issues on OSX with ipv6 in macaddress.rb. Fixed #2346 - A much cleverer EC2 fact Fixed #2346 - Part 1: Added arp fact for Linux Discussion on ec2 facts - #2346 Fixed #3087 - Identify VMWare (#6327) Memory facts should be available on Mac Darwin Fixed #6695 - Updated id fact for Darwin et al
-rw-r--r--lib/facter/arp.rb22
-rw-r--r--lib/facter/ec2.rb77
-rw-r--r--lib/facter/id.rb11
-rw-r--r--lib/facter/memory.rb37
-rw-r--r--lib/facter/operatingsystem.rb9
-rw-r--r--lib/facter/operatingsystemrelease.rb12
-rw-r--r--lib/facter/util/ip.rb7
-rw-r--r--lib/facter/util/macaddress.rb2
-rw-r--r--lib/facter/util/memory.rb31
-rw-r--r--spec/fixtures/ifconfig/darwin_10_6_6_dualstack8
-rw-r--r--spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en17
-rw-r--r--spec/fixtures/netstat/darwin_10_6_6_dualstack34
-rwxr-xr-xspec/unit/id_spec.rb27
-rwxr-xr-xspec/unit/operatingsystem_spec.rb16
-rwxr-xr-xspec/unit/operatingsystemrelease_spec.rb26
-rwxr-xr-xspec/unit/util/ip_spec.rb7
-rwxr-xr-xspec/unit/util/macaddress_spec.rb109
17 files changed, 350 insertions, 92 deletions
diff --git a/lib/facter/arp.rb b/lib/facter/arp.rb
new file mode 100644
index 0000000..f4b7709
--- /dev/null
+++ b/lib/facter/arp.rb
@@ -0,0 +1,22 @@
+require 'facter/util/ip'
+
+Facter.add(:arp) do
+ confine :kernel => :linux
+ setcode do
+ arp = []
+ output = %x{/usr/sbin/arp -a}
+ output.each_line do |s|
+ arp.push($1) if s =~ /^\S+\s\S+\s\S+\s(\S+)\s\S+\s\S+\s\S+$/
+ end
+ arp[0]
+ end
+end
+
+Facter::Util::IP.get_interfaces.each do |interface|
+ Facter.add("arp_" + Facter::Util::IP.alphafy(interface)) do
+ confine :kernel => :linux
+ setcode do
+ Facter::Util::IP.get_arp_value(interface)
+ end
+ end
+end
diff --git a/lib/facter/ec2.rb b/lib/facter/ec2.rb
index ef84757..29b2a1c 100644
--- a/lib/facter/ec2.rb
+++ b/lib/facter/ec2.rb
@@ -1,24 +1,46 @@
-# Changelog:
-# Original facts - Tim Dysinger
-# Updated and added can_connect? function - KurtBe
+# Original fact Tim Dysinger
+# Additional work from KurtBe
+# Additional work for Paul Nasrat
+# Additional work modelled on Ohai EC2 fact
require 'open-uri'
-require 'timeout'
+require 'socket'
-def can_connect?(ip,port,wait_sec=2)
- Timeout::timeout(wait_sec) {open(ip, port)}
- return true
-rescue
- return false
-end
+EC2_ADDR = "169.254.169.254"
+EC2_METADATA_URL = "http://#{EC2_ADDR}/2008-02-01/meta-data"
+EC2_USERDATA_URL = "http://#{EC2_ADDR}/2008-02-01/user-data"
+
+def can_metadata_connect?(addr, port, timeout=2)
+ t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
+ saddr = Socket.pack_sockaddr_in(port, addr)
+ connected = false
+ begin
+ t.connect_nonblock(saddr)
+ rescue Errno::EINPROGRESS
+ r,w,e = IO::select(nil,[t],nil,timeout)
+ if !w.nil?
+ connected = true
+ else
+ begin
+ t.connect_nonblock(saddr)
+ rescue Errno::EISCONN
+ t.close
+ connected = true
+ rescue SystemCallError
+ end
+ end
+ rescue SystemCallError
+ end
+ connected
+end
def metadata(id = "")
- open("http://169.254.169.254/2008-02-01/meta-data/#{id||=''}").read.
+ open("#{EC2_METADATA_URL}/#{id||=''}").read.
split("\n").each do |o|
key = "#{id}#{o.gsub(/\=.*$/, '/')}"
if key[-1..-1] != '/'
- value = open("http://169.254.169.254/2008-02-01/meta-data/#{key}").read.
+ value = open("#{EC2_METADATA_URL}/#{key}").read.
split("\n")
value = value.size>1 ? value : value.first
symbol = "ec2_#{key.gsub(/\-|\//, '_')}".to_sym
@@ -29,7 +51,34 @@ def metadata(id = "")
end
end
-if can_connect?("169.254.169.254","80")
- metadata
+def userdata()
+ # assumes the only expected error is the 404 if there's no user-data
+ begin
+ value = OpenURI.open_uri("#{EC2_USERDATA_URL}/").read.split
+ Facter.add(:ec2_userdata) { setcode { value } }
+ rescue OpenURI::HTTPError
+ end
end
+def has_euca_mac?
+ if Facter.value(:macaddress) =~ /^[dD]0:0[dD]:/
+ return true
+ else
+ return false
+ end
+end
+
+def has_ec2_arp?
+ if Facter.value(:arp) == 'fe:ff:ff:ff:ff:ff'
+ return true
+ else
+ return false
+ end
+end
+
+if (has_euca_mac? || has_ec2_arp?) && can_metadata_connect?(EC2_ADDR,80)
+ metadata
+ userdata
+else
+ Facter.debug "Not an EC2 host"
+end
diff --git a/lib/facter/id.rb b/lib/facter/id.rb
index c2c3594..1c42284 100644
--- a/lib/facter/id.rb
+++ b/lib/facter/id.rb
@@ -1,15 +1,8 @@
Facter.add(:id) do
- confine :operatingsystem => %w{Linux Fedora RedHat CentOS SuSE SLES Debian Ubuntu Gentoo AIX OEL OVS GNU/kFreeBSD windows}
setcode "whoami"
end
Facter.add(:id) do
- confine :operatingsystem => %w{Solaris}
- setcode do
- if %x{id} =~ /^uid=\d+\((\S+)\)/
- $1
- else
- nil
- end
- end
+ confine :kernel => :SunOS
+ setcode "/usr/xpg4/bin/id -un"
end
diff --git a/lib/facter/memory.rb b/lib/facter/memory.rb
index aa67702..9dd2e29 100644
--- a/lib/facter/memory.rb
+++ b/lib/facter/memory.rb
@@ -110,6 +110,43 @@ if Facter.value(:kernel) == "OpenBSD"
end
end
+if Facter.value(:kernel) == "Darwin"
+ swap = Facter::Util::Resolution.exec('sysctl vm.swapusage')
+ swapfree, swaptotal = 0, 0
+ unless swap.empty?
+ # Parse the line:
+ # vm.swapusage: total = 128.00M used = 0.37M free = 127.63M (encrypted)
+ if swap =~ /total\s=\s(\S+)\s+used\s=\s(\S+)\s+free\s=\s(\S+)\s/
+ swaptotal += $1.to_i
+ swapfree += $3.to_i
+ end
+ end
+
+ Facter.add("SwapSize") do
+ confine :kernel => :Darwin
+ setcode do
+ Facter::Memory.scale_number(swaptotal.to_f,"MB")
+ end
+ end
+
+ Facter.add("SwapFree") do
+ confine :kernel => :Darwin
+ setcode do
+ Facter::Memory.scale_number(swapfree.to_f,"MB")
+ end
+ end
+
+ Facter::Memory.vmstat_darwin_find_free_memory()
+
+ Facter.add("MemoryTotal") do
+ confine :kernel => :Darwin
+ memtotal = Facter::Util::Resolution.exec("sysctl hw.memsize | cut -d':' -f2")
+ setcode do
+ Facter::Memory.scale_number(memtotal.to_f,"")
+ end
+ end
+end
+
if Facter.value(:kernel) == "SunOS"
swap = Facter::Util::Resolution.exec('/usr/sbin/swap -l')
swapfree, swaptotal = 0, 0
diff --git a/lib/facter/operatingsystem.rb b/lib/facter/operatingsystem.rb
index 1675909..25eeb00 100644
--- a/lib/facter/operatingsystem.rb
+++ b/lib/facter/operatingsystem.rb
@@ -32,6 +32,8 @@ Facter.add(:operatingsystem) do
end
elsif FileTest.exists?("/etc/arch-release")
"Arch"
+ elsif FileTest.exists?("/etc/vmware-release")
+ "VMWareESX"
elsif FileTest.exists?("/etc/redhat-release")
txt = File.read("/etc/redhat-release")
if txt =~ /centos/i
@@ -63,6 +65,13 @@ Facter.add(:operatingsystem) do
end
Facter.add(:operatingsystem) do
+ confine :kernel => "VMkernel"
+ setcode do
+ "ESXi"
+ end
+end
+
+Facter.add(:operatingsystem) do
# Default to just returning the kernel as the operating system
setcode do Facter[:kernel].value end
end
diff --git a/lib/facter/operatingsystemrelease.rb b/lib/facter/operatingsystemrelease.rb
index ac9be65..da1b76a 100644
--- a/lib/facter/operatingsystemrelease.rb
+++ b/lib/facter/operatingsystemrelease.rb
@@ -84,6 +84,16 @@ Facter.add(:operatingsystemrelease) do
end
Facter.add(:operatingsystemrelease) do
+ confine :operatingsystem => %w{VMwareESX}
+ setcode do
+ release = Facter::Util::Resolution.exec('vmware -v')
+ if release =~ /VMware ESX .*?(\d.*)/
+ $1
+ end
+ end
+end
+
+Facter.add(:operatingsystemrelease) do
confine :operatingsystem => %w{Slamd64}
setcode do
releasefile = Facter::Util::Resolution.exec('cat /etc/slamd64-version')
@@ -96,5 +106,5 @@ Facter.add(:operatingsystemrelease) do
end
Facter.add(:operatingsystemrelease) do
- setcode do Facter[:kernelrelease].value end
+ setcode do Facter[:kernelrelease].value end
end
diff --git a/lib/facter/util/ip.rb b/lib/facter/util/ip.rb
index e4370dc..8b6dbf4 100644
--- a/lib/facter/util/ip.rb
+++ b/lib/facter/util/ip.rb
@@ -169,4 +169,11 @@ module Facter::Util::IP
network = ip.mask(subnet.to_s).to_s
end
end
+
+ def self.get_arp_value(interface)
+ arp = Facter::Util::Resolution.exec("arp -en -i #{interface} | sed -e 1d")
+ if arp =~ /^\S+\s+\w+\s+(\S+)\s+\w\s+\S+$/
+ return $1
+ end
+ end
end
diff --git a/lib/facter/util/macaddress.rb b/lib/facter/util/macaddress.rb
index fc0a043..f6bae14 100644
--- a/lib/facter/util/macaddress.rb
+++ b/lib/facter/util/macaddress.rb
@@ -12,7 +12,7 @@ module Facter::Util::Macaddress
end
def self.default_interface
- `#{netstat_command} | /usr/bin/awk '/^default/{print $6}'`.chomp
+ `#{netstat_command} | /usr/bin/awk '/^default/{print $6;exit}'`.chomp
end
private
diff --git a/lib/facter/util/memory.rb b/lib/facter/util/memory.rb
index 43abec6..029b117 100644
--- a/lib/facter/util/memory.rb
+++ b/lib/facter/util/memory.rb
@@ -62,5 +62,36 @@ module Facter::Memory
end
end
end
+
+ # Darwin had to be different. It's generally opaque with how much RAM it is
+ # using, and this figure could be improved upon too I fear.
+ # Parses the output of "vm_stat", takes the pages free & pages speculative
+ # and multiples that by the page size (also given in output). Ties in with
+ # what activity monitor outputs for free memory.
+ def self.vmstat_darwin_find_free_memory()
+
+ memfree = 0
+ pagesize = 0
+ memspecfree = 0
+
+ vmstats = Facter::Util::Resolution.exec('vm_stat')
+ vmstats.each do |vmline|
+ case
+ when vmline =~ /page\ssize\sof\s(\d+)\sbytes/
+ pagesize = $1.to_i
+ when vmline =~ /^Pages\sfree:\s+(\d+)\./
+ memfree = $1.to_i
+ when vmline =~ /^Pages\sspeculative:\s+(\d+)\./
+ memspecfree = $1.to_i
+ end
+ end
+
+ freemem = ( memfree + memspecfree ) * pagesize
+ Facter.add("MemoryFree") do
+ setcode do
+ Facter::Memory.scale_number(freemem.to_f, "")
+ end
+ end
+ end
end
diff --git a/spec/fixtures/ifconfig/darwin_10_6_6_dualstack b/spec/fixtures/ifconfig/darwin_10_6_6_dualstack
new file mode 100644
index 0000000..819f56e
--- /dev/null
+++ b/spec/fixtures/ifconfig/darwin_10_6_6_dualstack
@@ -0,0 +1,8 @@
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
+ inet 127.0.0.1 netmask 0xff000000
+ inet6 ::1 prefixlen 128
+ inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
+en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:25:4b:ca:56:72
+ media: autoselect
+ status: inactive
diff --git a/spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en1 b/spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en1
new file mode 100644
index 0000000..eabb1f6
--- /dev/null
+++ b/spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en1
@@ -0,0 +1,7 @@
+en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
+ ether 00:25:00:48:19:ef
+ inet6 fe80::225:ff:fe48:19ef%en1 prefixlen 64 scopeid 0x5
+ inet 192.168.1.207 netmask 0xffffff00 broadcast 192.168.1.255
+ inet6 2000:44b4:32:400::1 prefixlen 64
+ media: autoselect
+ status: active
diff --git a/spec/fixtures/netstat/darwin_10_6_6_dualstack b/spec/fixtures/netstat/darwin_10_6_6_dualstack
new file mode 100644
index 0000000..14d937d
--- /dev/null
+++ b/spec/fixtures/netstat/darwin_10_6_6_dualstack
@@ -0,0 +1,34 @@
+Routing tables
+
+Internet:
+Destination Gateway Flags Refs Use Netif Expire
+default 192.168.1.254 UGSc 38 0 en1
+127 127.0.0.1 UCS 0 0 lo0
+127.0.0.1 127.0.0.1 UH 14 1044474 lo0
+169.254 link#5 UCS 0 0 en1
+192.168.1 link#5 UCS 2 0 en1
+192.168.1.207 127.0.0.1 UHS 0 1 lo0
+192.168.1.220 e0:f8:47:98:85:71 UHLWI 0 0 en1 135
+192.168.1.254 0:4:ed:66:13:cc UHLWI 42 134 en1 1158
+
+Internet6:
+Destination Gateway Flags Netif Expire
+default 2000:44b4:61::16e UGSc tun0
+::1 ::1 UH lo0
+2000:44b4:61::16e 2000:44b4:61::16f UH tun0
+2000:44b4:61::16f link#9 UHL lo0
+2000:44b4:62:480::/64 link#5 UC en1
+2000:44b4:62:480::/60 ::1 UGSc lo0
+2000:44b4:62:480::1 0:25:0:48:19:ef UHL lo0
+fe80::%lo0/64 fe80::1%lo0 Uc lo0
+fe80::1%lo0 link#1 UHL lo0
+fe80::%en1/64 link#5 UC en1
+fe80::225:ff:fe48:19ef%en1 0:25:0:48:19:ef UHL lo0
+fe80::a00:27ff:fe02:bcb5%en1 8:0:27:2:bc:b5 UHLW en1
+fe80::a932:c76f:9c2e:ead8%en1 0:1e:2a:b3:9b:66 UHLW en1
+fe80::e2f8:47ff:fe98:8571%en1 e0:f8:47:98:85:71 UHLW en1
+fe80::225:4bff:feca:5672%tun0 link#9 UHL lo0
+ff01::/32 ::1 Um lo0
+ff02::/32 ::1 UmC lo0
+ff02::/32 link#5 UmC en1
+ff02::/32 fe80::225:4bff:feca:5672%tun0 UmC tun0
diff --git a/spec/unit/id_spec.rb b/spec/unit/id_spec.rb
new file mode 100755
index 0000000..a9e1797
--- /dev/null
+++ b/spec/unit/id_spec.rb
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+describe "id fact" do
+
+ kernel = [ 'Linux', 'Darwin', 'windows', 'FreeBSD', 'OpenBSD', 'NetBSD', 'AIX', 'HP-UX' ]
+
+ kernel.each do |k|
+ describe "with kernel reported as #{k}" do
+ it "should return the current user" do
+ Facter::Util::Resolution.stubs(:exec).with('uname -s').returns(k)
+ Facter::Util::Resolution.stubs(:exec).with('lsb_release -a 2>/dev/null').returns('foo')
+ Facter::Util::Resolution.expects(:exec).once.with('whoami', '/bin/sh').returns 'bar'
+
+ Facter.fact(:id).value.should == 'bar'
+ end
+ end
+ end
+
+ it "should return the current user on Solaris" do
+ Facter::Util::Resolution.stubs(:exec).with('uname -s').returns('SunOS')
+ Facter::Util::Resolution.expects(:exec).once.with('/usr/xpg4/bin/id -un', '/bin/sh').returns 'bar'
+
+ Facter.fact(:id).value.should == 'bar'
+ end
+end
diff --git a/spec/unit/operatingsystem_spec.rb b/spec/unit/operatingsystem_spec.rb
index 73b3649..91cd311 100755
--- a/spec/unit/operatingsystem_spec.rb
+++ b/spec/unit/operatingsystem_spec.rb
@@ -26,8 +26,13 @@ describe "Operating System fact" do
Facter.fact(:operatingsystem).value.should == "Solaris"
end
- it "should identify Oracle VM as OVS" do
+ it "should be ESXi for VMkernel" do
+ Facter.fact(:kernel).stubs(:value).returns("VMkernel")
+
+ Facter.fact(:operatingsystem).value.should == "ESXi"
+ end
+ it "should identify Oracle VM as OVS" do
Facter.fact(:kernel).stubs(:value).returns("Linux")
FileTest.stubs(:exists?).returns false
@@ -36,4 +41,13 @@ describe "Operating System fact" do
Facter.fact(:operatingsystem).value.should == "OVS"
end
+
+ it "should identify VMWare ESX" do
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
+ FileTest.stubs(:exists?).returns false
+
+ FileTest.expects(:exists?).with("/etc/vmware-release").returns true
+
+ Facter.fact(:operatingsystem).value.should == "VMWareESX"
+ end
end
diff --git a/spec/unit/operatingsystemrelease_spec.rb b/spec/unit/operatingsystemrelease_spec.rb
index 1cfb4ac..739a20a 100755
--- a/spec/unit/operatingsystemrelease_spec.rb
+++ b/spec/unit/operatingsystemrelease_spec.rb
@@ -15,14 +15,14 @@ describe "Operating System Release fact" do
end
test_cases = {
- "CentOS" => "/etc/redhat-release",
- "RedHat" => "/etc/redhat-release",
- "Fedora" => "/etc/fedora-release",
- "MeeGo" => "/etc/meego-release",
- "OEL" => "/etc/enterprise-release",
- "oel" => "/etc/enterprise-release",
- "OVS" => "/etc/ovs-release",
- "ovs" => "/etc/ovs-release"
+ "CentOS" => "/etc/redhat-release",
+ "RedHat" => "/etc/redhat-release",
+ "Fedora" => "/etc/fedora-release",
+ "MeeGo" => "/etc/meego-release",
+ "OEL" => "/etc/enterprise-release",
+ "oel" => "/etc/enterprise-release",
+ "OVS" => "/etc/ovs-release",
+ "ovs" => "/etc/ovs-release",
}
test_cases.each do |system, file|
@@ -36,4 +36,14 @@ describe "Operating System Release fact" do
end
end
end
+
+ it "for VMWareESX it should run the vmware -v command" do
+ Facter.fact(:kernel).stubs(:value).returns("VMkernel")
+ Facter.fact(:kernelrelease).stubs(:value).returns("4.1.0")
+ Facter.fact(:operatingsystem).stubs(:value).returns("VMwareESX")
+
+ Facter::Util::Resolution.stubs(:exec).with('vmware -v').returns('foo')
+
+ Facter.fact(:operatingsystemrelease).value
+ end
end
diff --git a/spec/unit/util/ip_spec.rb b/spec/unit/util/ip_spec.rb
index 1a545b8..0374e75 100755
--- a/spec/unit/util/ip_spec.rb
+++ b/spec/unit/util/ip_spec.rb
@@ -227,4 +227,11 @@ describe Facter::Util::IP do
Facter::Util::IP.convert_from_hex?(platform).should == true
end
end
+
+ it "should return an arp address on Linux" do
+ Facter.stubs(:value).with(:kernel).returns("Linux")
+
+ Facter::Util::IP.expects(:get_arp_value).with("eth0").returns("00:00:0c:9f:f0:04")
+ Facter::Util::IP.get_arp_value("eth0").should == "00:00:0c:9f:f0:04"
+ end
end
diff --git a/spec/unit/util/macaddress_spec.rb b/spec/unit/util/macaddress_spec.rb
index 98215c4..4764b05 100755
--- a/spec/unit/util/macaddress_spec.rb
+++ b/spec/unit/util/macaddress_spec.rb
@@ -5,71 +5,64 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
require 'facter/util/macaddress'
describe "Darwin" do
- test_cases = [
- # version, iface, real macaddress, fallback macaddress
- ["9.8.0", 'en0', "00:17:f2:06:e4:2e", "00:17:f2:06:e4:2e"],
- ["10.3.0", 'en0', "00:17:f2:06:e3:c2", "00:17:f2:06:e3:c2"],
- ["10.6.4", 'en1', "58:b0:35:7f:25:b3", "58:b0:35:fa:08:b1"]
- ]
-
- test_cases.each do |version, default_iface, macaddress, fallback_macaddress|
- netstat_file = File.join(SPECDIR, "fixtures", "netstat", "darwin_#{version.tr('.', '_')}")
- ifconfig_file_no_iface = File.join(SPECDIR, "fixtures", "ifconfig", "darwin_#{version.tr('.', '_')}")
- ifconfig_file = "#{ifconfig_file_no_iface}_#{default_iface}"
-
- describe "version #{version}" do
-
- describe Facter::Util::Macaddress::Darwin do
-
- describe ".default_interface" do
- describe "when netstat has a default interface" do
-
- before do
- Facter::Util::Macaddress::Darwin.stubs(:netstat_command).returns("cat \"#{netstat_file}\"")
- end
-
- it "should return the default interface name" do
- Facter::Util::Macaddress::Darwin.default_interface.should == default_iface
- end
- end
-
- end
-
- describe ".macaddress" do
- describe "when netstat has a default interface" do
- before do
- Facter.stubs(:warn)
- Facter::Util::Macaddress::Darwin.stubs(:default_interface).returns('')
- Facter::Util::Macaddress::Darwin.stubs(:ifconfig_command).returns("cat \"#{ifconfig_file}\"")
- end
-
- it "should return the macaddress of the default interface" do
- Facter::Util::Macaddress::Darwin.macaddress.should == macaddress
- end
-
- end
+ test_cases = [
+ # version, iface, real macaddress, fallback macaddress
+ ["9.8.0", 'en0', "00:17:f2:06:e4:2e", "00:17:f2:06:e4:2e"],
+ ["10.3.0", 'en0', "00:17:f2:06:e3:c2", "00:17:f2:06:e3:c2"],
+ ["10.6.4", 'en1', "58:b0:35:7f:25:b3", "58:b0:35:fa:08:b1"],
+ ["10.6.6_dualstack", "en1", "00:25:00:48:19:ef", "00:25:4b:ca:56:72"]
+ ]
+
+ test_cases.each do |version, default_iface, macaddress, fallback_macaddress|
+ netstat_file = File.join(SPECDIR, "fixtures", "netstat", "darwin_#{version.tr('.', '_')}")
+ ifconfig_file_no_iface = File.join(SPECDIR, "fixtures", "ifconfig", "darwin_#{version.tr('.', '_')}")
+ ifconfig_file = "#{ifconfig_file_no_iface}_#{default_iface}"
+
+ describe "version #{version}" do
+ describe Facter::Util::Macaddress::Darwin do
+ describe ".default_interface" do
+ describe "when netstat has a default interface" do
+ before do
+ Facter::Util::Macaddress::Darwin.stubs(:netstat_command).returns("cat \"#{netstat_file}\"")
+ end
- describe "when netstat does not have a default interface" do
- before do
- Facter::Util::Macaddress::Darwin.stubs(:default_interface).returns("")
- Facter::Util::Macaddress::Darwin.stubs(:ifconfig_command).returns("cat \"#{ifconfig_file_no_iface}\"")
- end
+ it "should return the default interface name" do
+ Facter::Util::Macaddress::Darwin.default_interface.should == default_iface
+ end
+ end
+ end
- it "should warn about the lack of default" do
- Facter.expects(:warn).with("Could not find a default route. Using first non-loopback interface")
- Facter::Util::Macaddress::Darwin.stubs(:default_interface).returns('')
- Facter::Util::Macaddress::Darwin.macaddress
- end
+ describe ".macaddress" do
+ describe "when netstat has a default interface" do
+ before do
+ Facter.stubs(:warn)
+ Facter::Util::Macaddress::Darwin.stubs(:default_interface).returns('')
+ Facter::Util::Macaddress::Darwin.stubs(:ifconfig_command).returns("cat \"#{ifconfig_file}\"")
+ end
- it "should return the macaddress of the first non-loopback interface" do
- Facter::Util::Macaddress::Darwin.macaddress.should == fallback_macaddress
- end
+ it "should return the macaddress of the default interface" do
+ Facter::Util::Macaddress::Darwin.macaddress.should == macaddress
+ end
+ end
- end
- end
+ describe "when netstat does not have a default interface" do
+ before do
+ Facter::Util::Macaddress::Darwin.stubs(:default_interface).returns("")
+ Facter::Util::Macaddress::Darwin.stubs(:ifconfig_command).returns("cat \"#{ifconfig_file_no_iface}\"")
+ end
+ it "should warn about the lack of default" do
+ Facter.expects(:warn).with("Could not find a default route. Using first non-loopback interface")
+ Facter::Util::Macaddress::Darwin.stubs(:default_interface).returns('')
+ Facter::Util::Macaddress::Darwin.macaddress
end
+ it "should return the macaddress of the first non-loopback interface" do
+ Facter::Util::Macaddress::Darwin.macaddress.should == fallback_macaddress
+ end
+ end
end
+ end
end
+ end
end