Generate Pulp 3 Python client using swagger-codegen
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.
# 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.
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)