Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[202211][DBMigrator] Update db_migrator to support EdgeZoneAggregator Buffer Config for T0s #2770

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
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