@@ -410,7 +410,7 @@ def bulk_add_wfs(self, wfs) -> None:
410410
411411 """
412412 # Make all fireworks workflows
413- wfs = [Workflow .from_Firework (wf ) if isinstance (wf , Firework ) else wf for wf in wfs ]
413+ wfs = [Workflow .from_firework (wf ) if isinstance (wf , Firework ) else wf for wf in wfs ]
414414
415415 # Initialize new firework counter, starting from the next fw id
416416 total_num_fws = sum (len (wf ) for wf in wfs )
@@ -1700,8 +1700,11 @@ def rerun_fw(self, fw_id, rerun_duplicates=True, recover_launch=None, recover_mo
17001700
17011701 Returns:
17021702 [int]: list of firework ids that were rerun
1703+
1704+ Raises:
1705+ ValueError: raised in case of firework, recover_launch or recovery info not found
17031706 """
1704- m_fw = self .fireworks .find_one ({"fw_id" : fw_id }, {"state" : 1 })
1707+ m_fw = self .fireworks .find_one ({"fw_id" : fw_id }, {"state" : True , "launches" : True })
17051708
17061709 if not m_fw :
17071710 raise ValueError (f"FW with id: { fw_id } not found!" )
@@ -1722,14 +1725,25 @@ def rerun_fw(self, fw_id, rerun_duplicates=True, recover_launch=None, recover_mo
17221725
17231726 # Launch recovery
17241727 if recover_launch is not None :
1725- recovery = self .get_recovery (fw_id , recover_launch )
1728+ if not m_fw ["launches" ]:
1729+ raise ValueError (f"FW with id: { fw_id } has no active launches" )
1730+ if recover_launch == "last" :
1731+ rec_launch_id = m_fw ["launches" ][- 1 ]
1732+ else :
1733+ if recover_launch not in m_fw ["launches" ]:
1734+ raise ValueError (f"launch_id: { recover_launch } is no launch of fw_id: { fw_id } " )
1735+ rec_launch_id = recover_launch
1736+ recovery = self .get_recovery (rec_launch_id )
1737+ if not recovery :
1738+ raise ValueError (f"No recovery info found in launch { rec_launch_id } " )
17261739 recovery .update (_mode = recover_mode )
17271740 set_spec = recursive_dict ({"$set" : {"spec._recovery" : recovery }})
17281741 if recover_mode == "prev_dir" :
1729- prev_dir = self .get_launch_by_id (recovery .get ("_launch_id" )).launch_dir
1742+ launch_f = {"launch_id" : recovery .get ("_launch_id" )}
1743+ launch_p = {"launch_dir" : True }
1744+ prev_dir = self .launches .find_one (launch_f , launch_p )["launch_dir" ]
17301745 set_spec ["$set" ]["spec._launch_dir" ] = prev_dir
17311746 self .fireworks .find_one_and_update ({"fw_id" : fw_id }, set_spec )
1732-
17331747 # If no launch recovery specified, unset the firework recovery spec
17341748 else :
17351749 set_spec = {"$unset" : {"spec._recovery" : "" }}
@@ -1756,17 +1770,28 @@ def rerun_fw(self, fw_id, rerun_duplicates=True, recover_launch=None, recover_mo
17561770
17571771 return reruns
17581772
1759- def get_recovery (self , fw_id , launch_id = "last" ):
1760- """Function to get recovery data for a given fw and launch
1773+ def get_recovery (self , launch_id ):
1774+ """Function to get recovery data for a given launch.
1775+
17611776 Args:
1762- fw_id (int): fw id to get recovery data for
1763- launch_id (int or 'last'): launch_id to get recovery data for, if 'last'
1764- recovery data is generated from last launch.
1765- """
1766- m_fw = self .get_fw_by_id (fw_id )
1767- launch = m_fw .launches [- 1 ] if launch_id == "last" else self .get_launch_by_id (launch_id )
1768- recovery = launch .state_history [- 1 ].get ("checkpoint" )
1769- recovery .update (_prev_dir = launch .launch_dir , _launch_id = launch .launch_id )
1777+ launch_id (int): launch_id to get recovery data for
1778+
1779+ Returns:
1780+ recovery (dict): recovery metadata, None when no recovery retrieved
1781+
1782+ Raises:
1783+ ValueError: raised when no launch under the the launch_id is found
1784+ """
1785+ launch_f = {"launch_id" : launch_id }
1786+ launch_p = {"launch_dir" : True , "state_history" : True }
1787+ launch_dct = self .launches .find_one (launch_f , launch_p )
1788+ if launch_dct is None :
1789+ raise ValueError (f"launch_id: { launch_id } does not exist" )
1790+ if not launch_dct ["state_history" ]:
1791+ return None
1792+ recovery = launch_dct ["state_history" ][- 1 ].get ("checkpoint" )
1793+ if recovery :
1794+ recovery .update (_prev_dir = launch_dct ["launch_dir" ], _launch_id = launch_id )
17701795 return recovery
17711796
17721797 def _refresh_wf (self , fw_id ) -> None :
0 commit comments