Skip to content

Commit

Permalink
Adding publishing code and updating README
Browse files Browse the repository at this point in the history
This commits adds basic publishing which allows the ansible-galaxy to
install the role version directly through a URL. Also, updated the
README.

fixes #3467
https://pulp.plan.io/issues/3467
  • Loading branch information
David Davis committed Mar 14, 2018
1 parent b4461a8 commit 12311eb
Show file tree
Hide file tree
Showing 4 changed files with 168 additions and 36 deletions.
97 changes: 67 additions & 30 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,55 +45,79 @@ Create a repository ``foo``

``$ http POST http://localhost:8000/api/v3/repositories/ name=foo``

Add an Importer to repository ``foo``
-------------------------------------

Add important details about your Importer and provide examples.

``$ http POST http://localhost:8000/api/v3/repositories/foo/importers/ansible-importer/``

.. code:: json
{
"_href": "http://localhost:8000/api/v3/repositories/foo/importers/ansible-importer/bar/",
"_href": "http://localhost:8000/api/v3/repositories/8d7cd67a-9421-461f-9106-2df8e4854f5f/",
...
}
Add a Publisher to repository ``foo``
-------------------------------------
``$ export REPO_HREF=$(http :8000/api/v3/repositories/ | jq -r '.results[] | select(.name == "foo") | ._href')``


Create a new importer ``bar``
-----------------------------

``$ http POST http://localhost:8000/api/v3/repositories/foo/publishers/ansible-publisher/ name=bar``
``$ http POST :8000/api/v3/importers/ansible/ name=bar download_policy='immediate' sync_mode='additive' feed_url='https://galaxy.ansible.com/api/v1/roles/?namespace=ansible'``

.. code:: json
{
"_href": "http://localhost:8000/api/v3/repositories/foo/publishers/ansible-publisher/bar/",
"_href": "http://localhost:8000/api/v3/importers/ansible/13ac2d63-7b7b-401d-b71b-9a5af05aab3c/",
...
}
Add a Distribution to Publisher ``bar``
---------------------------------------
``$ export IMPORTER_HREF=$(http :8000/api/v3/importers/ansible/ | jq -r '.results[] | select(.name == "bar") | ._href')``

``$ http POST http://localhost:8000/api/v3/repositories/foo/publishers/ansible-publisher/bar/distributions/ some=params``

Sync repository ``foo`` using Importer ``bar``
Sync repository ``foo`` using importer ``bar``
----------------------------------------------

Use ``plugin-template`` Importer:
``$ http POST $IMPORTER_HREF'sync/' repository=$REPO_HREF``


Look at the new Repository Version created
------------------------------------------

``$ http GET $REPO_HREF'versions/1/'``

.. code:: json
{
"_added_href": "http://localhost:8000/api/v3/repositories/933164fd-0514-4b0a-826f-c2e389ab1607/versions/1/added_content/",
"_content_href": "http://localhost:8000/api/v3/repositories/933164fd-0514-4b0a-826f-c2e389ab1607/versions/1/content/",
"_href": "http://localhost:8000/api/v3/repositories/933164fd-0514-4b0a-826f-c2e389ab1607/versions/1/",
"_removed_href": "http://localhost:8000/api/v3/repositories/933164fd-0514-4b0a-826f-c2e389ab1607/versions/1/removed_content/",
"content_summary": {
"ansible": 11
},
"created": "2018-03-12T19:23:31.000923Z",
"number": 1
}
Create an Ansible publisher
---------------------------

``$ http POST http://localhost:8000/api/v3/publishers/ansible/ name=bar``

``http POST http://localhost:8000/api/v3/repositories/foo/importers/ansible-importer/bar/sync/``
.. code:: json
{
"_href": "http://localhost:8000/api/v3/publishers/ansible/bar/",
...
}
Add content to repository ``foo``
---------------------------------
``$ http POST http://localhost:8000/api/v3/repositorycontents/ repository='http://localhost:8000/api/v3/repositories/foo/' content='http://localhost:8000/api/v3/content/ansible-publisher/a9578a5f-c59f-4920-9497-8d1699c112ff/'``
``$ export PUBLISHER_HREF=$(http :8000/api/v3/publishers/ansible/ | jq -r '.results[] | select(.name == "bar") | ._href')``

Create a Publication using Publisher ``bar``
--------------------------------------------

Dispatch the Publish task
Use the ``bar`` Publisher to create a Publication
-------------------------------------------------

``$ http POST http://localhost:8000/api/v3/repositories/foo/publishers/ansible-publisher/bar/publish/``
``$ http POST $PUBLISHER_HREF'publish/' repository=$REPO_HREF``

.. code:: json
Expand All @@ -104,12 +128,25 @@ Dispatch the Publish task
}
]
Check status of a task
----------------------
``$ export PUBLICATION_HREF=$(http :8000/api/v3/publications/ | jq -r --arg PUBLISHER_HREF "$PUBLISHER_HREF" '.results[] | select(.publisher==$PUBLISHER_HREF) | ._href')``


Create a Distribution for the Publication
---------------------------------------

``$ http POST http://localhost:8000/api/v3/distributions/ name='baz' base_path='dev' publication=$PUBLICATION_HREF``


.. code:: json
{
"_href": "http://localhost:8000/api/v3/distributions/9b29f1b2-6726-40a2-988a-273d3f009a41/",
...
}
``$ http GET http://localhost:8000/api/v3/tasks/82e64412-47f8-4dd4-aa55-9de89a6c549b/``
Install the ansible kubernetes Role
-----------------------------------

Download ``foo.tar.gz`` from Pulp
---------------------------------
``$ ansible-galaxy install http://localhost:8000/content/dev/ansible/kubernetes-modules/v0.3.1-6.tar,,ansible.kubernetes``

``$ http GET http://localhost:8000/content/foo/foo.tar.gz``
1 change: 1 addition & 0 deletions pulp_ansible/app/tasks/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from .synchronizing import synchronize
from .publishing import publish
75 changes: 75 additions & 0 deletions pulp_ansible/app/tasks/publishing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import logging

from gettext import gettext as _

from celery import shared_task

from pulpcore.plugin.models import (
RepositoryVersion,
Publication,
PublishedArtifact,
RemoteArtifact)
from pulpcore.plugin.tasking import UserFacingTask, WorkingDirectory

from pulp_ansible.app.models import AnsibleRole, AnsiblePublisher


log = logging.getLogger(__name__)


@shared_task(base=UserFacingTask)
def publish(publisher_pk, repository_version_pk):
"""
Use provided publisher to create a Publication based on a RepositoryVersion.
Args:
publisher_pk (str): Use the publish settings provided by this publisher.
repository_version_pk (str): Create a publication from this repository version.
"""
publisher = AnsiblePublisher.objects.get(pk=publisher_pk)
repository_version = RepositoryVersion.objects.get(pk=repository_version_pk)

log.info(
_('Publishing: repository=%(repository)s, version=%(version)d, publisher=%(publisher)s'),
{
'repository': repository_version.repository.name,
'version': repository_version.number,
'publisher': publisher.name,
})

with WorkingDirectory():
with Publication.create(repository_version, publisher) as publication:
populate(publication)

log.info(
_('Publication: %(publication)s created'),
{
'publication': publication.pk
})


def populate(publication):
"""
Populate a publication.
Create published artifacts and yield a Manifest Entry for each.
Args:
publication (pulpcore.plugin.models.Publication): A Publication to populate.
Yields:
Entry: Each manifest entry.
"""
def find_artifact():
_artifact = content_artifact.artifact
if not _artifact:
_artifact = RemoteArtifact.objects.filter(content_artifact=content_artifact).first()
return _artifact

for content in publication.repository_version.content:
content_artifact = content.contentartifact_set.get()
published_artifact = PublishedArtifact(
relative_path=content_artifact.relative_path,
publication=publication,
content_artifact=content_artifact)
published_artifact.save()
31 changes: 25 additions & 6 deletions pulp_ansible/app/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

from django_filters.rest_framework import filterset
from rest_framework.decorators import detail_route
from rest_framework.exceptions import ValidationError
from rest_framework import serializers

from pulpcore.plugin.models import Repository
from pulpcore.plugin.models import Repository, RepositoryVersion
from pulpcore.plugin.viewsets import (
ContentViewSet,
ImporterViewSet,
Expand Down Expand Up @@ -43,7 +43,7 @@ def sync(self, request, pk):
importer = self.get_object()
repository = self.get_resource(request.data['repository'], Repository)
if not importer.feed_url:
raise ValidationError(detail=_('A feed_url must be specified.'))
raise serializers.ValidationError(detail=_('A feed_url must be specified.'))
result = tasks.synchronize.apply_async_with_reservation(
[repository, importer],
kwargs={
Expand All @@ -62,12 +62,31 @@ class AnsiblePublisherViewSet(PublisherViewSet):
@detail_route(methods=('post',))
def publish(self, request, pk):
publisher = self.get_object()
repository = self.get_resource(request.data['repository'], Repository)
repository = None
repository_version = None
if 'repository' not in request.data and 'repository_version' not in request.data:
raise serializers.ValidationError("Either the 'repository' or 'repository_version' "
"need to be specified.")

if 'repository' in request.data and request.data['repository']:
repository = self.get_resource(request.data['repository'], Repository)

if 'repository_version' in request.data and request.data['repository_version']:
repository_version = self.get_resource(request.data['repository_version'],
RepositoryVersion)

if repository and repository_version:
raise serializers.ValidationError("Either the 'repository' or 'repository_version' "
"can be specified - not both.")

if not repository_version:
repository_version = RepositoryVersion.latest(repository)

result = tasks.publish.apply_async_with_reservation(
[repository, publisher],
[repository_version.repository, publisher],
kwargs={
'publisher_pk': str(publisher.pk),
'repository_pk': repository.pk
'repository_version_pk': str(repository_version.pk)
}
)
return OperationPostponedResponse([result], request)

0 comments on commit 12311eb

Please sign in to comment.