Archived
192 lines
6.2 KiB
Markdown
192 lines
6.2 KiB
Markdown
# terraform-provider-dynu
|
|
|
|
A standalone Terraform provider for Dynu DNS.
|
|
|
|
> Status: **read-only milestone**. This provider currently implements provider configuration and data sources only.
|
|
|
|
## Feature scope
|
|
|
|
Implemented:
|
|
- Provider authentication using `api_key` or `DYNU_API_KEY`
|
|
- Optional provider `base_url` override for local test/dev setups
|
|
- Data sources:
|
|
- `dynu_domains`
|
|
- `dynu_domain`
|
|
- `dynu_dns_records`
|
|
|
|
Not implemented yet:
|
|
- Terraform resources (no create/update/delete)
|
|
- Any write API operations
|
|
|
|
## Provider source and module path
|
|
|
|
- Terraform provider source address: `dynu/dynu`
|
|
- Go module path: `github.com/dynu/terraform-provider-dynu`
|
|
|
|
The repository can be hosted elsewhere during development, but module and provider source naming are kept aligned with planned public registry publishing.
|
|
|
|
## Requirements
|
|
|
|
- Terraform `>= 1.5`
|
|
- Go `>= 1.23`
|
|
- Dynu API key for live API usage
|
|
|
|
## Authentication
|
|
|
|
Option 1: Terraform configuration.
|
|
|
|
```hcl
|
|
provider "dynu" {
|
|
api_key = var.dynu_api_key
|
|
}
|
|
|
|
variable "dynu_api_key" {
|
|
type = string
|
|
sensitive = true
|
|
}
|
|
```
|
|
|
|
Option 2: Environment variable.
|
|
|
|
```bash
|
|
export DYNU_API_KEY="your-dynu-api-key"
|
|
```
|
|
|
|
## Data source examples
|
|
|
|
See the `examples/` directory:
|
|
- `examples/provider/provider.tf`
|
|
- `examples/data-sources/dynu_domains/data-source.tf`
|
|
- `examples/data-sources/dynu_domain/data-source.tf`
|
|
- `examples/data-sources/dynu_dns_records/data-source.tf`
|
|
|
|
## Developer workflow
|
|
|
|
- `./scripts/setup-dev.sh` - validate local Go/Terraform toolchains and environment health (no changes)
|
|
- `./scripts/setup-dev.sh --fix` - attempt safe remediation with installed version managers (`mise`, `asdf`, `tfenv`, `tenv`)
|
|
- `./scripts/setup-dev.sh --strict` - require Terraform to be installed
|
|
- `./scripts/check.sh` - formatting, vet, and unit tests (Tier A)
|
|
- `./scripts/test-integration.sh` - local mock-backed provider integration tests (Tier B)
|
|
- `./scripts/testacc.sh` - default: Tier B; live mode available with `--live` (Tier C)
|
|
|
|
### setup-dev behavior
|
|
|
|
`scripts/setup-dev.sh` now performs robust validation and troubleshooting checks:
|
|
|
|
- Always reports resolved paths for `bash`, `git`, `go`, and `terraform` (Terraform is warning-only unless `--strict` is used).
|
|
- Enforces minimum versions:
|
|
- Go `>= 1.23` (error if missing or too old)
|
|
- Terraform `>= 1.5` (warning if missing by default, error if present but too old)
|
|
- Detects common broken Go setups:
|
|
- manual `GOROOT` conflicting with `go env GOROOT`
|
|
- stale stdlib tree mismatches (for example missing `slices`, `maps`, `math/rand/v2`)
|
|
- Detects malformed `GOPROXY` and prints the recommended non-destructive fix:
|
|
- `go env -w GOPROXY=https://proxy.golang.org,direct`
|
|
- Supports optional safe auto-fix mode:
|
|
- only uses already-installed user-space managers
|
|
- does **not** run distro package managers, `sudo`, or shell-profile edits
|
|
- re-validates tools after attempted remediation
|
|
|
|
The script is safe for both normal shells and VS Code integrated terminals, and includes guidance when terminal/session restart may be needed after changing versions.
|
|
|
|
### Standalone repository guarantee
|
|
|
|
This repository is intentionally self-contained:
|
|
- no dependency on sibling repositories
|
|
- no dependency on external helper scripts (for example `services-up.sh`)
|
|
- no hardcoded local paths (for example `/workspace/...` or `/home/...`)
|
|
|
|
### setup-dev troubleshooting quick reference
|
|
|
|
- **Malformed GOPROXY**
|
|
- Symptom: warning that GOPROXY has no valid entries.
|
|
- Fix: `go env -w GOPROXY=https://proxy.golang.org,direct`
|
|
|
|
- **Broken GOROOT**
|
|
- Symptom: `GOROOT` environment value differs from `go env GOROOT`, or stdlib package checks fail.
|
|
- Fix: usually remove manual override with `unset GOROOT`, then ensure the intended `go` binary is first in `PATH`.
|
|
|
|
- **Go version / stdlib path mismatch**
|
|
- Symptom: `go version` looks modern but build errors mention missing stdlib packages (for example `slices`, `maps`, `math/rand/v2`).
|
|
- Cause: stale or mismatched Go installation path.
|
|
- Fix: re-select/install Go via your version manager and re-run `./scripts/setup-dev.sh`.
|
|
|
|
- **VS Code integrated terminal stale environment**
|
|
- Symptom: command paths or versions do not match your expected shell setup.
|
|
- Fix: restart the integrated terminal (or reload the VS Code window) and run `./scripts/setup-dev.sh` again.
|
|
|
|
### Build
|
|
|
|
```bash
|
|
go build ./...
|
|
```
|
|
|
|
## Testing model
|
|
|
|
The provider now has three explicit test tiers:
|
|
|
|
### Tier A: unit tests (fast, no network)
|
|
|
|
Covers focused package behavior (client parsing, mappers, provider helper logic).
|
|
|
|
```bash
|
|
./scripts/check.sh
|
|
go test ./...
|
|
```
|
|
|
|
### Tier B: local integration tests (mock Dynu API, no real credentials)
|
|
|
|
These tests use an `httptest` fake Dynu API server and run the Terraform provider end-to-end against deterministic fixtures.
|
|
|
|
- No Dynu account required
|
|
- Dummy API key is used in test provider configuration
|
|
- Exercises provider wiring, schema/state mapping, hostname resolution flow, and diagnostic behavior
|
|
|
|
```bash
|
|
./scripts/test-integration.sh
|
|
./scripts/testacc.sh
|
|
```
|
|
|
|
### Tier C: live acceptance tests (opt-in)
|
|
|
|
These tests call the real Dynu API and are read-only.
|
|
|
|
Required environment variables:
|
|
- `TF_ACC=1`
|
|
- `DYNU_API_KEY`
|
|
|
|
Optional:
|
|
- `DYNU_DOMAIN` (required for domain-specific acceptance tests such as `dynu_domain` and `dynu_dns_records`)
|
|
|
|
```bash
|
|
TF_ACC=1 DYNU_API_KEY="your-dynu-api-key" DYNU_DOMAIN="www.example.com" ./scripts/testacc.sh --live
|
|
# or
|
|
LIVE=1 TF_ACC=1 DYNU_API_KEY="your-dynu-api-key" ./scripts/testacc.sh
|
|
```
|
|
|
|
If `DYNU_DOMAIN` is omitted, domain-specific live tests skip cleanly.
|
|
|
|
## CI
|
|
|
|
GitHub Actions CI runs on push and pull requests and executes:
|
|
- gofmt verification
|
|
- `go vet ./...`
|
|
- `go test ./...`
|
|
|
|
Live acceptance tests are intentionally excluded from default CI.
|
|
|
|
## Documentation
|
|
|
|
Registry-style markdown docs are stored in `docs/`.
|
|
|
|
## Limitations
|
|
|
|
- Dynu timestamps are currently exposed as strings exactly as returned by Dynu API.
|
|
- Data returned from Dynu is sorted in provider state for Terraform stability.
|
|
- Read-only operations only.
|
|
|
|
## Roadmap
|
|
|
|
Next planned milestone after this testing foundation:
|
|
- first writable resource (`dynu_dns_record`) with strict schema validation, import support, mock-first integration tests, and then live acceptance coverage.
|