Skip to content

Commit

Permalink
Merge pull request #65 from arista-eosplus/update-gar
Browse files Browse the repository at this point in the history
Add disable key to existing modules for negation of properties
  • Loading branch information
grybak-arista committed Dec 1, 2015
2 parents 67a2fa9 + 4bcfe81 commit 3b21d3e
Show file tree
Hide file tree
Showing 37 changed files with 826 additions and 475 deletions.
19 changes: 15 additions & 4 deletions pyeapi/api/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,28 +120,41 @@ def configure(self, commands):
except (CommandError, ConnectionError):
return False

def command_builder(self, string, value=None, default=None):
def command_builder(self, string, value=None, default=None, disable=None):
"""Builds a command with keywords
Notes:
Negating a command string by overriding 'value' with None or an
assigned value that evalutates to false has been deprecated.
Please use 'disable' to negate a command.
Parameters are evaluated in the order 'default', 'disable', 'value'.
Args:
string (str): The command string
value: The configuration setting to subsititue into the command
string. If value is a boolean and True, just the command
string is used
default (bool): Specifies the command should use the default
keyword argument
keyword argument. Default preempts disable and value.
disable (bool): Specifies the command should use the no
keyword argument. Disable preempts value.
Returns:
A command string that can be used to configure the node
"""
if default:
return 'default %s' % string
elif disable:
return 'no %s' % string
elif value is True:
return string
elif value:
return '%s %s' % (string, value)
else:
return 'no %s' % string
# -- above line to be deprecated and replaced with the error below
# raise ValueError("abstract.command_builder: No value "
# "received '%s'" % value)

def configure_interface(self, name, commands):
"""Configures the specified interface with the commands
Expand Down Expand Up @@ -202,5 +215,3 @@ def getall(self):

def get(self, name, default=None):
raise NotImplementedError


5 changes: 4 additions & 1 deletion pyeapi/api/acl.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@

from pyeapi.api import EntityCollection


def mask_to_prefixlen(mask):
"""Converts a subnet mask from dotted decimal to bit length
Expand All @@ -60,6 +61,7 @@ def mask_to_prefixlen(mask):
mask = mask or '255.255.255.255'
return netaddr.IPAddress(mask).netmask_bits()


def prefixlen_to_mask(prefixlen):
"""Converts a prefix length to a dotted decimal subnet mask
Expand All @@ -73,6 +75,7 @@ def prefixlen_to_mask(prefixlen):
addr = '0.0.0.0/%s' % prefixlen
return str(netaddr.IPNetwork(addr).netmask)


class StandardAcls(EntityCollection):

entry_re = re.compile(r'(\d+)'
Expand Down Expand Up @@ -146,6 +149,6 @@ def remove_entry(self, name, seqno):
cmds = ['ip access-list standard %s' % name, 'no %s' % seqno, 'exit']
return self.configure(cmds)


def instance(node):
return StandardAcls(node)

81 changes: 50 additions & 31 deletions pyeapi/api/bgp.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,26 +132,32 @@ def default(self):
command = 'default router bgp {}'.format(config['bgp_as'])
return self.configure(command)

def set_router_id(self, value=None, default=False):
cmd = self.command_builder('router-id', value=value, default=default)
def set_router_id(self, value=None, default=False, disable=False):
cmd = self.command_builder('router-id', value=value,
default=default, disable=disable)
return self.configure_bgp(cmd)

def set_maximum_paths(self, max_path=None, max_ecmp_path=None, default=False):
def set_maximum_paths(self, max_path=None, max_ecmp_path=None,
default=False, disable=False):
if not max_path and max_ecmp_path:
raise TypeError('Cannot use maximum_ecmp_paths without '
'providing max_path')
if default:
cmd = 'default maximum-paths'
elif max_path:
cmd = 'maximum-paths {}'.format(max_path)
value = None
if max_path:
value = '{}'.format(max_path)
if max_ecmp_path:
cmd += ' ecmp {}'.format(max_ecmp_path)
else:
cmd = 'no maximum-paths'
value += ' ecmp {}'.format(max_ecmp_path)
cmd = self.command_builder('maximum-paths', value=value,
default=default, disable=disable)
return self.configure_bgp(cmd)

def set_shutdown(self, value=None, default=False):
cmd = self.command_builder('shutdown', value=value, default=default)
def set_shutdown(self, default=False, disable=True):
# Default setting for BGP shutdown is disable=True,
# meaning 'no shutdown'.
# If both default and disable are false, BGP shutdown will
# effectively be enabled.
cmd = self.command_builder('shutdown', value=True, default=default,
disable=disable)
return self.configure_bgp(cmd)

def add_network(self, prefix, length, route_map=None):
Expand Down Expand Up @@ -246,7 +252,7 @@ def ispeergroup(self, name):
return True

def create(self, name):
return self.set_shutdown(name, True)
return self.set_shutdown(name, default=False, disable=False)

def delete(self, name):
response = self.configure('no neighbor {}'.format(name))
Expand All @@ -261,45 +267,58 @@ def configure(self, cmd):
cmds = ['router bgp {}'.format(match.group(1)), cmd]
return super(BgpNeighbors, self).configure(cmds)

def command_builder(self, name, cmd, value, default):
def command_builder(self, name, cmd, value, default, disable):
string = 'neighbor {} {}'.format(name, cmd)
return super(BgpNeighbors, self).command_builder(string, value, default)
return super(BgpNeighbors, self).command_builder(string, value,
default, disable)

def set_peer_group(self, name, value=None, default=False):
def set_peer_group(self, name, value=None, default=False, disable=False):
if not self.ispeergroup(name):
cmd = self.command_builder(name, 'peer-group', value, default)
cmd = self.command_builder(name, 'peer-group', value, default,
disable)
return self.configure(cmd)
return False

def set_remote_as(self, name, value=None, default=False):
cmd = self.command_builder(name, 'remote-as', value, default)
def set_remote_as(self, name, value=None, default=False, disable=False):
cmd = self.command_builder(name, 'remote-as', value, default, disable)
return self.configure(cmd)

def set_shutdown(self, name, value=None, default=False):
cmd = self.command_builder(name, 'shutdown', value, default)
def set_shutdown(self, name, default=False, disable=True):
# Default setting for BGP neighbor shutdown is
# disable=True, meaning 'no shutdown'
# If both default and disable are false, BGP neighbor shutdown will
# effectively be enabled.
cmd = self.command_builder(name, 'shutdown', True, default, disable)
return self.configure(cmd)

def set_send_community(self, name, value=None, default=False):
cmd = self.command_builder(name, 'send-community', value, default)
def set_send_community(self, name, value=None, default=False,
disable=False):
cmd = self.command_builder(name, 'send-community', value, default,
disable)
return self.configure(cmd)

def set_next_hop_self(self, name, value=None, default=False):
cmd = self.command_builder(name, 'next-hop-self', value, default)
def set_next_hop_self(self, name, value=None, default=False,
disable=False):
cmd = self.command_builder(name, 'next-hop-self', value, default,
disable)
return self.configure(cmd)

def set_route_map_in(self, name, value=None, default=False):
cmd = self.command_builder(name, 'route-map', value, default)
def set_route_map_in(self, name, value=None, default=False, disable=False):
cmd = self.command_builder(name, 'route-map', value, default, disable)
cmd += ' in'
return self.configure(cmd)

def set_route_map_out(self, name, value=None, default=False):
cmd = self.command_builder(name, 'route-map', value, default)
def set_route_map_out(self, name, value=None, default=False,
disable=False):
cmd = self.command_builder(name, 'route-map', value, default, disable)
cmd += ' out'
return self.configure(cmd)

def set_description(self, name, value=None, default=False):
cmd = self.command_builder(name, 'description', value, default)
def set_description(self, name, value=None, default=False, disable=False):
cmd = self.command_builder(name, 'description', value, default,
disable)
return self.configure(cmd)


def instance(api):
return Bgp(api)
Loading

0 comments on commit 3b21d3e

Please sign in to comment.