Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions config/evpn_mh.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import click
import utilities_common.cli as clicommon

from jsonpatch import JsonPatchConflict

from .validated_config_db_connector import ValidatedConfigDBConnector

#
# EVPN MH commands
#
EVPN_MH_TABLE = 'EVPN_MH_GLOBAL'

#
# 'evpn-mh' group ('config evpn-mh ...')
#


@click.group(cls=clicommon.AbbreviationGroup, name='evpn-mh')
@click.pass_context
def evpn_mh(ctx):
"""Set EVPN MH attributes"""
pass


#
# 'startup-delay' subcommand
#
EVPN_MH_STARTUP_DELAY_MIN = 0
EVPN_MH_STARTUP_DELAY_DEFAULT = 300
EVPN_MH_STARTUP_DELAY_MAX = 3600


def is_valid_startup_delay(startup_delay):
try:
if int(startup_delay) in range(EVPN_MH_STARTUP_DELAY_MIN, EVPN_MH_STARTUP_DELAY_MAX + 1):
return True
except (ValueError, TypeError):
pass
return False


@evpn_mh.command('startup-delay')
@click.argument('startup_delay', metavar='<startup_delay>', required=True)
@clicommon.pass_db
@click.pass_context
def set_startup_delay(ctx, db, startup_delay=EVPN_MH_STARTUP_DELAY_DEFAULT):
"""Set EVPN MH startup delay time in seconds"""
config_db = ValidatedConfigDBConnector(db.cfgdb)
if not is_valid_startup_delay(startup_delay):
ctx.fail(f"EVPN MH Startup Delay {startup_delay} is not valid. "
f"Valid values are {EVPN_MH_STARTUP_DELAY_MIN}-{EVPN_MH_STARTUP_DELAY_MAX}.")

try:
# Get existing entry to preserve other fields
entry = config_db.get_entry(EVPN_MH_TABLE, 'default') or {}
entry['startup_delay'] = startup_delay
config_db.set_entry(EVPN_MH_TABLE, 'default', entry)
except (ValueError, JsonPatchConflict) as e:
ctx.fail("Failed to save to ConfigDB. Error: {}".format(e))


#
# 'mac-holdtime' subcommand
#
EVPN_MH_MAC_HOLDTIME_MIN = 0
EVPN_MH_MAC_HOLDTIME_DEFAULT = 1080
EVPN_MH_MAC_HOLDTIME_MAX = 86400


def is_valid_mac_holdtime(mac_holdtime):
try:
if int(mac_holdtime) in range(EVPN_MH_MAC_HOLDTIME_MIN, EVPN_MH_MAC_HOLDTIME_MAX + 1):
return True
except (ValueError, TypeError):
pass
return False


@evpn_mh.command('mac-holdtime')
@click.argument('mac_holdtime', metavar='<mac_holdtime>', required=True)
@clicommon.pass_db
@click.pass_context
def set_mac_holdtime(ctx, db, mac_holdtime=EVPN_MH_MAC_HOLDTIME_DEFAULT):
"""Set EVPN MH MAC holdtime in seconds"""
config_db = ValidatedConfigDBConnector(db.cfgdb)
if not is_valid_mac_holdtime(mac_holdtime):
ctx.fail(f"EVPN MH MAC Holdtime {mac_holdtime} is not valid. "
f"Valid values are {EVPN_MH_MAC_HOLDTIME_MIN}-{EVPN_MH_MAC_HOLDTIME_MAX}.")

try:
# Get existing entry to preserve other fields
entry = config_db.get_entry(EVPN_MH_TABLE, 'default') or {}
entry['mac_holdtime'] = mac_holdtime
config_db.set_entry(EVPN_MH_TABLE, 'default', entry)
except (ValueError, JsonPatchConflict) as e:
ctx.fail("Failed to save to ConfigDB. Error: {}".format(e))


#
# 'neigh_holdtime' subcommand
#
EVPN_MH_NEIGH_HOLDTIME_MIN = 0
EVPN_MH_NEIGH_HOLDTIME_DEFAULT = 1080
EVPN_MH_NEIGH_HOLDTIME_MAX = 86400


def is_valid_neigh_holdtime(neigh_holdtime):
try:
if int(neigh_holdtime) in range(EVPN_MH_NEIGH_HOLDTIME_MIN, EVPN_MH_NEIGH_HOLDTIME_MAX + 1):
return True
except (ValueError, TypeError):
pass
return False


@evpn_mh.command('neigh-holdtime')
@click.argument('neigh_holdtime', metavar='<neigh_holdtime>', required=True)
@clicommon.pass_db
@click.pass_context
def set_neigh_holdtime(ctx, db, neigh_holdtime=EVPN_MH_NEIGH_HOLDTIME_DEFAULT):
"""Set EVPN MH neighbor holdtime in seconds"""
config_db = ValidatedConfigDBConnector(db.cfgdb)
if not is_valid_neigh_holdtime(neigh_holdtime):
ctx.fail(f"EVPN MH Neigh Holdtime {neigh_holdtime} is not valid. "
f"Valid values are {EVPN_MH_NEIGH_HOLDTIME_MIN}-{EVPN_MH_NEIGH_HOLDTIME_MAX}.")

try:
# Get existing entry to preserve other fields
entry = config_db.get_entry(EVPN_MH_TABLE, 'default') or {}
entry['neigh_holdtime'] = neigh_holdtime
config_db.set_entry(EVPN_MH_TABLE, 'default', entry)
except (ValueError, JsonPatchConflict) as e:
ctx.fail("Failed to save to ConfigDB. Error: {}".format(e))
Loading
Loading