import string import pytest import subprocess import os from buildstream import _yaml from .site import HAVE_OSTREE_CLI # ArtifactShare() # # Abstract class providing scaffolding for # generating data to be used with various sources # # Args: # directory (str): The base temp directory for the test # class ArtifactShare(): def __init__(self, directory): # We need the ostree CLI for tests which use this # if not HAVE_OSTREE_CLI: pytest.skip("ostree cli is not available") # The working directory for the artifact share (in case it # needs to do something outside of it's backend's storage folder). # self.directory = os.path.abspath(directory) # The directory the actual repo will be stored in. # # Unless this gets more complicated, just use this directly # in tests as a remote artifact push/pull configuration # self.repo = os.path.join(self.directory, 'repo') os.makedirs(self.repo) self.init() self.update_summary() # init(): # # Initializes the artifact share # # Returns: # (smth): A new ref corresponding to this commit, which can # be passed as the ref in the Repo.source_config() API. # def init(self): subprocess.call(['ostree', 'init', '--repo', self.repo, '--mode', 'archive-z2']) # update_summary(): # # Ensure that the summary is up to date # def update_summary(self): subprocess.call(['ostree', 'summary', '--update', '--repo', self.repo]) # has_artifact(): # # Checks whether the artifact is present in the share # # Args: # project_name (str): The project name # element_name (str): The element name # cache_key (str): The cache key # # Returns: # (bool): True if the artifact exists in the share, otherwise false. def has_artifact(self, project_name, element_name, cache_key): # NOTE: This should be kept in line with our ostree # based artifact cache code, the below is the # same algo for creating an artifact reference # # Chop off the .bst suffix first assert element_name.endswith('.bst') element_name = element_name[:-4] valid_chars = string.digits + string.ascii_letters + '-._' element_name = ''.join([ x if x in valid_chars else '_' for x in element_name ]) artifact_key = '{0}/{1}/{2}'.format(project_name, element_name, cache_key) if not subprocess.call(['ostree', 'rev-parse', '--repo', self.repo, artifact_key]): return True return False # create_artifact_share() # # Create an ArtifactShare for use in a test case # def create_artifact_share(directory): return ArtifactShare(directory)