def setUp(self): with open(self.artifact_path, 'w') as f: f.write('Temp Artifact File') self.pulp_temp_file = PulpTemporaryFile.init_and_validate( self.artifact_path) self.pulp_temp_file.save() self.artifact = Artifact.from_pulp_temporary_file(self.pulp_temp_file) collection = Collection.objects.create(namespace='my_ns', name='my_name') self.collection_version = CollectionVersion.objects.create( collection=collection) self.collection_version.save() content_artifact = ContentArtifact.objects.create( artifact=self.artifact, content=self.collection_version, ) content_artifact.save()
def import_collection( temp_file_pk, repository_pk=None, expected_namespace=None, expected_name=None, expected_version=None, ): """ Create a Collection from an uploaded artifact and optionally validate its expected metadata. This task provides optional validation of the `namespace`, `name`, and `version` metadata attributes. If the Artifact fails validation or parsing, the Artifact is deleted and the Collection is not created. This task performs a CollectionImport object get_or_create() to allow import messages to be logged. Args: temp_file_pk (str): The pk of the PulpTemporaryFile to create the Collection from. Keyword Args: repository_pk (str): Optional. If specified, a new RepositoryVersion will be created for the Repository and any new Collection content associated with it. expected_namespace (str): Optional. The namespace is validated against the namespace specified in the Collection's metadata. If it does not match a ImporterError is raised. expected_name (str): Optional. The name is validated against the name specified in the Collection's metadata. If it does not match a ImporterError is raised. expected_version (str): Optional. The version is validated against the version specified in the Collection's metadata. If it does not match a ImporterError is raised. Raises: ImporterError: If the `expected_namespace`, `expected_name`, or `expected_version` do not match the metadata in the tarball. """ CollectionImport.objects.get_or_create(task_id=get_current_job().id) temp_file = PulpTemporaryFile.objects.get(pk=temp_file_pk) filename = CollectionFilename(expected_namespace, expected_name, expected_version) log.info(f"Processing collection from {temp_file.file.name}") user_facing_logger = logging.getLogger("pulp_ansible.app.tasks.collection.import_collection") try: with temp_file.file.open() as artifact_file: importer_result = process_collection( artifact_file, filename=filename, logger=user_facing_logger ) artifact = Artifact.from_pulp_temporary_file(temp_file) importer_result["artifact_url"] = reverse("artifacts-detail", args=[artifact.pk]) collection_version = create_collection_from_importer(importer_result) except ImporterError as exc: log.info(f"Collection processing was not successfull: {exc}") temp_file.delete() raise except Exception as exc: user_facing_logger.error(f"Collection processing was not successfull: {exc}") temp_file.delete() raise ContentArtifact.objects.create( artifact=artifact, content=collection_version, relative_path=collection_version.relative_path, ) CreatedResource.objects.create(content_object=collection_version) if repository_pk: repository = AnsibleRepository.objects.get(pk=repository_pk) content_q = CollectionVersion.objects.filter(pk=collection_version.pk) with repository.new_version() as new_version: new_version.add_content(content_q) CreatedResource.objects.create(content_object=repository)