diff --git a/backend/internal/moduleindex/generator.go b/backend/internal/moduleindex/generator.go index 49580d98..8bdfa4d4 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,22 @@ 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, + Alias: "", + } + 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/moduleschema/extractor_test.go b/backend/internal/moduleindex/moduleschema/extractor_test.go index 3616aec3..ccb9352a 100644 --- a/backend/internal/moduleindex/moduleschema/extractor_test.go +++ b/backend/internal/moduleindex/moduleschema/extractor_test.go @@ -95,4 +95,12 @@ 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.") + } + 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/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..7e3c684d --- /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 { 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'