All Projects → UpCloudLtd → upcloud-python-api

UpCloudLtd / upcloud-python-api

Licence: MIT license
Python client for UpCloud's API

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to upcloud-python-api

Groupy
A simple yet powerful API wrapper for the GroupMe messaging service.
Stars: ✭ 57 (+11.76%)
Mutual labels:  pypi, api-client
upcloud-go-api
Go client for UpCloud's API
Stars: ✭ 42 (-17.65%)
Mutual labels:  upcloud, upcloud-api
upcloud-php-api
PHP client for UpCloud's API
Stars: ✭ 23 (-54.9%)
Mutual labels:  api-client, upcloud
AutoMeter-API
AutoMeter-API是一款针对分布式服务,微服务API功能和性能一体的自动化测试平台,一站式解决应用,服务,API,环境管理,用例,条件,测试场景,计划,测试报告,功能/性能测试兼容支持的一体化工作平台
Stars: ✭ 105 (+105.88%)
Mutual labels:  api-client
poetry-setup
Generate setup.py (setuptools) from pyproject.toml (poetry)
Stars: ✭ 44 (-13.73%)
Mutual labels:  pypi
airtabler
R interface to the Airtable API
Stars: ✭ 84 (+64.71%)
Mutual labels:  api-client
deepl-api-connector
Connector library for deepl.com rest translation api
Stars: ✭ 12 (-76.47%)
Mutual labels:  api-client
lpconnector
Python client for syncing LastPass Enterprise with a remote directory over LDAP
Stars: ✭ 14 (-72.55%)
Mutual labels:  api-client
export-dynamodb
Export Amazon DynamoDb to CSV or JSON
Stars: ✭ 52 (+1.96%)
Mutual labels:  pypi
niet
Parse/Read yaml or json files directly in your shell (sh, bash, ksh, ...)
Stars: ✭ 27 (-47.06%)
Mutual labels:  pypi
PypiScan
这个脚本主要提供对pypi供应链的源头进行安全扫描研究,扫描并发现未知的恶意包情况。
Stars: ✭ 25 (-50.98%)
Mutual labels:  pypi
servicenow
A golang client for ServiceNow
Stars: ✭ 16 (-68.63%)
Mutual labels:  api-client
notion-sdk-py
Official Notion SDK rewritten in Python (sync + async)
Stars: ✭ 753 (+1376.47%)
Mutual labels:  api-client
fb-messenger-bot-api
NodeJS Facebook Messenger API for bots to send messages and setup events to Facebook.
Stars: ✭ 29 (-43.14%)
Mutual labels:  api-client
psd2
API client for banks supporting PSD2 APIs with OAuth2 authentication.
Stars: ✭ 26 (-49.02%)
Mutual labels:  api-client
adyen-python-api-library
Adyen API Library for Python
Stars: ✭ 41 (-19.61%)
Mutual labels:  api-client
pandoc-latex-environment
Pandoc filter for adding LaTeX environement on specific div
Stars: ✭ 27 (-47.06%)
Mutual labels:  pypi
chess.com
Python wrapper for Chess.com Published-Data API
Stars: ✭ 34 (-33.33%)
Mutual labels:  api-client
TopicNet
Interface for easier topic modelling.
Stars: ✭ 127 (+149.02%)
Mutual labels:  pypi
jusibe
📲 JavaScript client for Jusibe.com SMS API service. http://jusibe.com
Stars: ✭ 24 (-52.94%)
Mutual labels:  api-client

UpCloud's Python API Client

test Code Health PyPI version License

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 in API v2.0.0

  • Python 3.6
  • Python 3.7
  • Python 3.8
  • Python 3.9
  • PyPy3

Python 2 has been deprecated

  • Python 2.7 is supported in older API versions (< v2.0.0), still available in PyPI.

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.

Defining and creating servers

import upcloud_api
from upcloud_api import Server, Storage, login_user_block

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


login_user = login_user_block(
    username='theuser',
    ssh_keys=['ssh-rsa AAAAB3NzaC1yc2EAA[...]ptshi44x [email protected]'],
    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-000030200200', 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',
        memory_amount=1024,
        hostname='web2.example.com',
        zone='uk-lon1',
        storage_devices=[
            Storage(os='01000000-0000-4000-8000-000030200200', 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-000030200200', 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-000030200200', 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 at test/live_test.py. This suite is NOT run with py.test 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. See source code on how to run the live test.

Bugs, Issues, Problems, Ideas

Please report issues and features requests through the issues page.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].