Skip to content

Commit 12c160d

Browse files
authored
Merge pull request #314 from treydock/local-route
Support 'local' routes with redhat provider
2 parents 3a1251c + a80db8c commit 12c160d

File tree

6 files changed

+96
-9
lines changed

6 files changed

+96
-9
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ network_route { 'default':
8080
netmask => '0.0.0.0',
8181
network => 'default'
8282
}
83+
network_route { '10.0.0.2':
84+
ensure => 'present',
85+
network => 'local',
86+
interface => 'eth0',
87+
options => 'proto 66 scope host table local',
88+
}
8389
```
8490

8591
For SLES:

lib/puppet/provider/network_route/redhat.rb

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,23 @@ def self.parse_file(_filename, contents)
4242
route = line.split(' ', 6)
4343
raise Puppet::Error, 'Malformed redhat route file, cannot instantiate network_route resources' if route.length < 4
4444

45+
route = line.split(' ', 5) if route[0] == 'local'
46+
4547
new_route = {}
4648

47-
new_route[:gateway] = route[2]
48-
new_route[:interface] = route[4]
49-
new_route[:options] = route[5] if route[5]
49+
if route[0] == 'local'
50+
new_route[:interface] = route[3]
51+
new_route[:options] = route[4] if route[4]
52+
else
53+
new_route[:gateway] = route[2]
54+
new_route[:interface] = route[4]
55+
new_route[:options] = route[5] if route[5]
56+
end
5057

51-
if ['default', '0.0.0.0'].include? route[0]
58+
if route[0] == 'local'
59+
new_route[:name] = route[1]
60+
new_route[:network] = 'local'
61+
elsif ['default', '0.0.0.0'].include? route[0]
5262
new_route[:name] = 'default' # FIXME: Must match :name in order for changes to be detected
5363
new_route[:network] = 'default'
5464
new_route[:netmask] = '0.0.0.0'
@@ -72,11 +82,16 @@ def self.format_file(_filename, providers)
7282
contents << header
7383
# Build routes
7484
providers.sort_by(&:name).each do |provider|
75-
%w[network netmask gateway interface].each do |prop|
85+
%w[network interface].each do |prop|
7686
raise Puppet::Error, "#{provider.name} is missing the required parameter '#{prop}'." if provider.send(prop).nil?
7787
end
88+
%w[netmask gateway].each do |prop|
89+
raise Puppet::Error, "#{provider.name} is missing the required parameter '#{prop}'." if provider.send(prop).nil? && provider.send('network').to_s != 'local'
90+
end
7891
contents << if provider.network == 'default'
7992
"#{provider.network} via #{provider.gateway} dev #{provider.interface}"
93+
elsif provider.network == 'local'
94+
"#{provider.network} #{provider.name} dev #{provider.interface}"
8095
else
8196
ip = IPAddr.new("#{provider.network}/#{provider.netmask}")
8297
"#{ip}/#{ip.prefix} via #{provider.gateway} dev #{provider.interface}"

lib/puppet/type/network_route.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@
2222
isrequired
2323
desc 'The target network address'
2424
validate do |value|
25-
unless value == 'default'
25+
unless %w[default local].include?(value)
2626
a = PuppetX::Voxpupuli::Utils.try { IPAddr.new(value) }
2727
raise("Invalid value for parameter 'network': #{value}") unless a
2828
end
2929
end
3030
end
3131

3232
newproperty(:netmask) do
33-
isrequired
3433
desc 'The subnet mask to apply to the route'
3534

3635
validate do |value|
@@ -54,7 +53,6 @@
5453
end
5554

5655
newproperty(:gateway) do
57-
isrequired
5856
desc 'The gateway to use for the route'
5957

6058
validate do |value|
@@ -79,4 +77,9 @@
7977
raise ArgumentError, "#{self.class} requires a string for the options property" unless value.is_a?(String)
8078
end
8179
end
80+
81+
validate do
82+
raise "Network_route[#{self[:name]}] must have netmask defined" if self[:network] != 'local' && self[:netmask].nil?
83+
raise "Network_route[#{self[:name]}] must have gateway defined" if self[:network] != 'local' && self[:gateway].nil?
84+
end
8285
end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
10.0.0.0/8 via 10.0.0.1 dev eth0
2+
192.168.0.0/16 via 10.0.0.1 table n0-hc
3+
local 10.0.0.2 dev eth0 proto 66 scope host table local

spec/unit/provider/network_route/redhat_spec.rb

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,21 @@ def fixture_data(file)
6969
end
7070
end
7171

72+
describe 'an advanced file using local route' do
73+
let :data do
74+
described_class.parse_file('', fixture_data('local_routes'))
75+
end
76+
77+
it 'parses out normal ipv4 network routes' do
78+
expect(data.find { |h| h[:name] == '10.0.0.2' }).to eq(
79+
name: '10.0.0.2',
80+
network: 'local',
81+
interface: 'eth0',
82+
options: 'proto 66 scope host table local'
83+
)
84+
end
85+
end
86+
7287
describe 'an invalid file' do
7388
it 'fails' do
7489
expect do
@@ -127,8 +142,20 @@ def fixture_data(file)
127142
)
128143
end
129144

145+
let :local_provider do
146+
instance_double(
147+
'local_provider',
148+
name: '10.0.0.2',
149+
network: 'local',
150+
netmask: nil,
151+
gateway: nil,
152+
interface: 'eth0',
153+
options: 'proto 66 scope host table local'
154+
)
155+
end
156+
130157
let :content do
131-
described_class.format_file('', [route1_provider, route2_provider, defaultroute_provider, nooptions_provider])
158+
described_class.format_file('', [route1_provider, route2_provider, defaultroute_provider, nooptions_provider, local_provider])
132159
end
133160

134161
describe 'writing the route line' do
@@ -166,5 +193,11 @@ def fixture_data(file)
166193
expect(content).not_to match(%r{absent})
167194
end
168195
end
196+
197+
describe 'for local routes' do
198+
it 'has local route defined' do
199+
expect(content.scan(%r{^local .*$}).first).to include('local 10.0.0.2 dev eth0 proto 66 scope host table local')
200+
end
201+
end
169202
end
170203
end

spec/unit/type/network_route_spec.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@
3535

3636
describe 'when validating the attribute value' do
3737
describe 'network' do
38+
it 'allows local' do
39+
r = Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: 'local', netmask: '255.255.255.0', gateway: '23.23.23.42', interface: 'eth0')
40+
expect(r[:network]).to eq('local')
41+
end
42+
3843
it 'validates the network as an IP address' do
3944
expect do
4045
Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: 'not an ip address', netmask: '255.255.255.0', gateway: '23.23.23.42', interface: 'eth0')
@@ -63,6 +68,17 @@
6368
r = Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: '192.168.1.0', netmask: '255.255.128.0', gateway: '23.23.23.42', interface: 'eth0')
6469
expect(r[:netmask]).to eq('255.255.128.0')
6570
end
71+
72+
it 'requires netmask when not local' do
73+
expect do
74+
Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: '192.168.1.0', gateway: '10.0.0.1', interface: 'eth0')
75+
end.to raise_error(%r{must have netmask defined})
76+
end
77+
78+
it 'does not require netmask when local' do
79+
r = Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: 'local', gateway: '10.0.0.1', interface: 'eth0')
80+
expect(r[:netmask]).to be_nil
81+
end
6682
end
6783

6884
describe 'gateway' do
@@ -71,6 +87,17 @@
7187
Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: '192.168.1.0', netmask: '255.255.255.0', gateway: 'not an ip address', interface: 'eth0')
7288
end.to raise_error(%r{Invalid value for parameter 'gateway'})
7389
end
90+
91+
it 'requires gateway when not local' do
92+
expect do
93+
Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: '192.168.1.0', netmask: '255.255.255.0', interface: 'eth0')
94+
end.to raise_error(%r{must have gateway defined})
95+
end
96+
97+
it 'does not require gateway when local' do
98+
r = Puppet::Type.type(:network_route).new(name: '192.168.1.0/24', network: 'local', netmask: '255.255.255.0', interface: 'eth0')
99+
expect(r[:gateway]).to be_nil
100+
end
74101
end
75102
end
76103
end

0 commit comments

Comments
 (0)