def subseq__traffic(seq, pf, container, udd): steps_pf = SEQ_STEP_MAP[pf].step_module traf_seq = seq.add_sequence('TRAFFIC TESTS') traf_seq.add_step(steps_pf.goto_mode, name='MODE STARDUST PRETRAF', kwargs={'mode': 'STARDUST'}) traf_seq.add_step(steps_pf.diags_sysinit, name='DIAG SYSINIT PRETRAF') dynamic_sequence_builder.build_traffic_cases_subseq(traffic_seq=traf_seq, container=container, udd=udd, step_module=steps_pf, category=None, enabled=True) return seq
def standard_switch_sequence_definition(): try: container = aplib.get_my_container_key() except Exception: raise Exception("Cannot use this Apollo version!") udd = aplib.get_cached_data('{0}_uut_descriptor'.format(container)) pf = udd.get('product_family').upper() pc = udd.get('product_codename').upper() psd = udd.get('uut_config', {}).get('prod_seq_def', {}) area = __area__ # udd.get('test_area', None) seq = aplib.get_sequence_definition('{0} {1} {2} {3} SEQ'.format( __product_line__, pf, pc, area), jump_on_error='FINAL') # ------------------------------------------------------------------------------------------------------------------ # Init init_seq = seq.add_sequence('INITIALIZATION') init_seq.add_step(steps_nyquist.init, name='INIT', kwargs={}) init_seq.add_step(steps_nyquist.ud_retrieve, name="RETRIEVE UUT DESCRIPTOR") init_seq.add_step(steps_nyquist.ud_print_uut_descriptor, name='PRINT DESCRIPTOR') init_seq.add_step(steps_nyquist.ud_print_uut_config, name='PRINT UUT CONFIG') # Area Check seq.add_step(steps_nyquist.process_area_check, name='AREACHECK', kwargs={}, enabled=True) # Power ON & Boot # Unit should already be powered up from pre-sequence auto-discovery. # seq.add_step(steps_nyquist.power_cycle_on, name='POWER ON BOOT', group_level=5, enabled=False) # Basic Mode seq.add_step(steps_nyquist.goto_mode, name='MODE BTLDR', kwargs={'mode': 'BTLDR'}) # ------------------------------------------------------------------------------------------------------------------ # PCAMAP pcamap_seq = seq.add_sequence('PCAMAP PROGRAMMING', enabled=True) # Verify CMPD # TODO: waiting Trac #5852 pcamap_seq.add_step(steps_nyquist.process_verify_cmpd, name='VERIFY CMPD SPROM', enabled=False, kwargs={ 'force': False, 'cmpd_description': 'SPROM', 'uut_type_key': 'MODEL_NUM', 'part_number_key': 'TAN_NUM', 'part_revision_key': 'TAN_REVISION_NUMBER', 'eco_type': 'VERIFICATION' }) # PCAMAP Program pcamap_seq.add_step(steps_nyquist.pcamap_write_uut, name='PCAMAP PROGRAM', kwargs={ 'device_instance': 0, 'memory_type': 'vb' }) # PIDVID Verify seq.add_step(steps_nyquist.process_verify_pidvid, name='PIDVID VERIFY', jump_on_error='CLEAN UP') # ------------------------------------------------------------------------------------------------------------------ # Diag Testing diag_seq = seq.add_sequence('DIAGNOSTIC TESTS', enabled=True) diag_seq.add_step(steps_nyquist.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) diag_seq.add_step(steps_nyquist.diags_sysinit, name='SYSINIT') diag_seq.add_step(steps_nyquist.diags_psu_check, name='PSU CHECK', kwargs={}) # Diag Testlist build-out dynamic_sequence_builder.build_diag_testlist_subseq( diag_seq=diag_seq, container=container, udd=udd, step_module=steps_nyquist, category=None, enabled=True) # ------------------------------------------------------------------------------------------------------------------ # Traffic Testing traf_seq = seq.add_sequence('TRAFFIC TESTS', enabled=True) traf_seq.add_step(steps_nyquist.goto_mode, name='MODE STARDUST PRETRAF', kwargs={'mode': 'STARDUST'}) traf_seq.add_step(steps_nyquist.diags_sysinit, name='DIAG SYSINIT PRETRAF') dynamic_sequence_builder.build_traffic_cases_subseq( traffic_seq=traf_seq, container=container, udd=udd, step_module=steps_nyquist, category=None, enabled=True) # ------------------------------------------------------------------------------------------------------------------ # Power OFF seq.add_step(steps_nyquist.power_off, name='POWER OFF', group_level=1000) # Clean up final_seq = seq.add_sequence('FINAL', finalization=True) final_seq.add_step(steps_nyquist.power_off, name='POWER OFF', kwargs={}, group_level=1000) final_seq.add_step(steps_nyquist.clean_up, name='CLEAN UP') final_seq.add_step(steps_nyquist.final, name='END') return seq
def standard_switch_common(profile_type): """ 2C/4C Run Sequence that includes: 1) setup 2) area check 3) chamber startup 4) corner buildup 5) chamber wrapup 5) power off 6) cleanup :return: seq """ try: container = aplib.get_my_container_key() except Exception: raise Exception("Cannot use this Apollo version!") udd = aplib.get_cached_data('{0}_uut_descriptor'.format(container)) pf = udd.get('product_family').upper() pc = udd.get('product_codename').upper() seq = aplib.get_sequence_definition('{0} {1} {2} {3} SEQ'.format( __product_line__, pf, pc, __area__), jump_on_error='FINAL') # Enable CATS # seq.adt_enabled = ['cats'] # ------------------------------------------------------------------------------------------------------------------ # Init init_seq = seq.add_sequence('INITIALIZATION') init_seq.add_step(steps_nyquist.init, name='INIT', kwargs={}) init_seq.add_step(steps_nyquist.ud_retrieve, name="RETRIEVE UUT DESCRIPTOR") init_seq.add_step(steps_nyquist.ud_print_uut_descriptor, name='PRINT DESCRIPTOR') init_seq.add_step(steps_nyquist.ud_print_uut_config, name='PRINT UUT CONFIG') # Chamber Init # TODO: Trac#6087 seq.add_step(steps_ess_chamber.step__chamber_init, name='CHAMBER INIT', kwargs={ 'profile_type': profile_type, 'fi_action': 'nopause', 'first_init': False }) # Area Check seq.add_step(steps_nyquist.process_area_check, name='AREACHECK', kwargs={'previous_area': 'ICT'}, enabled=True) # MAC Verify Only seq.add_step(steps_nyquist.process_assign_verify_mac, name='VERIFY MAC', kwargs={'assign': False}) # ------------------------------------------------------------------------------------------------------------------ # PCAMAP pcamap_seq = seq.add_sequence('PCAMAP PROGRAMMING', enabled=True) # Verify CMPD # TODO: waiting Trac #5852 pcamap_seq.add_step(steps_nyquist.process_verify_cmpd, name='VERIFY CMPD SPROM', kwargs={ 'force': False, 'cmpd_description': 'SPROM', 'uut_type_key': 'MODEL_NUM', 'part_number_key': 'MOTHERBOARD_ASSEMBLY_NUM', 'part_revision_key': 'MOTHERBOARD_REVISION_NUM', 'previous_area': 'PCBST', 'eco_type': 'VERIFICATION' }, enabled=False) # Chamber Start seq.add_step(steps_ess_chamber.step__chamber_start, name='CHAMBER START', kwargs={}) # -------------------------------------------------------------------------------------------------------------- # Build All Corners # Example corners = OrderedDict([('NTNV', ('AMBIENT', 'NOMINAL', False)), # ('HTLV', ('HOT', 'LOW', True)), # ('LTLV', ('COLD', 'LOW', True))]) if True: # Logic branch for chamber debug (if needed) corners = steps_ess_chamber.get_global_corners() for i, corner in enumerate(corners): temperature = corners[corner][0] voltage = corners[corner][1] adt_flag = corners[corner][2] corner_seq = seq.add_sequence('{0} CORNER'.format(corner), adt_enabled=adt_flag) corner_seq.add_step(steps_ess_chamber.step__chamber_ramp, name='CHAMBER RAMP {0}'.format(temperature), kwargs={'action': temperature}) corner_seq_sublevel1 = corner_seq.add_sequence('UUT-MONITOR GROUP', parallel_steps=True) corner_seq_sublevel1.add_step( steps_ess_chamber.step__chamber_start_monitor, name="CHAMBER MONITOR START {0}".format(i)) corner_seq_sublevel2 = corner_seq_sublevel1.add_sequence( 'UUT AT {0} VOLT'.format(voltage)) corner_seq_sublevel3 = corner_seq_sublevel2.add_sequence( 'UUT TESTS', adt_enabled=adt_flag, jump_on_error="CHAMBER MONITOR STOP {0}".format(i)) corner_seq_sublevel3.add_step(steps_nyquist.power_cycle_on, name='POWER ON BOOT', group_level=5) if True: # Logic branch for chamber debug (if needed) corner_seq_sublevel3.add_step(steps_nyquist.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) corner_seq_sublevel3.add_step( steps_nyquist.diags_switch_mcu_mode, name='MCU MODE IOS', kwargs={'kkmode': 'IOS'}) corner_seq_sublevel3.add_step(steps_nyquist.diags_sysinit, name='DIAG SYSINIT') corner_seq_sublevel3.add_step(steps_nyquist.diags_vmargin_test, name='VOLTAGE MARGIN', kwargs={ 'device_instance': 0, 'margin_level': voltage }) corner_seq_sublevel3.add_step( steps_nyquist.diags_temperature_test, name='UUT TEMPERATURES', kwargs={ 'temperature_corner': temperature, 'operational_state': 'idle' }) corner_seq_sublevel3.add_step(steps_nyquist.diags_psu_check, name='PSU CHECK', kwargs={}) corner_seq_sublevel3.add_step( steps_nyquist.diags_stackrac_test, name='STACKRAC TEST', kwargs={}) corner_seq_sublevel3.add_step( steps_nyquist.diags_serdeseye_sif_test, name='SERDES EYE SIF TEST', kwargs={}) corner_seq_sublevel3.add_step( steps_nyquist.diags_serdeseye_nif_test, name='SERDES EYE NIF TEST', kwargs={}) # Diag Testlist build-out corner_seq_sublevel3_diag = corner_seq_sublevel3.add_sequence( 'DIAG TESTS') corner_seq_sublevel3_diag.add_step(steps_nyquist.goto_mode, name='MODE DIAG', kwargs={'mode': 'DIAG'}) dynamic_sequence_builder.build_diag_testlist_subseq( diag_seq=corner_seq_sublevel3_diag, container=container, udd=udd, step_module=steps_nyquist, category=None, enabled=True) # Traffic Testlist build-out corner_seq_sublevel3_traf = corner_seq_sublevel3.add_sequence( 'TRAF TESTS') corner_seq_sublevel3_traf.add_step(steps_nyquist.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) dynamic_sequence_builder.build_traffic_cases_subseq( traffic_seq=corner_seq_sublevel3_traf, container=container, udd=udd, step_module=steps_nyquist, category=None, enabled=True) # Corner wrap-up corner_seq_sublevel2.add_step( steps_ess_chamber.step__chamber_stop_monitor, name="CHAMBER MONITOR STOP {0}".format(i), kwargs={}, group_level=aplib.FINALIZATION - 2) corner_seq.add_step(steps_nyquist.power_off, name='POWER OFF', group_level=aplib.FINALIZATION - 1) # ------------------------------------------------------------------------------------------------------------------ # Chamber Wrap-Up # 1. Chamber Stop will sync all containers AND return chamber to ambient. # 2. Power off each UUT. # 3. Clean Up (remove classes and clean userdict) final_seq = seq.add_sequence('FINAL', finalization=True) final_seq.add_step(steps_ess_chamber.step__chamber_final, name="CHAMBER STOP", kwargs={}, group_level=aplib.FINALIZATION - 3) final_seq.add_step(steps_nyquist.power_off, name='POWER OFF', group_level=aplib.FINALIZATION - 2) final_seq.add_step(steps_nyquist.clean_up, name='CLEAN UP', group_level=aplib.FINALIZATION - 1) return seq
def standard_switch_sequence_definition(): try: container = aplib.get_my_container_key() except Exception: raise Exception("Cannot use this Apollo version!") udd = aplib.get_cached_data('{0}_uut_descriptor'.format(container)) pf = udd.get('product_family').upper() pc = udd.get('product_codename').upper() psd = udd.get('uut_config', {}).get('prod_seq_def', {}) area = __area__ # udd.get(test_area, None) seq = aplib.get_sequence_definition('{0} {1} {2} {3} SEQ'.format( __product_line__, pf, pc, area), jump_on_error='FINAL') # Enable CATS # seq.adt_enabled = ['cats'] # ------------------------------------------------------------------------------------------------------------------ # Init init_seq = seq.add_sequence('INITIALIZATION') init_seq.add_step(steps_franklin.init, name='INIT', kwargs={}) init_seq.add_step(steps_franklin.ud_retrieve, name="RETRIEVE UUT DESCRIPTOR") init_seq.add_step(steps_franklin.ud_print_uut_descriptor, name='PRINT DESCRIPTOR') init_seq.add_step(steps_franklin.ud_print_uut_config, name='PRINT UUT CONFIG') # Area Check seq.add_step(steps_franklin.process_area_check, name='AREACHECK', kwargs={}, enabled=True) # Power ON & Boot # Unit should already be powered up from pre-sequence auto-discovery. # seq.add_step(steps_franklin.power_cycle_on, name='POWER ON BOOT', group_level=5, enabled=False) # Basic Mode seq.add_step(steps_franklin.goto_mode, name='MODE BTLDR', kwargs={'mode': 'BTLDR'}) # MAC Verify Only seq.add_step(steps_franklin.process_assign_verify_mac, name='VERIFY MAC', kwargs={'assign': False}) # Get RFID Data seq.add_step(steps_franklin.process_get_rfid_db, name='GET RFID TID', enabled=True, kwargs={}) # ------------------------------------------------------------------------------------------------------------------ # PCAMAP pcamap_seq = seq.add_sequence('PCAMAP PROGRAMMING', enabled=True) # Verify CMPD # TODO: waiting Trac #5852 pcamap_seq.add_step(steps_franklin.process_verify_cmpd, name='VERIFY CMPD SPROM', enabled=False, kwargs={ 'force': False, 'cmpd_description': 'SPROM', 'uut_type_key': 'MODEL_NUM', 'part_number_key': 'TAN_NUM', 'part_revision_key': 'TAN_REVISION_NUMBER', 'eco_type': 'VERIFICATION' }) # PCAMAP Program pcamap_seq.add_step(steps_franklin.pcamap_write_uut, name='PCAMAP PROGRAM', kwargs={ 'device_instance': 0, 'memory_type': 'vb' }) # PIDVID Verify seq.add_step(steps_franklin.process_verify_pidvid, name='PIDVID VERIFY', jump_on_error='CLEAN UP') # ------------------------------------------------------------------------------------------------------------------ # Load Images image_load_seq = seq.add_sequence('IMAGE LOADING', enabled=True) image_load_seq.add_step(steps_franklin.goto_mode, name='MODE LINUX', kwargs={'mode': 'LINUX'}) image_load_seq.add_step(steps_franklin.linux_set_network_interface, name='SET LINUX NET INTF') image_load_seq.add_step( steps_franklin.load_hw_images, name='LOAD HW IMAGES', kwargs={ 'master_list': ['btldr', 'linux', 'diag', 'fpga', 'mcu', 'nic', 'SBC_CFG'], 'force': False }, enabled=False) image_load_seq.add_step(steps_franklin.ios_install_supplemental_images, name='LOAD IOS SUPPLEMENTAL IMAGES', enabled=True) # ------------------------------------------------------------------------------------------------------------------ # Update any Images via stardust # SBC update will ALWAYS program; turn off for FST. image_seq = seq.add_sequence('DEVICE IMAGE PROGRAMMING', enabled=True) image_secboot_seq = image_seq.add_sequence( 'DEVICE IMAGE PROGRAMMING SECBOOT') image_secboot_seq.add_step(steps_franklin.goto_mode, name='MODE BTLDR', kwargs={'mode': 'BTLDR'}) image_secboot_seq.add_step(steps_franklin.upgrade_btldr, name='PROG BTLDR') image_secboot_seq.add_step(steps_franklin.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) image_secboot_seq.add_step(steps_franklin.upgrade_fpga, name='PROG FPGA') image_secboot_seq.add_step(steps_franklin.power_cycle_on, name='POWER ON REBOOT', kwargs={'contingent': True}, group_level=5) image_mcu_seq = image_seq.add_sequence('DEVICE IMAGE PROGRAMMING MCU') image_mcu_seq.add_step(steps_franklin.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) image_mcu_seq.add_step(steps_franklin.diags_switch_mcu_mode, name='MCU MODE IOS', kwargs={'kkmode': 'IOS'}) image_mcu_seq.add_step(steps_franklin.upgrade_mcu, name='PROG MCU', enabled=False) image_nic_seq = image_seq.add_sequence('DEVICE IMAGE PROGRAMMING NIC') image_nic_seq.add_step(steps_franklin.goto_mode, name='MODE LINUX', kwargs={'mode': 'LINUX'}) image_nic_seq.add_step(steps_franklin.upgrade_nic, name='PROG NIC', enabled=True) image_sbc_seq = image_seq.add_sequence('DEVICE IMAGE PROGRAMMING SBC') image_sbc_seq.add_step(steps_franklin.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) image_sbc_seq.add_step(steps_franklin.update_sbc, name='PROG SBC', enabled=False) # ------------------------------------------------------------------------------------------------------------------ # Identity Protection Programming idpro_seq = seq.add_sequence('IDENTITY PROTECTION') idpro_main_subseq = idpro_seq.add_sequence('IDENTITY PROTECTION MAINBOARD', enabled=True) idpro_main_subseq.add_step(steps_franklin.power_cycle_on, name='POWER ON REBOOT', group_level=5) idpro_main_subseq.add_step(steps_franklin.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) idpro_main_subseq.add_step(steps_franklin.diags_sysinit, name='DIAG SYSINIT') idpro_main_subseq.add_step(steps_franklin.x509sudi_sign_certificate, name='X509 SHA1', kwargs={'x509_sudi_hash': 'SHA1'}, enabled=True) idpro_main_subseq.add_step(steps_franklin.act2_sign_chip, name='ACT2', kwargs={ 'device_instance': 0, 'keytype': 'ACT2-RSA' }, enabled=True) idpro_main_subseq.add_step(steps_franklin.act2_sign_chip, name='ACT2 2099', kwargs={ 'device_instance': 0, 'keytype': 'ACT2-HARSA' }, enabled=True) idpro_main_subseq.add_step(steps_franklin.x509sudi_sign_certificate, name='X509 SHA256', kwargs={ 'x509_sudi_hash': 'SHA256', 'keytype': 'ACT2-RSA' }, enabled=True) idpro_main_subseq.add_step(steps_franklin.x509sudi_sign_certificate, name='X509 SHA256 2099', kwargs={ 'x509_sudi_hash': 'CMCA3', 'keytype': 'ACT2-HARSA' }, enabled=False) # Peripherals for special builds only (i.e. proto, etc.). if psd.get(area, {}).get('idpro_periphs', False): idpro_peripheral_subseq = idpro_seq.add_sequence( 'IDENTITY PROTECTION PERIPHERALS', enabled=True) idpro_peripheral_subseq.add_step(steps_franklin.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) idpro_peripheral_subseq.add_step(steps_franklin.diags_sysinit, name='DIAG SYSINIT') idpro_peripheral_subseq.add_step(steps_franklin.act2_sign_chip, name='ACT2 1', kwargs={ 'device_instance': 1, 'keytype': 'ACT2-RSA' }, enabled=True) idpro_peripheral_subseq.add_step(steps_franklin.act2_sign_chip, name='ACT2 2', kwargs={ 'device_instance': 2, 'keytype': 'ACT2-RSA' }, enabled=True) idpro_peripheral_subseq.add_step(steps_franklin.act2_sign_chip, name='ACT2 3', kwargs={ 'device_instance': 3, 'keytype': 'ACT2-RSA' }, enabled=True) idpro_peripheral_subseq.add_step(steps_franklin.act2_sign_chip, name='ACT2 4', kwargs={ 'device_instance': 4, 'keytype': 'ACT2-RSA' }, enabled=True) # IOS Boot Test and IdPro Check idpro_seq.add_step(steps_franklin.goto_mode, name='MODE IOSE', kwargs={'mode': 'IOSE'}) idpro_seq.add_step(steps_franklin.ios_verify_idpro, name='ID PRO VERIFICATION', kwargs={}) idpro_seq.add_step(steps_franklin.goto_mode, name='MODE BTLDR', kwargs={'mode': 'BTLDR'}) idpro_seq.add_step(steps_franklin.process_assign_verify_mac, name='VERIFY MAC', kwargs={'assign': False}) # ------------------------------------------------------------------------------------------------------------------ # Power Cycle Testing seq.add_step(steps_franklin.power_power_cycle_testing, name='POWER CYCLE TEST') # ================================================================================================================== # Main Loop Tests # ------------------------------------------------------------------------------------------------------------------ fst_loop_seq = seq.add_sequence('SYSTEM LOOP TESTS', iterations=(aplib.ITERATION_TIME, 30)) fst_loop_seq.iterations.type = aplib.ITERATION_TIME fst_loop_seq.iterations.value = psd.get(area, {}).get( 'total_loop_time_secs', 1) if psd else 1 fst_loop_seq.add_step(steps_franklin.loop_marker, name='FST LOOP', kwargs={'title': 'FST'}) # ------------------------------------------------------------------------------------------------------------------ # Diag Testing diag_seq = fst_loop_seq.add_sequence('DIAGNOSTIC TESTS', enabled=True) diag_seq.add_step(steps_franklin.goto_mode, name='MODE STARDUST', kwargs={'mode': 'STARDUST'}) diag_seq.add_step(steps_franklin.diags_sysinit, name='SYSINIT') diag_seq.add_step(steps_franklin.diags_rtc_chkset_test, name='RTC CHK SET TEST', kwargs={}) diag_seq.add_step(steps_franklin.diags_psu_check, name='PSU CHECK', kwargs={}) diag_seq.add_step(steps_franklin.diags_update_mcu_settings, name='MCU SETTINGS', kwargs={}) diag_seq.add_step(steps_franklin.diags_temperature_test, name='TEMPERATURE TEST', kwargs={'operational_state': 'diag'}, enabled=True) diag_seq.add_step(steps_franklin.diags_vmargin_test, name='VMARGIN TEST', kwargs={ 'device_instance': 0, 'margin_level': 'NOMINAL' }, enabled=True) diag_seq.add_step(steps_franklin.diags_fan_test, name='FAN TEST', kwargs={}, enabled=True) diag_seq.add_step(steps_franklin.diags_stackrac_test, name='STACKRAC TEST', kwargs={}, enabled=True) diag_seq.add_step(steps_franklin.diags_serdeseye_sif_test, name='SERDES EYE SIF TEST', kwargs={}, enabled=True) diag_seq.add_step(steps_franklin.diags_serdeseye_nif_test, name='SERDES EYE NIF TEST', kwargs={}, enabled=True) # Diag Testlist build-out dynamic_sequence_builder.build_diag_testlist_subseq( diag_seq=diag_seq, container=container, udd=udd, step_module=steps_franklin, category=None, enabled=True) # ------------------------------------------------------------------------------------------------------------------ # Traffic Testing traf_seq = fst_loop_seq.add_sequence('TRAFFIC TESTS', enabled=True) traf_seq.add_step(steps_franklin.goto_mode, name='MODE STARDUST PRETRAF', kwargs={'mode': 'STARDUST'}) traf_seq.add_step(steps_franklin.diags_sysinit, name='DIAG SYSINIT PRETRAF') dynamic_sequence_builder.build_traffic_cases_subseq( traffic_seq=traf_seq, container=container, udd=udd, step_module=steps_franklin, category=None, enabled=True) seq.add_step(steps_franklin.loop_marker, name='FST LOOPS DONE', kwargs={ 'title': 'FST (Loops completed)', 'close_loop': True }) # ================================================================================================================== # ------------------------------------------------------------------------------------------------------------------ # Power OFF seq.add_step(steps_franklin.power_off, name='POWER OFF', group_level=1000) # Clean up final_seq = seq.add_sequence('FINAL', finalization=True) final_seq.add_step(steps_franklin.power_off, name='POWER OFF', kwargs={}, group_level=1000) final_seq.add_step(steps_franklin.clean_up, name='CLEAN UP') final_seq.add_step(steps_franklin.final, name='END') return seq