Skip to content

Commit 413d1c8

Browse files
committed
fix(provisioner/terraform/tfparse): allow empty values in coder_workspace_tag defaults
1 parent f518669 commit 413d1c8

File tree

4 files changed

+85
-20
lines changed

4 files changed

+85
-20
lines changed

coderd/templateversions_test.go

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,8 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
429429
}
430430
}`,
431431
},
432-
reqTags: map[string]string{"a": "b"},
433-
// wantTags: map[string]string{"owner": "", "scope": "organization", "a": "b"},
434-
expectError: `provisioner tag "a" evaluated to an empty value`,
432+
reqTags: map[string]string{"a": "b"},
433+
wantTags: map[string]string{"owner": "", "scope": "organization", "a": "b"},
435434
},
436435
{
437436
name: "main.tf with disallowed workspace tag value",
@@ -568,6 +567,42 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
568567
},
569568
wantTags: map[string]string{"owner": "", "scope": "organization"},
570569
},
570+
{
571+
name: "main.tf with tags from parameter with default value from variable no default",
572+
files: map[string]string{
573+
`main.tf`: `
574+
variable "provisioner" {
575+
type = string
576+
}
577+
variable "default_provisioner" {
578+
type = string
579+
default = "" # intentionally blank, set on template creation
580+
}
581+
data "coder_parameter" "provisioner" {
582+
name = "provisioner"
583+
mutable = false
584+
default = var.default_provisioner
585+
dynamic "option" {
586+
for_each = toset(split(",", var.provisioner))
587+
content {
588+
name = option.value
589+
value = option.value
590+
}
591+
}
592+
}
593+
data "coder_workspace_tags" "tags" {
594+
tags = {
595+
"provisioner" : data.coder_parameter.provisioner.value
596+
}
597+
}`,
598+
},
599+
reqTags: map[string]string{
600+
"provisioner": "alpha",
601+
},
602+
wantTags: map[string]string{
603+
"provisioner": "alpha", "owner": "", "scope": "organization",
604+
},
605+
},
571606
} {
572607
tt := tt
573608
t.Run(tt.name, func(t *testing.T) {

enterprise/coderd/workspaces_test.go

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,8 +1488,11 @@ func TestWorkspaceTagsTerraform(t *testing.T) {
14881488
createTemplateVersionRequestTags map[string]string
14891489
// the coder_workspace_tags bit of main.tf.
14901490
// you can add more stuff here if you need
1491-
tfWorkspaceTags string
1492-
skipCreateWorkspace bool
1491+
tfWorkspaceTags string
1492+
templateImportUserVariableValues []codersdk.VariableValue
1493+
// if we need to set parameters on workspace build
1494+
workspaceBuildParameters []codersdk.WorkspaceBuildParameter
1495+
skipCreateWorkspace bool
14931496
}{
14941497
{
14951498
name: "no tags",
@@ -1589,6 +1592,38 @@ func TestWorkspaceTagsTerraform(t *testing.T) {
15891592
// matching tag foo=bar.
15901593
skipCreateWorkspace: true,
15911594
},
1595+
{
1596+
name: "overrides with dynamic option from var",
1597+
provisionerTags: map[string]string{"foo": "bar"},
1598+
createTemplateVersionRequestTags: map[string]string{"foo": "bar"},
1599+
templateImportUserVariableValues: []codersdk.VariableValue{{Name: "default_foo", Value: "baz"}, {Name: "foo", Value: "bar,baz"}},
1600+
workspaceBuildParameters: []codersdk.WorkspaceBuildParameter{{Name: "foo", Value: "bar"}},
1601+
tfWorkspaceTags: `
1602+
variable "default_foo" {
1603+
type = string
1604+
}
1605+
variable "foo" {
1606+
type = string
1607+
}
1608+
data "coder_parameter" "foo" {
1609+
name = "foo"
1610+
type = "string"
1611+
default = var.default_foo
1612+
mutable = false
1613+
dynamic "option" {
1614+
for_each = toset(split(",", var.foo))
1615+
content {
1616+
name = option.value
1617+
value = option.value
1618+
}
1619+
}
1620+
}
1621+
data "coder_workspace_tags" "tags" {
1622+
tags = {
1623+
"foo" = data.coder_parameter.foo.value
1624+
}
1625+
}`,
1626+
},
15921627
} {
15931628
tc := tc
15941629
t.Run(tc.name, func(t *testing.T) {
@@ -1617,11 +1652,12 @@ func TestWorkspaceTagsTerraform(t *testing.T) {
16171652
fi, err := templateAdmin.Upload(ctx, "application/x-tar", bytes.NewReader(tarBytes))
16181653
require.NoError(t, err, "failed to upload file")
16191654
tv, err := templateAdmin.CreateTemplateVersion(ctx, owner.OrganizationID, codersdk.CreateTemplateVersionRequest{
1620-
Name: testutil.GetRandomName(t),
1621-
FileID: fi.ID,
1622-
StorageMethod: codersdk.ProvisionerStorageMethodFile,
1623-
Provisioner: codersdk.ProvisionerTypeTerraform,
1624-
ProvisionerTags: tc.createTemplateVersionRequestTags,
1655+
Name: testutil.GetRandomName(t),
1656+
FileID: fi.ID,
1657+
StorageMethod: codersdk.ProvisionerStorageMethodFile,
1658+
Provisioner: codersdk.ProvisionerTypeTerraform,
1659+
ProvisionerTags: tc.createTemplateVersionRequestTags,
1660+
UserVariableValues: tc.templateImportUserVariableValues,
16251661
})
16261662
require.NoError(t, err, "failed to create template version")
16271663
coderdtest.AwaitTemplateVersionJobCompleted(t, templateAdmin, tv.ID)
@@ -1630,8 +1666,9 @@ func TestWorkspaceTagsTerraform(t *testing.T) {
16301666
if !tc.skipCreateWorkspace {
16311667
// Creating a workspace as a non-privileged user must succeed
16321668
ws, err := member.CreateUserWorkspace(ctx, memberUser.Username, codersdk.CreateWorkspaceRequest{
1633-
TemplateID: tpl.ID,
1634-
Name: coderdtest.RandomUsername(t),
1669+
TemplateID: tpl.ID,
1670+
Name: coderdtest.RandomUsername(t),
1671+
RichParameterValues: tc.workspaceBuildParameters,
16351672
})
16361673
require.NoError(t, err, "failed to create workspace")
16371674
coderdtest.AwaitWorkspaceBuildJobCompleted(t, member, ws.LatestBuild.ID)

provisioner/terraform/tfparse/tfparse.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,6 @@ func (p *Parser) WorkspaceTagDefaults(ctx context.Context) (map[string]string, e
239239
return nil, xerrors.Errorf("eval provisioner tags: %w", err)
240240
}
241241

242-
// Ensure that none of the tag values are empty after evaluation.
243-
for k, v := range evalTags {
244-
if len(strings.TrimSpace(v)) > 0 {
245-
continue
246-
}
247-
return nil, xerrors.Errorf("provisioner tag %q evaluated to an empty value, please set a default value", k)
248-
}
249242
return evalTags, nil
250243
}
251244

provisioner/terraform/tfparse/tfparse_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ func Test_WorkspaceTagDefaultsFromFile(t *testing.T) {
268268
}
269269
}`,
270270
},
271-
expectError: `provisioner tag "az" evaluated to an empty value, please set a default value`,
271+
expectTags: map[string]string{"cluster": "developers", "az": "", "platform": "kubernetes", "region": "us"},
272272
},
273273
{
274274
name: "main.tf with missing parameter default value outside workspace tags",

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