Skip to content

Commit 041e000

Browse files
authored
feat: support workspace tags (#223)
1 parent 8fa0fbf commit 041e000

File tree

5 files changed

+153
-16
lines changed

5 files changed

+153
-16
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
provider "coder" {}
2+
3+
data "coder_parameter" "os_selector" {
4+
name = "os_selector"
5+
display_name = "Operating System"
6+
mutable = false
7+
8+
default = "osx"
9+
10+
option {
11+
icon = "/icons/linux.png"
12+
name = "Linux"
13+
value = "linux"
14+
}
15+
option {
16+
icon = "/icons/osx.png"
17+
name = "OSX"
18+
value = "osx"
19+
}
20+
option {
21+
icon = "/icons/windows.png"
22+
name = "Windows"
23+
value = "windows"
24+
}
25+
}
26+
27+
data "coder_parameter" "feature_cache_enabled" {
28+
name = "feature_cache_enabled"
29+
display_name = "Enable cache?"
30+
type = "bool"
31+
32+
default = false
33+
}
34+
35+
data "coder_parameter" "feature_debug_enabled" {
36+
name = "feature_debug_enabled"
37+
display_name = "Enable debug?"
38+
type = "bool"
39+
40+
default = true
41+
}
42+
43+
data "coder_workspace_tags" "custom_workspace_tags" {
44+
tags = {
45+
"cluster" = "developers"
46+
"os" = data.coder_parameter.os_selector.value
47+
"debug" = "${data.coder_parameter.feature_debug_enabled.value}+12345"
48+
"cache" = data.coder_parameter.feature_cache_enabled.value == "true" ? "nix-with-cache" : "no-cache"
49+
}
50+
}

provider/examples_test.go

+17-11
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,25 @@ import (
1414
func TestExamples(t *testing.T) {
1515
t.Parallel()
1616

17-
t.Run("coder_parameter", func(t *testing.T) {
18-
t.Parallel()
17+
for _, testDir := range []string{
18+
"coder_parameter",
19+
"coder_workspace_tags",
20+
} {
21+
t.Run(testDir, func(t *testing.T) {
22+
testDir := testDir
23+
t.Parallel()
1924

20-
resource.Test(t, resource.TestCase{
21-
Providers: map[string]*schema.Provider{
22-
"coder": provider.New(),
23-
},
24-
IsUnitTest: true,
25-
Steps: []resource.TestStep{{
26-
Config: mustReadFile(t, "../examples/resources/coder_parameter/resource.tf"),
27-
}},
25+
resource.Test(t, resource.TestCase{
26+
Providers: map[string]*schema.Provider{
27+
"coder": provider.New(),
28+
},
29+
IsUnitTest: true,
30+
Steps: []resource.TestStep{{
31+
Config: mustReadFile(t, "../examples/resources/"+testDir+"/resource.tf"),
32+
}},
33+
})
2834
})
29-
})
35+
}
3036
}
3137

3238
func mustReadFile(t *testing.T, path string) string {

provider/provider.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ func New() *schema.Provider {
6868
}, nil
6969
},
7070
DataSourcesMap: map[string]*schema.Resource{
71-
"coder_workspace": workspaceDataSource(),
72-
"coder_provisioner": provisionerDataSource(),
73-
"coder_parameter": parameterDataSource(),
74-
"coder_git_auth": gitAuthDataSource(),
75-
"coder_external_auth": externalAuthDataSource(),
71+
"coder_workspace": workspaceDataSource(),
72+
"coder_workspace_tags": workspaceTagDataSource(),
73+
"coder_provisioner": provisionerDataSource(),
74+
"coder_parameter": parameterDataSource(),
75+
"coder_git_auth": gitAuthDataSource(),
76+
"coder_external_auth": externalAuthDataSource(),
7677
},
7778
ResourcesMap: map[string]*schema.Resource{
7879
"coder_agent": agentResource(),

provider/workspace_tags.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package provider
2+
3+
import (
4+
"context"
5+
6+
"github.com/google/uuid"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
type WorkspaceTags struct {
12+
Tags map[string]string
13+
}
14+
15+
func workspaceTagDataSource() *schema.Resource {
16+
return &schema.Resource{
17+
Description: "Use this data source to configure workspace tags to select provisioners.",
18+
ReadContext: func(ctx context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
19+
rd.SetId(uuid.NewString())
20+
return nil
21+
},
22+
Schema: map[string]*schema.Schema{
23+
"tags": {
24+
Type: schema.TypeMap,
25+
Description: `Key-value map with workspace tags`,
26+
ForceNew: true,
27+
Optional: true,
28+
Elem: &schema.Schema{Type: schema.TypeString},
29+
},
30+
},
31+
}
32+
}

provider/workspace_tags_test.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package provider_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/coder/terraform-provider-coder/provider"
12+
)
13+
14+
func TestWorkspaceTags(t *testing.T) {
15+
resource.Test(t, resource.TestCase{
16+
Providers: map[string]*schema.Provider{
17+
"coder": provider.New(),
18+
},
19+
IsUnitTest: true,
20+
Steps: []resource.TestStep{{
21+
Config: `
22+
provider "coder" {
23+
}
24+
data "coder_parameter" "animal" {
25+
name = "animal"
26+
type = "string"
27+
default = "chris"
28+
}
29+
data "coder_workspace_tags" "wt" {
30+
tags = {
31+
"cat" = "james"
32+
"dog" = data.coder_parameter.animal.value
33+
}
34+
}`,
35+
Check: func(state *terraform.State) error {
36+
require.Len(t, state.Modules, 1)
37+
require.Len(t, state.Modules[0].Resources, 2)
38+
resource := state.Modules[0].Resources["data.coder_workspace_tags.wt"]
39+
require.NotNil(t, resource)
40+
41+
attribs := resource.Primary.Attributes
42+
require.Equal(t, "james", attribs["tags.cat"])
43+
require.Equal(t, "chris", attribs["tags.dog"])
44+
return nil
45+
},
46+
}},
47+
})
48+
}

0 commit comments

Comments
 (0)