Skip to content

v1.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 10 Oct 13:19
· 6 commits to refs/heads/main since this release
Immutable release. Only release title and notes can be modified.
7a76a76

The client now covers the whole Tailscale API. Every endpoint is checked against the official OpenAPI spec, and tested against a real tailnet.

Upgrading from 0.x

  • Devices: only device_id, node_id, hostname, and name are always set. Other fields are None when the API leaves them out, which it does a lot for devices shared in from another tailnet. Lists are empty then, and is_external is False.
  • Tailnet settings: a setting the API does not return is None, not False or a made up default.
  • Users: tailnet_lock_key is gone, as the API has no such field on users. profile_pic_url is filled now; it was always empty.
  • Errors: an error response raises a TailscaleResponseError, with the HTTP status and the reason the API gave. A 401 raises TailscaleUnauthorizedError and a 403 TailscalePermissionError; both are still a TailscaleAuthenticationError. A 403 no longer throws away the OAuth token.
  • IDs are escaped in request paths. An empty ID, ., or .. raises a ValueError.
  • CLI: the command is tailscale-api instead of tailscale, so it no longer clashes with the official Tailscale client.
  • Minimums: aiohttp 3.8.3, yarl 1.8.2, mashumaro 3.17, and Typer 0.15.4 for the CLI.

Worth knowing

  • Listing devices works again for tailnets with devices shared in from another tailnet (#1466).
  • An OAuth client recovers from a failed token request, and a stored token the API refused is replaced instead of reused.
  • Secrets stay out of reprs and CLI tracebacks.
  • tailscale-api dump <endpoint> prints the raw API response, for debugging and test fixtures.

What’s changed

🚨 Breaking changes

  • Only require the identifiers of a device, and add its distro and posture identity @frenck (#1468)
  • Fix the profile picture of users, and add the tailnet ID and list filters @frenck (#1469)
  • Add the missing tailnet settings, and leave settings the API does not return unset @frenck (#1470)
  • Rename the CLI command to tailscale-api @frenck (#1488)

✨ New features

🐛 Bug fixes

  • Fix the Prettier hook, which never ran, and the YAML indentation @frenck (#1461)
  • Fall back to the default fields when the device list fails with a 404 @frenck (#1466)
  • Fix the profile picture of users, and add the tailnet ID and list filters @frenck (#1469)
  • Recover from failed OAuth token requests, and stop reusing refused tokens @frenck (#1496)
  • Escape IDs in request paths, and keep secrets out of reprs and tracebacks @frenck (#1497)
  • Handle empty policy validation, domains without nameservers, and empty audit log values @frenck (#1499)

🚀 Enhancements

  • Only require the identifiers of a device, and add its distro and posture identity @frenck (#1468)
  • Add the missing tailnet settings, and leave settings the API does not return unset @frenck (#1470)
  • Add OAuth clients and federated identities to the keys @frenck (#1471)
  • Add the posture status and OAuth client of devices, and treat empty values as unset @frenck (#1473)
  • Give API errors their status and the reason the API gave @frenck (#1478)
  • Rename the CLI command to tailscale-api @frenck (#1488)
  • Add dump commands for the whole API, and say when the API refuses a request @frenck (#1492)
  • Test against anonymized responses of a real tailnet @frenck (#1493)
  • Test request payloads, real values, the timeout, and the CLI through its entry point @frenck (#1501)

🧰 Maintenance

  • Remove the unused workflow requirements file @frenck (#1462)
  • Remove the lock workflow @frenck (#1465)
  • Add actionlint to catch workflow mistakes zizmor and yamllint miss @frenck (#1489)
  • Check the CLI group against Typer, not click @frenck (#1495)

📚 Documentation

  • Document what the API refuses in a settings update @frenck (#1490)
  • Document the whole API in the README @frenck (#1491)
  • Correct the documentation of errors, device defaults, token storage, and sessions @frenck (#1500)

⬆️ Dependency updates

41 changes