Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
92dc6df
feat(drivers): add boolFromConfig and strSliceFromConfig helpers
intel352 May 3, 2026
5f980c4
feat(droplet): support user_data / vpc_uuid / ssh_keys / volumes / ta…
intel352 May 3, 2026
1b8e4a2
feat(drivers): add infra.volume driver (DO Block Storage)
intel352 May 3, 2026
605e2c8
feat(provider): register infra.volume driver and capability
intel352 May 3, 2026
8e21552
docs: declare infra.volume in plugin.json and CHANGELOG
intel352 May 3, 2026
be15f78
fix(droplet): strict validation for volumes config entries (Copilot f…
intel352 May 3, 2026
287a91d
fix(volume): reject fractional size_gb instead of silent truncation (…
intel352 May 3, 2026
004acb4
fix(droplet): accept []int and []int64 ssh_keys at top level (Copilot…
intel352 May 3, 2026
e8d5aa5
fix(sizing): cover infra.volume in resolveSizing test cases (Copilot …
intel352 May 3, 2026
264d6bb
fix(volume): treat description/tags changes as ForceNew (Copilot find…
intel352 May 3, 2026
185d387
fix(droplet): Diff flags vpc/tags/volumes/backups drift as ForceNew (…
intel352 May 3, 2026
0bb9402
Merge remote-tracking branch 'origin/main' into feat/droplet-volume-e…
intel352 May 3, 2026
60e426d
fix(plugin): include 'Block Storage volumes' in Manifest.Description
intel352 May 3, 2026
d4e1c72
fix(ci): wfctl-strict-contracts must copy plugin.contracts.json along…
intel352 May 3, 2026
7a0d4eb
fix(droplet): resolve VolumeIDs to names in Outputs (Copilot round-2 …
intel352 May 3, 2026
b340546
fix(util): intStrictFromConfig surfaces type mismatches explicitly (C…
intel352 May 3, 2026
2dacc7a
fix(droplet): tags clear (non-empty -> empty) surfaces as drift (Copi…
intel352 May 3, 2026
5cff2e2
fix(volume): filesystem_type transitions raw<->ext4 surface as drift …
intel352 May 3, 2026
c77c214
fix(volume): description add/clear from empty surfaces as drift (Copi…
intel352 May 3, 2026
c465dfb
fix(volume): tags clear surfaces as drift (Copilot round-2 finding #6)
intel352 May 3, 2026
a6d9283
fix(droplet): vpc_uuid add-from-empty surfaces as drift (Copilot roun…
intel352 May 3, 2026
0fa89de
docs(droplet): explicit limitation block for user_data/ssh_keys/monit…
intel352 May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,14 @@ jobs:
# Also validate after simulating the GoReleaser before-hook rewrites
# (mirrors .goreleaser.yaml before.hooks) so a bad template change
# is caught before release.
tmp=$(mktemp)
cp plugin.json "$tmp"
sed -i.bak 's/"version": ".*"/"version": "0.0.0-ci-rewrite-test"/' "$tmp" && rm -f "$tmp.bak"
sed -i.bak 's|/releases/download/v[^/]*/|/releases/download/v0.0.0-ci-rewrite-test/|g' "$tmp" && rm -f "$tmp.bak"
go run "github.com/GoCodeAlone/workflow/cmd/wfctl@${WFCTL_VERSION}" plugin validate --file "$tmp" --strict-contracts
rm "$tmp"
# NOTE: wfctl plugin validate --strict-contracts looks for
# plugin.contracts.json co-located with plugin.json (same dir).
# Use a temp DIR (not just a temp file) and copy BOTH so the
# rewrite-validation finds the contract descriptor.
tmp_dir=$(mktemp -d)
cp plugin.json "$tmp_dir/"
cp plugin.contracts.json "$tmp_dir/"
sed -i.bak 's/"version": ".*"/"version": "0.0.0-ci-rewrite-test"/' "$tmp_dir/plugin.json" && rm -f "$tmp_dir/plugin.json.bak"
sed -i.bak 's|/releases/download/v[^/]*/|/releases/download/v0.0.0-ci-rewrite-test/|g' "$tmp_dir/plugin.json" && rm -f "$tmp_dir/plugin.json.bak"
go run "github.com/GoCodeAlone/workflow/cmd/wfctl@${WFCTL_VERSION}" plugin validate --file "$tmp_dir/plugin.json" --strict-contracts
rm -rf "$tmp_dir"
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,41 @@ All notable changes to workflow-plugin-digitalocean are documented here.

### Added

- **`infra.volume` driver** — DigitalOcean Block Storage. Create / Read /
Update (in-place resize via `StorageActions.Resize` for size growth) /
Delete / Diff (size shrinks, region changes, and filesystem_type changes
force replace) / HealthCheck (Read succeeds → healthy; godo `Volume`
exposes no Status field, so a successful API round-trip is the strongest
available signal).

Config keys: `name` (from `spec.Name`), `region` (defaults to provider
region), `size_gb` (required, > 0), `filesystem_type` (`ext4` / `xfs`;
default empty = raw block device), `description`, `tags`.

Outputs: `id` (UUID), `name`, `region`, `size_gb`, `filesystem_type`.
ProviderIDFormat = `IDFormatUUID`.

- **Droplet driver — extended config** for self-hosted services that need
more than the bare-minimum size/image/region. New optional keys, all
additive and defaulted-empty (no behaviour change for existing configs):

- `user_data` (string) — cloud-init payload
- `vpc_uuid` (string) — VPC the Droplet joins
- `ssh_keys` ([]string | []int | mixed) — fingerprint strings OR numeric
SSH-key IDs; element type is detected at runtime (structpb-safe; floats
must be whole numbers)
- `tags` ([]string)
- `enable_backups` (bool) — maps to `Backups`
- `monitoring` (bool)
- `ipv6` (bool)
- `volumes` ([]string of Block Storage volume **names**) — names are
resolved to IDs at create time via `Storage.ListVolumes(name=,region=)`;
a name that doesn't resolve in the Droplet's region returns
`droplet volumes: volume %q not found`

Droplet outputs gain `private_ip` (`droplet.PrivateIPv4()`) so downstream
services in the same VPC can be wired directly.

- **Troubleshoot fetches DO deploy/build logs** (PR-E2) — `AppPlatformDriver.Troubleshoot`
now calls `godo.AppsService.GetLogs` for each component in any deployment
whose phase is `Error`, `Canceled`, or `Superseded`. The DO API returns
Expand Down
Loading
Loading