As a third party wishing to integrate with Pulp 3, you can use OpenAPI tooling to generate bindings
for over 20 different languages. Here is an example of how to use swagger-codegen
to generate
Python bindings.
The REST API documentation for Pulp 3 is available on every Pulp instance at /pulp/api/v3/docs
.
The documentation is auto generated using the OpenAPI 2.0, formerly known as Swagger, schema
definition. Each Pulp instance has a variety of plugins installed. The documentation is always a
reflection of the installed plugins.
The schema can also be used to generate client bindings in many languages using swagger-codegen
.
The schema is available for your local Pulp at /pulp/api/v3/docs/api.json
.
The "Getting Started" section of
swagger-codegen
documentation contains a link to the latest version of the jar that can be used
to generate a client for Pulp. The example below can be used to generate the Python client.
{% highlight bash %}
Download swagger-codegen-cli jar¶
curl -o swagger-codegen-cli.jar http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/2.3.1/swagger-codegen-cli-2.3.1.jar
List available config options for Python clients¶
java -jar swagger-codegen-cli.jar config-help -l python
CONFIG OPTIONS packageName python package name (convention: snake_case). (Default: swagger_client)
projectName
python project name in setup.py (e.g. petstore-api).
packageVersion
python package version. (Default: 1.0.0)
packageUrl
python package URL.
sortParamsByRequiredFlag
Sort method arguments to place required parameters before optional parameters. (Default: true)
hideGenerationTimestamp
hides the timestamp when files were generated (Default: true)
library
library template (sub-template) to use (Default: urllib3)
Create a custom swagger-codegen config for Python¶
vim config.json
{ "packageName":"my_pulp3_client", "projectName":"my-pulp3-client", "packageVersion":"0.0.1" }
Download the OpenAPI 2.0 schema from Pulp¶
curl -o pulp-api.json http://localhost:24817/pulp/api/v3/docs/api.json
Generate the client¶
java -jar swagger-codegen-cli.jar generate \ -i pulp-api.json \ -l python \ -o ./my_pulp3_client \ -c config.json
Install the new Python package¶
pip install my_pulp3_client/
Below is an example of a script that uses the new client package to interact with Pulp.
{% highlight python %} import my_pulp3_client from my_pulp3_client import Distribution, FileContent, FilePublisher, FileRemote, Repository, \ RepositorySyncURL, RepositoryPublishURL from my_pulp3_client.rest import ApiException from pprint import pprint from time import sleep
def monitor_task(task_href): """Polls the Task API until the task is in a completed state.
Prints the task details and a success or failure message. Exits on failure.
Args:
task_href(str): The href of the task to monitor
Returns:
list[str]: List of hrefs that identify resource created by the task
"""
completed = ['completed', 'failed', 'canceled']
task = api.tasks_read(task_href)
while task.state not in completed:
sleep(2)
task = api.tasks_read(task_href)
pprint(task)
if task.state == 'completed':
print("The task was successfful.")
return task.created_resources
else:
print("The task did not finish successfully.")
exit()
Configure HTTP basic authorization: basic¶
configuration = my_pulp3_client.Configuration() configuration.username = 'admin' configuration.password = 'admin' configuration.safe_chars_for_path_param = '/'
client = my_pulp3_client.ApiClient(configuration)
create an instance of the API class¶
api = my_pulp3_client.PulpApi(client)
try: # Create a File Remote remote_url = 'https://repos.fedorapeople.org/pulp/pulp/demo_repos/test_file_repo/PULP_MANIFEST' remote_data = FileRemote(name='bar', url=remote_url) file_remote = api.remotes_file_create(remote_data) pprint(file_remote)
# Create a Repository
repository_data = Repository(name='foo')
repository = api.repositories_create(repository_data)
pprint(repository)
# Sync a Repository
repository_sync_data = my_pulp3_client.RepositorySyncURL(repository=repository.href)
sync_response = api.remotes_file_sync(file_remote.href, repository_sync_data)
pprint(sync_response)
# Monitor the sync task
created_resources = monitor_task(sync_response.href)
repository_version_1 = api.repositories_versions_read(created_resources[0])
pprint(repository_version_1)
# Create an artifact from a local file
artifact = api.artifacts_create('devel/pulp3_python_client_example/test_bindings.py')
pprint(artifact)
# Create a FileContent from the artifact
file_data = FileContent(relative_path='foo.tar.gz', artifact=artifact.href)
filecontent = api.content_file_files_create(file_data)
pprint(filecontent)
# Add the new FileContent to a repository version
repo_version_data = {'add_content_units': [filecontent.href]}
repo_version_response = api.repositories_versions_create(repository.href, repo_version_data)
# Monitor the repo version creation task
created_resources = monitor_task(repo_version_response.href)
repository_version_2 = api.repositories_versions_read(created_resources[0])
pprint(repository_version_2)
# Create a FilePublisher
file_publisher_data = FilePublisher(name='bar')
file_publisher = api.publishers_file_create(file_publisher_data)
# Create a publication from the latest version of the repository
publish_data = RepositoryPublishURL(repository=repository.href)
publish_response = api.publishers_file_publish(file_publisher.href, publish_data)
# Monitor the publish task
created_resources = monitor_task(publish_response.href)
publication_href = created_resources[0]
distribution_data = Distribution(name='baz', base_path='foo', publication=publication_href)
distribution = api.distributions_create(distribution_data)
pprint(distribution)
except ApiException as e: print("Exception when calling the Api: %s\n" % e)