address_for does not check for nil interface addresses
Add checks to address_for to check for no addresses for interface or no address for interface family. Change-Id: I3f81a80457df7a421cf60ba192fb8d7062f641a6 Closes-Bug: #1368292
This commit is contained in:
parent
7697c97231
commit
ff8bff52c3
@ -5,6 +5,7 @@ This file is used to list changes made in each version of cookbook-openstack-com
|
|||||||
## 10.1.0
|
## 10.1.0
|
||||||
* Adding identity admin bind host endpoint to allow flexibility and consistency
|
* Adding identity admin bind host endpoint to allow flexibility and consistency
|
||||||
* Fix logging.conf No section error
|
* Fix logging.conf No section error
|
||||||
|
* Raise error for nil address returned from address_for
|
||||||
|
|
||||||
## 10.0.3
|
## 10.0.3
|
||||||
* Adding identity internal endpoint variables to support new endpoint usage in identity cookbook
|
* Adding identity internal endpoint variables to support new endpoint usage in identity cookbook
|
||||||
|
@ -90,7 +90,7 @@ module ::Openstack # rubocop:disable Documentation
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return the IPv4 address for the hash.
|
# Return the address for the hash.
|
||||||
#
|
#
|
||||||
# If the bind_interface is set, then return the first IP on the interface.
|
# If the bind_interface is set, then return the first IP on the interface.
|
||||||
# otherwise return the IP specified in the host attribute.
|
# otherwise return the IP specified in the host attribute.
|
||||||
|
@ -24,11 +24,14 @@ module ::Openstack # rubocop:disable Documentation
|
|||||||
#
|
#
|
||||||
# @param [String] interface The interface to query.
|
# @param [String] interface The interface to query.
|
||||||
# @param [String] family The protocol family to use.
|
# @param [String] family The protocol family to use.
|
||||||
# @return [String] The address.
|
# @return [String] The address or log error when address is nil
|
||||||
def address_for(interface, family = node['openstack']['endpoints']['family'])
|
def address_for(interface, family = node['openstack']['endpoints']['family'])
|
||||||
interface_node = node['network']['interfaces'][interface]['addresses']
|
interface_node = node['network']['interfaces'][interface]['addresses']
|
||||||
interface_node.select do |address, data|
|
fail "Interface #{interface} has no addresses assigned" if interface_node.to_a.empty?
|
||||||
return address if data['family'] == family
|
|
||||||
end
|
address = interface_node.find { |addr, data| data['family'] == family }
|
||||||
|
fail "Interface #{interface} has no address for family #{family}" if address.nil?
|
||||||
|
|
||||||
|
address[0]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -60,5 +60,55 @@ describe 'openstack-common::default' do
|
|||||||
).to eq('::1')
|
).to eq('::1')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
describe '#address_for failures' do
|
||||||
|
it 'fails when addresses for interface is nil' do
|
||||||
|
node.set['network'] = {
|
||||||
|
'interfaces' => {
|
||||||
|
'lo' => {
|
||||||
|
'addresses' => nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allow(subject).to receive(:address_for).with('lo')
|
||||||
|
.and_raise('Interface lo has no addresses assigned')
|
||||||
|
expect { subject.address_for('lo') }
|
||||||
|
.to raise_error(RuntimeError, 'Interface lo has no addresses assigned')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails when no addresses are avaiable for interface' do
|
||||||
|
node.set['network'] = {
|
||||||
|
'interfaces' => {
|
||||||
|
'lo' => {
|
||||||
|
'addresses' => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allow(subject).to receive(:address_for).with('lo')
|
||||||
|
.and_raise('Interface lo has no addresses assigned')
|
||||||
|
expect { subject.address_for('lo') }
|
||||||
|
.to raise_error(RuntimeError, 'Interface lo has no addresses assigned')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails when no address is available for interface family' do
|
||||||
|
node.set['network'] = {
|
||||||
|
'interfaces' => {
|
||||||
|
'lo' => {
|
||||||
|
'addresses' => {
|
||||||
|
'127.0.0.1' => {
|
||||||
|
'family' => 'inet',
|
||||||
|
'prefixlen' => '8',
|
||||||
|
'netmask' => '255.0.0.0',
|
||||||
|
'scope' => 'Node'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allow(subject).to receive(:address_for).with('lo', 'inet6')
|
||||||
|
.and_raise('Interface lo has no address for family inet6')
|
||||||
|
expect { subject.address_for('lo', 'inet6') }
|
||||||
|
.to raise_error(RuntimeError, 'Interface lo has no address for family inet6')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user