def from_dir(cls, res_dir, update_res_dir=True): """ Wrapper around :meth:`lisa.utils.Serializable.from_path`. It uses :meth:`_filepath` to get the name of the serialized file to reload. """ res_dir = ArtifactPath(root=res_dir, relative='') bundle = super().from_path(cls._filepath(res_dir)) # We need to update the res_dir to the one we were given if update_res_dir: bundle.res_dir = res_dir return bundle
def _get_res_dir(self, root, relative, name, append_time, symlink): logger = self.get_logger() while True: time_str = datetime.now().strftime('%Y%m%d_%H%M%S.%f') if not name: name = time_str elif append_time: name = "{}-{}".format(name, time_str) # If we were given an ArtifactPath with an existing root, we # preserve that root so it can be relocated as the caller wants it res_dir = ArtifactPath(root, os.path.join(relative,name)) # Compute base installation path logger.info('Creating result directory: %s', str(res_dir)) # It will fail if the folder already exists. In that case, # append_time should be used to ensure we get a unique name. try: os.makedirs(res_dir) break except FileExistsError: # If the time is used in the name, there is some hope that the # next time it will succeed if append_time: logger.info('Directory already exists, retrying ...') continue else: raise if symlink: res_lnk = os.path.join(LISA_HOME, LATEST_LINK) with contextlib.suppress(FileNotFoundError): os.remove(res_lnk) # There may be a race condition with another tool trying to create # the link with contextlib.suppress(FileExistsError): os.symlink(res_dir, res_lnk) return res_dir