diff --git a/README.md b/README.md index e11186c..8eeafa0 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,23 @@ -# Coderd Terraform Provider +# terraform-provider-coderd -# ⚠️ WORK IN PROGRESS - DO NOT USE ⚠️ +`terraform-provider-coderd` enables managing a [Coder](https://github.com/coder/coder) deployment using [Terraform](https://github.com/hashicorp/terraform) IaC. -_This template repository is built on the [Terraform Plugin Framework](https://github.com/hashicorp/terraform-plugin-framework). The template repository built on the [Terraform Plugin SDK](https://github.com/hashicorp/terraform-plugin-sdk) can be found at [terraform-provider-scaffolding](https://github.com/hashicorp/terraform-provider-scaffolding). See [Which SDK Should I Use?](https://developer.hashicorp.com/terraform/plugin/framework-benefits) in the Terraform documentation for additional information._ - -This repository is a *template* for a [Terraform](https://www.terraform.io) provider. It is intended as a starting point for creating Terraform providers, containing: - -- A resource and a data source (`internal/provider/`), -- Examples (`examples/`) and generated documentation (`docs/`), -- Miscellaneous meta files. - -These files contain boilerplate code that you will need to edit to create your own Terraform provider. Tutorials for creating Terraform providers can be found on the [HashiCorp Developer](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework) platform. _Terraform Plugin Framework specific guides are titled accordingly._ - -Please see the [GitHub template repository documentation](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template) for how to create a new repository from this template on GitHub. - -Once you've written your provider, you'll want to [publish it on the Terraform Registry](https://developer.hashicorp.com/terraform/registry/providers/publishing) so that others can use it. +The provider currently supports resources and data sources for: +- Users +- Templates + Template Versions +- Groups +- Workspace Proxies +- Organizations (Data Source only) ## Requirements - [Terraform](https://developer.hashicorp.com/terraform/downloads) >= 1.0 - [Go](https://golang.org/doc/install) >= 1.21 +- [Coder](https://github.com/coder/coder) >= 2.10.1 -## Building The Provider - -1. Clone the repository -1. Enter the repository directory -1. Build the provider using the Go `install` command: - -```shell -go install -``` - -## Adding Dependencies - -This provider uses [Go modules](https://github.com/golang/go/wiki/Modules). -Please see the Go documentation for the most up to date information about using Go modules. - -To add a new dependency `github.com/author/dependency` to your Terraform provider: - -```shell -go get github.com/author/dependency -go mod tidy -``` - -Then commit the changes to `go.mod` and `go.sum`. - -## Using the provider +## Usage -Fill this in for each provider +See the [`examples`](examples) and the [documentation](https://registry.terraform.io/providers/coder/coderd/latest/docs). ## Developing the Provider @@ -55,12 +25,11 @@ If you wish to work on the provider, you'll first need [Go](http://www.golang.or To compile the provider, run `go install`. This will build the provider and put the provider binary in the `$GOPATH/bin` directory. -To generate or update documentation, run `go generate`. +To generate or update documentation, run `make gen`. -In order to run the full suite of Acceptance tests, run `make testacc`. +### Terraform Acceptance Tests -*Note:* Acceptance tests create real resources, and often cost money to run. +Acceptance tests are run against a live Coder deployment in a local Docker container. To run the full suite of Acceptance tests, run `make testacc`. -```shell -make testacc -``` +> [!NOTE] +> Our [CI workflow](./github/workflows/test.yml) runs an acceptance test matrix against multiple Terraform versions. diff --git a/docs/data-sources/group.md b/docs/data-sources/group.md index eb790f5..37d3f7a 100644 --- a/docs/data-sources/group.md +++ b/docs/data-sources/group.md @@ -3,12 +3,12 @@ page_title: "coderd_group Data Source - terraform-provider-coderd" subcategory: "" description: |- - An existing group on the coder deployment. + An existing group on the Coder deployment. --- # coderd_group (Data Source) -An existing group on the coder deployment. +An existing group on the Coder deployment. diff --git a/docs/data-sources/organization.md b/docs/data-sources/organization.md index f1fcac6..26b8cdd 100644 --- a/docs/data-sources/organization.md +++ b/docs/data-sources/organization.md @@ -3,12 +3,17 @@ page_title: "coderd_organization Data Source - terraform-provider-coderd" subcategory: "" description: |- - An existing organization on the coder deployment. + An existing organization on the Coder deployment. + ~> Warning + This data source is only compatible with Coder version 2.13.0 https://github.com/coder/coder/releases/tag/v2.13.0 and later. --- # coderd_organization (Data Source) -An existing organization on the coder deployment. +An existing organization on the Coder deployment. + +~> **Warning** +This data source is only compatible with Coder version [2.13.0](https://github.com/coder/coder/releases/tag/v2.13.0) and later. diff --git a/docs/data-sources/user.md b/docs/data-sources/user.md index b7b21db..35557e7 100644 --- a/docs/data-sources/user.md +++ b/docs/data-sources/user.md @@ -3,12 +3,12 @@ page_title: "coderd_user Data Source - terraform-provider-coderd" subcategory: "" description: |- - An existing user on the coder deployment + An existing user on the Coder deployment --- # coderd_user (Data Source) -An existing user on the coder deployment +An existing user on the Coder deployment diff --git a/docs/index.md b/docs/index.md index 974962c..d373b16 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,20 +3,16 @@ page_title: "coderd Provider" subcategory: "" description: |- - + ~> Warning + This provider is only compatible with Coder version 2.10.1 https://github.com/coder/coder/releases/tag/v2.13.0 and later. --- # coderd Provider +~> **Warning** +This provider is only compatible with Coder version [2.10.1](https://github.com/coder/coder/releases/tag/v2.13.0) and later. -## Example Usage - -```terraform -provider "coderd" { - # example configuration here -} -``` <!-- schema generated by tfplugindocs --> ## Schema diff --git a/docs/resources/group.md b/docs/resources/group.md index ec10901..3e7220a 100644 --- a/docs/resources/group.md +++ b/docs/resources/group.md @@ -10,7 +10,33 @@ description: |- A group on the Coder deployment. If you want to have a group resource with unmanaged members, but still want to read the members in Terraform, use the `data.coderd_group` data source. Creating groups requires an Enterprise license. - +## Example Usage + +```terraform +// Provider populated from environment variables +provider "coderd" {} + +resource "coderd_user" "coder1" { + username = "coder1" + name = "Coder One" + email = "coder1@coder.com" +} + +resource "coderd_user" "coder2" { + username = "coder2" + name = "Coder One" + email = "coder2@coder.com" +} + +// Add two users to the group by their ID. +resource "coderd_group" "group1" { + name = "group1" + members = [ + coderd_user.coder1.id, + coderd_user.coder2.id + ] +} +``` <!-- schema generated by tfplugindocs --> ## Schema diff --git a/docs/resources/template.md b/docs/resources/template.md index 598f385..185e52e 100644 --- a/docs/resources/template.md +++ b/docs/resources/template.md @@ -10,7 +10,40 @@ description: |- A Coder template - +## Example Usage + +```terraform +// Provider populated from environment variables +provider "coderd" {} + +// Get the commit SHA of the configuration's git repository +variable "TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA" { + type = string +} + +resource "coderd_user" "coder1" { + username = "coder1" + name = "Coder One" + email = "coder1@coder.com" +} + +resource "coderd_template" "ubuntu-main" { + name = "ubuntu-main" + description = "The main template for developing on Ubuntu." + versions = [ + { + name = "stable-${var.TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA}" + description = "The stable version of the template." + directory = "./stable-template" + }, + { + name = "staging-${var.TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA}" + description = "The staging version of the template." + directory = "./staging-template" + } + ] +} +``` <!-- schema generated by tfplugindocs --> ## Schema diff --git a/docs/resources/user.md b/docs/resources/user.md index 5672928..dd54af7 100644 --- a/docs/resources/user.md +++ b/docs/resources/user.md @@ -10,7 +10,37 @@ description: |- A user on the Coder deployment. - +## Example Usage + +```terraform +// Provider populated from environemnt variables +provider "coderd" {} + +// Create a bot user for Jenkins +resource "coderd_user" "jenkins" { + username = "jenkins" + name = "Jenkins CI/CD" + email = "ci@example.com" + roles = ["template-admin"] + login_type = "none" +} + +// Keep the password of a user account up to date from an external source +resource "coderd_user" "audit" { + username = "auditor" + name = "Auditor" + email = "security@example.com" + roles = ["auditor"] + login_type = "password" + password = data.vault_password.auditor.value +} + +// Ensure the admin account is suspended +resource "coderd_user" "admin" { + username = "admin" + suspended = true +} +``` <!-- schema generated by tfplugindocs --> ## Schema diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 026c42c..0000000 --- a/examples/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Examples - -This directory contains examples that are mostly used for documentation, but can also be run/tested manually via the Terraform CLI. - -The document generation tool looks for files in the following locations by default. All other *.tf files besides the ones mentioned below are ignored by the documentation tool. This is useful for creating examples that can run and/or ar testable even if some parts are not relevant for the documentation. - -* **provider/provider.tf** example file for the provider index page -* **data-sources/`full data source name`/data-source.tf** example file for the named data source page -* **resources/`full resource name`/resource.tf** example file for the named data source page diff --git a/examples/data-sources/coderd_example/data-source.tf b/examples/data-sources/coderd_example/data-source.tf deleted file mode 100644 index db00893..0000000 --- a/examples/data-sources/coderd_example/data-source.tf +++ /dev/null @@ -1,3 +0,0 @@ -data "coderd_example" "example" { - configurable_attribute = "some-value" -} diff --git a/examples/provider/provider.tf b/examples/provider/provider.tf deleted file mode 100644 index 8d3fb0e..0000000 --- a/examples/provider/provider.tf +++ /dev/null @@ -1,3 +0,0 @@ -provider "coderd" { - # example configuration here -} diff --git a/examples/resources/coderd_example/resource.tf b/examples/resources/coderd_example/resource.tf deleted file mode 100644 index ccfd842..0000000 --- a/examples/resources/coderd_example/resource.tf +++ /dev/null @@ -1,3 +0,0 @@ -resource "coderd_example" "example" { - configurable_attribute = "some-value" -} diff --git a/examples/resources/coderd_group/resource.tf b/examples/resources/coderd_group/resource.tf new file mode 100644 index 0000000..0909dc0 --- /dev/null +++ b/examples/resources/coderd_group/resource.tf @@ -0,0 +1,23 @@ +// Provider populated from environment variables +provider "coderd" {} + +resource "coderd_user" "coder1" { + username = "coder1" + name = "Coder One" + email = "coder1@coder.com" +} + +resource "coderd_user" "coder2" { + username = "coder2" + name = "Coder One" + email = "coder2@coder.com" +} + +// Add two users to the group by their ID. +resource "coderd_group" "group1" { + name = "group1" + members = [ + coderd_user.coder1.id, + coderd_user.coder2.id + ] +} diff --git a/examples/resources/coderd_template/resource.tf b/examples/resources/coderd_template/resource.tf new file mode 100644 index 0000000..b95f23d --- /dev/null +++ b/examples/resources/coderd_template/resource.tf @@ -0,0 +1,30 @@ +// Provider populated from environment variables +provider "coderd" {} + +// Get the commit SHA of the configuration's git repository +variable "TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA" { + type = string +} + +resource "coderd_user" "coder1" { + username = "coder1" + name = "Coder One" + email = "coder1@coder.com" +} + +resource "coderd_template" "ubuntu-main" { + name = "ubuntu-main" + description = "The main template for developing on Ubuntu." + versions = [ + { + name = "stable-${var.TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA}" + description = "The stable version of the template." + directory = "./stable-template" + }, + { + name = "staging-${var.TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA}" + description = "The staging version of the template." + directory = "./staging-template" + } + ] +} diff --git a/examples/resources/coderd_user/resource.tf b/examples/resources/coderd_user/resource.tf new file mode 100644 index 0000000..ed6e380 --- /dev/null +++ b/examples/resources/coderd_user/resource.tf @@ -0,0 +1,27 @@ +// Provider populated from environemnt variables +provider "coderd" {} + +// Create a bot user for Jenkins +resource "coderd_user" "jenkins" { + username = "jenkins" + name = "Jenkins CI/CD" + email = "ci@example.com" + roles = ["template-admin"] + login_type = "none" +} + +// Keep the password of a user account up to date from an external source +resource "coderd_user" "audit" { + username = "auditor" + name = "Auditor" + email = "security@example.com" + roles = ["auditor"] + login_type = "password" + password = data.vault_password.auditor.value +} + +// Ensure the admin account is suspended +resource "coderd_user" "admin" { + username = "admin" + suspended = true +} diff --git a/internal/provider/group_data_source.go b/internal/provider/group_data_source.go index 5af8998..95c8e6e 100644 --- a/internal/provider/group_data_source.go +++ b/internal/provider/group_data_source.go @@ -56,7 +56,7 @@ func (d *GroupDataSource) Metadata(ctx context.Context, req datasource.MetadataR func (d *GroupDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = schema.Schema{ - MarkdownDescription: "An existing group on the coder deployment.", + MarkdownDescription: "An existing group on the Coder deployment.", Attributes: map[string]schema.Attribute{ "id": schema.StringAttribute{ diff --git a/internal/provider/organization_data_source.go b/internal/provider/organization_data_source.go index 8471adc..59b598c 100644 --- a/internal/provider/organization_data_source.go +++ b/internal/provider/organization_data_source.go @@ -46,7 +46,11 @@ func (d *OrganizationDataSource) Metadata(ctx context.Context, req datasource.Me func (d *OrganizationDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = schema.Schema{ - MarkdownDescription: "An existing organization on the coder deployment.", + MarkdownDescription: `An existing organization on the Coder deployment. + +~> **Warning** +This data source is only compatible with Coder version [2.13.0](https://github.com/coder/coder/releases/tag/v2.13.0) and later. +`, Attributes: map[string]schema.Attribute{ "id": schema.StringAttribute{ diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 456adb3..34272a9 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -52,6 +52,10 @@ func (p *CoderdProvider) Metadata(ctx context.Context, req provider.MetadataRequ func (p *CoderdProvider) Schema(ctx context.Context, req provider.SchemaRequest, resp *provider.SchemaResponse) { resp.Schema = schema.Schema{ + MarkdownDescription: ` +~> **Warning** +This provider is only compatible with Coder version [2.10.1](https://github.com/coder/coder/releases/tag/v2.13.0) and later. +`, Attributes: map[string]schema.Attribute{ "url": schema.StringAttribute{ MarkdownDescription: "URL to the Coder deployment. Defaults to $CODER_URL.", diff --git a/internal/provider/user_data_source.go b/internal/provider/user_data_source.go index c1675a3..7c5846f 100644 --- a/internal/provider/user_data_source.go +++ b/internal/provider/user_data_source.go @@ -50,7 +50,7 @@ func (d *UserDataSource) Metadata(ctx context.Context, req datasource.MetadataRe func (d *UserDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = schema.Schema{ - MarkdownDescription: "An existing user on the coder deployment", + MarkdownDescription: "An existing user on the Coder deployment", // Validation handled by ConfigValidators Attributes: map[string]schema.Attribute{