Skip to content

Commit

Permalink
feat: support workspace tags (#223)
Browse files Browse the repository at this point in the history
  • Loading branch information
mtojek authored May 16, 2024
1 parent 8fa0fbf commit 041e000
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 16 deletions.
50 changes: 50 additions & 0 deletions examples/resources/coder_workspace_tags/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
provider "coder" {}

data "coder_parameter" "os_selector" {
name = "os_selector"
display_name = "Operating System"
mutable = false

default = "osx"

option {
icon = "/icons/linux.png"
name = "Linux"
value = "linux"
}
option {
icon = "/icons/osx.png"
name = "OSX"
value = "osx"
}
option {
icon = "/icons/windows.png"
name = "Windows"
value = "windows"
}
}

data "coder_parameter" "feature_cache_enabled" {
name = "feature_cache_enabled"
display_name = "Enable cache?"
type = "bool"

default = false
}

data "coder_parameter" "feature_debug_enabled" {
name = "feature_debug_enabled"
display_name = "Enable debug?"
type = "bool"

default = true
}

data "coder_workspace_tags" "custom_workspace_tags" {
tags = {
"cluster" = "developers"
"os" = data.coder_parameter.os_selector.value
"debug" = "${data.coder_parameter.feature_debug_enabled.value}+12345"
"cache" = data.coder_parameter.feature_cache_enabled.value == "true" ? "nix-with-cache" : "no-cache"
}
}
28 changes: 17 additions & 11 deletions provider/examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,25 @@ import (
func TestExamples(t *testing.T) {
t.Parallel()

t.Run("coder_parameter", func(t *testing.T) {
t.Parallel()
for _, testDir := range []string{
"coder_parameter",
"coder_workspace_tags",
} {
t.Run(testDir, func(t *testing.T) {
testDir := testDir
t.Parallel()

resource.Test(t, resource.TestCase{
Providers: map[string]*schema.Provider{
"coder": provider.New(),
},
IsUnitTest: true,
Steps: []resource.TestStep{{
Config: mustReadFile(t, "../examples/resources/coder_parameter/resource.tf"),
}},
resource.Test(t, resource.TestCase{
Providers: map[string]*schema.Provider{
"coder": provider.New(),
},
IsUnitTest: true,
Steps: []resource.TestStep{{
Config: mustReadFile(t, "../examples/resources/"+testDir+"/resource.tf"),
}},
})
})
})
}
}

func mustReadFile(t *testing.T, path string) string {
Expand Down
11 changes: 6 additions & 5 deletions provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,12 @@ func New() *schema.Provider {
}, nil
},
DataSourcesMap: map[string]*schema.Resource{
"coder_workspace": workspaceDataSource(),
"coder_provisioner": provisionerDataSource(),
"coder_parameter": parameterDataSource(),
"coder_git_auth": gitAuthDataSource(),
"coder_external_auth": externalAuthDataSource(),
"coder_workspace": workspaceDataSource(),
"coder_workspace_tags": workspaceTagDataSource(),
"coder_provisioner": provisionerDataSource(),
"coder_parameter": parameterDataSource(),
"coder_git_auth": gitAuthDataSource(),
"coder_external_auth": externalAuthDataSource(),
},
ResourcesMap: map[string]*schema.Resource{
"coder_agent": agentResource(),
Expand Down
32 changes: 32 additions & 0 deletions provider/workspace_tags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package provider

import (
"context"

"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

type WorkspaceTags struct {
Tags map[string]string
}

func workspaceTagDataSource() *schema.Resource {
return &schema.Resource{
Description: "Use this data source to configure workspace tags to select provisioners.",
ReadContext: func(ctx context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
rd.SetId(uuid.NewString())
return nil
},
Schema: map[string]*schema.Schema{
"tags": {
Type: schema.TypeMap,
Description: `Key-value map with workspace tags`,
ForceNew: true,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
},
}
}
48 changes: 48 additions & 0 deletions provider/workspace_tags_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package provider_test

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/stretchr/testify/require"

"github.com/coder/terraform-provider-coder/provider"
)

func TestWorkspaceTags(t *testing.T) {
resource.Test(t, resource.TestCase{
Providers: map[string]*schema.Provider{
"coder": provider.New(),
},
IsUnitTest: true,
Steps: []resource.TestStep{{
Config: `
provider "coder" {
}
data "coder_parameter" "animal" {
name = "animal"
type = "string"
default = "chris"
}
data "coder_workspace_tags" "wt" {
tags = {
"cat" = "james"
"dog" = data.coder_parameter.animal.value
}
}`,
Check: func(state *terraform.State) error {
require.Len(t, state.Modules, 1)
require.Len(t, state.Modules[0].Resources, 2)
resource := state.Modules[0].Resources["data.coder_workspace_tags.wt"]
require.NotNil(t, resource)

attribs := resource.Primary.Attributes
require.Equal(t, "james", attribs["tags.cat"])
require.Equal(t, "chris", attribs["tags.dog"])
return nil
},
}},
})
}

0 comments on commit 041e000

Please sign in to comment.