Skip to content

Commit

Permalink
Merge pull request #118 from mmailand/wip_1688_ipinterface_secondary
Browse files Browse the repository at this point in the history
First implementation of secondary ip, please review
  • Loading branch information
jerearista committed Feb 3, 2017
2 parents 763c4ab + 399f921 commit 9b48429
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 1 deletion.
7 changes: 7 additions & 0 deletions lib/puppet/provider/eos_ipinterface/default.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ def helper_addresses=(val)
@property_hash[:helper_addresses] = val
end

def secondary_addresses=(val)
node.api('ipinterfaces').set_secondary_addresses(resource['name'], value: val)
@property_hash[:secondary_addresses] = val
end

def mtu=(val)
node.api('ipinterfaces').set_mtu(resource['name'], value: val)
@property_hash[:mtu] = val
Expand All @@ -85,6 +90,8 @@ def create
self.mtu = resource[:mtu] if resource[:mtu]
self.helper_addresses = resource[:helper_addresses] \
if resource[:helper_addresses]
self.secondary_addresses = resource[:secondary_addresses] \
if resource[:secondary_addresses]
end

def destroy
Expand Down
36 changes: 36 additions & 0 deletions lib/puppet/type/eos_ipinterface.rb
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,30 @@ def insync?(current)
end
end

newproperty(:secondary_addresses, array_matching: :all) do
desc <<-EOS
The secondary_addresses property configures the list of IP
addresses marked as secondary.
Each element value is in address/mask format.
Example:
secondary_addresses => ['192.168.10.24/31', '192.168.10.25/31']
EOS

# Sort the arrays before comparing
def insync?(current)
current.sort == should.sort
end

validate do |value|
unless value =~ CIDR_REGEXP
fail "value #{value.inspect} is invalid, must be an IP address followed by a netmask"
end
end
end

newproperty(:mtu) do
desc <<-EOS
The mtu property configures the IP interface MTU value
Expand All @@ -130,4 +154,16 @@ def insync?(current)
end
end
end

validate do
if self[:name] =~ /Ethernet/
unless !self[:secondary_addresses]
self[:secondary_addresses].each do |address|
unless address =~ CIDR_REGEXP31
fail "value #{address.inspect} is invalid, only netmask 31 and greater are allowed"
end
end
end
end
end
end
4 changes: 4 additions & 0 deletions lib/puppet_x/eos/utils/helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,7 @@

IPADDR_REGEXP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/x
CIDR_REGEXP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([1-9]|[1-2][0-9]|3[0-2]))$/x
CIDR_REGEXP31 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([1-9]|[1-2][0-9]|3[0-1]))$/x
23 changes: 22 additions & 1 deletion spec/unit/puppet/provider/eos_ipinterface/default_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
name: 'Ethernet1',
address: '1.2.3.4/5',
helper_addresses: %w(5.6.7.8 9.10.11.12),
secondary_addresses: %w(1.2.3.4/31 1.2.3.5/31),
mtu: '9000',
provider: described_class.name
}
Expand Down Expand Up @@ -88,6 +89,7 @@ def ipinterfaces
name: 'Ethernet1',
address: '1.2.3.4/5',
helper_addresses: %w(5.6.7.8 9.10.11.12),
secondary_addresses: %w(1.2.3.4/31 1.2.3.5/31),
mtu: '1500',
exists?: true
end
Expand Down Expand Up @@ -120,6 +122,8 @@ def ipinterfaces
expect(resources['Ethernet1'].provider.mtu).to eq '1500'
expect(resources['Ethernet1'].provider.helper_addresses).to \
eq %w(5.6.7.8 9.10.11.12)
expect(resources['Ethernet1'].provider.secondary_addresses).to \
eq %w(1.2.3.4/31 1.2.3.5/31)
expect(resources['Ethernet1'].provider.exists?).to be_truthy
end

Expand Down Expand Up @@ -159,7 +163,8 @@ def ipinterfaces
allow(api).to receive_messages(
set_address: true,
set_mtu: true,
set_helper_addresses: true
set_helper_addresses: true,
set_secondary_addresses: true
)
end

Expand All @@ -182,6 +187,11 @@ def ipinterfaces
provider.create
expect(provider.helper_addresses).to eq(resource[:helper_addresses])
end

it 'sets secondary_addresses to the resource value' do
provider.create
expect(provider.secondary_addresses).to eq(resource[:secondary_addresses])
end
end

describe '#destroy' do
Expand Down Expand Up @@ -219,5 +229,16 @@ def ipinterfaces
expect(provider.helper_addresses).to eq(value)
end
end

describe '#secondary_addresses=(val)' do
let(:value) { %w(5.6.7.8 9.10.11.12) }

it 'updates secondary_addresses on the provider' do
expect(api).to receive(:set_secondary_addresses)
.with(resource[:name], value: value)
provider.secondary_addresses = value
expect(provider.secondary_addresses).to eq(value)
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ Ethernet1:
:address: 1.2.3.4/5
:mtu: "1500"
:helper_addresses: ['5.6.7.8', '9.10.11.12']
:secondary_addresses: ['1.2.3.4/31', '1.2.3.5/31']
9 changes: 9 additions & 0 deletions spec/unit/puppet/type/eos_ipinterface_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@
include_examples 'accepts values without munging', [['1.1.1.1', '2.2.2.2']]
end

describe 'secondary_addresses' do
let(:attribute) { :secondary_addresses }
subject { described_class.attrclass(attribute) }

include_examples 'property'
include_examples '#doc Documentation'
include_examples 'accepts values without munging', [['1.1.1.1/31', '2.2.2.2/31']]
end

describe 'mtu' do
let(:attribute) { :mtu }
subject { described_class.attrclass(attribute) }
Expand Down

0 comments on commit 9b48429

Please sign in to comment.