def lookup_profile_in_filesystem(profile_name): """Helper function for looking up the profile in the filesystem First we check if the file is an absolute path, otherwise we lookup within the pending profile, i.e. in the .perun/jobs directory. If we still have not find the profile, we then iteratively explore the subfolders starting from current directory and look for a potential match. :param str profile_name: value that is being read from the commandline :returns str: full path to profile """ # 1) if it exists return the value if os.path.exists(profile_name): return profile_name log.info("file '{}' does not exist. Checking pending jobs...".format( profile_name)) # 2) if it does not exists check pending job_dir = pcs.get_job_directory() job_path = os.path.join(job_dir, profile_name) if os.path.exists(job_path): return job_path log.info("file '{}' not found in pending jobs...".format(profile_name)) # 3) if still not found, check recursively all candidates for match and ask for confirmation searched_regex = re.compile(profile_name) for root, _, files in os.walk(os.getcwd()): for file in files: full_path = os.path.join(root, file) if file.endswith('.perf') and searched_regex.search(full_path): rel_path = os.path.relpath(full_path, os.getcwd()) if click.confirm( "did you perhaps mean '{}'?".format(rel_path)): return full_path return profile_name
def pcs_with_degradations(): """ """ pool_path = os.path.join(os.path.split(__file__)[0], 'degradation_profiles') profiles = [ os.path.join(pool_path, 'linear_base.perf'), os.path.join(pool_path, 'linear_base_degradated.perf'), os.path.join(pool_path, 'quad_base.perf') ] # Change working dir into the temporary directory pcs_path = tempfile.mkdtemp() os.chdir(pcs_path) commands.init_perun_at(pcs_path, False, {'vcs': {'url': '../', 'type': 'git'}}) # Initialize git vcs.init({}) # Populate repo with commits repo = git.Repo(pcs_path) # Create first commit file1 = os.path.join(pcs_path, "file1") store.touch_file(file1) repo.index.add([file1]) root = repo.index.commit("root") # Create second commit repo.git.checkout('-b', 'develop') file2 = os.path.join(pcs_path, "file2") store.touch_file(file2) repo.index.add([file2]) middle_head = repo.index.commit("second commit") # Create third commit repo.git.checkout('master') file3 = os.path.join(pcs_path, "file3") store.touch_file(file3) repo.index.add([file3]) repo.index.commit("parallel commit") repo.git.merge('--no-ff', 'develop') current_head = str(repo.head.commit) # Populate PCS with profiles jobs_dir = pcs.get_job_directory() root_profile = Helpers.prepare_profile(jobs_dir, profiles[0], str(root)) commands.add([root_profile], str(root)) middle_profile = Helpers.prepare_profile(jobs_dir, profiles[1], str(middle_head)) commands.add([middle_profile], str(middle_head)) head_profile = Helpers.prepare_profile(jobs_dir, profiles[2], str(current_head)) commands.add([head_profile], str(current_head)) yield pcs # clean up the directory shutil.rmtree(pcs_path)
def get_untracked_profiles(): """Returns list untracked profiles, currently residing in the .perun/jobs directory. :returns list: list of ProfileInfo parsed from .perun/jobs directory """ profile_list = [] # Transform each profile of the path to the ProfileInfo object for untracked_path in sorted(os.listdir(pcs.get_job_directory())): if untracked_path.endswith('perf'): real_path = os.path.join(pcs.get_job_directory(), untracked_path) time = timestamp.timestamp_to_str(os.stat(real_path).st_mtime) # Update the list of profiles and counters of types profile_info = profile.ProfileInfo(untracked_path, real_path, time, is_raw_profile=True) profile_list.append(profile_info) return profile_list
def pcs_full(): """ """ # Change working dir into the temporary directory profiles = stored_profile_pool() pcs_path = tempfile.mkdtemp() os.chdir(pcs_path) commands.init_perun_at(pcs_path, False, {'vcs': {'url': '../', 'type': 'git'}}) # Initialize git vcs.init({}) # Populate repo with commits repo = git.Repo(pcs_path) # Create first commit file1 = os.path.join(pcs_path, "file1") store.touch_file(file1) repo.index.add([file1]) root = repo.index.commit("root") # Create second commit file2 = os.path.join(pcs_path, "file2") store.touch_file(file2) repo.index.add([file2]) current_head = repo.index.commit("second commit") # Populate PCS with profiles jobs_dir = pcs.get_job_directory() root_profile = Helpers.prepare_profile(jobs_dir, profiles[0], str(root)) commands.add([root_profile], str(root)) chead_profile1 = Helpers.prepare_profile(jobs_dir, profiles[1], str(current_head)) chead_profile2 = Helpers.prepare_profile(jobs_dir, profiles[2], str(current_head)) commands.add([chead_profile1, chead_profile2], str(current_head)) # Assert that we have five blobs: 2 for commits and 3 for profiles pcs_object_dir = os.path.join(pcs_path, ".perun", "objects") number_of_perun_objects = sum( len(os.listdir(os.path.join(pcs_object_dir, sub))) for sub in os.listdir(pcs_object_dir) ) assert number_of_perun_objects == 5 yield pcs # clean up the directory shutil.rmtree(pcs_path)
def store_generated_profile(prof, job): """Stores the generated profile in the pending jobs directory. :param dict prof: profile that we are storing in the repository :param Job job: job with additional information about generated profiles """ full_profile = profile.finalize_profile_for_job(prof, job) full_profile_name = profile.generate_profile_name(full_profile) profile_directory = pcs.get_job_directory() full_profile_path = os.path.join(profile_directory, full_profile_name) profile.store_profile_at(full_profile, full_profile_path) log.info("stored profile at: {}".format( os.path.relpath(full_profile_path))) if dutils.strtobool( str( config.lookup_key_recursively("profiles.register_after_run", "false"))): # We either store the profile according to the origin, or we use the current head dst = prof.get('origin', vcs.get_minor_head()) commands.add([full_profile_path], dst, keep_profile=False)