Thanks. Some progress: the machine create command worked:$ uv run machine --config-file ~/.config/machine/config-gcp.yml create --name test1 --type basic New droplet created with id: us-central1-a/test1 DNS: test1.machine-testing-gcp.servesthe.world
Nice — that's the full happy path working: VM created, ID returned in the <zone>/<name> format, and the DNS A record went into Cloud DNS. So GCE + Cloud DNS + project-metadata SSH keys are all wired up correctly.
A few things worth verifying while it's fresh:
SSH in: ssh <new-user-name>@test1.machine-testing-gcp.servesthe.world (using whatever username you set in the machine type's new-user-name, not david). If DNS hasn't propagated yet, try the IP directly from machine list.
Round-trip check: machine list should show test1 with the right tags (machine:created, machine:type:basic, machine:session:<id>). That confirms the metadata-as-tags encoding round-trips correctly through GCP.
Cleanup: machine destroy us-central1-a/test1 — important to verify destroy works end-to-end before relying on it. Also confirms the DNS record gets removed.
Anything that fails on those, paste it and I'll dig in.
machine list works: $ uv run machine --config-file ~/.config/machine/config-gcp.yml list test1 (us-central1-a/test1, us-central1-a, basic): 34.71.92.77
That one line confirms a lot:
basic was extracted from the machine:type:basic tag, which means our newline-encoded metadata is decoding correctly34.71.92.77 came out of the nested network_interfaces[].access_configs[].nat_i_p structureThe remaining unverified path is machine destroy — that's the one most likely to surface a wait-for-operation or DNS-deletion issue, since destroy returns a long-running operation and we block on op.result(). Worth running:
machine destroy us-central1-a/test1
Then confirm with machine list (should be empty) and machine list-domain (the test1 A record should be gone). If destroy hangs or errors, that's likely a propagation timing thing or the operation timeout being too short — easy to fix.
Excellent — that's the full end-to-end verified: SSH key from project metadata propagated to the VM, cloud-init created the user account, DNS resolved, and the firewall let you in. Means the user-data path through GCE metadata is wired up correctly too.
destroy is the only path still untested — once you've confirmed that cleans up both the VM and the DNS record, the GCP provider is ready to ship.
That's the whole loop verified — create, list, ssh, destroy, with DNS records cleaned up on the way out. GCP support is functionally done.
Want me to commit the changes (provider, registration, README, dependencies) so you have a clean state for opening the PR?