From 623e60b9ca33d72fabbb5fe71cd83803ae6489f1 Mon Sep 17 00:00:00 2001 From: Diogenes Fernandes Date: Mon, 13 Jan 2025 20:48:24 -0300 Subject: [PATCH 1/4] adding provider information to module dependencies Signed-off-by: Diogenes Fernandes --- backend/internal/moduleindex/generator.go | 16 ++++++++++++++++ backend/internal/moduleindex/module_version.go | 2 -- .../moduleindex/moduleschema/extractor_test.go | 11 +++++++++++ .../internal/moduleindex/moduleschema/schema.go | 14 ++++++++------ .../moduleschema/testdata/modulecall/versions.tf | 13 +++++++++++++ .../internal/moduleindex/moduleschema/tofu.go | 1 + 6 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf diff --git a/backend/internal/moduleindex/generator.go b/backend/internal/moduleindex/generator.go index 49580d98..05f083ac 100644 --- a/backend/internal/moduleindex/generator.go +++ b/backend/internal/moduleindex/generator.go @@ -736,6 +736,7 @@ func (g generator) extractModuleSchema(ctx context.Context, directory string, d g.extractModuleVariables(rootModuleSchema, &d.BaseDetails) g.extractModuleOutputs(rootModuleSchema, &d.BaseDetails) g.extractModuleDependencies(rootModuleSchema, d) + g.extractProviderDependencies(moduleSchema, d) g.extractModuleResources(rootModuleSchema, d) return nil } @@ -814,6 +815,21 @@ func (g generator) extractModuleDependencies(moduleSchema moduleschema.ModuleSch d.Dependencies = result } +func (g generator) extractProviderDependencies(schema moduleschema.Schema, d *Details) { + result := make([]ProviderDependency, len(schema.ProviderConfig)) + i := 0 + for providerCallName, providerCall := range schema.ProviderConfig { + result[i] = ProviderDependency{ + Name: providerCallName, + FullName: providerCall.FullName, + VersionConstraint: providerCall.VersionConstraint, + } + i++ + } + + d.Providers = result +} + func (g generator) extractModuleResources(moduleSchema moduleschema.ModuleSchema, d *Details) { result := make([]Resource, len(moduleSchema.Resources)) for i, resource := range moduleSchema.Resources { diff --git a/backend/internal/moduleindex/module_version.go b/backend/internal/moduleindex/module_version.go index 4ba58c2c..775e1f8c 100644 --- a/backend/internal/moduleindex/module_version.go +++ b/backend/internal/moduleindex/module_version.go @@ -74,8 +74,6 @@ type ModuleDependency struct { // ProviderDependency describes a provider dependency of a module. // swagger:model type ProviderDependency struct { - // required:true - Alias string `json:"alias"` // required:true Name string `json:"name"` // required:true diff --git a/backend/internal/moduleindex/moduleschema/extractor_test.go b/backend/internal/moduleindex/moduleschema/extractor_test.go index 3616aec3..21cd2443 100644 --- a/backend/internal/moduleindex/moduleschema/extractor_test.go +++ b/backend/internal/moduleindex/moduleschema/extractor_test.go @@ -2,6 +2,7 @@ package moduleschema_test import ( "context" + "fmt" "os" "runtime" "testing" @@ -95,4 +96,14 @@ func TestModuleCall(t *testing.T) { if metadata.RootModule.ModuleCalls["foo"].Source != "./module" { t.Fatalf("Incorrect module source: %s", metadata.RootModule.ModuleCalls["foo"].Source) } + + _, ok = metadata.ProviderConfig["opentofu"] + if !ok { + t.Fatalf("Provider call not found.") + } + + fmt.Println(metadata.ProviderConfig["opentofu"]) + if metadata.ProviderConfig["opentofu"].Name != "opentofu" { + t.Fatalf("Incorrect provider name: %s != %s", metadata.ProviderConfig["opentofu"].Name, "opentofu") + } } diff --git a/backend/internal/moduleindex/moduleschema/schema.go b/backend/internal/moduleindex/moduleschema/schema.go index a5a58e4e..c19f7774 100644 --- a/backend/internal/moduleindex/moduleschema/schema.go +++ b/backend/internal/moduleindex/moduleschema/schema.go @@ -8,16 +8,18 @@ type Schema struct { // swagger:model ModuleProviderConfigSchema type ProviderConfigSchema struct { - Name string `json:"name"` - FullName string `json:"full_name"` + Name string `json:"name"` + FullName string `json:"full_name"` + VersionConstraint string `json:"version_constraint"` } // swagger:model ModuleSchema type ModuleSchema struct { - Resources []Resource `json:"resources,omitempty"` - ModuleCalls map[string]ModuleCall `json:"module_calls,omitempty"` - Variables map[string]Variable `json:"variables,omitempty"` - Outputs map[string]Output `json:"outputs,omitempty"` + Resources []Resource `json:"resources,omitempty"` + ModuleCalls map[string]ModuleCall `json:"module_calls,omitempty"` + ProviderConfig map[string]ProviderConfigSchema `json:"provider_config,omitempty"` + Variables map[string]Variable `json:"variables,omitempty"` + Outputs map[string]Output `json:"outputs,omitempty"` } // swagger:model ModuleResource diff --git a/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf b/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf new file mode 100644 index 00000000..5ce43237 --- /dev/null +++ b/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf @@ -0,0 +1,13 @@ +terraform { + required_providers { + opentofu = { + source = "opentofu/opentofu" + version = "~> 1.6.0" + } + + ad = { + source = "opentofu/ad" + version = "0.5.0" + } + } +} diff --git a/backend/internal/moduleindex/moduleschema/tofu.go b/backend/internal/moduleindex/moduleschema/tofu.go index 148d61a3..b32e35da 100644 --- a/backend/internal/moduleindex/moduleschema/tofu.go +++ b/backend/internal/moduleindex/moduleschema/tofu.go @@ -128,6 +128,7 @@ func (e *externalTofuExtractor) Extract(ctx context.Context, moduleDirectory str } } } + var result Schema outputBytes := output.Bytes() if err := json.Unmarshal(outputBytes, &result); err != nil { From 25253657cc5bd286c90b6c76ec1f9bae136e55eb Mon Sep 17 00:00:00 2001 From: Diogenes Fernandes Date: Mon, 13 Jan 2025 23:17:41 -0300 Subject: [PATCH 2/4] cleanup Signed-off-by: Diogenes Fernandes --- backend/internal/moduleindex/generator.go | 1 + backend/internal/moduleindex/module_version.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/backend/internal/moduleindex/generator.go b/backend/internal/moduleindex/generator.go index 05f083ac..8bdfa4d4 100644 --- a/backend/internal/moduleindex/generator.go +++ b/backend/internal/moduleindex/generator.go @@ -823,6 +823,7 @@ func (g generator) extractProviderDependencies(schema moduleschema.Schema, d *De Name: providerCallName, FullName: providerCall.FullName, VersionConstraint: providerCall.VersionConstraint, + Alias: "", } i++ } diff --git a/backend/internal/moduleindex/module_version.go b/backend/internal/moduleindex/module_version.go index 775e1f8c..4ba58c2c 100644 --- a/backend/internal/moduleindex/module_version.go +++ b/backend/internal/moduleindex/module_version.go @@ -74,6 +74,8 @@ type ModuleDependency struct { // ProviderDependency describes a provider dependency of a module. // swagger:model type ProviderDependency struct { + // required:true + Alias string `json:"alias"` // required:true Name string `json:"name"` // required:true From 447eb5046f6bed376a8d533e9cd45c20c7fcf74e Mon Sep 17 00:00:00 2001 From: Diogenes Fernandes Date: Tue, 14 Jan 2025 07:39:26 -0300 Subject: [PATCH 3/4] remove fmt and change to test version constraint instead Signed-off-by: Diogenes Fernandes --- .../internal/moduleindex/moduleschema/extractor_test.go | 7 ++----- .../moduleschema/testdata/modulecall/versions.tf | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/backend/internal/moduleindex/moduleschema/extractor_test.go b/backend/internal/moduleindex/moduleschema/extractor_test.go index 21cd2443..ccb9352a 100644 --- a/backend/internal/moduleindex/moduleschema/extractor_test.go +++ b/backend/internal/moduleindex/moduleschema/extractor_test.go @@ -2,7 +2,6 @@ package moduleschema_test import ( "context" - "fmt" "os" "runtime" "testing" @@ -101,9 +100,7 @@ func TestModuleCall(t *testing.T) { if !ok { t.Fatalf("Provider call not found.") } - - fmt.Println(metadata.ProviderConfig["opentofu"]) - if metadata.ProviderConfig["opentofu"].Name != "opentofu" { - t.Fatalf("Incorrect provider name: %s != %s", metadata.ProviderConfig["opentofu"].Name, "opentofu") + if metadata.ProviderConfig["opentofu"].VersionConstraint != "1.6.0" { + t.Fatalf("Incorrect provider name: %s != %s", metadata.ProviderConfig["opentofu"].VersionConstraint, "1.6.0") } } diff --git a/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf b/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf index 5ce43237..7e3c684d 100644 --- a/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf +++ b/backend/internal/moduleindex/moduleschema/testdata/modulecall/versions.tf @@ -2,7 +2,7 @@ terraform { required_providers { opentofu = { source = "opentofu/opentofu" - version = "~> 1.6.0" + version = "1.6.0" } ad = { From 46ddd7bc121163eadf7291fc8ae2d94ea37bb9ce Mon Sep 17 00:00:00 2001 From: Diogenes Fernandes Date: Thu, 16 Jan 2025 22:52:45 -0300 Subject: [PATCH 4/4] generating openAPI yml Signed-off-by: Diogenes Fernandes --- backend/internal/server/openapi.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/internal/server/openapi.yml b/backend/internal/server/openapi.yml index 7703f70d..c96fd7b5 100644 --- a/backend/internal/server/openapi.yml +++ b/backend/internal/server/openapi.yml @@ -326,6 +326,8 @@ definitions: type: string name: type: string + version_constraint: + type: string type: object ModuleResource: properties: @@ -353,6 +355,10 @@ definitions: additionalProperties: $ref: '#/definitions/ModuleOutput' type: object + provider_config: + additionalProperties: + $ref: '#/definitions/ModuleProviderConfigSchema' + type: object resources: items: $ref: '#/definitions/ModuleResource'