Skip to content

Commit

Permalink
Merge pull request #231 from stephanerobert/varp
Browse files Browse the repository at this point in the history
Varp
  • Loading branch information
stephanerobert committed Nov 7, 2018
2 parents 0837fff + bd92087 commit 99095d9
Show file tree
Hide file tree
Showing 5 changed files with 241 additions and 29 deletions.
29 changes: 27 additions & 2 deletions netman/adapters/switches/arista.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from netman import regex
from netman.adapters.switches.util import split_on_dedent
from netman.core.objects.exceptions import VlanAlreadyExist, UnknownVlan, BadVlanNumber, BadVlanName, \
IPAlreadySet, IPNotAvailable, UnknownIP, UnknownInterface, UnknownBond, DhcpRelayServerAlreadyExists, \
UnknownDhcpRelayServer
IPAlreadySet, IPNotAvailable, UnknownIP, DhcpRelayServerAlreadyExists, UnknownDhcpRelayServer, UnknownInterface, \
UnknownBond, VarpAlreadyExistsForVlan, VarpDoesNotExistForVlan
from netman.core.objects.interface import Interface
from netman.core.objects.interface_states import OFF, ON
from netman.core.objects.port_modes import ACCESS, TRUNK
Expand Down Expand Up @@ -254,6 +254,29 @@ def remove_dhcp_relay_server(self, vlan_number, ip_address):
self.node.config(['interface Vlan{}'.format(vlan_number),
'no ip helper-address {}'.format(ip_address)])

def add_vlan_varp_ip(self, vlan_number, ip_network):
vlan = self.get_vlan(vlan_number)

if ip_network in vlan.varp_ips:
raise VarpAlreadyExistsForVlan(vlan=vlan_number, ip_network=ip_network)

try:
self.node.config(['interface Vlan{}'.format(vlan_number),
'ip virtual-router address {}'.format(ip_network)])
except CommandError as e:
if regex.match("^.*is already assigned to interface Vlan(\d+)]", e.message):
raise IPNotAvailable(ip_network=ip_network, reason=str(e))
raise

def remove_vlan_varp_ip(self, vlan_number, ip_network):
vlan = self.get_vlan(vlan_number)

if ip_network not in vlan.varp_ips:
raise VarpDoesNotExistForVlan(vlan=vlan_number, ip_network=ip_network)

self.node.config(['interface Vlan{}'.format(vlan_number),
'no ip virtual-router address {}'.format(ip_network)])

def _apply_interface_vlan_data(self, vlans):
config = self._fetch_interface_vlans_config(vlans)

Expand All @@ -267,6 +290,8 @@ def _apply_interface_vlan_data(self, vlans):
except AddrFormatError:
self.logger.warning(
'Unsupported IP Helper address found in Vlan {} : {}'.format(vlan.number, regex[0]))
if regex.match(" *ip virtual-router address (.*)", line):
vlan.varp_ips.append(IPNetwork(regex[0]))

def _fetch_interface_vlans_config(self, vlans):
all_interface_vlans = sorted('Vlan{}'.format(vlan.number) for vlan in vlans)
Expand Down
10 changes: 10 additions & 0 deletions netman/core/objects/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,16 @@ def __init__(self, vlan=None, vrrp_group_id=None):
super(VrrpDoesNotExistForVlan, self).__init__("Vrrp group {group} does not exist for vlan {vlan}".format(group=vrrp_group_id, vlan=vlan))


class VarpAlreadyExistsForVlan(Conflict):
def __init__(self, vlan=None, ip_network=None):
super(VarpAlreadyExistsForVlan, self).__init__("Varp ip network {ip} is already on vlan {vlan}".format(ip=ip_network, vlan=vlan))


class VarpDoesNotExistForVlan(InvalidValue):
def __init__(self, vlan=None, ip_network=None):
super(VarpDoesNotExistForVlan, self).__init__("Varp ip {ip} is not configured for vlan {vlan}".format(ip=ip_network, vlan=vlan))


class NoIpOnVlanForVrrp(InvalidValue):
def __init__(self, vlan=None):
super(NoIpOnVlanForVrrp, self).__init__("Vlan {vlan} needs an IP before configuring VRRP".format(vlan=vlan))
Expand Down
6 changes: 6 additions & 0 deletions netman/core/objects/switch_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,12 @@ def unset_bond_mtu(self, number):
def set_vlan_ntp_state(self, vlan_number, state):
raise NotImplementedError()

def add_vlan_varp_ip(self, vlan_number, ip_network):
raise NotImplementedError()

def remove_vlan_varp_ip(self, vlan_number, ip_network):
raise NotImplementedError()


class SwitchBase(SwitchOperations):
def __init__(self, switch_descriptor):
Expand Down
3 changes: 2 additions & 1 deletion netman/core/objects/vlan.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
class Vlan(Model):
def __init__(self, number=None, name=None, ips=None, vrrp_groups=None, vrf_forwarding=None, access_group_in=None,
access_group_out=None, dhcp_relay_servers=None, arp_routing=None, icmp_redirects=None,
unicast_rpf_mode=None, ntp=None):
unicast_rpf_mode=None, ntp=None, varp_ips=None):
self.number = number
self.name = name
self.access_groups = {IN: access_group_in, OUT: access_group_out}
Expand All @@ -31,3 +31,4 @@ def __init__(self, number=None, name=None, ips=None, vrrp_groups=None, vrf_forwa
self.icmp_redirects = icmp_redirects
self.unicast_rpf_mode = unicast_rpf_mode
self.ntp = ntp
self.varp_ips = varp_ips or []

0 comments on commit 99095d9

Please sign in to comment.