From 86bd319381d4862e8d09665000c1af4e43b59375 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Thu, 4 Aug 2022 20:36:12 +0100 Subject: [PATCH] schema: plumb TF version generator via go generate --- schema/core_schema.go | 13 +- schema/core_schema_test.go | 49 ++++++++ schema/errors.go | 21 ++++ schema/versions_gen.go | 248 +++++++++++++++++++++++++++++++++++++ 4 files changed, 330 insertions(+), 1 deletion(-) create mode 100755 schema/versions_gen.go diff --git a/schema/core_schema.go b/schema/core_schema.go index 801e7a8a..9e980b39 100644 --- a/schema/core_schema.go +++ b/schema/core_schema.go @@ -51,7 +51,18 @@ func CoreModuleSchemaForVersion(v *version.Version) (*schema.BodySchema, error) return mod_v0_12.ModuleSchema(ver), nil } - return nil, fmt.Errorf("no compatible schema found for %s", v.String()) + return nil, NoCompatibleSchemaErr{Version: ver} +} + +//go:generate go run ../internal/versiongen -w ./versions_gen.go +func CoreModuleSchemaForConstraint(vc version.Constraints) (*schema.BodySchema, error) { + for _, v := range terraformVersions { + if vc.Check(v) { + return CoreModuleSchemaForVersion(v) + } + } + + return nil, NoCompatibleSchemaErr{Constraints: vc} } func semVer(ver *version.Version) (*version.Version, error) { diff --git a/schema/core_schema_test.go b/schema/core_schema_test.go index 5669d26c..acd2ed27 100644 --- a/schema/core_schema_test.go +++ b/schema/core_schema_test.go @@ -106,4 +106,53 @@ func TestCoreModuleSchemaForVersion_matching(t *testing.T) { } } +func TestCoreModuleSchemaForConstraint(t *testing.T) { + testCases := []struct { + constraint version.Constraints + matchedSchema *schema.BodySchema + expectedErr error + }{ + { + version.MustConstraints(version.NewConstraint(">= 0.12, < 0.13")), + mod_v0_12.ModuleSchema(version.Must(version.NewVersion("0.12.31"))), + nil, + }, + { + version.Constraints{}, + mod_v1_2.ModuleSchema(version.Must(version.NewVersion("1.3.0"))), + nil, + }, + { + version.MustConstraints(version.NewConstraint("< 0.12")), + nil, + fmt.Errorf("no compatible schema found for 0.11.15"), + }, + { + version.MustConstraints(version.NewConstraint("> 999.999.999")), + nil, + fmt.Errorf("no compatible schema found for > 999.999.999"), + }, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("%d-%s", i, tc.constraint.String()), func(t *testing.T) { + bodySchema, err := CoreModuleSchemaForConstraint(tc.constraint) + if err != nil && tc.expectedErr == nil { + t.Fatal(err) + } + if err != nil && err.Error() != tc.expectedErr.Error() { + t.Fatalf("expected error: %q, given: %q", err.Error(), tc.expectedErr.Error()) + } + if err == nil && tc.expectedErr != nil { + t.Fatalf("expected error: %q", tc.expectedErr.Error()) + } + + expectedSchema := tc.matchedSchema + if diff := cmp.Diff(expectedSchema, bodySchema, ctydebug.CmpOptions); diff != "" { + t.Fatalf("schema mismatch: %s", diff) + } + }) + } +} + type versionedBodySchema func(*version.Version) *schema.BodySchema diff --git a/schema/errors.go b/schema/errors.go index 466c3b72..d055f79b 100644 --- a/schema/errors.go +++ b/schema/errors.go @@ -1,7 +1,28 @@ package schema +import ( + "fmt" + + "github.com/hashicorp/go-version" +) + type coreSchemaRequiredErr struct{} func (e coreSchemaRequiredErr) Error() string { return "core schema required (none provided)" } + +type NoCompatibleSchemaErr struct { + Version *version.Version + Constraints version.Constraints +} + +func (e NoCompatibleSchemaErr) Error() string { + if e.Version != nil { + return fmt.Sprintf("no compatible schema found for %s", e.Version) + } + if e.Constraints != nil && len(e.Constraints) > 0 { + return fmt.Sprintf("no compatible schema found for %s", e.Constraints) + } + return "no compatible schema found" +} diff --git a/schema/versions_gen.go b/schema/versions_gen.go new file mode 100755 index 00000000..991ada75 --- /dev/null +++ b/schema/versions_gen.go @@ -0,0 +1,248 @@ +// Code generated by "versiongen"; DO NOT EDIT. +package schema + +import ( + "github.com/hashicorp/go-version" +) + +var ( + OldestAvailableVersion = version.Must(version.NewVersion("0.12.0")) + LatestAvailableVersion = version.Must(version.NewVersion("1.3.0-alpha20220803")) + + terraformVersions = version.Collection{ + version.Must(version.NewVersion("1.3.0-alpha20220803")), + version.Must(version.NewVersion("1.3.0-alpha20220706")), + version.Must(version.NewVersion("1.3.0-alpha20220622")), + version.Must(version.NewVersion("1.3.0-alpha20220608")), + version.Must(version.NewVersion("1.2.6")), + version.Must(version.NewVersion("1.2.5")), + version.Must(version.NewVersion("1.2.4")), + version.Must(version.NewVersion("1.2.3")), + version.Must(version.NewVersion("1.2.2")), + version.Must(version.NewVersion("1.2.1")), + version.Must(version.NewVersion("1.2.0")), + version.Must(version.NewVersion("1.2.0-rc2")), + version.Must(version.NewVersion("1.2.0-rc1")), + version.Must(version.NewVersion("1.2.0-beta1")), + version.Must(version.NewVersion("1.2.0-alpha20220413")), + version.Must(version.NewVersion("1.2.0-alpha-20220328")), + version.Must(version.NewVersion("1.1.9")), + version.Must(version.NewVersion("1.1.8")), + version.Must(version.NewVersion("1.1.7")), + version.Must(version.NewVersion("1.1.6")), + version.Must(version.NewVersion("1.1.5")), + version.Must(version.NewVersion("1.1.4")), + version.Must(version.NewVersion("1.1.3")), + version.Must(version.NewVersion("1.1.2")), + version.Must(version.NewVersion("1.1.1")), + version.Must(version.NewVersion("1.1.0")), + version.Must(version.NewVersion("1.1.0-rc1")), + version.Must(version.NewVersion("1.1.0-beta2")), + version.Must(version.NewVersion("1.1.0-beta1")), + version.Must(version.NewVersion("1.1.0-alpha20211029")), + version.Must(version.NewVersion("1.1.0-alpha20211020")), + version.Must(version.NewVersion("1.1.0-alpha20211006")), + version.Must(version.NewVersion("1.1.0-alpha20210922")), + version.Must(version.NewVersion("1.1.0-alpha20210908")), + version.Must(version.NewVersion("1.1.0-alpha20210811")), + version.Must(version.NewVersion("1.1.0-alpha20210728")), + version.Must(version.NewVersion("1.1.0-alpha20210714")), + version.Must(version.NewVersion("1.1.0-alpha20210630")), + version.Must(version.NewVersion("1.1.0-alpha20210616")), + version.Must(version.NewVersion("1.0.11")), + version.Must(version.NewVersion("1.0.10")), + version.Must(version.NewVersion("1.0.9")), + version.Must(version.NewVersion("1.0.8")), + version.Must(version.NewVersion("1.0.7")), + version.Must(version.NewVersion("1.0.6")), + version.Must(version.NewVersion("1.0.5")), + version.Must(version.NewVersion("1.0.4")), + version.Must(version.NewVersion("1.0.3")), + version.Must(version.NewVersion("1.0.2")), + version.Must(version.NewVersion("1.0.1")), + version.Must(version.NewVersion("1.0.0")), + version.Must(version.NewVersion("0.15.5")), + version.Must(version.NewVersion("0.15.4")), + version.Must(version.NewVersion("0.15.3")), + version.Must(version.NewVersion("0.15.2")), + version.Must(version.NewVersion("0.15.1")), + version.Must(version.NewVersion("0.15.0")), + version.Must(version.NewVersion("0.15.0-rc2")), + version.Must(version.NewVersion("0.15.0-rc1")), + version.Must(version.NewVersion("0.15.0-beta2")), + version.Must(version.NewVersion("0.15.0-beta1")), + version.Must(version.NewVersion("0.15.0-alpha20210210")), + version.Must(version.NewVersion("0.15.0-alpha20210127")), + version.Must(version.NewVersion("0.15.0-alpha20210107")), + version.Must(version.NewVersion("0.14.11")), + version.Must(version.NewVersion("0.14.10")), + version.Must(version.NewVersion("0.14.9")), + version.Must(version.NewVersion("0.14.8")), + version.Must(version.NewVersion("0.14.7")), + version.Must(version.NewVersion("0.14.6")), + version.Must(version.NewVersion("0.14.5")), + version.Must(version.NewVersion("0.14.4")), + version.Must(version.NewVersion("0.14.3")), + version.Must(version.NewVersion("0.14.2")), + version.Must(version.NewVersion("0.14.1")), + version.Must(version.NewVersion("0.14.0")), + version.Must(version.NewVersion("0.14.0-rc1")), + version.Must(version.NewVersion("0.14.0-beta2")), + version.Must(version.NewVersion("0.14.0-beta1")), + version.Must(version.NewVersion("0.14.0-alpha20201007")), + version.Must(version.NewVersion("0.14.0-alpha20200923")), + version.Must(version.NewVersion("0.14.0-alpha20200910")), + version.Must(version.NewVersion("0.13.7")), + version.Must(version.NewVersion("0.13.6")), + version.Must(version.NewVersion("0.13.5")), + version.Must(version.NewVersion("0.13.4")), + version.Must(version.NewVersion("0.13.3")), + version.Must(version.NewVersion("0.13.2")), + version.Must(version.NewVersion("0.13.1")), + version.Must(version.NewVersion("0.13.0")), + version.Must(version.NewVersion("0.13.0-rc1")), + version.Must(version.NewVersion("0.13.0-beta3")), + version.Must(version.NewVersion("0.13.0-beta2")), + version.Must(version.NewVersion("0.13.0-beta1")), + version.Must(version.NewVersion("0.12.31")), + version.Must(version.NewVersion("0.12.30")), + version.Must(version.NewVersion("0.12.29")), + version.Must(version.NewVersion("0.12.28")), + version.Must(version.NewVersion("0.12.27")), + version.Must(version.NewVersion("0.12.26")), + version.Must(version.NewVersion("0.12.25")), + version.Must(version.NewVersion("0.12.24")), + version.Must(version.NewVersion("0.12.23")), + version.Must(version.NewVersion("0.12.22")), + version.Must(version.NewVersion("0.12.21")), + version.Must(version.NewVersion("0.12.20")), + version.Must(version.NewVersion("0.12.19")), + version.Must(version.NewVersion("0.12.18")), + version.Must(version.NewVersion("0.12.17")), + version.Must(version.NewVersion("0.12.16")), + version.Must(version.NewVersion("0.12.15")), + version.Must(version.NewVersion("0.12.14")), + version.Must(version.NewVersion("0.12.13")), + version.Must(version.NewVersion("0.12.12")), + version.Must(version.NewVersion("0.12.11")), + version.Must(version.NewVersion("0.12.10")), + version.Must(version.NewVersion("0.12.9")), + version.Must(version.NewVersion("0.12.8")), + version.Must(version.NewVersion("0.12.7")), + version.Must(version.NewVersion("0.12.6")), + version.Must(version.NewVersion("0.12.5")), + version.Must(version.NewVersion("0.12.4")), + version.Must(version.NewVersion("0.12.3")), + version.Must(version.NewVersion("0.12.2")), + version.Must(version.NewVersion("0.12.1")), + version.Must(version.NewVersion("0.12.0")), + version.Must(version.NewVersion("0.12.0-rc1")), + version.Must(version.NewVersion("0.12.0-beta2")), + version.Must(version.NewVersion("0.12.0-beta1")), + version.Must(version.NewVersion("0.12.0-alpha4")), + version.Must(version.NewVersion("0.12.0-alpha3")), + version.Must(version.NewVersion("0.12.0-alpha2")), + version.Must(version.NewVersion("0.12.0-alpha1")), + version.Must(version.NewVersion("0.11.15")), + version.Must(version.NewVersion("0.11.15-oci")), + version.Must(version.NewVersion("0.11.14")), + version.Must(version.NewVersion("0.11.13")), + version.Must(version.NewVersion("0.11.12")), + version.Must(version.NewVersion("0.11.12-beta1")), + version.Must(version.NewVersion("0.11.11")), + version.Must(version.NewVersion("0.11.10")), + version.Must(version.NewVersion("0.11.9")), + version.Must(version.NewVersion("0.11.9-beta1")), + version.Must(version.NewVersion("0.11.8")), + version.Must(version.NewVersion("0.11.7")), + version.Must(version.NewVersion("0.11.6")), + version.Must(version.NewVersion("0.11.5")), + version.Must(version.NewVersion("0.11.4")), + version.Must(version.NewVersion("0.11.3")), + version.Must(version.NewVersion("0.11.2")), + version.Must(version.NewVersion("0.11.1")), + version.Must(version.NewVersion("0.11.0")), + version.Must(version.NewVersion("0.11.0-rc1")), + version.Must(version.NewVersion("0.11.0-beta1")), + version.Must(version.NewVersion("0.10.8")), + version.Must(version.NewVersion("0.10.7")), + version.Must(version.NewVersion("0.10.6")), + version.Must(version.NewVersion("0.10.5")), + version.Must(version.NewVersion("0.10.4")), + version.Must(version.NewVersion("0.10.3")), + version.Must(version.NewVersion("0.10.2")), + version.Must(version.NewVersion("0.10.1")), + version.Must(version.NewVersion("0.10.0")), + version.Must(version.NewVersion("0.10.0-rc1")), + version.Must(version.NewVersion("0.10.0-beta2")), + version.Must(version.NewVersion("0.10.0-beta1")), + version.Must(version.NewVersion("0.9.11")), + version.Must(version.NewVersion("0.9.10")), + version.Must(version.NewVersion("0.9.9")), + version.Must(version.NewVersion("0.9.8")), + version.Must(version.NewVersion("0.9.7")), + version.Must(version.NewVersion("0.9.6")), + version.Must(version.NewVersion("0.9.5")), + version.Must(version.NewVersion("0.9.4")), + version.Must(version.NewVersion("0.9.3")), + version.Must(version.NewVersion("0.9.2")), + version.Must(version.NewVersion("0.9.1")), + version.Must(version.NewVersion("0.9.0")), + version.Must(version.NewVersion("0.8.8")), + version.Must(version.NewVersion("0.8.7")), + version.Must(version.NewVersion("0.8.6")), + version.Must(version.NewVersion("0.8.5")), + version.Must(version.NewVersion("0.8.4")), + version.Must(version.NewVersion("0.8.3")), + version.Must(version.NewVersion("0.8.2")), + version.Must(version.NewVersion("0.8.1")), + version.Must(version.NewVersion("0.8.0")), + version.Must(version.NewVersion("0.7.13")), + version.Must(version.NewVersion("0.7.12")), + version.Must(version.NewVersion("0.7.11")), + version.Must(version.NewVersion("0.7.10")), + version.Must(version.NewVersion("0.7.9")), + version.Must(version.NewVersion("0.7.8")), + version.Must(version.NewVersion("0.7.7")), + version.Must(version.NewVersion("0.7.6")), + version.Must(version.NewVersion("0.7.5")), + version.Must(version.NewVersion("0.7.4")), + version.Must(version.NewVersion("0.7.3")), + version.Must(version.NewVersion("0.7.2")), + version.Must(version.NewVersion("0.7.1")), + version.Must(version.NewVersion("0.7.0")), + version.Must(version.NewVersion("0.6.16")), + version.Must(version.NewVersion("0.6.15")), + version.Must(version.NewVersion("0.6.14")), + version.Must(version.NewVersion("0.6.13")), + version.Must(version.NewVersion("0.6.12")), + version.Must(version.NewVersion("0.6.11")), + version.Must(version.NewVersion("0.6.10")), + version.Must(version.NewVersion("0.6.9")), + version.Must(version.NewVersion("0.6.8")), + version.Must(version.NewVersion("0.6.7")), + version.Must(version.NewVersion("0.6.6")), + version.Must(version.NewVersion("0.6.5")), + version.Must(version.NewVersion("0.6.4")), + version.Must(version.NewVersion("0.6.3")), + version.Must(version.NewVersion("0.6.2")), + version.Must(version.NewVersion("0.6.1")), + version.Must(version.NewVersion("0.6.0")), + version.Must(version.NewVersion("0.5.3")), + version.Must(version.NewVersion("0.5.1")), + version.Must(version.NewVersion("0.5.0")), + version.Must(version.NewVersion("0.4.2")), + version.Must(version.NewVersion("0.4.1")), + version.Must(version.NewVersion("0.4.0")), + version.Must(version.NewVersion("0.3.7")), + version.Must(version.NewVersion("0.3.6")), + version.Must(version.NewVersion("0.3.5")), + version.Must(version.NewVersion("0.3.1")), + version.Must(version.NewVersion("0.3.0")), + version.Must(version.NewVersion("0.2.2")), + version.Must(version.NewVersion("0.2.1")), + version.Must(version.NewVersion("0.2.0")), + version.Must(version.NewVersion("0.1.1")), + version.Must(version.NewVersion("0.1.0")), + } +)