Skip to content

Commit

Permalink
[202211][DBMigrator] Update db_migrator to support EdgeZoneAggregator…
Browse files Browse the repository at this point in the history
… Buffer Config for T0s (#2770)

What I did
Updated dbmigrator to support warm upgrade to new buffer config for EdgeZoneAggregator neighbors.

How to verify it
Unit tests pass and tested on lab device
  • Loading branch information
developfast authored Apr 12, 2023
1 parent c22e8ab commit bb3271f
Show file tree
Hide file tree
Showing 6 changed files with 585 additions and 12 deletions.
61 changes: 52 additions & 9 deletions scripts/db_migrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ def migrate_mgmt_ports_on_s6100(self):
self.appDB.set(self.appDB.APPL_DB, 'PORT_TABLE:PortConfigDone', 'count', str(total_count))
log.log_notice("Port count updated from {} to : {}".format(portCount, self.appDB.get(self.appDB.APPL_DB, 'PORT_TABLE:PortConfigDone', 'count')))
return True

def migrate_intf_table(self):
'''
Migrate all data from existing INTF table in APP DB during warmboot with IP Prefix
Expand Down Expand Up @@ -265,7 +265,6 @@ def migrate_config_db_buffer_tables_for_dynamic_calculation(self, speed_list, ca
@append_item_method - a function which is called to append an item to the list of pending commit items
any update to buffer configuration will be pended and won't be applied until
all configuration is checked and aligns with the default one
1. Buffer profiles for lossless PGs in BUFFER_PROFILE table will be removed
if their names have the convention of pg_lossless_<speed>_<cable_length>_profile
where the speed and cable_length belongs speed_list and cable_len_list respectively
Expand Down Expand Up @@ -349,15 +348,13 @@ def prepare_dynamic_buffer_for_warm_reboot(self, buffer_pools=None, buffer_profi
'''
This is the very first warm reboot of buffermgrd (dynamic) if the system reboot from old image by warm-reboot
In this case steps need to be taken to get buffermgrd prepared (for warm reboot)
During warm reboot, buffer tables should be installed in the first place.
However, it isn't able to achieve that when system is warm-rebooted from an old image
without dynamic buffer supported, because the buffer info wasn't in the APPL_DB in the old image.
The solution is to copy that info from CONFIG_DB into APPL_DB in db_migrator.
During warm-reboot, db_migrator adjusts buffer info in CONFIG_DB by removing some fields
according to requirement from dynamic buffer calculation.
The buffer info before that adjustment needs to be copied to APPL_DB.
1. set WARM_RESTART_TABLE|buffermgrd as {restore_count: 0}
2. Copy the following tables from CONFIG_DB into APPL_DB in case of warm reboot
The separator in fields that reference objects in other table needs to be updated from '|' to ':'
Expand All @@ -367,7 +364,6 @@ def prepare_dynamic_buffer_for_warm_reboot(self, buffer_pools=None, buffer_profi
- BUFFER_QUEUE, separator updated for field 'profile
- BUFFER_PORT_INGRESS_PROFILE_LIST, separator updated for field 'profile_list'
- BUFFER_PORT_EGRESS_PROFILE_LIST, separator updated for field 'profile_list'
'''
warmreboot_state = self.stateDB.get(self.stateDB.STATE_DB, 'WARM_RESTART_ENABLE_TABLE|system', 'enable')
mmu_size = self.stateDB.get(self.stateDB.STATE_DB, 'BUFFER_MAX_PARAM_TABLE|global', 'mmu_size')
Expand Down Expand Up @@ -572,13 +568,57 @@ def migrate_port_qos_map_global(self):
dscp_to_tc_map_table_names = self.configDB.get_keys('DSCP_TO_TC_MAP')
if len(dscp_to_tc_map_table_names) == 0:
return

qos_maps = self.configDB.get_table('PORT_QOS_MAP')
if 'global' not in qos_maps.keys():
# We are unlikely to have more than 1 DSCP_TO_TC_MAP in previous versions
self.configDB.set_entry('PORT_QOS_MAP', 'global', {"dscp_to_tc_map": dscp_to_tc_map_table_names[0]})
log.log_info("Created entry for global DSCP_TO_TC_MAP {}".format(dscp_to_tc_map_table_names[0]))

def update_edgezone_aggregator_config(self):
"""
Update cable length configuration in ConfigDB for T0 neighbor interfaces
connected to EdgeZone Aggregator devices, while resetting the port values to trigger a buffer change
1. Find a list of all interfaces connected to an EdgeZone Aggregator device.
2. If all the cable lengths are the same, do nothing and return.
3. If there are different cable lengths, update CABLE_LENGTH values for these interfaces with a constant value of 40m.
"""
device_neighbor_metadata = self.configDB.get_table("DEVICE_NEIGHBOR_METADATA")
device_neighbors = self.configDB.get_table("DEVICE_NEIGHBOR")
cable_length = self.configDB.get_table("CABLE_LENGTH")
port_table = self.configDB.get_table("PORT")
edgezone_aggregator_devs = []
edgezone_aggregator_intfs = []
EDGEZONE_AGG_CABLE_LENGTH = "40m"
for k, v in device_neighbor_metadata.items():
if v.get("type") == "EdgeZoneAggregator":
edgezone_aggregator_devs.append(k)

if len(edgezone_aggregator_devs) == 0:
return

for intf, intf_info in device_neighbors.items():
if intf_info.get("name") in edgezone_aggregator_devs:
edgezone_aggregator_intfs.append(intf)

cable_length_table = self.configDB.get_entry("CABLE_LENGTH", "AZURE")
first_cable_intf = next(iter(cable_length_table))
first_cable_length = cable_length_table[first_cable_intf]
index = 0

for intf, length in cable_length_table.items():
index += 1
if first_cable_length != length:
break
elif index == len(cable_length_table):
# All cable lengths are the same, nothing to modify
return

for intf, length in cable_length_table.items():
if intf in edgezone_aggregator_intfs:
# Set new cable length values
self.configDB.set(self.configDB.CONFIG_DB, "CABLE_LENGTH|AZURE", intf, EDGEZONE_AGG_CABLE_LENGTH)

def version_unknown(self):
"""
version_unknown tracks all SONiC versions that doesn't have a version
Expand Down Expand Up @@ -740,7 +780,7 @@ def version_2_0_1(self):
def version_2_0_2(self):
"""
Version 2_0_2
This is the latest version for 202012 branch
This is the latest version for 202012 branch
"""
log.log_info('Handling version_2_0_2')
self.set_version('version_3_0_0')
Expand Down Expand Up @@ -865,7 +905,7 @@ def version_4_0_0(self):
self.stateDB.set(self.stateDB.STATE_DB, 'FAST_RESTART_ENABLE_TABLE|system', 'enable', enable_state)
self.set_version('version_4_0_1')
return 'version_4_0_1'

def version_4_0_1(self):
"""
Version 4_0_1.
Expand Down Expand Up @@ -913,11 +953,14 @@ def common_migration_ops(self):
# removed together with calling to migrate_copp_table function.
if self.asic_type != "mellanox":
self.migrate_copp_table()
if self.asic_type == "broadcom" and 'Force10-S6100' in self.hwsku:
if self.asic_type == "broadcom" and 'Force10-S6100' in self.hwsku:
self.migrate_mgmt_ports_on_s6100()
else:
log.log_notice("Asic Type: {}, Hwsku: {}".format(self.asic_type, self.hwsku))

# Updating edgezone aggregator cable length config for T0 devices
self.update_edgezone_aggregator_config()

def migrate(self):
version = self.get_version()
log.log_info('Upgrading from version ' + version)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
{
"DEVICE_NEIGHBOR_METADATA|ARISTA01T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR_METADATA|ARISTA02T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR_METADATA|ARISTA03T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR_METADATA|ARISTA04T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR|Ethernet0": {
"name": "ARISTA01T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet4": {
"name": "ARISTA02T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet8": {
"name": "ARISTA03T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet12": {
"name": "ARISTA04T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet16": {
"name": "Servers1",
"port": "eth0"
},
"DEVICE_NEIGHBOR|Ethernet20": {
"name": "Servers2",
"port": "eth0"
},
"PORT|Ethernet0": {
"admin_status": "up",
"alias": "Ethernet1/1",
"description": "",
"index": "1",
"lanes": "77,78",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet4": {
"admin_status": "up",
"alias": "Ethernet2/1",
"description": "",
"index": "2",
"lanes": "79,80",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet8": {
"admin_status": "up",
"alias": "Ethernet3/1",
"description": "",
"index": "3",
"lanes": "81,82",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet12": {
"admin_status": "up",
"alias": "Ethernet4/1",
"description": "",
"index": "4",
"lanes": "83,84",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet16": {
"admin_status": "up",
"alias": "Ethernet5/1",
"description": "",
"index": "5",
"lanes": "85,86",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet20": {
"admin_status": "up",
"alias": "Ethernet6/1",
"description": "",
"index": "6",
"lanes": "87,88",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"CABLE_LENGTH|AZURE": {
"Ethernet0": "300m",
"Ethernet4": "300m",
"Ethernet8": "300m",
"Ethernet12": "300m",
"Ethernet16": "5m",
"Ethernet20": "5m"
},
"VERSIONS|DATABASE": {
"VERSION": "version_1_0_1"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
{
"DEVICE_NEIGHBOR_METADATA|ARISTA01T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR_METADATA|ARISTA02T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR_METADATA|ARISTA03T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR_METADATA|ARISTA04T1": {
"hwsku": "Arista-VM",
"mgmt_addr": "10.64.247.200",
"type": "EdgeZoneAggregator"
},
"DEVICE_NEIGHBOR|Ethernet0": {
"name": "ARISTA01T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet4": {
"name": "ARISTA02T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet8": {
"name": "ARISTA03T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet12": {
"name": "ARISTA04T1",
"port": "Ethernet1"
},
"DEVICE_NEIGHBOR|Ethernet16": {
"name": "Servers1",
"port": "eth0"
},
"DEVICE_NEIGHBOR|Ethernet20": {
"name": "Servers2",
"port": "eth0"
},
"PORT|Ethernet0": {
"admin_status": "up",
"alias": "Ethernet1/1",
"description": "",
"index": "1",
"lanes": "77,78",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet4": {
"admin_status": "up",
"alias": "Ethernet2/1",
"description": "",
"index": "2",
"lanes": "79,80",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet8": {
"admin_status": "up",
"alias": "Ethernet3/1",
"description": "",
"index": "3",
"lanes": "81,82",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet12": {
"admin_status": "up",
"alias": "Ethernet4/1",
"description": "",
"index": "4",
"lanes": "83,84",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet16": {
"admin_status": "up",
"alias": "Ethernet5/1",
"description": "",
"index": "5",
"lanes": "85,86",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"PORT|Ethernet20": {
"admin_status": "up",
"alias": "Ethernet6/1",
"description": "",
"index": "6",
"lanes": "87,88",
"mtu": "9100",
"pfc_asym": "off",
"speed": "100000",
"tpid": "0x8100"
},
"CABLE_LENGTH|AZURE": {
"Ethernet0": "40m",
"Ethernet4": "40m",
"Ethernet8": "40m",
"Ethernet12": "40m",
"Ethernet16": "5m",
"Ethernet20": "5m"
},
"VERSIONS|DATABASE": {
"VERSION": "version_4_0_1"
}
}
Loading

0 comments on commit bb3271f

Please sign in to comment.