digital ocean cluster management through droplets
Project description
digital-ocean-cluster
A well tested library for managing a fleet of droplets.
About
This library concurrent creates and runs digital ocean droplets through the doctl command line interface. This api allows massive concurrency running each action on a seperate thread.
The amount of implemented features for doctl is very few, but just enough to bring up a Droplet cloud, install dependencies, and execute commands on the cluster.
To develop software, run . ./activate
Windows
This environment requires you to use git-bash.
Linting
Run ./lint.sh to find linting errors using pylint, flake8 and mypy.
Pre-requesits
- You will need to have an ssh key registered with digital ocean. This key must also be in your ~/.ssh folder.
- You will need to have the doctl binary installed in your path.
TODO: Make a more minimal example
Example
"""
Unit test file.
"""
import os
import subprocess
import unittest
from pathlib import Path
from digital_ocean_cluster import (
DigitalOceanCluster,
Droplet,
DropletCluster,
DropletCreationArgs,
)
# os.environ["home"] = "/home/niteris"
IS_GITHUB = os.environ.get("GITHUB_ACTIONS", False)
TAGS = ["test", "cluster"]
CLUSTER_SIZE = 4
def install(droplet: Droplet) -> None:
"""Install a package."""
# droplet.run_cmd("apt-get update")
#droplet.run_cmd("apt-get install -y vim")
droplet.copy_text_to("echo 'Install Done!'", Path("/root/test.sh"))
class DigitalOceanClusterTester(unittest.TestCase):
"""Main tester class."""
@unittest.skipIf(IS_GITHUB, "Skipping test for GitHub Actions")
def test_create_droplets(self) -> None:
"""Test command line interface (CLI)."""
# first delete the previous cluster
# create a cluster of 4 machines
# Deleting the cluster
deleted: list[Droplet] = DigitalOceanCluster.delete_cluster(TAGS)
print(f"Deleted: {[d.name for d in deleted]}")
creation_args: list[DropletCreationArgs] = [
DropletCreationArgs(name=f"test-droplet-creation-{i}", tags=TAGS, install=install)
for i in range(CLUSTER_SIZE)
]
print(f"Creating droplets: {creation_args}")
cluster: DropletCluster = DigitalOceanCluster.create_droplets(creation_args)
self.assertEqual(len(cluster.droplets), CLUSTER_SIZE)
self.assertEqual(len(cluster.failed_droplets), 0)
# now run ls on all of them
cmd = "pwd"
result: dict[Droplet, subprocess.CompletedProcess] = cluster.run_cmd(cmd)
for _, cp in result.items():
self.assertIn(
"/root",
cp.stdout,
f"Error: {cp.returncode}\n\nstderr:\n{cp.stderr}\n\nstdout:\n{cp.stdout}",
)
content: str = "the quick brown fox jumps over the lazy dog"
remote_path = Path("/root/test.txt")
# now copy a file to all of them
cluster.copy_text_to(content, remote_path)
# now get the text back
results: dict[Droplet, str | Exception] = cluster.copy_text_from(remote_path)
for droplet, text in results.items():
if isinstance(text, Exception):
print(f"Error: {text}")
self.fail(f"Droplet {droplet.name} failed\nError: {text}")
else:
print(f"Text: {text}")
print("Deleting cluster")
# now delete the cluster
DigitalOceanCluster.delete_cluster(cluster)
print("Deleted cluster")
if __name__ == "__main__":
unittest.main()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file digital_ocean_cluster-1.1.17.tar.gz.
File metadata
- Download URL: digital_ocean_cluster-1.1.17.tar.gz
- Upload date:
- Size: 22.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e67d8144808d3fb801d6ecddd4a2aa1e2e6a3ea733b412299b0a1aa4898afeb
|
|
| MD5 |
01fbd4b404c71616046fa528e204a959
|
|
| BLAKE2b-256 |
2ebc55482edcc382ca95dc5c03404dd5e5a1e58bde89fcb501233fe6a40c87e9
|
File details
Details for the file digital_ocean_cluster-1.1.17-py2.py3-none-any.whl.
File metadata
- Download URL: digital_ocean_cluster-1.1.17-py2.py3-none-any.whl
- Upload date:
- Size: 16.6 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bca7f367a87e78568d77170444341484b337f4a674288f8b77c29faaab51016f
|
|
| MD5 |
fe66fae77509b0a7a94ac0f3af6d546a
|
|
| BLAKE2b-256 |
7a419f93bed31ca113ed47cd29a2692dad21363c0f6f0b331934960bd4b86b41
|