Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Queryset of the RepositoryVersions containing the specified content
"""
if value is None:
# user didn't supply a value
return qs
if not value:
raise serializers.ValidationError(detail=_('No value supplied for content filter'))
# Get the content object from the content_href
content = NamedModelViewSet.get_resource(value, Content)
# Get the repository from the parent request.
repository_pk = self.parent.request.parser_context['kwargs']['repository_pk']
repository = Repository.objects.get(pk=repository_pk)
repository_content_set = RepositoryContent.objects.filter(content=content,
repository=repository)
# Get the sorted list of version_added and version_removed.
version_added = list(repository_content_set.values_list('version_added__number', flat=True))
# None values have to be filtered out from version_removed,
# in order for zip_longest to pass it a default fillvalue
version_removed = list(filter(None.__ne__, repository_content_set
.values_list('version_removed__number', flat=True)))
# The range finding should work as long as both lists are sorted
# Why it works: https://gist.github.com/werwty/6867f83ae5adbae71e452c28ecd9c444
version_added.sort()
version_removed.sort()
def destination_repo(source_repo_name):
"""Find the destination repository based on source repo's name."""
if importer.repo_mapping and importer.repo_mapping.get(source_repo_name):
dest_repo_name = importer.repo_mapping[source_repo_name]
else:
dest_repo_name = source_repo_name
return Repository.objects.get(name=dest_repo_name)
def import_collection(artifact_id, repository_id):
task = models.CollectionImport.current()
log.info(f'Starting collection import task: {task.id}')
artifact = pulp_models.Artifact.objects.get(pk=artifact_id)
repository = pulp_models.Repository.objects.get(pk=repository_id)
filename = schema.CollectionFilename(
task.namespace.name, task.name, task.version)
task_logger = _get_task_logger(task)
task_logger.info(
f'Starting import: task_id={task.id}, artifact_id={artifact_id}')
try:
importer_obj = _process_collection(artifact, filename, task_logger)
_publish_collection(task, artifact, repository, importer_obj)
except Exception as e:
artifact.delete()
task_logger.error(f'Import Task "{task.id}" failed: {e}')
raise
def validate(self, data):
try:
remote = models.Repository.objects.get(pk=self.context["repository_pk"]).remote
except KeyError:
remote = None
if "remote" not in data and not remote:
raise serializers.ValidationError(
{"remote": _("This field is required since a remote is not set on the repository.")}
)
return data
def add_and_remove(repository_pk, add_content_units, remove_content_units, base_version_pk=None):
"""
Create a new repository version by adding and then removing content units.
Args:
repository_pk (int): The primary key for a Repository for which a new Repository Version
should be created.
add_content_units (list): List of PKs for :class:`~pulpcore.app.models.Content` that
should be added to the previous Repository Version for this Repository.
remove_content_units (list): List of PKs for:class:`~pulpcore.app.models.Content` that
should be removed from the previous Repository Version for this Repository.
base_version_pk (int): the primary key for a RepositoryVersion whose content will be used
as the initial set of content for our new RepositoryVersion
"""
repository = models.Repository.objects.get(pk=repository_pk)
if base_version_pk:
base_version = models.RepositoryVersion.objects.get(pk=base_version_pk)
else:
base_version = None
with models.RepositoryVersion.create(repository, base_version=base_version) as new_version:
new_version.add_content(models.Content.objects.filter(pk__in=add_content_units))
new_version.remove_content(models.Content.objects.filter(pk__in=remove_content_units))
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
filename = data['filename']
# TODO(cutwater): Merge Artifact and UploadCollectionSerializers
namespace = self._get_namespace(data)
self._check_namespace_access(namespace, request.user)
self._check_role_name_conflict(namespace, filename.name)
self._check_version_conflict(namespace, filename)
self._check_is_tarfile(request.data['file'].file.name)
artifact_data = {'file': request.data['file']}
if serializer.data['sha256'] is not None:
artifact_data['sha256'] = data['sha256']
repository = pulp_models.Repository.objects.get(
name=settings.GALAXY_PULP_REPOSITORY)
artifact = self._save_artifact(artifact_data)
task = tasking.create_task(
tasks.import_collection,
task_cls=models.CollectionImport,
params={
'artifact_id': artifact.pk,
'repository_id': repository.pk,
},
task_args={
'namespace': namespace,
'name': filename.name,
'version': filename.version,
})
Queryset of the RepositoryVersions containing the specified content
"""
if value is None:
# user didn't supply a value
return qs
if not value:
raise serializers.ValidationError(detail=_('No value supplied for content filter'))
# Get the content object from the content_href
content = NamedModelViewSet.get_resource(value, Content)
# Get the repository from the parent request.
repository_pk = self.parent.request.parser_context['kwargs']['repository_pk']
repository = Repository.objects.get(pk=repository_pk)
repository_content_set = RepositoryContent.objects.filter(content=content,
repository=repository)
# Get the sorted list of version_added and version_removed.
version_added = list(repository_content_set.values_list('version_added__number', flat=True))
# None values have to be filtered out from version_removed,
# in order for zip_longest to pass it a default fillvalue
version_removed = list(filter(None.__ne__, repository_content_set
.values_list('version_removed__number', flat=True)))
# The range finding should work as long as both lists are sorted
# Why it works: https://gist.github.com/werwty/6867f83ae5adbae71e452c28ecd9c444
version_added.sort()
version_removed.sort()
def add_and_remove(repository_pk, add_content_units, remove_content_units, base_version_pk=None):
"""
Create a new repository version by adding and then removing content units.
Args:
repository_pk (int): The primary key for a Repository for which a new Repository Version
should be created.
add_content_units (list): List of PKs for :class:`~pulpcore.app.models.Content` that
should be added to the previous Repository Version for this Repository.
remove_content_units (list): List of PKs for:class:`~pulpcore.app.models.Content` that
should be removed from the previous Repository Version for this Repository.
base_version_pk (int): the primary key for a RepositoryVersion whose content will be used
as the initial set of content for our new RepositoryVersion
"""
repository = models.Repository.objects.get(pk=repository_pk).cast()
if base_version_pk:
base_version = models.RepositoryVersion.objects.get(pk=base_version_pk)
else:
base_version = None
if "*" in remove_content_units:
latest = repository.latest_version()
if latest:
remove_content_units = latest.content.values_list("pk", flat=True)
else:
remove_content_units = []
with repository.new_version(base_version=base_version) as new_version:
new_version.remove_content(models.Content.objects.filter(pk__in=remove_content_units))
new_version.add_content(models.Content.objects.filter(pk__in=add_content_units))