blob: 8664c69d0ba8cbd421cd41705ed1d34e09ed2f15 [file] [log] [blame]
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)