Ejemplo n.º 1
0
    def reclaim(self, request):
        """
        Triggers an asynchronous space reclaim operation.
        """
        serializer = ReclaimSpaceSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        repos = serializer.validated_data.get("repo_hrefs", [])
        keeplist = serializer.validated_data.get("repo_versions_keeplist", [])
        reclaim_repo_pks = []
        keeplist_rv_pks = []
        for repo in repos:
            reclaim_repo_pks.append(repo.pk)
        for rv in keeplist:
            repos.append(rv.repository)
            keeplist_rv_pks.append(rv.pk)

        task = dispatch(
            reclaim_space,
            shared_resources=repos,
            kwargs={
                "repo_pks": reclaim_repo_pks,
                "keeplist_rv_pks": keeplist_rv_pks,
            },
        )

        return OperationPostponedResponse(task, request)
Ejemplo n.º 2
0
    def post(self, request, path):
        """
        Queues a task that creates a new Collection from an uploaded artifact.
        """
        distro = get_object_or_404(AnsibleDistribution, base_path=path)
        serializer = GalaxyCollectionUploadSerializer(
            data=request.data, context={"request": request})
        serializer.is_valid(raise_exception=True)

        expected_digests = {"sha256": serializer.validated_data["sha256"]}
        artifact = Artifact.init_and_validate(
            serializer.validated_data["file"],
            expected_digests=expected_digests)
        artifact.save()

        locks = [str(artifact.pk)]
        kwargs = {"artifact_pk": artifact.pk}
        if distro.repository:
            locks.append(distro.repository)
            kwargs["repository_pk"] = distro.repository.pk

        async_result = enqueue_with_reservation(import_collection,
                                                locks,
                                                kwargs=kwargs)
        return OperationPostponedResponse(async_result, request)
Ejemplo n.º 3
0
    def create(self, request, exporter_pk):
        """
        Generates a Task to export the set of repositories assigned to a specific PulpExporter.
        """
        # Validate Exporter
        exporter = PulpExporter.objects.get(pk=exporter_pk).cast()
        ExporterSerializer.validate_path(exporter.path, check_is_dir=True)

        # Validate Export
        serializer = PulpExportSerializer(data=request.data,
                                          context={"exporter": exporter})
        serializer.is_valid(raise_exception=True)

        # Invoke the export
        export = PulpExport.objects.create(exporter=exporter,
                                           params=request.data)
        export.validated_versions = serializer.validated_data.get(
            "versions", None)
        export.validated_start_versions = serializer.validated_data.get(
            "start_versions", None)
        export.validated_chunk_size = serializer.validated_data.get(
            "chunk_size", None)

        task = dispatch(pulp_export, [exporter], kwargs={"the_export": export})

        return OperationPostponedResponse(task, request)
Ejemplo n.º 4
0
    def create(self, request, repository_pk):
        """
        Queues a task that creates a new RepositoryVersion by adding and removing content units
        """
        add_content_units = []
        remove_content_units = []
        repository = self.get_parent_object()

        if 'base_version' in request.data:
            base_version_pk = self.get_resource(request.data['base_version'], RepositoryVersion).pk
        else:
            base_version_pk = None

        if 'add_content_units' in request.data:
            for url in request.data['add_content_units']:
                content = self.get_resource(url, Content)
                add_content_units.append(content.pk)

        if 'remove_content_units' in request.data:
            for url in request.data['remove_content_units']:
                content = self.get_resource(url, Content)
                remove_content_units.append(content.pk)

        result = enqueue_with_reservation(
            tasks.repository.add_and_remove, [repository],
            kwargs={
                'repository_pk': repository_pk,
                'base_version_pk': base_version_pk,
                'add_content_units': add_content_units,
                'remove_content_units': remove_content_units
            }
        )
        return OperationPostponedResponse(result, request)
Ejemplo n.º 5
0
    def delete(self, request, format=None):
        """
        Cleans up all the Content and Artifact orphans in the system
        """
        async_result = enqueue_with_reservation(orphan_cleanup, [])

        return OperationPostponedResponse(async_result, request)
Ejemplo n.º 6
0
    def delete(self, request, format=None):
        """
        Cleans up all the Content and Artifact orphans in the system
        """
        task = dispatch(orphan_cleanup)

        return OperationPostponedResponse(task, request)
Ejemplo n.º 7
0
 def delete(self, request, pk, *args, **kwargs):
     """
     Dispatches a task with reservation for deleting a distribution.
     """
     self.get_object()
     async_result = enqueue_with_reservation(tasks.distribution.delete,
                                             "/api/v3/distributions/",
                                             args=(pk, ))
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 8
0
    def destroy(self, request, repository_pk, number):
        """
        Queues a task to handle deletion of a RepositoryVersion
        """
        version = self.get_object()

        task = dispatch(tasks.repository.delete_version, [version.repository],
                        kwargs={"pk": version.pk})
        return OperationPostponedResponse(task, request)
Ejemplo n.º 9
0
 def destroy(self, request, pk):
     """
     Generates a Task to delete a Repository
     """
     repo = self.get_object()
     async_result = enqueue_with_reservation(tasks.repository.delete,
                                             [repo],
                                             kwargs={'repo_id': repo.pk})
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 10
0
 def destroy(self, request, repository_pk, number):
     """
     Queues a task to handle deletion of a RepositoryVersion
     """
     version = self.get_object()
     async_result = enqueue_with_reservation(
         tasks.repository.delete_version, [version.repository],
         kwargs={'pk': version.pk})
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 11
0
    def modify(self, request, pk):
        """
        Queues a task that creates a new RepositoryVersion by adding and removing content units
        """
        add_content_units = {}
        remove_content_units = {}

        repository = self.get_object()
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        if "base_version" in request.data:
            base_version_pk = self.get_resource(request.data["base_version"],
                                                RepositoryVersion).pk
        else:
            base_version_pk = None

        if "add_content_units" in request.data:
            for url in request.data["add_content_units"]:
                add_content_units[NamedModelViewSet.extract_pk(url)] = url

            content_units_pks = set(add_content_units.keys())
            existing_content_units = Content.objects.filter(
                pk__in=content_units_pks)
            existing_content_units.touch()

            self.verify_content_units(existing_content_units,
                                      add_content_units)

            add_content_units = list(add_content_units.keys())

        if "remove_content_units" in request.data:
            if "*" in request.data["remove_content_units"]:
                remove_content_units = ["*"]
            else:
                for url in request.data["remove_content_units"]:
                    remove_content_units[NamedModelViewSet.extract_pk(
                        url)] = url
                content_units_pks = set(remove_content_units.keys())
                existing_content_units = Content.objects.filter(
                    pk__in=content_units_pks)
                self.verify_content_units(existing_content_units,
                                          remove_content_units)
                remove_content_units = list(remove_content_units.keys())

        task = dispatch(
            tasks.repository.add_and_remove,
            exclusive_resources=[repository],
            kwargs={
                "repository_pk": pk,
                "base_version_pk": base_version_pk,
                "add_content_units": add_content_units,
                "remove_content_units": remove_content_units,
            },
        )
        return OperationPostponedResponse(task, request)
Ejemplo n.º 12
0
 def create(self, request, *args, **kwargs):
     """
     Dispatches a task with reservation for creating a distribution.
     """
     serializer = self.get_serializer(data=request.data)
     serializer.is_valid(raise_exception=True)
     async_result = enqueue_with_reservation(tasks.distribution.create,
                                             "/api/v3/distributions/",
                                             kwargs={'data': request.data})
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 13
0
 def destroy(self, request, pk, **kwargs):
     """
     Delete a model instance
     """
     instance = self.get_object()
     serializer = self.get_serializer(instance)
     app_label = instance._meta.app_label
     async_result = enqueue_with_reservation(
         tasks.base.general_delete, [instance],
         args=(pk, app_label, serializer.__class__.__name__))
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 14
0
    def delete(self, request, format=None):
        """
        Cleans up all the Content and Artifact orphans in the system
        """
        deprecation_logger.warning(
            "The `DELETE /pulp/api/v3/orphans/` call is deprecated. Use"
            "`POST /pulp/api/v3/orphans/cleanup/` instead.")

        task = dispatch(orphan_cleanup)

        return OperationPostponedResponse(task, request)
Ejemplo n.º 15
0
    def post(self, request):
        """
        Repair artifacts.
        """
        serializer = RepairSerializer(data=request.data)
        serializer.is_valid()

        verify_checksums = serializer.validated_data["verify_checksums"]

        async_result = enqueue_with_reservation(repair_all_artifacts, [], args=[verify_checksums])

        return OperationPostponedResponse(async_result, request)
Ejemplo n.º 16
0
 def update(self, request, pk, **kwargs):
     partial = kwargs.pop('partial', False)
     instance = self.get_object()
     serializer = self.get_serializer(instance, data=request.data, partial=partial)
     serializer.is_valid(raise_exception=True)
     app_label = instance._meta.app_label
     async_result = enqueue_with_reservation(
         tasks.base.general_update, [instance],
         args=(pk, app_label, serializer.__class__.__name__),
         kwargs={'data': request.data, 'partial': partial}
     )
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 17
0
    def post(self, request):
        """
        Repair artifacts.
        """
        serializer = RepairSerializer(data=request.data)
        serializer.is_valid()

        verify_checksums = serializer.validated_data["verify_checksums"]

        task = dispatch(repair_all_artifacts, [], args=[verify_checksums])

        return OperationPostponedResponse(task, request)
Ejemplo n.º 18
0
    def create(self, request, exporter_pk):
        """
        Generates a Task to export the set of repositories assigned to a specific PulpExporter.
        """
        exporter = PulpExporter.objects.get(pk=exporter_pk).cast()

        result = enqueue_with_reservation(
            pulp_export,
            [exporter],
            kwargs={'pulp_exporter': exporter},
        )
        return OperationPostponedResponse(result, request)
Ejemplo n.º 19
0
    def repair(self, request, repository_pk, number):
        """
        Queues a task to repair currupted artifacts corresponding to a RepositoryVersion
        """
        version = self.get_object()

        async_result = enqueue_with_reservation(
            tasks.repository.repair_version,
            [version.repository],
            kwargs={"repository_version_pk": version.pk},
        )
        return OperationPostponedResponse(async_result, request)
Ejemplo n.º 20
0
 def purge(self, request):
     """
     Purge task-records for tasks in 'final' states.
     """
     serializer = PurgeSerializer(data=request.data)
     serializer.is_valid(raise_exception=True)
     task = dispatch(purge,
                     args=[
                         serializer.data["finished_before"],
                         list(serializer.data["states"])
                     ])
     return OperationPostponedResponse(task, request)
Ejemplo n.º 21
0
 def create(self, request, *args, **kwargs):
     """
     Dispatches a task with reservation for creating an instance.
     """
     serializer = self.get_serializer(data=request.data)
     serializer.is_valid(raise_exception=True)
     app_label = self.queryset.model._meta.app_label
     async_result = enqueue_with_reservation(
         tasks.base.general_create,
         self.async_reserved_resources(None),
         args=(app_label, serializer.__class__.__name__),
         kwargs={'data': request.data})
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 22
0
    def destroy(self, request, repository_pk, number):
        """
        Queues a task to handle deletion of a RepositoryVersion
        """
        version = self.get_object()

        if version.number == 0:
            raise serializers.ValidationError(detail=_("Cannot delete repository version 0."))

        async_result = enqueue_with_reservation(
            tasks.repository.delete_version, [version.repository], kwargs={"pk": version.pk}
        )
        return OperationPostponedResponse(async_result, request)
Ejemplo n.º 23
0
 def destroy(self, request, pk, **kwargs):
     """
     Delete a model instance
     """
     instance = self.get_object()
     serializer = self.get_serializer(instance)
     app_label = instance._meta.app_label
     task = dispatch(
         tasks.base.general_delete,
         exclusive_resources=self.async_reserved_resources(instance),
         args=(pk, app_label, serializer.__class__.__name__),
     )
     return OperationPostponedResponse(task, request)
Ejemplo n.º 24
0
 def update(self, request, pk, **kwargs):
     partial = kwargs.pop("partial", False)
     instance = self.get_object()
     serializer = self.get_serializer(instance, data=request.data, partial=partial)
     serializer.is_valid(raise_exception=True)
     app_label = instance._meta.app_label
     task = dispatch(
         tasks.base.general_update,
         exclusive_resources=self.async_reserved_resources(instance),
         args=(pk, app_label, serializer.__class__.__name__),
         kwargs={"data": request.data, "partial": partial},
     )
     return OperationPostponedResponse(task, request)
Ejemplo n.º 25
0
    def cleanup(self, request):
        """
        Triggers an asynchronous orphan cleanup operation.
        """
        serializer = OrphansCleanupSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        content_pks = serializer.validated_data.get("content_hrefs", None)

        task = dispatch(orphan_cleanup, [],
                        kwargs={"content_pks": content_pks})

        return OperationPostponedResponse(task, request)
Ejemplo n.º 26
0
 def update(self, request, pk, partial=False):
     """
     Generates a Task to update a Repository
     """
     instance = self.get_object()
     serializer = self.get_serializer(instance, data=request.data, partial=partial)
     serializer.is_valid(raise_exception=True)
     async_result = enqueue_with_reservation(
         tasks.repository.update, [instance],
         args=(instance.pk, ),
         kwargs={'data': request.data, 'partial': partial}
     )
     return OperationPostponedResponse(async_result, request)
Ejemplo n.º 27
0
    def commit(self, request, pk):
        """
        Queues a Task that creates an Artifact, and the Upload gets deleted and cannot be re-used.
        """
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        sha256 = serializer.validated_data["sha256"]

        upload = self.get_object()
        async_result = enqueue_with_reservation(tasks.upload.commit, [upload],
                                                args=(upload.pk, sha256))
        return OperationPostponedResponse(async_result, request)
Ejemplo n.º 28
0
    def commit(self, request, pk):
        """
        Queues a Task that creates an Artifact, and the Upload gets deleted and cannot be re-used.
        """
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        sha256 = serializer.validated_data["sha256"]

        upload = self.get_object()
        task = dispatch(tasks.upload.commit,
                        exclusive_resources=[upload],
                        args=(upload.pk, sha256))
        return OperationPostponedResponse(task, request)
Ejemplo n.º 29
0
    def create(self, request, importer_pk):
        """Import a Pulp export into Pulp."""
        try:
            importer = PulpImporter.objects.get(pk=importer_pk)
        except PulpImporter.DoesNotExist:
            raise Http404

        serializer = PulpImportSerializer(data=request.data, context={"request": request})
        serializer.is_valid(raise_exception=True)
        path = serializer.validated_data.get("path")
        toc = serializer.validated_data.get("toc")
        task = dispatch(
            pulp_import, [importer], kwargs={"importer_pk": importer.pk, "path": path, "toc": toc}
        )
        return OperationPostponedResponse(task, request)
Ejemplo n.º 30
0
 def update(self, request, pk, *args, **kwargs):
     """
     Dispatches a task with reservation for updating a distribution.
     """
     partial = kwargs.pop('partial', False)
     instance = self.get_object()
     serializer = self.get_serializer(instance, data=request.data, partial=partial)
     serializer.is_valid(raise_exception=True)
     async_result = enqueue_with_reservation(
         tasks.distribution.update,
         "/api/v3/distributions/",
         args=(pk,),
         kwargs={'data': request.data, 'partial': partial}
     )
     return OperationPostponedResponse(async_result, request)