1
0
mirror of https://gitlab.alpinelinux.org/alpine/cloud/tiny-cloud.git synced 2025-12-14 19:02:45 +03:00

initial digitalocean support

This commit is contained in:
Jake Buchholz Göktürk 2025-05-29 03:46:51 +00:00
parent bbe5e2e38c
commit daa31db54e
11 changed files with 75 additions and 46 deletions

View File

@ -1,5 +1,12 @@
# CHANGELOG
## 2025-XX-XX - Tiny Cloud v3.2.0
* Initial support for `digitalocean` cloud provider
* Alpine autoinstall - allow override disk and reboot and set swap (@ncopa)
## 2024-12-03 - Tiny Cloud v3.1.0
* Default to "/usr merge" friendly installation locations

View File

@ -10,6 +10,7 @@ https://gitlab.alpinelinux.org/alpine/cloud/tiny-ec2-bootstrap), Tiny Cloud
works with multiple cloud providers. Currently, the following are supported:
* [AWS](https://aws.amazon.com) - Amazon Web Services
* [Azure](https://azure.microsoft.com) - Microsoft Azure
* [DigitalOcean](https://digitalocean.com) - DigitalOcean
* [GCP](https://cloud.google.com) - Google Cloud Platform
* [Hetzner](https://www.hetzner.com) - Hetzner Cloud
* [Incus](https://linuxcontainers.org/incus) - Incus Containers and Virtual Machines
@ -96,8 +97,8 @@ Tiny Cloud tries to autodetect (supported) clouds as of 3.1.0. The default
value for `CLOUD` is `auto`.
However, if you want to explicitly set a cloud provider, you can do so in the
conf file. Current valid values are `aws`, `azure`, `gcp`, `hetzner`, `incus`,
`nocloud`, `oci`, and `scaleway`.
conf file. Current valid values are `aws`, `azure`, `digitalocean`, `gcp`,
`hetzner`, `incus`, `nocloud`, `oci`, and `scaleway`.
Alternatively, you can add `tinycloud=cloud=<cloud>` (preferred) or `ds=<cloud>`
(cloud-init compatible) to the kernel `/proc/cmdline` (preferred) or

View File

@ -13,7 +13,7 @@
## FUTURE
* Support `vendor-data`? In theory this is a baseline, and and `user-data`
* Support `vendor-data`? In theory this is a baseline, and `user-data`
is layered on top of that.
* Support additional features of `#cloud-config` as needed
@ -21,7 +21,6 @@
* Support LVM partitioning and non-`ext[234]` filesystems?
* Support other cloud providers...
* Digital Ocean
* IBM
* Openstack
* ???

View File

@ -0,0 +1,5 @@
#!/bin/sh
# vim:set filetype=sh:
# shellcheck shell=sh
grep -qi digitalocean "$ROOT"/sys/class/dmi/id/modalias 2>/dev/null && echo "10 digitalocean"

View File

@ -0,0 +1,23 @@
# DigitalOcean Instance MetaData Service variables and functions
# vim: set filetype=sh:
# shellcheck shell=sh
IMDS_URI="metadata/v1"
IMDS_HOSTNAME="hostname"
IMDS_LOCAL_HOSTNAME="$IMDS_HOSTNAME"
IMDS_SSH_KEYS="public-keys"
# TODO: flesh out networking
unset \
IMDS_NICS \
IMDS_MAC \
IMDS_IPV4 \
IMDS_IPV6 \
IMDS_IPV4_NET \
IMDS_IPV6_NET \
IMDS_IPV4_PREFIX \
IMDS_IPV6_PREFIX
_imds_header() { echo; }
_imds_ssh_keys() { _imds "$IMDS_SSH_KEYS"; }

View File

@ -1,18 +0,0 @@
# AWS Instance MetaData Service variables and functions
# vim:set filetype=sh:
# shellcheck shell=sh
IMDS_HEADER="X-aws-ec2-metadata-token"
IMDS_TOKEN_TTL_HEADER="X-aws-ec2-metadata-token-ttl-seconds"
: "${IMDS_TOKEN_TTL:=5}"
IMDS_URI="latest"
_imds_token() {
printf "PUT /latest/api/token HTTP/1.0\r\n%s: %s\r\n\r\n" \
"$IMDS_TOKEN_TTL_HEADER" "$IMDS_TOKEN_TTL" \
| nc -w 1 "$IMDS_ENDPOINT" 80 | tail -n 1
}
_imds_header() {
echo "$IMDS_HEADER: $(_imds_token)"
}

View File

@ -1,18 +0,0 @@
# AWS Instance MetaData Service variables and functions
# vim:set filetype=sh:
# shellcheck shell=sh
IMDS_HEADER="X-aws-ec2-metadata-token"
IMDS_TOKEN_TTL_HEADER="X-aws-ec2-metadata-token-ttl-seconds"
: "${IMDS_TOKEN_TTL:=5}"
IMDS_URI="latest"
_imds_token() {
printf "PUT /latest/api/token HTTP/1.0\r\n%s: %s\r\n\r\n" \
"$IMDS_TOKEN_TTL_HEADER" "$IMDS_TOKEN_TTL" \
| nc -w 1 "$IMDS_ENDPOINT" 80 | tail -n 1
}
_imds_header() {
echo "$IMDS_HEADER: $(_imds_token)"
}

View File

@ -5,7 +5,7 @@
. $(atf_get_srcdir)/test_env.sh
export PREFIX="$srcdir"
PROVIDERS="aws azure gcp hetzner incus oci nocloud scaleway"
PROVIDERS="aws azure digitalocean gcp hetzner incus oci nocloud scaleway"
init_tests \
imds_help \
@ -13,6 +13,7 @@ init_tests \
\
imds_hostname_aws \
imds_hostname_azure \
imds_hostname_digitalocean \
imds_hostname_gcp \
imds_hostname_hetzner \
imds_hostname_incus \
@ -22,6 +23,7 @@ init_tests \
\
imds_local_hostname_aws \
imds_local_hostname_azure \
imds_local_hostname_digitalocean \
imds_local_hostname_gcp \
imds_local_hostname_hetzner \
imds_local_hostname_incus \
@ -31,6 +33,7 @@ init_tests \
\
imds_ssh_keys_aws \
imds_ssh_keys_azure \
imds_ssh_keys_digitalocean \
imds_ssh_keys_gcp \
imds_ssh_keys_hetzner \
imds_ssh_keys_incus \
@ -58,7 +61,7 @@ imds_space_body() {
check_hostname() {
fake_metadata "$1" <<-EOF
# nocloud, alpine, aws, hetzner
# aws, digitalocean, hetzner, nocloud
hostname: myhostname
# azure
compute:
@ -71,6 +74,7 @@ check_hostname() {
}
imds_hostname_aws_body() { check_hostname aws; }
imds_hostname_azure_body() { check_hostname azure; }
imds_hostname_digitalocean_body() { check_hostname digitalocean; }
imds_hostname_gcp_body() { check_hostname gcp; }
imds_hostname_hetzner_body() { check_hostname hetzner; }
imds_hostname_incus_body() {
@ -91,9 +95,9 @@ EOF
check_local_hostname() {
fake_metadata "$1" <<-EOF
# nocloud, alpine, aws, incus
# nocloud, aws, incus
local-hostname: myhostname
# hetzner
# digitalocean, hetzner
hostname: myhostname
# azure
compute:
@ -106,6 +110,7 @@ check_local_hostname() {
}
imds_local_hostname_aws_body() { check_local_hostname aws; }
imds_local_hostname_azure_body() { check_local_hostname azure; }
imds_local_hostname_digitalocean_body() { check_local_hostname digitalocean; }
imds_local_hostname_gcp_body() { check_local_hostname gcp; }
imds_local_hostname_hetzner_body() { check_local_hostname hetzner; }
imds_local_hostname_incus_body() { check_local_hostname incus; }
@ -144,6 +149,14 @@ check_ssh_keys() {
}
imds_ssh_keys_aws_body() { check_ssh_keys aws; }
imds_ssh_keys_azure_body() { check_ssh_keys azure; }
imds_ssh_keys_digitalocean_body() {
local key="ssh-ed25519 keydata"
fake_metadata "digitalocean" <<-EOF
# digitalocean
public-keys: $key
EOF
CLOUD="digitalocean" atf_check -o match:"$key" imds @ssh-keys
}
imds_ssh_keys_gcp_body() { check_ssh_keys gcp; }
imds_ssh_keys_hetzner_body() {
local key="ssh-ed25519 keydata"

View File

@ -27,6 +27,7 @@ init_tests \
autodetect_aws_nitro \
autodetect_aws_xen \
autodetect_azure \
autodetect_digitalocean \
autodetect_gcp \
autodetect_hetzner \
autodetect_incus \
@ -37,7 +38,7 @@ init_tests \
autodetect_scaleway \
autodetect_unknown
PROVIDERS="aws azure gcp nocloud oci scaleway hetzner"
PROVIDERS="aws azure digitalocean gcp hetzner nocloud oci scaleway"
expand_root_body() {
mkdir proc
@ -276,6 +277,16 @@ autodetect_azure_body() {
sh -c ". \"$lib\"; echo \$CLOUD"
}
autodetect_digitalocean_body() {
mkdir -p sys/class/dmi/id
cat > sys/class/dmi/id/modalias <<-EOT
dmi:bvnDigitalOcean:bvrReleasev4.1:bd03/08/2024:br4.1:svn:pnVirtualMachine:pvrReleasev4.1:rvn:rnVirtualMachine:rvrReleasev4.1:cvn:ct3:cvrReleasev4.1:skuNone:
EOT
atf_check \
-o match:"digitalocean" \
sh -c ". \"$lib\"; echo \$CLOUD"
}
autodetect_gcp_body() {
mkdir -p sys/class/dmi/id
cat > sys/class/dmi/id/modalias <<-EOT

View File

@ -74,6 +74,11 @@ fake_metadata_azure() {
export WGET_STRIP_PREFIX="/metadata/instance"
}
fake_metadata_digitalocean() {
cat > "169.254.169.254.yaml"
export WGET_STRIP_PREFIX="/metadata/v1"
}
fake_metadata_gcp() {
cat > "169.254.169.254.yaml"
export WGET_STRIP_PREFIX="/computeMetadata/v1"
@ -111,6 +116,7 @@ fake_metadata() {
alpine|nocloud) fake_metadata_nocloud;;
aws) fake_metadata_aws;;
azure) fake_metadata_azure;;
digitalocean) fake_metadata_digitalocean;;
gcp) fake_metadata_gcp;;
hetzner) fake_metadata_hetzner;;
incus) fake_metadata_incus;;

View File

@ -6,7 +6,7 @@
export PREFIX="$srcdir"
export MOCK=echo
PROVIDERS="alpine aws azure gcp incus hetzner nocloud oci scaleway"
PROVIDERS="alpine aws azure digitalocean gcp incus hetzner nocloud oci scaleway"
init_tests \
tiny_cloud_help \