Skip to main content

TorizonCloud Python API

About

TorizonCloud Python API is a wrapper around the official Torizon Cloud API.

The purpose of this API is to make it easier to the user by:

  • Creating a login function, so the user don't need to pass the credentials at each API call
  • Format the HTTP header, this can be quite challenging
  • Access all devices, packages, fleets and lockboxes with the same syntax.
    • The official API creates a new endpoint for each newly created device, package, ....

How to use

Check the examples/main.py script, it should be self-explanatory.

But you simply need to:

  1. Install the package
    1. pip install torizon-cloud
  2. Login using your Torizon Cloud Credentials.
    1. It expects 2 enviroment variables, TORIZON_CLOUD_CLIENT and TORIZON_CLOUD_SECRET.
  3. Check the helper function for the API endpoints.

Simple Examples

Check the examples folder for some common use cases.

Login into the platform

import os
from torizon_cloud import TorizonCloud

client_id = os.getenv("TORIZON_CLOUD_CLIENT")
client_secret = os.getenv("TORIZON_CLOUD_SECRET")

cloud = TorizonCloud()
cloud.login(client_id, client_secret)

Get a list of the provisioned devices

cloud.api.getDevices()

Get a list of uploaded Packages

cloud.api.getPackages()

Get a list of created fleets

cloud.api.getFleets()

Get a list of created Lockboxes

cloud.api.getLockboxes()

Get a list of created Lockboxes with details

cloud.api.getLockbox_details()

Get a list of metric names

cloud.api.getDevice_dataMetric_names()

Get Network info about devices

This is going to return info about ['deviceUuid', 'localIpV4', 'hostname', 'macAddress']

cloud.api.getDevicesNetwork()

Get information about the Packages instaled on a device

cloud.api.getDevicesPackagesDeviceuuid(
    deviceUuid = '558c5227-62fe-4a83-beea-7153d7ae641d' # you can get this from getDevices
)

Post create a new device

cloud.api.postDevices(
    deviceName = "Delicious-Hamburger", # user-defined name
    deviceId   = "1234", # user-defined string
    hibernated = True)

This is going to return the device_credentials.zip for the device to connect to your cloud.

  1. dump the zip content to /var/sota/import in the device
  2. run in the device sudo systemctl restart aktualizr

Post upload a new package

compose_file_lock = "examples/camera.lock.yaml"
version = "999"

with open(compose_file_lock, "r") as f:
    data = f.read()

cloud.api.postPackages(    
    name           = os.path.basename(compose_file_lock),
    version        = version,
    hardwareId     = "docker-compose",
    targetFormat   = "BINARY",
    ContentLength  = os.path.getsize(compose_file_lock),
    data = data)

Post create a new fleet

new_fleet_uuid = cloud.api.postFleets(
    name = "test",
    fleetType = "static"
) # returns a string with the fleet uuid

Post add devices to the fleet

# query a device by name
devices_by_name = cloud.api.getDevices(
    nameContains = "Delicious-Hamburger"
)["values"] # returns a list of devices with nameContains

devices_uuid = [x["deviceUuid"] for x in devices_by_name["values"]]

# add the devices to the fleet
devices_uuid_reponse = cloud.api.postFleetsFleetidDevices(
    fleetId = new_fleet_uuid,
    devices = devices_uuid
)

Post an update to a list of devices or list of fleets

cloud.api.postUpdates(
    packageIds = [f"{os.path.basename(compose_file_lock)}-{version}"],
    # devices    = ["4af561db-b4a0-4346-949b-c20d5added07"], # the device must have been seen online at least 1 time
    # fleets     = ["8b96056e-0607-4e48-a098-e8c182647171"], # the device must have been seen online at least 1 time
)

Delete devices in a list

Please be careful, this operation is irreversible.

# get the first 50 devices
devices = cloud.api.getDevices(limit = 50)["values"]

# filter those devices with a simple logic
deviceUuids = [device["deviceUuid"] for device in devices if (device["deviceName"] != "something" or not device["deviceId"].startswith("verdin"))]

# delete all the devices in the filtered list
for deviceUuid in deviceUuids:
    cloud.api.deleteDevicesDeviceuuid(deviceUuid = deviceUuid)

Delete Fleets

Please be careful, this operation is irreversible.

# get the first 50 fleets
fleets = cloud.api.getFleets(limit = 50)["values"]

# filter those fleets with a simple logic
fleetIds = [fleet["id"] for fleet in fleets if (fleet["name"] != "something")]

# delete all the fleets in the list
for fleetId in fleetIds:
    cloud.api.deleteFleetsFleetid(fleetId = fleetId)

Delete Packages

Please be careful, this operation is irreversible.

# get the first 50 packages using some filters
packages = cloud.api.getPackages(
    limit = 50,
    packageSource = "targets.json",
    nameContains = "matheuscastelo"
    )["values"]

packageIds = [package["packageId"] for package in packages]

for packageId in packageIds:
    cloud.api.deletePackagesPackageid(packageId = packageId)

Delete devices in a list

Please be careful, this operation is irreversible.

# get the first 50 devices
devices = cloud.api.getDevices(limit = 50)["values"]

# filter those devices with a simple logic
deviceUuids = [device["deviceUuid"] for device in devices if (device["deviceName"] != "something" or not device["deviceId"].startswith("verdin"))]

# delete all the devices in the filtered list
for deviceUuid in deviceUuids:
    cloud.api.deleteDevicesDeviceuuid(deviceUuid = deviceUuid)

Delete Fleets

Please be careful, this operation is irreversible.

# get the first 50 fleets
fleets = cloud.api.getFleets(limit = 50)["values"]

# filter those fleets with a simple logic
fleetIds = [fleet["id"] for fleet in fleets if (fleet["name"] != "something")]

# delete all the fleets in the list
for fleetId in fleetIds:
    cloud.api.deleteFleetsFleetid(fleetId = fleetId)

Delete Packages

Please be careful, this operation is irreversible.

# get the first 50 packages using some filters
packages = cloud.api.getPackages(
    limit = 50,
    packageSource = "targets.json",
    nameContains = "matheuscastelo"
    )["values"]

packageIds = [package["packageId"] for package in packages]

for packageId in packageIds:
    cloud.api.deletePackagesPackageid(packageId = packageId)

Delete Lockboxes

Please be careful, this operation is irreversible.

# get lockboxes names and filter it
lockboxes = cloud.api.getLockboxes()

lockboxesNames = [name for name in lockboxes if "matheuscastelo" in name]

for lockboxesNams in lockboxesNames:
    cloud.api.deleteLockboxesLockbox_name(lockbox_name = lockboxesNams)

Metadata

Release files for torizon-cloud 0.0.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 torizon-cloud 0.0.5
File Size Uploaded
torizon_cloud-0.0.5.tar.gz 22.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for torizon-cloud 0.0.5
File Interpreter ABI Platform
torizon_cloud-0.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 42.6 kB

Release files / torizon_cloud-0.0.5.tar.gz

Download URL torizon_cloud-0.0.5.tar.gz
Size 22.1 kB
Tags Source
SHA-256 checksum
How to use checksums
d306d5b99d0c9ee0e50962845529bef9203908bd86b356e63abce6d77b4c8497
BLAKE2b-256 checksum
How to use checksums
09f98ebbd37401285c2a524c9e48359900a7036f9aefa19ce6670f661815cb08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.12

Release files / torizon_cloud-0.0.5-py3-none-any.whl

Download URL torizon_cloud-0.0.5-py3-none-any.whl
Size 20.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d3deb041891270a73c0a01dc69ec91d6e882b7269211229a77798f3086fd3433
BLAKE2b-256 checksum
How to use checksums
dfcdd159e23d72456395a5157d5596994289fd4624d4e2c0a92be45b91db3e4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.12

Release history Release notifications | RSS feed

This release

0.0.5 This release

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

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