diff --git a/provider/helpers/env.go b/provider/helpers/env.go index b1007820..6ffab3f6 100644 --- a/provider/helpers/env.go +++ b/provider/helpers/env.go @@ -6,7 +6,13 @@ import ( ) // RequireEnv requires environment variable to be present. +// The constraint can be verified only during execution of the workspace build +// (determined with env `CODER_WORKSPACE_BUILD_ID`). func RequireEnv(name string) (string, error) { + if os.Getenv("CODER_WORKSPACE_BUILD_ID") == "" { + return os.Getenv(name), nil + } + val := os.Getenv(name) if val == "" { return "", fmt.Errorf("%s is required", name) diff --git a/provider/workspace.go b/provider/workspace.go index f06e9e1e..d8bfd3a5 100644 --- a/provider/workspace.go +++ b/provider/workspace.go @@ -62,13 +62,22 @@ func workspaceDataSource() *schema.Resource { id := helpers.OptionalEnvOrDefault("CODER_WORKSPACE_ID", uuid.NewString()) rd.SetId(id) - templateID := helpers.OptionalEnv("CODER_WORKSPACE_TEMPLATE_ID") // FIXME switch to `helpers.RequireEnv(...)` + templateID, err := helpers.RequireEnv("CODER_WORKSPACE_TEMPLATE_ID") + if err != nil { + return diag.Errorf("template ID is missing: %s", err.Error()) + } _ = rd.Set("template_id", templateID) - templateName := helpers.OptionalEnv("CODER_WORKSPACE_TEMPLATE_NAME") // FIXME switch to `helpers.RequireEnv(...)` + templateName, err := helpers.RequireEnv("CODER_WORKSPACE_TEMPLATE_NAME") + if err != nil { + return diag.Errorf("template name is missing: %s", err.Error()) + } _ = rd.Set("template_name", templateName) - templateVersion := helpers.OptionalEnv("CODER_WORKSPACE_TEMPLATE_VERSION") // FIXME switch to `helpers.RequireEnv(...)` + templateVersion, err := helpers.RequireEnv("CODER_WORKSPACE_TEMPLATE_VERSION") + if err != nil { + return diag.Errorf("template version is missing: %s", err.Error()) + } _ = rd.Set("template_version", templateVersion) config, valid := i.(config) diff --git a/provider/workspace_test.go b/provider/workspace_test.go index d285b30c..e53f30d4 100644 --- a/provider/workspace_test.go +++ b/provider/workspace_test.go @@ -1,6 +1,7 @@ package provider_test import ( + "regexp" "testing" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -102,3 +103,34 @@ func TestWorkspace_UndefinedOwner(t *testing.T) { }}, }) } + +func TestWorkspace_MissingTemplateName(t *testing.T) { + t.Setenv("CODER_WORKSPACE_BUILD_ID", "1") // Let's pretend this is a workspace build + + t.Setenv("CODER_WORKSPACE_OWNER", "owner123") + t.Setenv("CODER_WORKSPACE_OWNER_ID", "11111111-1111-1111-1111-111111111111") + t.Setenv("CODER_WORKSPACE_OWNER_NAME", "Mr Owner") + t.Setenv("CODER_WORKSPACE_OWNER_EMAIL", "owner123@example.com") + t.Setenv("CODER_WORKSPACE_OWNER_SESSION_TOKEN", "abc123") + t.Setenv("CODER_WORKSPACE_OWNER_GROUPS", `["group1", "group2"]`) + t.Setenv("CODER_WORKSPACE_OWNER_OIDC_ACCESS_TOKEN", "supersecret") + t.Setenv("CODER_WORKSPACE_TEMPLATE_ID", "templateID") + // CODER_WORKSPACE_TEMPLATE_NAME is missing + t.Setenv("CODER_WORKSPACE_TEMPLATE_VERSION", "v1.2.3") + + resource.Test(t, resource.TestCase{ + Providers: map[string]*schema.Provider{ + "coder": provider.New(), + }, + IsUnitTest: true, + Steps: []resource.TestStep{{ + Config: ` + provider "coder" { + url = "https://example.com:8080" + } + data "coder_workspace" "me" { + }`, + ExpectError: regexp.MustCompile("CODER_WORKSPACE_TEMPLATE_NAME is required"), + }}, + }) +}