From 252e9fab4846afeed1400760f3bb926961bc44f6 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 26 Feb 2018 13:29:04 -0800 Subject: [PATCH] [Fast-Reboot]: Adapt fast-reboot-dump script for SAIv1.2 (#211) * Adapt fast-reboot-dump script for SAIv1.2 * Use argparse for parsing command line --- scripts/fast-reboot | 2 +- scripts/fast-reboot-dump.py | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/scripts/fast-reboot b/scripts/fast-reboot index 1873dfe39f..a3a05661ff 100755 --- a/scripts/fast-reboot +++ b/scripts/fast-reboot @@ -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 diff --git a/scripts/fast-reboot-dump.py b/scripts/fast-reboot-dump.py index f5a32ebc16..7488b8831f 100644 --- a/scripts/fast-reboot-dump.py +++ b/scripts/fast-reboot-dump.py @@ -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 @@ -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 @@ -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')