From 1561e84c0c845ce5ef8e4ebbd05b760eed25fcb8 Mon Sep 17 00:00:00 2001 From: Rob Coward Date: Tue, 10 Jan 2023 13:35:43 +0000 Subject: [PATCH] feat: Adding support for working-directory in CRD for workspace --- api/v1alpha1/workspace_types.go | 3 +++ .../bases/app.terraform.io_workspaces.yaml | 3 +++ workspacehelper/tfc_org.go | 22 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/api/v1alpha1/workspace_types.go b/api/v1alpha1/workspace_types.go index 6fbc6aad..410ad94b 100644 --- a/api/v1alpha1/workspace_types.go +++ b/api/v1alpha1/workspace_types.go @@ -144,6 +144,9 @@ type WorkspaceSpec struct { // Specifies the agent pool name we wish to use. // +optional AgentPoolName string `json:"agentPoolName,omitempty"` + // Working directory within the module repository + // +optional + WorkingDirectory string `json:"workingDirectory,omitempty"` } // WorkspaceStatus defines the observed state of Workspace diff --git a/config/crd/bases/app.terraform.io_workspaces.yaml b/config/crd/bases/app.terraform.io_workspaces.yaml index 67e2c741..7681ffbc 100644 --- a/config/crd/bases/app.terraform.io_workspaces.yaml +++ b/config/crd/bases/app.terraform.io_workspaces.yaml @@ -285,6 +285,9 @@ spec: - repo_identifier - token_id type: object + workingDirectory: + description: Working directory within the module repository + type: string required: - organization - secretsMountPath diff --git a/workspacehelper/tfc_org.go b/workspacehelper/tfc_org.go index 4d3cb231..ed712770 100644 --- a/workspacehelper/tfc_org.go +++ b/workspacehelper/tfc_org.go @@ -105,6 +105,17 @@ func (t *TerraformCloudClient) SetTerraformVersion(workspace, terraformVersion s return nil } +func (t *TerraformCloudClient) SetWorkingDirectory(workspace, workingDirectory string) error { + wsUpdateOptions := tfc.WorkspaceUpdateOptions{ + WorkingDirectory: &workingDirectory, + } + _, err := t.Client.Workspaces.Update(context.TODO(), t.Organization, workspace, wsUpdateOptions) + if err != nil { + return err + } + return nil +} + // getAgentPoolID uses AgentPoolName to lookup and return AgentPoolID func getAgentPoolID(specTFCAgentPoolName string, agentPools []*tfc.AgentPool) (*tfc.AgentPool, error) { for _, agentPool := range agentPools { @@ -198,6 +209,13 @@ func (t *TerraformCloudClient) CheckWorkspace(workspace string, instance *appv1a } } + if instance.Spec.WorkingDirectory != ws.WorkingDirectory { + err = t.SetWorkingDirectory(workspace, instance.Spec.WorkingDirectory) + if err != nil { + return nil, err + } + } + if instance.Spec.AgentPoolID != ws.AgentPoolID { err := t.updateAgentPoolID(instance, ws) if err != nil { @@ -248,6 +266,10 @@ func (t *TerraformCloudClient) CreateWorkspace(workspace string, instance *appv1 options.ExecutionMode = tfc.String("agent") } + if instance.Spec.WorkingDirectory != "" { + options.WorkingDirectory = &instance.Spec.WorkingDirectory + } + ws, err := t.Client.Workspaces.Create(context.TODO(), t.Organization, options) if err != nil { return "", err