summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStafford Brunk <wingrunr21@gmail.com>2014-08-27 09:27:22 -0600
committerBryan McLellan <btm@opscode.com>2015-02-17 11:51:01 -0500
commite271ab64202bc265595b6d5c2e3673b8a63d2f1b (patch)
tree3f301e66b2bb7e11a87cb96a7206ad71c5d94e25
parentbbfecb4481f143090eebd45a6bdb4ce6f10cf32c (diff)
downloadohai-e271ab64202bc265595b6d5c2e3673b8a63d2f1b.tar.gz
Add an IpHelper utility module
-rw-r--r--lib/ohai/util/ip_helper.rb52
-rw-r--r--spec/unit/util/ip_helper_spec.rb128
2 files changed, 180 insertions, 0 deletions
diff --git a/lib/ohai/util/ip_helper.rb b/lib/ohai/util/ip_helper.rb
new file mode 100644
index 00000000..92da9956
--- /dev/null
+++ b/lib/ohai/util/ip_helper.rb
@@ -0,0 +1,52 @@
+#
+# Author:: Stafford Brunk (<stafford.brunk@gmail.com>)
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module Ohai
+ module Util
+ module IpHelper
+ # Corresponding to RFC 4193
+ IPV6_PRIVATE_ADDRESS_BLOCK = IPAddress('fc00::/7')
+
+ def private_address?(addr)
+ ip = IPAddress(addr)
+
+ if ip.respond_to? :private?
+ ip.private?
+ else
+ IPV6_PRIVATE_ADDRESS_BLOCK.include?(ip)
+ end
+ end
+ alias :unique_local_address? :private_address?
+
+ def public_address?(addr)
+ !private_address?(addr)
+ end
+
+ # The ipaddress gem doesn't implement loopback?
+ # for IPv4 addresses
+ # https://github.com/bluemonk/ipaddress/issues/25
+ def loopback?(addr)
+ ip = IPAddress(addr)
+
+ if ip.respond_to? :loopback?
+ ip.loopback?
+ else
+ IPAddress('127.0.0.0/8').include? ip
+ end
+ end
+ end
+ end
+end
diff --git a/spec/unit/util/ip_helper_spec.rb b/spec/unit/util/ip_helper_spec.rb
new file mode 100644
index 00000000..946ca47c
--- /dev/null
+++ b/spec/unit/util/ip_helper_spec.rb
@@ -0,0 +1,128 @@
+#
+# Author:: Stafford Brunk (<stafford.brunk@gmail.com>)
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'ipaddress'
+require 'spec_helper'
+require 'ohai/util/ip_helper'
+
+class IpHelperMock
+ include Ohai::Util::IpHelper
+end
+
+describe "Ohai::Util::IpHelper" do
+ let(:ip_helper) { IpHelperMock.new }
+
+ shared_examples 'ip address types' do
+ context 'with an IPv4 address' do
+ context 'that is private' do
+ let(:address) { '10.128.142.89' }
+
+ it 'identifies the address as private' do
+ expect(ip_helper.private_address?(address)).to be_truthy
+ end
+ end
+
+ context 'that is public' do
+ let(:address) { '74.125.224.72' }
+
+ it 'identifies the address as public' do
+ expect(ip_helper.private_address?(address)).to be_falsey
+ end
+ end
+ end
+
+ context 'with an IPv6 address' do
+ context 'that is an RFC 4193 unique local address' do
+ let(:address) { 'fdf8:f53b:82e4::53' }
+
+ it 'identifies the address as a unique local address' do
+ expect(ip_helper.private_address?(address)).to be_truthy
+ end
+ end
+
+ context 'that is a non RFC 4193 unique local address' do
+ let(:address) { 'FE80::0202:B3FF:FE1E:8329' }
+
+ it 'does not identify the address as a unique local address' do
+ expect(ip_helper.private_address?(address)).to be_falsey
+ end
+ end
+ end
+ end
+
+ describe 'private_address?' do
+ include_examples 'ip address types'
+ end
+
+ describe 'unique_local_address?' do
+ include_examples 'ip address types'
+ end
+
+ describe 'public_address?' do
+ let(:address) { '10.128.142.89' }
+
+ before do
+ allow(ip_helper).to receive(:private_address?)
+ end
+
+ it 'should call #private_address?' do
+ expect(ip_helper).to receive(:private_address?)
+ ip_helper.public_address?(address)
+ end
+
+ it 'should return the inverse of #private_address?' do
+ expect(ip_helper.public_address?(address)).to equal !ip_helper.private_address?(address)
+ end
+ end
+
+ describe 'loopback?' do
+ context 'with an IPv4 address' do
+ context 'that is a loopback address' do
+ let(:address) { '127.0.0.1' }
+
+ it 'should identify the address as a loopback address' do
+ expect(ip_helper.loopback?(address)).to be_truthy
+ end
+ end
+
+ context 'that is not a loopback address' do
+ let(:address) { '1.2.3.4' }
+
+ it 'should not identify the address as a loopback address' do
+ expect(ip_helper.loopback?(address)).to be_falsey
+ end
+ end
+ end
+
+ context 'with an IPv6 address' do
+ context 'that is a loopback address' do
+ let(:address) { '0:0:0:0:0:0:0:1' }
+
+ it 'should identify the address as a loopback address' do
+ expect(ip_helper.loopback?(address)).to be_truthy
+ end
+ end
+
+ context 'that is not a loopback address' do
+ let(:address) { '2400:6180:0000:00D0:0000:0000:0009:7001' }
+
+ it 'should not identify the address as a loopback address' do
+ expect(ip_helper.loopback?(address)).to be_falsey
+ end
+ end
+ end
+ end
+end