From 39fbffa65b23b7b3b4bd25c0758b87213bb49f8d Mon Sep 17 00:00:00 2001 From: "dmytro.malikin" Date: Mon, 4 Dec 2023 10:26:55 +0200 Subject: [PATCH] SCALRCORE-28912: Add iac-platform attribute to the workspace resource and data source --- CHANGELOG.md | 2 ++ docs/resources/workspace.md | 1 + go.mod | 2 +- go.sum | 4 ++-- scalr/data_source_scalr_workspace.go | 7 ++++++ scalr/data_source_scalr_workspace_test.go | 3 +++ scalr/resource_scalr_workspace.go | 28 ++++++++++++++++++++--- scalr/resource_scalr_workspace_test.go | 4 ++++ 8 files changed, 45 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a259a8a2..0873b384 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `scalr_service_account`: new attribute `owners` ([#289](https://github.com/Scalr/terraform-provider-scalr/pull/289)) - `data.scalr_service_account`: new attribute `owners` ([#289](https://github.com/Scalr/terraform-provider-scalr/pull/289)) +- `scalr_workspace`: new attribute `iac-platform` ([]()) +- `data.scalr_workspace`: new attribute `iac-platform` ([]()) ### Changed diff --git a/docs/resources/workspace.md b/docs/resources/workspace.md index 34fe775b..4224e897 100644 --- a/docs/resources/workspace.md +++ b/docs/resources/workspace.md @@ -159,6 +159,7 @@ resource "scalr_workspace" "example-b" { - `execution_mode` (String) Which execution mode to use. Valid values are `remote` and `local`. When set to `local`, the workspace will be used for state storage only. Defaults to `remote` (not set, backend default is used). - `force_latest_run` (Boolean) Set (true/false) to configure if latest new run will be automatically raised in priority. Default `false`. - `hooks` (Block List) Settings for the workspaces custom hooks. (see [below for nested schema](#nestedblock--hooks)) +- `iac_platform` (String) The IaC platform to use for this workspace. Valid values are `terraform` and `opentofu`. Defaults to `terraform`. - `module_version_id` (String) The identifier of a module version in the format `modver-`. This attribute conflicts with `vcs_provider_id` and `vcs_repo` attributes. - `operations` (Boolean, Deprecated) Set (true/false) to configure workspace remote execution. When `false` workspace is only used to store state. Defaults to `true`. - `provider_configuration` (Block Set) Provider configurations used in workspace runs. (see [below for nested schema](#nestedblock--provider_configuration)) diff --git a/go.mod b/go.mod index 97cb6ca1..8ec42051 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/hashicorp/terraform-plugin-docs v0.16.0 github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1 github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 - github.com/scalr/go-scalr v0.0.0-20231127161513-5526b467eebc + github.com/scalr/go-scalr v0.0.0-20231204082256-f94a55cbf7fa ) require ( diff --git a/go.sum b/go.sum index 6c4250df..8af75415 100644 --- a/go.sum +++ b/go.sum @@ -260,8 +260,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/scalr/go-scalr v0.0.0-20231127161513-5526b467eebc h1:TvEXZ34Q3rS8dab1zO5pNqTQDDjPZrKBBw44PycKV3A= -github.com/scalr/go-scalr v0.0.0-20231127161513-5526b467eebc/go.mod h1:p34SHb25YRvbgft7SUjSDYESeoQhWzAlxGXId/BbaSE= +github.com/scalr/go-scalr v0.0.0-20231204082256-f94a55cbf7fa h1:/gnbCaGFSHS+nv8CH4sxLMbvCuHaWtERe1gaDD5ZiWY= +github.com/scalr/go-scalr v0.0.0-20231204082256-f94a55cbf7fa/go.mod h1:p34SHb25YRvbgft7SUjSDYESeoQhWzAlxGXId/BbaSE= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= diff --git a/scalr/data_source_scalr_workspace.go b/scalr/data_source_scalr_workspace.go index 56cbc0b3..915fce14 100644 --- a/scalr/data_source_scalr_workspace.go +++ b/scalr/data_source_scalr_workspace.go @@ -94,6 +94,12 @@ func dataSourceScalrWorkspace() *schema.Resource { Computed: true, }, + "iac_platform": { + Description: "The IaC platform used for this workspace.", + Type: schema.TypeString, + Computed: true, + }, + "working_directory": { Description: "A relative path that Terraform will execute within.", Type: schema.TypeString, @@ -262,6 +268,7 @@ func dataSourceScalrWorkspaceRead(ctx context.Context, d *schema.ResourceData, m _ = d.Set("operations", workspace.Operations) _ = d.Set("execution_mode", workspace.ExecutionMode) _ = d.Set("terraform_version", workspace.TerraformVersion) + _ = d.Set("iac_platform", workspace.IaCPlatform) _ = d.Set("working_directory", workspace.WorkingDirectory) _ = d.Set("has_resources", workspace.HasResources) _ = d.Set("auto_queue_runs", workspace.AutoQueueRuns) diff --git a/scalr/data_source_scalr_workspace_test.go b/scalr/data_source_scalr_workspace_test.go index 8e7b8229..64436825 100644 --- a/scalr/data_source_scalr_workspace_test.go +++ b/scalr/data_source_scalr_workspace_test.go @@ -40,6 +40,8 @@ func TestAccScalrWorkspaceDataSource_basic(t *testing.T) { "data.scalr_workspace.test", "auto_apply", "true"), resource.TestCheckResourceAttr( "data.scalr_workspace.test", "terraform_version", "1.1.9"), + resource.TestCheckResourceAttr( + "data.scalr_workspace.test", "iac_platform", "terraform"), resource.TestCheckResourceAttr( "data.scalr_workspace.test", "working_directory", "terraform/test"), resource.TestCheckResourceAttr( @@ -115,6 +117,7 @@ resource scalr_workspace test { environment_id = scalr_environment.test.id auto_apply = true terraform_version = "1.1.9" + iac_platform = "terraform" working_directory = "terraform/test" hooks { pre_init = "./scripts/pre-init.sh" diff --git a/scalr/resource_scalr_workspace.go b/scalr/resource_scalr_workspace.go index 734e033c..9e01c778 100644 --- a/scalr/resource_scalr_workspace.go +++ b/scalr/resource_scalr_workspace.go @@ -4,14 +4,13 @@ import ( "context" "errors" "fmt" + "github.com/scalr/go-scalr" "log" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" - - "github.com/scalr/go-scalr" ) func resourceScalrWorkspace() *schema.Resource { @@ -142,6 +141,20 @@ func resourceScalrWorkspace() *schema.Resource { Computed: true, }, + "iac_platform": { + Description: "The IaC platform to use for this workspace. Valid values are `terraform` and `opentofu`. Defaults to `terraform`.", + Type: schema.TypeString, + Optional: true, + Default: string(scalr.WorkspaceIaCPlatformTerraform), + ValidateFunc: validation.StringInSlice( + []string{ + string(scalr.WorkspaceIaCPlatformTerraform), + string(scalr.WorkspaceIaCPlatformOpenTofu), + }, + false, + ), + }, + "working_directory": { Description: "A relative path that Terraform will be run in. Defaults to the root of the repository `\"\"`.", Type: schema.TypeString, @@ -390,6 +403,10 @@ func resourceScalrWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m options.TerraformVersion = scalr.String(tfVersion.(string)) } + if iacPlatform, ok := d.GetOk("iac_platform"); ok { + options.IacPlatform = scalr.WorkspaceIaCPlatformPtr(scalr.WorkspaceIaCPlatform(iacPlatform.(string))) + } + if workingDir, ok := d.GetOk("working_directory"); ok { options.WorkingDirectory = scalr.String(workingDir.(string)) } @@ -521,6 +538,7 @@ func resourceScalrWorkspaceRead(ctx context.Context, d *schema.ResourceData, met _ = d.Set("operations", workspace.Operations) _ = d.Set("execution_mode", workspace.ExecutionMode) _ = d.Set("terraform_version", workspace.TerraformVersion) + _ = d.Set("iac_platform", workspace.IaCPlatform) _ = d.Set("working_directory", workspace.WorkingDirectory) _ = d.Set("environment_id", workspace.Environment.ID) _ = d.Set("has_resources", workspace.HasResources) @@ -625,7 +643,7 @@ func resourceScalrWorkspaceUpdate(ctx context.Context, d *schema.ResourceData, m d.HasChange("vcs_repo") || d.HasChange("operations") || d.HasChange("execution_mode") || d.HasChange("vcs_provider_id") || d.HasChange("agent_pool_id") || d.HasChange("deletion_protection_enabled") || d.HasChange("hooks") || d.HasChange("module_version_id") || d.HasChange("var_files") || - d.HasChange("run_operation_timeout") { + d.HasChange("run_operation_timeout") || d.HasChange("iac_platform") { // Create a new options struct. options := scalr.WorkspaceUpdateOptions{ Name: scalr.String(d.Get("name").(string)), @@ -662,6 +680,10 @@ func resourceScalrWorkspaceUpdate(ctx context.Context, d *schema.ResourceData, m options.TerraformVersion = scalr.String(tfVersion.(string)) } + if iacPlatform, ok := d.GetOk("iac_platform"); ok { + options.IacPlatform = scalr.WorkspaceIaCPlatformPtr(scalr.WorkspaceIaCPlatform(iacPlatform.(string))) + } + if v, ok := d.Get("var_files").([]interface{}); ok { varFiles := make([]string, 0) for _, varFile := range v { diff --git a/scalr/resource_scalr_workspace_test.go b/scalr/resource_scalr_workspace_test.go index 0159a20c..97836254 100644 --- a/scalr/resource_scalr_workspace_test.go +++ b/scalr/resource_scalr_workspace_test.go @@ -250,6 +250,8 @@ func TestAccScalrWorkspace_update(t *testing.T) { "scalr_workspace.test", "execution_mode", string(scalr.WorkspaceExecutionModeLocal)), resource.TestCheckResourceAttr( "scalr_workspace.test", "terraform_version", "1.1.9"), + resource.TestCheckResourceAttr( + "scalr_workspace.test", "iac_platform", string(scalr.WorkspaceIaCPlatformTerraform)), resource.TestCheckResourceAttr( "scalr_workspace.test", "working_directory", "terraform/test"), resource.TestCheckResourceAttr( @@ -287,6 +289,8 @@ func TestAccScalrWorkspace_update(t *testing.T) { "scalr_workspace.test", "execution_mode", string(scalr.WorkspaceExecutionModeLocal)), resource.TestCheckResourceAttr( "scalr_workspace.test", "terraform_version", "1.1.9"), + resource.TestCheckResourceAttr( + "scalr_workspace.test", "iac_platform", string(scalr.WorkspaceIaCPlatformTerraform)), resource.TestCheckResourceAttr( "scalr_workspace.test", "working_directory", "terraform/test"), resource.TestCheckResourceAttr(