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
Lines changed: 50 additions & 0 deletions
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

Lines changed: 17 additions & 11 deletions
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

Lines changed: 6 additions & 5 deletions
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

Lines changed: 32 additions & 0 deletions
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

Lines changed: 48 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy