- stop bgp docker
- enable bgp graceful restart
- same as fast-reboot
- stop teamd docker
- stop teamd gracefully to allow teamd to send last valid update to be sure we'll have 90 seconds reboot time available.
- stop swss docker
- disable mac learning and aging
- freeze orchagent
- set redis flag WARM_RESTART_TABLE:system
- kill swss dockers
- save the appdb and asic db into the files.
- save applDB db in
/host/warmboot/appl_db.json
- save configDB db in
/host/warmboot/config_db.json
- save stateDB db (only FDB and WARM_RESTART_TABLE) in
/host/warmboot/state_db.json
- save asicDB in
/host/warmboot/asic_db.json
- save applDB db in
- stop syncd docker
- warm shutdown
- save the SAI states in
/host/warmboot/sai-warmboot.bin
- kill syncd docker
- stop database
- use kexec to reboot, plus one extra kernel argument
Plan to re-use fast-reboot script. Improve the fast-reboot to handle warm-reboot scenario, have a symbol link to warm-reboot. The script detects the name, and call corresponding reboot.
In fast-reboot or warm-reboot, we will use kernel argument to indicate the whole system reboot type for the next boot up. The argument format is SONIC_BOOT_TYPE=[fast-reboot|warm|cold]
. Benefits:
- not possible to set both fast and warm
- less conflict with vanilla linux kernel arguments
- all existing checker for
*fast-reboot*
still work
Later if we improve the consistency SONIC_BOOT_TYPE=[fast|warm|cold]
, this way the production image upgrading process will be smooth (no disruptive change)
- Application (e.g. SONiC) sets switch attribute SAI_SWITCH_ATTR_RESTART_WARM to true before calling remove_switch().
- Note that this attribute doesn't have to be set at switch_create() time. This is a dynamic decision, setting before calling remove_switch() is sufficient.
- Application sets profile attribute SAI_KEY_WARM_BOOT_WRITE_FILE to a valid path/filename where the SAI data will be saved during upcoming warm shutdown.
- Depending on the SAI implementation, this value might have been read by SAI at switch_create() time only. It is recommended to set this value before calling create_switch().
- Use kernel argument
SONIC_BOOT_TYPE=warm
to determine in warm starting mode - start database
- recover redis from
/host/warmboot/*.json
- implemented in database system service
- recover redis from
- start syncd docker
- implemented inside syncd docker
- recover SAI state from
/host/warmboot/sai-warmboot.bin
- the host interface will be also recovered.
- start swss docker
- orchagent will wait till syncd has been started to do init view.
- will read from APP DB and do comparsion logic.
- start teamd docker
- at the same time as swss docker. swss will not read teamd app db until it finishes the comparison logic.
- start bgp docker
- at the same time as swss docker. swss will not read bgp route table until it finishes the comparison logic.
- Application sets profile value SAI_KEY_BOOT_TYPE to 1 to indicate WARM BOOT. (0: cold boot, 2: fast boot)
- Application sets profile value SAI_KEY_WARM_BOOT_READ_FILE to the SAI data file from previous warm shutdown.
- Note: Switch attribute SAI_SWITCH_ATTR_WARM_RECOVER is not required by SAI.
- Application calls create_switch with 1 attribute: SAI_SWITCH_ATTR_INIT_SWITCH set to true. SAI shall recover other attributes programmed before.
- Application re-register all callbacks/notificaions. These function points are not retained by SAI across warm boot.
Assumptions:
- DUT is T0 topology
- Focus on whole system reboot, in future will extend it to container level warm restart
- Focus on one image warm reboot, and version upgrading warm reboot. No version downgrading warm reboot.
Structure of testbed: design doc
Architect:
- Both warm-reboot and fast-reboot are written in ansible playbook advanced-reboot.yml
- The playbook will deploy a master python script advanced-reboot.py to PTF docker container and all the steps are running there
- The master python script will
- ssh into DUT to execute reboot command
- ssh into Arist EOS VM to observe and operate port, port channel and BGP sessions
- operate VLAN ports
- store and analysis data
Steps:
-
Prepare environment
- Enable link state propagation
- Propagate VEOS port oper down to Fanout switch
- Propagete Fanout switch port oper down to VEOS
- Enable NTP service in DUT, Arista EOS VMs, PTF docker
- Enable link state propagation
-
Prepare DUT with user specified states
pre_reboot_vector
- DUT port down
- DUT LAG down
- DUT LAG member down
- DUT BGP session down
- Neigh port down
- Neigh LAG remove member
- Neigh LAG admin down
- Neigh LAG member admin down
- Neigh BGP session admin down
-
Pre-warm-reboot status check
- VM: Port.lastStatusChangeTimestamp
- VM: PortChannel.lastStatusChangeTimestamp
- VM: monitor how many routes received from DUT
- DUT: console connect and keep measure meaningful events such as shutdown and bootup
- Observe no packet drop
- current implementation of advanced-reboot waits for ping down, which is not working for warm-reboot
- if any packet drop, test fails
- how to know warm-shutdown and warm-bootup timestamp?
- CRM usage snapshot: the gold here is make sure no usage increase for no sad injected case
-
During-warm-reboot sad vector injection
during_reboot_vector
- Neigh port down
- Neigh LAG remove member
- Neigh LAG admin down
- Neigh LAG member admin down
- Neigh BGP session admin down
- Neigh route change
- Neigh MAC change
- Neigh VLAN member port admin down (some or all)
And conduct some measurement:
- Ping DUT loopback IP from a downlink port
- Ping from one DUT port to another (may choose some pairs or fullmesh)
- measure how many times disrupted
- fastfast reboot will expect once
- normal warm reboot will expect none
- fast reboot will expect once
- measure how long the longest dirutpive time
- measure how many times disrupted
-
Post-warm-reboot status check
- Generate expected_results based on
pre_reboot_vector
+during_reboot_vector
- VM: Port.lastStatusChangeTimestamp
- VM: PortChannel.lastStatusChangeTimestamp
- VM: monitor how many routes received from DUT
- DUT: check the image version as expected
- Observe no packet drop: current implementation of advanced-reboot waits for ping recover, which is not working for warm-reboot
- CRM is not increasing for happy path during warm reboot
- Generate expected_results based on
-
Clean-up
- Disable link state propagation
- Recover environment
- DUT reload minigraph
- Neigh copy startup-config to running-config
DUT | Description |
---|---|
Platform | x86_64-arista_7060_cx32s |
HwSKU | Arista-7060CX-32S-D48C8 |
ASIC | broadcom |
Topology | T0 (4 LAG up, one port per LAG) |
Steps:
- Enable link state propagation (Propagete Fanout switch port oper down to VEOS)
ansible-playbook -i linkstate/testbed_inv.py -e target_host=<VMS> --vault-password-file=password.txt linkstate/up.yml
- Run warm-reboot playbook once so PTF server will have latest code and data files
ansible-playbook test_sonic.yml -i str --limit <DUT> --vault-password-file password.txt -e testbed_name=<VMS> -e testcase_name=warm-reboot
-
Before warm-reboot happen, create one of the below sad situation on DUT
- Shutdown a downlink port. Remove the port name from /tmp/vlan_interfaces.json (if the post reboot status should keep down, below are the same)
- Shutdown a up link port. Remove the LAG node from /tmp/portchannel_interfaces.json
- Shutdown a up link LAG. Remove the LAG node from /tmp/portchannel_interfaces.json
Before warm-reboot happen, create one of the below sad situation on EOS VM (T1). All the up/down are relative to DUT.
- Shutdown a up link LAG. Remove the DUT LAG node from /tmp/portchannel_interfaces.json
Before warm-reboot happen, create one of the below sad situation on fanout switch. All the up/down are relative to DUT.
- Shutdown a downlink port. Remove the port name from /tmp/vlan_interfaces.json
- Shutdown a up link port. Remove the DUT LAG node from /tmp/portchannel_interfaces.json
-
Run the PTF command line on PTF server.
- You can find the command in playbook output in Step 2 with below section
TASK [test : PTF Test - Advanced-reboot test]
ptf --test-dir ptftests advanced-reboot.ReloadTest --qlen=1000 --platform-dir ptftests --platform remote -t "verbose=True;dut_username=\"admin\";dut_hostname=\"<DUTIP>\";reboot_limit_in_seconds=30;reboot_type=\"warm-reboot\";portchannel_ports_file=\"/tmp/portchannel_interfaces.json\";vlan_ports_file=\"/tmp/vlan_interfaces.json\";ports_file=\"/tmp/ports.json\";dut_mac='<MAC>';dut_vlan_ip='192.168.0.1';default_ip_range='192.168.0.0/16';vlan_ip_range=\"192.168.0.0/21\";lo_v6_prefix=\"fc00:1::/64\";arista_vms=\"['10.64.247.135','10.64.247.134','10.64.247.132']\""
- You can also find the PTF server IP one section below
TASK [test : command] Thursday 30 May 2019 12:45:19 +0000 (0:00:00.172) 0:00:21.280 ********** changed: [<DUT> -> <PTF_IP>]
-
Carefully observe command output and seek for message like "Dut reboots: reboot start", switch to DUT ssh connection immediately and try hit enter keys several times. The ssh connnection will be no response after about 5 seconds. That's the time of shutdown.
-
During reboot happen, create one of the transition situations. You should do it quickly after above step.
- Shutdown a downlink port.
- Shutdown a up link port.
- Shutdown a up link LAG.
- Startup a downlink port.
- Startup a up link port.
- Startup a up link LAG.
-
Keep observe 'ptf' command until it finish with 'OK' result
-
After warm-reboot, create one of the below sad situation on EOS VM (T1). All the up/down are relative to DUT.
- Shutdown a up link LAG. Remove the DUT LAG node from /tmp/portchannel_interfaces.json
After warm-reboot, create one of the below sad situation on fanout switch. All the up/down are relative to DUT.
- Shutdown a downlink port. Remove the port name from /tmp/vlan_interfaces.json
- Shutdown a up link port. Remove the DUT LAG node from /tmp/portchannel_interfaces.json