Skip to main content

UpCloud API Client

Project description

UpCloud's Python API Client

test PyPI version License OpenSSF Scorecard

OOP-based API client for UpCloud's API. Includes most of the API functionality and some convenience functions that combine several API endpoints and logic.

Please test all of your use cases thoroughly before actual production use. Using a separate UpCloud account for testing / developing the client is recommended.

Installation

pip install upcloud-api

Alternatively, if you want the newest (possibly not yet released) stuff, clone the project and run:

python setup.py install

Supported Python versions

  • Python 3.9
  • Python 3.10
  • Python 3.11
  • Python 3.12
  • Python 3.13
  • PyPy3

Python 2 has been deprecated

  • Python 2.7 is no longer supported, but available in older API versions (< v2.0.0).

Changelog

Usage

More usage examples are available under [docs/]. If there's a specific thing you're interested in, but are not able to get working, please contact UpCloud support.

Load credentials from environment

from upcloud_api import CloudManager, Credentials

credentials = Credentials.parse()
c = CloudManager(**credentials.dict)
c.get_account()

Defining and creating servers

import upcloud_api
from upcloud_api import CloudManager, Server, Storage, login_user_block

manager = CloudManager('api_user', 'password')
manager.authenticate()


login_user = login_user_block(
    username='theuser',
    ssh_keys=['ssh-rsa AAAAB3NzaC1yc2EAA[...]ptshi44x user@some.host'],
    create_password=False
)

cluster = {
    'web1': Server(
        plan='2xCPU-4GB',
        hostname='web1.example.com',
        zone='uk-lon1', # All available zones with ids can be retrieved by using manager.get_zones()
        storage_devices=[
            # OS: template storage UUID, all available os templates can be retrieved by calling manager.get_templates()
            # Note: the storage os template uuid:s will change when OS is updated. So check that the UUID is correct
            # default tier: maxIOPS, the 100k IOPS storage backend
            Storage(os='01000000-0000-4000-8000-000030240200', size=10),
            # secondary storage, hdd for reduced speed & cost
            Storage(size=100, tier='hdd')
        ],
        login_user=login_user  # user and ssh-keys
    ),
    'web2': Server(
        plan='2xCPU-4GB',
        hostname='web2.example.com',
        zone='uk-lon1',
        storage_devices=[
            Storage(os='01000000-0000-4000-8000-000030240200', size=10),
            Storage(size=100, tier='hdd'),
        ],
        login_user=login_user
    ),
    'db': Server(
        # use custom resources, instead of a plan
        core_number=12, # CPU cores
        memory_amount=49152, # RAM in MB
        hostname='db.example.com',
        zone='uk-lon1',
        storage_devices=[
            Storage(os='01000000-0000-4000-8000-000030240200', size=10),
            Storage(size=100),
        ],
        login_user=login_user
    ),
    'lb': Server(
        plan='2xCPU-4GB',
        hostname='balancer.example.com',
        zone='uk-lon1',
        storage_devices=[
            Storage(os='01000000-0000-4000-8000-000030240200', size=10)
        ],
        login_user=login_user
    )
}

for server in cluster:
    manager.create_server(cluster[server]) # creates all server objects defined in cluster

Servers can be defined as dicts without using Server or Storage classes. The syntax/attributes are exactly like above and under the hood they are converted to Server and Storage classes. This feature is mainly for easier usage of the module from Ansible, but may provide useful elsewhere.

Stop / Start / Destroy Servers

for server in cluster:
	server.shutdown()
	# OR:
	server.start()
	# OR:
	server.destroy()
	for storage in server.storage_devices:
	  storage.destroy()

As the success of server.start() or server.destroy() and storage.destroy() depend on the Server's state, new helpers have been added. The helpers may be called regardless of the server's current state.

# makes sure that the server is stopped (blocking wait) and then destroys the server and its storages
server.stop_and_destroy()

# makes sure that the server is started (blocking wait)
server.ensure_started()

CloudManager offers mode fine-grained deletion options for servers as you can choose to delete storages and choose what happens to their backups when deleting the server. By default the storage and their backups are always preserved.

Following example would delete all storages attached to a server, but would keep the latest backup of each storage if backups exist.

from upcloud_api.storage import BackupDeletionPolicy

manager.delete_server(uuid, delete_storages=True, backups=BackupDeletionPolicy.KEEP_LATEST)

Upgrade a Server

server = cluster['web1']
server.shutdown()
server.core_number = 4
server.memory_amount = 4096
server.save()
server.start()

Clone a new server from existing storage

Cloning is done by giving existing storage uuid to storage_devices. Note that size of the storage must be defined and must be at least the same size as the storage being cloned.

clone = Server(
    plan='2xCPU-4GB',
    hostname='cloned.server',
    zone='fi-hel1',
    storage_devices=[
        Storage(
            uuid='012bea57-0f70-4154-84d0-b3d25f4a018b',
            size=50  # size must be defined and it has to be at least same size than storage being cloned
        ),
    ]
)

manager.create_server(clone)

Easy access to servers and their information

# returns a public IPv4 (preferred) IPv6 (no public IPv4 was attached) address
server.get_public_ip()

# returns a JSON serializable dict with the server's information (storages and ip-addresses included)
server.to_dict()

Get resources

servers     = manager.get_servers()
server1     = manager.get_server(uuid) # e.g servers[0].uuid
storages    = manager.get_storages()
storage1    = manager.get_storage(uuid) # e.g server1.storage_devices[0].uuid
ip_addrs    = manager.get_ips()
ip_addr     = manager.get_ip(address) # e.g server1.ip_addresses[0].address

Testing

Set up environment and install dependencies:

# run at project root, python3 and virtualenv must be installed
virtualenv venv
source venv/bin/activate

Install the package in editable mode.

# run at project root
pip install -e .

Tests are located under test/. Run with:

py.test test/

To test against all supported python versions, run:

tox

The project also supplies a small test suite to test against the live API in test/test_integration. This suite is NOT run with py.test dy default as it will permanently remove all resources related to an account. It should only be run with a throwaway dev-only account when preparing for a new release. It is not shipped with PyPI releases. To run the integration tests, append --integration-tests flag to the py.test command.

Bugs, Issues, Problems, Ideas

Please report issues and features requests through the issues page.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

upcloud_api-2.9.0.tar.gz (61.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

upcloud_api-2.9.0-py3-none-any.whl (37.0 kB view details)

Uploaded Python 3

File details

Details for the file upcloud_api-2.9.0.tar.gz.

File metadata

  • Download URL: upcloud_api-2.9.0.tar.gz
  • Upload date:
  • Size: 61.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for upcloud_api-2.9.0.tar.gz
Algorithm Hash digest
SHA256 de6361da5cfda552eea97da940e3ef824b3f63a76db2036d54cdc1a5567be3b8
MD5 7f2b8cca1ccabb11ddc076312d9aa842
BLAKE2b-256 d2c6ecae7186212847ed75d04508bce502d7880415140caa11555ca906165200

See more details on using hashes here.

Provenance

The following attestation bundles were made for upcloud_api-2.9.0.tar.gz:

Publisher: main.yml on UpCloudLtd/upcloud-python-api

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file upcloud_api-2.9.0-py3-none-any.whl.

File metadata

  • Download URL: upcloud_api-2.9.0-py3-none-any.whl
  • Upload date:
  • Size: 37.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for upcloud_api-2.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a7524a921a1d2ff97f2b64a8682eec534511f8eb4687470cd3a175a08877a1cc
MD5 c034eb07d3f8115bc9b6aca39e96da65
BLAKE2b-256 4ec9278c1355ecfd5481074db816967fd4839e0adf3de7b7bdb2bef46cbdf1f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for upcloud_api-2.9.0-py3-none-any.whl:

Publisher: main.yml on UpCloudLtd/upcloud-python-api

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page