diff --git a/workspace.go b/workspace.go index 3a20a6463..6be114e3c 100644 --- a/workspace.go +++ b/workspace.go @@ -96,38 +96,39 @@ type WorkspaceList struct { // Workspace represents a Terraform Enterprise workspace. type Workspace struct { - ID string `jsonapi:"primary,workspaces"` - Actions *WorkspaceActions `jsonapi:"attr,actions"` - AgentPoolID string `jsonapi:"attr,agent-pool-id"` - AllowDestroyPlan bool `jsonapi:"attr,allow-destroy-plan"` - AutoApply bool `jsonapi:"attr,auto-apply"` - CanQueueDestroyPlan bool `jsonapi:"attr,can-queue-destroy-plan"` - CreatedAt time.Time `jsonapi:"attr,created-at,iso8601"` - Description string `jsonapi:"attr,description"` - Environment string `jsonapi:"attr,environment"` - ExecutionMode string `jsonapi:"attr,execution-mode"` - FileTriggersEnabled bool `jsonapi:"attr,file-triggers-enabled"` - GlobalRemoteState bool `jsonapi:"attr,global-remote-state"` - Locked bool `jsonapi:"attr,locked"` - MigrationEnvironment string `jsonapi:"attr,migration-environment"` - Name string `jsonapi:"attr,name"` - Operations bool `jsonapi:"attr,operations"` - Permissions *WorkspacePermissions `jsonapi:"attr,permissions"` - QueueAllRuns bool `jsonapi:"attr,queue-all-runs"` - SpeculativeEnabled bool `jsonapi:"attr,speculative-enabled"` - SourceName string `jsonapi:"attr,source-name"` - SourceURL string `jsonapi:"attr,source-url"` - TerraformVersion string `jsonapi:"attr,terraform-version"` - TriggerPrefixes []string `jsonapi:"attr,trigger-prefixes"` - VCSRepo *VCSRepo `jsonapi:"attr,vcs-repo"` - WorkingDirectory string `jsonapi:"attr,working-directory"` - UpdatedAt time.Time `jsonapi:"attr,updated-at,iso8601"` - ResourceCount int `jsonapi:"attr,resource-count"` - ApplyDurationAverage time.Duration `jsonapi:"attr,apply-duration-average"` - PlanDurationAverage time.Duration `jsonapi:"attr,plan-duration-average"` - PolicyCheckFailures int `jsonapi:"attr,policy-check-failures"` - RunFailures int `jsonapi:"attr,run-failures"` - RunsCount int `jsonapi:"attr,workspace-kpis-runs-count"` + ID string `jsonapi:"primary,workspaces"` + Actions *WorkspaceActions `jsonapi:"attr,actions"` + AgentPoolID string `jsonapi:"attr,agent-pool-id"` + AllowDestroyPlan bool `jsonapi:"attr,allow-destroy-plan"` + AutoApply bool `jsonapi:"attr,auto-apply"` + CanQueueDestroyPlan bool `jsonapi:"attr,can-queue-destroy-plan"` + CreatedAt time.Time `jsonapi:"attr,created-at,iso8601"` + Description string `jsonapi:"attr,description"` + Environment string `jsonapi:"attr,environment"` + ExecutionMode string `jsonapi:"attr,execution-mode"` + FileTriggersEnabled bool `jsonapi:"attr,file-triggers-enabled"` + GlobalRemoteState bool `jsonapi:"attr,global-remote-state"` + Locked bool `jsonapi:"attr,locked"` + MigrationEnvironment string `jsonapi:"attr,migration-environment"` + Name string `jsonapi:"attr,name"` + Operations bool `jsonapi:"attr,operations"` + Permissions *WorkspacePermissions `jsonapi:"attr,permissions"` + QueueAllRuns bool `jsonapi:"attr,queue-all-runs"` + SpeculativeEnabled bool `jsonapi:"attr,speculative-enabled"` + SourceName string `jsonapi:"attr,source-name"` + SourceURL string `jsonapi:"attr,source-url"` + StructuredRunOutputEnabled bool `jsonapi:"attr,structured-run-output-enabled"` + TerraformVersion string `jsonapi:"attr,terraform-version"` + TriggerPrefixes []string `jsonapi:"attr,trigger-prefixes"` + VCSRepo *VCSRepo `jsonapi:"attr,vcs-repo"` + WorkingDirectory string `jsonapi:"attr,working-directory"` + UpdatedAt time.Time `jsonapi:"attr,updated-at,iso8601"` + ResourceCount int `jsonapi:"attr,resource-count"` + ApplyDurationAverage time.Duration `jsonapi:"attr,apply-duration-average"` + PlanDurationAverage time.Duration `jsonapi:"attr,plan-duration-average"` + PolicyCheckFailures int `jsonapi:"attr,policy-check-failures"` + RunFailures int `jsonapi:"attr,run-failures"` + RunsCount int `jsonapi:"attr,workspace-kpis-runs-count"` // Relations AgentPool *AgentPool `jsonapi:"relation,agent-pool"` @@ -285,6 +286,12 @@ type WorkspaceCreateOptions struct { // documentation or other info about the client. SourceURL *string `jsonapi:"attr,source-url,omitempty"` + // BETA. Enable the experimental advanced run user interface. + // This only applies to runs using Terraform version 0.15.2 or newer, + // and runs executed using older versions will see the classic experience + // regardless of this setting. + StructuredRunOutputEnabled *bool `jsonapi:"attr,structured-run-output-enabled,omitempty"` + // The version of Terraform to use for this workspace. Upon creating a // workspace, the latest version is selected unless otherwise specified. TerraformVersion *string `jsonapi:"attr,terraform-version,omitempty"` @@ -499,6 +506,12 @@ type WorkspaceUpdateOptions struct { // repository is public or includes untrusted contributors. SpeculativeEnabled *bool `jsonapi:"attr,speculative-enabled,omitempty"` + // BETA. Enable the experimental advanced run user interface. + // This only applies to runs using Terraform version 0.15.2 or newer, + // and runs executed using older versions will see the classic experience + // regardless of this setting. + StructuredRunOutputEnabled *bool `jsonapi:"attr,structured-run-output-enabled,omitempty"` + // The version of Terraform to use for this workspace. TerraformVersion *string `jsonapi:"attr,terraform-version,omitempty"` diff --git a/workspace_test.go b/workspace_test.go index ae8eb98b0..6097118b3 100644 --- a/workspace_test.go +++ b/workspace_test.go @@ -105,19 +105,20 @@ func TestWorkspacesCreate(t *testing.T) { t.Run("with valid options", func(t *testing.T) { options := WorkspaceCreateOptions{ - Name: String("foo"), - AllowDestroyPlan: Bool(false), - AutoApply: Bool(true), - Description: String("qux"), - FileTriggersEnabled: Bool(true), - Operations: Bool(true), - QueueAllRuns: Bool(true), - SpeculativeEnabled: Bool(true), - SourceName: String("my-app"), - SourceURL: String("http://my-app-hostname.io"), - TerraformVersion: String("0.11.0"), - TriggerPrefixes: []string{"/modules", "/shared"}, - WorkingDirectory: String("bar/"), + Name: String("foo"), + AllowDestroyPlan: Bool(false), + AutoApply: Bool(true), + Description: String("qux"), + FileTriggersEnabled: Bool(true), + Operations: Bool(true), + QueueAllRuns: Bool(true), + SpeculativeEnabled: Bool(true), + SourceName: String("my-app"), + SourceURL: String("http://my-app-hostname.io"), + StructuredRunOutputEnabled: Bool(true), + TerraformVersion: String("0.11.0"), + TriggerPrefixes: []string{"/modules", "/shared"}, + WorkingDirectory: String("bar/"), } w, err := client.Workspaces.Create(ctx, orgTest.Name, options) @@ -142,6 +143,7 @@ func TestWorkspacesCreate(t *testing.T) { assert.Equal(t, *options.SpeculativeEnabled, item.SpeculativeEnabled) assert.Equal(t, *options.SourceName, item.SourceName) assert.Equal(t, *options.SourceURL, item.SourceURL) + assert.Equal(t, *options.StructuredRunOutputEnabled, item.StructuredRunOutputEnabled) assert.Equal(t, *options.TerraformVersion, item.TerraformVersion) assert.Equal(t, options.TriggerPrefixes, item.TriggerPrefixes) assert.Equal(t, *options.WorkingDirectory, item.WorkingDirectory) @@ -385,17 +387,18 @@ func TestWorkspacesUpdate(t *testing.T) { t.Run("with valid options", func(t *testing.T) { options := WorkspaceUpdateOptions{ - Name: String(randomString(t)), - AllowDestroyPlan: Bool(true), - AutoApply: Bool(false), - FileTriggersEnabled: Bool(true), - Operations: Bool(false), - QueueAllRuns: Bool(false), - SpeculativeEnabled: Bool(true), - Description: String("updated description"), - TerraformVersion: String("0.11.1"), - TriggerPrefixes: []string{"/modules", "/shared"}, - WorkingDirectory: String("baz/"), + Name: String(randomString(t)), + AllowDestroyPlan: Bool(true), + AutoApply: Bool(false), + FileTriggersEnabled: Bool(true), + Operations: Bool(false), + QueueAllRuns: Bool(false), + SpeculativeEnabled: Bool(true), + Description: String("updated description"), + StructuredRunOutputEnabled: Bool(true), + TerraformVersion: String("0.11.1"), + TriggerPrefixes: []string{"/modules", "/shared"}, + WorkingDirectory: String("baz/"), } w, err := client.Workspaces.Update(ctx, orgTest.Name, wTest.Name, options) @@ -417,6 +420,7 @@ func TestWorkspacesUpdate(t *testing.T) { assert.Equal(t, *options.Operations, item.Operations) assert.Equal(t, *options.QueueAllRuns, item.QueueAllRuns) assert.Equal(t, *options.SpeculativeEnabled, item.SpeculativeEnabled) + assert.Equal(t, *options.StructuredRunOutputEnabled, item.StructuredRunOutputEnabled) assert.Equal(t, *options.TerraformVersion, item.TerraformVersion) assert.Equal(t, options.TriggerPrefixes, item.TriggerPrefixes) assert.Equal(t, *options.WorkingDirectory, item.WorkingDirectory) @@ -497,16 +501,17 @@ func TestWorkspacesUpdateByID(t *testing.T) { t.Run("with valid options", func(t *testing.T) { options := WorkspaceUpdateOptions{ - Name: String(randomString(t)), - AllowDestroyPlan: Bool(true), - AutoApply: Bool(false), - FileTriggersEnabled: Bool(true), - Operations: Bool(false), - QueueAllRuns: Bool(false), - SpeculativeEnabled: Bool(true), - TerraformVersion: String("0.11.1"), - TriggerPrefixes: []string{"/modules", "/shared"}, - WorkingDirectory: String("baz/"), + Name: String(randomString(t)), + AllowDestroyPlan: Bool(true), + AutoApply: Bool(false), + FileTriggersEnabled: Bool(true), + Operations: Bool(false), + QueueAllRuns: Bool(false), + SpeculativeEnabled: Bool(true), + StructuredRunOutputEnabled: Bool(true), + TerraformVersion: String("0.11.1"), + TriggerPrefixes: []string{"/modules", "/shared"}, + WorkingDirectory: String("baz/"), } w, err := client.Workspaces.UpdateByID(ctx, wTest.ID, options) @@ -527,6 +532,7 @@ func TestWorkspacesUpdateByID(t *testing.T) { assert.Equal(t, *options.Operations, item.Operations) assert.Equal(t, *options.QueueAllRuns, item.QueueAllRuns) assert.Equal(t, *options.SpeculativeEnabled, item.SpeculativeEnabled) + assert.Equal(t, *options.StructuredRunOutputEnabled, item.StructuredRunOutputEnabled) assert.Equal(t, *options.TerraformVersion, item.TerraformVersion) assert.Equal(t, options.TriggerPrefixes, item.TriggerPrefixes) assert.Equal(t, *options.WorkingDirectory, item.WorkingDirectory) @@ -1051,7 +1057,7 @@ func TestWorkspace_Unmarshal(t *testing.T) { require.NoError(t, err) iso8601TimeFormat := "2006-01-02T15:04:05Z" - parsedTime, err := time.Parse(iso8601TimeFormat, "2020-07-15T23:38:43.821Z") + parsedTime, _ := time.Parse(iso8601TimeFormat, "2020-07-15T23:38:43.821Z") assert.Equal(t, ws.ID, "ws-1234") assert.Equal(t, ws.Name, "my-workspace")