Skip to main content

PyDo

pydo is the official Python client library that allows Python developers to interact with and manage their DigitalOcean resources through a Python abstraction layer on top of the raw DigitalOcean API HTTP Interface.

A top priority of this project is to ensure the client abides by the API contract. Therefore, the client itself wraps a generated client based on the DigitalOcean OpenAPI Specification to support all of DigitalOcean's HTTP APIs.

Getting Started With the Client

Prerequisites

  • Python version: >= 3.7.2

Installation

To install from pip:

    pip install git+https://github.com/digitalocean/pydo.git

or, if repo is cloned locally:

    pip install /<PATH>/<TO>/pydo

To install from source:

make install

pydo Quickstart

A quick guide to getting started with the client.

pydo must be initialized with pydo.Client(). A DigitalOcean API Token is required. The token can be passed explicitly to pydo.Client(), as such:

import os
from pydo import Client

client = Client(token=os.getenv("$DIGITALOCEAN_TOKEN"))

Example of Using pydo to Access DO Resources

Find below a working example for GETting a ssh_key (per this http request) and printing the ID associated with the ssh key. If you'd like to try out this quick example, you can follow these instructions to add ssh keys to your DO account.

import os
from pydo import Client

client = Client(token=os.getenv("$DIGITALOCEAN_TOKEN"))

ssh_keys_resp = client.ssh_keys.list()
for k in ssh_keys_resp["ssh_keys"]:
    print(f"ID: {k['id']}, NAME: {k['name']}, FINGERPRINT: {k['fingerprint']}")

The above code snippet should output the following:

ID: 123456, NAME: my_test_ssh_key, FINGERPRINT: 5c:74:7e:60:28:69:34:ca:dd:74:67:c3:f3:00:7f:fe
ID: 123457, NAME: my_prod_ssh_key, FINGERPRINT: eb:76:c7:2a:d3:3e:80:5d:ef:2e:ca:86:d7:79:94:0d

Consult the full list of supported DigitalOcean API endpoints in PyDo's documentation.

Note: More working examples can be found here.

Pagination Example

Below is an example on handling pagination. One must parse the URL to find the next page.

resp = self.client.ssh_keys.list(per_page=50, page=page)
pages = resp.links.pages
if 'next' in pages.keys():
    parsed_url = urlparse(pages['next'])
    page = parse_qs(parsed_url.query)['page'][0]
else:
    paginated = False

Contributing

Visit our Contribuing Guide for more information on getting involved in developing this client.

Tests

The tests included in this repo are used to validate the generated client. We use pytest to define and run the tests.

Requirements

  • Python 3.7+
    • Can be installed using something like pyenv
      • used to manage different installed versions of python.
      • can also manage python virtual environments (with a plugin)
    • Poetry.
      • can also be configured to manage python virtual environments.

There are two types of test suites in the tests/ directory.

Mocked Tests: tests/mocked/

Tests in the mocked directory include:

  • tests that validate the generated client has all the expected classes and methods for the respective API resources and operations.
  • tests that exercise individual operations against mocked responses.

These tests do not act against the real API so no real resources are created.

To run mocked tests, run:

make test-mocked

Integration Tests: tests/integration/

Tests in the integration directory include tests that simulate specific scenarios a customer might use the client for to interact with the API. IMPORTANT: these tests require a valid API token and DO create real resources on the respective DigitalOcean account.

To run integration tests, run:

DIGITALOCEAN_TOKEN=... make test-integration

Test Customizations

Some test values can be customized so integration tests can exercise different scenarios. For example, test use a default region to create resources. All the default values are managed in the tests/integration/defaults.py file. Any value that has environ.get() can be overwritten by setting the respective environment variable.

Tests with Docker

The included Dockerfile is a developler convenience to test the package in isolation.

To use it, first build the image. Run:

docker build -t pydo:dev .
Use the interactive python shell

Open the python shell:

docker run -it --rm --name pydo pydo:dev python

The above will launch an interactive python shell and display the following:

Skipping virtualenv creation, as specified in config file.
Python 3.10.5 | packaged by conda-forge | (main, Jun 14 2022, 07:06:46) [GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

From here you can use the client interactively:

>>> from pydo import Client
>>> c = Client($DIGITALOCEAN_TOKEN)
>>> c.droplets.get()

Alternatively, the tests can be run by attaching the tests as a volume and running pytest directly.

Run:

docker run -it --rm --name pydo -v $PWD/tests:/tests pydo:dev pytest tests/mocked

Known Issues

This selection lists the known issues of the client generator.

kubernetes.get_kubeconfig Does not serialize response content

In the generated python client, when calling client.kubernetes.get_kubeconfig(clust_id), the deserialization logic raises an error when the response content-type is applicaiton/yaml. We need to determine if the spec/schema can be configured such that the generator results in functions that properly handle the content. We will likely need to report the issue upstream to request support for the content-type.

invoices.get_pdf_by_uuid(invoice_uuid=invoice_uuid_param) Does not return PDF

In the generated python client, when calling invoices.get_pdf_by_uuid, the response returns a Iterator[bytes] that does not format correctly into a PDF.

Getting documentation via cli "help()"

Currently, calling the "help()" includes the API documentation for the respective operation which is substantial and can be confusing in the context of this client.

Roadmap

This section lists short-term and long-term goals for the project. Note: These are goals, not necessarily commitments. The sections are not intended to represent exclusive focus during these terms.

Short term:

Usability, stability, and marketing.

Short term, we are focused on improving usability and user productivity (part of this is getting the word out).

  • Documentation
    • Support an automated process for creating comprehensive documentation that explains working of codes
    • Support a clean cli help(<client function>) documentation solution
  • Release stability
    • define release strategy
    • pip release

Long term:

Model support, expand on supporting functions

  • The client currently inputs and outputs JSON dictionaries. Adding models would unlock features such as typing and validation.
  • Add supporting functions to elevate customer experience (i.e. adding a funtion that surfaces IP address for a Droplet)

Metadata

Release files for pydo 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pydo 0.1.5
File Size Uploaded
pydo-0.1.5.tar.gz 1.0 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for pydo 0.1.5
File Interpreter ABI Platform
pydo-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 2.1 MB

Release files / pydo-0.1.5.tar.gz

Download URL pydo-0.1.5.tar.gz
Size 1.0 MB
Tags Source
SHA-256 checksum
How to use checksums
ee1232288bccbb31acd57bd0b87e958a8cb36b05aef6a73a89efe9941a354f30
BLAKE2b-256 checksum
How to use checksums
3a2221a5304f0b1dd4f38fbda25bc1960927767c81a33872849188bbc292a226
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.14 CPython/3.7.3 Darwin/22.5.0

Release files / pydo-0.1.5-py3-none-any.whl

Download URL pydo-0.1.5-py3-none-any.whl
Size 1.0 MB
Tags Python 3
SHA-256 checksum
How to use checksums
794acf5b2cc858f84478ed15dee05ee2a6717963c2819af5579481f63b9058e9
BLAKE2b-256 checksum
How to use checksums
f425367495169dd2f1ea6683dc95e7af293cefaf3aafcead954ecb2f569dada1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.14 CPython/3.7.3 Darwin/22.5.0

Release history Release notifications | RSS feed

0.44.0

2 release files

0.42.0

2 release files

0.41.0

2 release files

0.37.0

2 release files

0.33.0

2 release files

0.32.0

2 release files

0.31.0

2 release files

0.30.0

2 release files

0.29.0

2 release files

0.27.0

2 release files

0.25.0

2 release files

0.24.0

2 release files

0.23.0

2 release files

0.22.0

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.18.0

2 release files

0.17.0

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.7

2 release files

0.1.6

2 release files

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page