Skip to content

Commit

Permalink
[Fast-Reboot]: Adapt fast-reboot-dump script for SAIv1.2 (#211)
Browse files Browse the repository at this point in the history
* Adapt fast-reboot-dump script for SAIv1.2

* Use argparse for parsing command line
  • Loading branch information
pavel-shirshov authored Feb 26, 2018
1 parent 461470b commit 252e9fa
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 6 deletions.
2 changes: 1 addition & 1 deletion scripts/fast-reboot
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ sonic_asic_type=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type)
# Dump the ARP and FDB tables to files also as default routes for both IPv4 and IPv6
# into /host/fast-reboot
mkdir -p /host/fast-reboot
/usr/bin/fast-reboot-dump.py /host/fast-reboot
/usr/bin/fast-reboot-dump.py -t /host/fast-reboot

# Kill bgpd to start the bgp graceful restart procedure
docker exec -ti bgp killall -9 zebra
Expand Down
25 changes: 20 additions & 5 deletions scripts/fast-reboot-dump.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import os
from fcntl import ioctl
import binascii
import argparse


ARP_CHUNK = binascii.unhexlify('08060001080006040001') # defines a part of the packet for ARP Request
Expand Down Expand Up @@ -95,20 +96,30 @@ def get_map_bridge_port_id_2_iface_name(db):

return bridge_port_id_2_iface_name

def get_vlan_oid_by_vlan_id(db, vlan_id):
keys = db.keys(db.ASIC_DB, 'ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:*')
keys = [] if keys is None else keys
for key in keys:
value = db.get_all(db.ASIC_DB, key)
if 'SAI_VLAN_ATTR_VLAN_ID' in value and int(value['SAI_VLAN_ATTR_VLAN_ID']) == vlan_id:
return key.replace('ASIC_STATE:SAI_OBJECT_TYPE_VLAN:', '')

raise Exception('Not found bvi oid for vlan_id: %d' % vlan_id)

def get_fdb(db, vlan_name, vlan_id, bridge_id_2_iface):
fdb_types = {
'SAI_FDB_ENTRY_TYPE_DYNAMIC': 'dynamic',
'SAI_FDB_ENTRY_TYPE_STATIC' : 'static'
}

bvid = get_vlan_oid_by_vlan_id(db, vlan_id)
available_macs = set()
map_mac_ip = {}
fdb_entries = []
keys = db.keys(db.ASIC_DB, 'ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{*\"vlan\":\"%d\"}' % vlan_id)
keys = db.keys(db.ASIC_DB, 'ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{*\"bvid\":\"%s\"*}' % bvid)
keys = [] if keys is None else keys
for key in keys:
key_obj = json.loads(key.replace('ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:', ''))
vlan = str(key_obj['vlan'])
mac = str(key_obj['mac'])
if not is_mac_unicast(mac):
continue
Expand Down Expand Up @@ -250,9 +261,13 @@ def generate_default_route_entries(filename):


def main():
root_dir = '/tmp'
if len(sys.argv) > 1 and os.path.isdir(sys.argv[1]):
root_dir = sys.argv[1]
parser = argparse.ArgumentParser()
parser.add_argument('-t', '--target', type=str, default='/tmp', help='target directory for files')
args = parser.parse_args()
root_dir = args.target
if not os.path.isdir(root_dir):
print "Target directory '%s' not found" % root_dir
sys.exit(1)
all_available_macs, map_mac_ip_per_vlan = generate_fdb_entries(root_dir + '/fdb.json')
arp_entries = generate_arp_entries(root_dir + '/arp.json', all_available_macs)
generate_default_route_entries(root_dir + '/default_routes.json')
Expand Down

0 comments on commit 252e9fa

Please sign in to comment.