From 4e918b9c7a1c896d02e5cf8a5efa4c4b4ea6f9a5 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Tue, 28 Jun 2022 14:06:12 +0100 Subject: [PATCH] schema: Introduce 1.1 terraform cloud block --- internal/schema/1.1/root.go | 14 +++++++ internal/schema/1.1/terraform.go | 67 ++++++++++++++++++++++++++++++++ internal/schema/1.2/root.go | 4 +- schema/core_schema.go | 5 +++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 internal/schema/1.1/root.go create mode 100644 internal/schema/1.1/terraform.go diff --git a/internal/schema/1.1/root.go b/internal/schema/1.1/root.go new file mode 100644 index 00000000..6100b002 --- /dev/null +++ b/internal/schema/1.1/root.go @@ -0,0 +1,14 @@ +package schema + +import ( + "github.com/hashicorp/go-version" + "github.com/hashicorp/hcl-lang/schema" + + v015_mod "github.com/hashicorp/terraform-schema/internal/schema/0.15" +) + +func ModuleSchema(v *version.Version) *schema.BodySchema { + bs := v015_mod.ModuleSchema(v) + bs.Blocks["terraform"] = patchTerraformBlockSchema(bs.Blocks["terraform"], v) + return bs +} diff --git a/internal/schema/1.1/terraform.go b/internal/schema/1.1/terraform.go new file mode 100644 index 00000000..90db004b --- /dev/null +++ b/internal/schema/1.1/terraform.go @@ -0,0 +1,67 @@ +package schema + +import ( + "github.com/hashicorp/go-version" + "github.com/hashicorp/hcl-lang/lang" + "github.com/hashicorp/hcl-lang/schema" + "github.com/zclconf/go-cty/cty" +) + +func patchTerraformBlockSchema(bs *schema.BlockSchema, v *version.Version) *schema.BlockSchema { + bs.Body.Blocks["cloud"] = &schema.BlockSchema{ + Description: lang.PlainText("Terraform Cloud configuration"), + MaxItems: 1, + Body: &schema.BodySchema{ + Attributes: map[string]*schema.AttributeSchema{ + "hostname": { + Expr: schema.LiteralTypeOnly(cty.String), + IsOptional: true, + Description: lang.Markdown("The Terraform Enterprise hostname to connect to. " + + "This optional argument defaults to `app.terraform.io` for use with Terraform Cloud."), + }, + "organization": { + Expr: schema.LiteralTypeOnly(cty.String), + IsRequired: true, + Description: lang.PlainText("The name of the organization containing the targeted workspace(s)."), + }, + "token": { + Expr: schema.LiteralTypeOnly(cty.String), + IsOptional: true, + Description: lang.Markdown("The token used to authenticate with Terraform Cloud/Enterprise. " + + "Typically this argument should not be set, and `terraform login` used instead; " + + "your credentials will then be fetched from your CLI configuration file " + + "or configured credential helper."), + }, + }, + Blocks: map[string]*schema.BlockSchema{ + "workspaces": { + Description: lang.Markdown("Workspace mapping strategy, either workspace `tags` or `name` is required."), + MaxItems: 1, + Body: &schema.BodySchema{ + Attributes: map[string]*schema.AttributeSchema{ + "name": { + Expr: schema.LiteralTypeOnly(cty.String), + IsOptional: true, + Description: lang.Markdown("The name of a single Terraform Cloud workspace " + + "to be used with this configuration When configured only the specified workspace " + + "can be used. This option conflicts with `tags`."), + }, + "tags": { + Expr: schema.ExprConstraints{ + schema.SetExpr{Elem: schema.LiteralTypeOnly(cty.String)}, + }, + IsOptional: true, + Description: lang.Markdown("A set of tags used to select remote Terraform Cloud workspaces" + + " to be used for this single configuration. New workspaces will automatically be tagged " + + "with these tag values. Generally, this is the primary and recommended strategy to use. " + + "This option conflicts with `name`."), + }, + }, + }, + }, + }, + }, + } + + return bs +} diff --git a/internal/schema/1.2/root.go b/internal/schema/1.2/root.go index dd8ab605..6dbf57b9 100644 --- a/internal/schema/1.2/root.go +++ b/internal/schema/1.2/root.go @@ -6,13 +6,13 @@ import ( "github.com/hashicorp/hcl-lang/schema" "github.com/zclconf/go-cty/cty" - v015_mod "github.com/hashicorp/terraform-schema/internal/schema/0.15" + v1_1_mod "github.com/hashicorp/terraform-schema/internal/schema/1.1" ) var v1_2 = version.Must(version.NewVersion("1.2.0")) func ModuleSchema(v *version.Version) *schema.BodySchema { - bs := v015_mod.ModuleSchema(v) + bs := v1_1_mod.ModuleSchema(v) if v.GreaterThanOrEqual(v1_2) { bs.Blocks["data"].Body.Blocks = map[string]*schema.BlockSchema{ "lifecycle": datasourceLifecycleBlock, diff --git a/schema/core_schema.go b/schema/core_schema.go index f20abc8e..801e7a8a 100644 --- a/schema/core_schema.go +++ b/schema/core_schema.go @@ -9,6 +9,7 @@ import ( mod_v0_13 "github.com/hashicorp/terraform-schema/internal/schema/0.13" mod_v0_14 "github.com/hashicorp/terraform-schema/internal/schema/0.14" mod_v0_15 "github.com/hashicorp/terraform-schema/internal/schema/0.15" + mod_v1_1 "github.com/hashicorp/terraform-schema/internal/schema/1.1" mod_v1_2 "github.com/hashicorp/terraform-schema/internal/schema/1.2" universal "github.com/hashicorp/terraform-schema/internal/schema/universal" ) @@ -18,6 +19,7 @@ var ( v0_13 = version.Must(version.NewVersion("0.13")) v0_14 = version.Must(version.NewVersion("0.14")) v0_15 = version.Must(version.NewVersion("0.15")) + v1_1 = version.Must(version.NewVersion("1.1")) v1_2 = version.Must(version.NewVersion("1.2")) ) @@ -33,6 +35,9 @@ func CoreModuleSchemaForVersion(v *version.Version) (*schema.BodySchema, error) if ver.GreaterThanOrEqual(v1_2) { return mod_v1_2.ModuleSchema(ver), nil } + if ver.GreaterThanOrEqual(v1_1) { + return mod_v1_1.ModuleSchema(ver), nil + } if ver.GreaterThanOrEqual(v0_15) { return mod_v0_15.ModuleSchema(ver), nil }