From 5900ef3db4cf96ed76a84447e1b36daf3f041128 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 28 Dec 2024 15:01:56 +0200 Subject: [PATCH 01/12] allow URI contain path traversal --- internal/exec/vendor_utils.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/exec/vendor_utils.go b/internal/exec/vendor_utils.go index 95f7dcb0e..0020d8034 100644 --- a/internal/exec/vendor_utils.go +++ b/internal/exec/vendor_utils.go @@ -641,11 +641,6 @@ func validateURI(uri string) error { if len(uri) > 2048 { return fmt.Errorf("URI exceeds maximum length of 2048 characters") } - // Add more validation as needed - // Validate URI format - if strings.Contains(uri, "..") { - return fmt.Errorf("URI cannot contain path traversal sequences") - } if strings.Contains(uri, " ") { return fmt.Errorf("URI cannot contain spaces") } From 71fff29d634da9214d2cfff415fd0828872db519 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 28 Dec 2024 15:04:19 +0200 Subject: [PATCH 02/12] allow scheme: git:: --- internal/exec/vendor_utils.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/exec/vendor_utils.go b/internal/exec/vendor_utils.go index 0020d8034..095481488 100644 --- a/internal/exec/vendor_utils.go +++ b/internal/exec/vendor_utils.go @@ -641,6 +641,7 @@ func validateURI(uri string) error { if len(uri) > 2048 { return fmt.Errorf("URI exceeds maximum length of 2048 characters") } + if strings.Contains(uri, " ") { return fmt.Errorf("URI cannot contain spaces") } @@ -653,11 +654,6 @@ func validateURI(uri string) error { if !strings.Contains(uri[6:], "/") { return fmt.Errorf("invalid OCI URI format") } - } else if strings.Contains(uri, "://") { - scheme := strings.Split(uri, "://")[0] - if !isValidScheme(scheme) { - return fmt.Errorf("unsupported URI scheme: %s", scheme) - } } return nil } From 4e8c172a6cee020ce3d13143137a735b93cba407 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 28 Dec 2024 15:05:19 +0200 Subject: [PATCH 03/12] remove max length check url --- internal/exec/vendor_utils.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/exec/vendor_utils.go b/internal/exec/vendor_utils.go index 095481488..913dd2415 100644 --- a/internal/exec/vendor_utils.go +++ b/internal/exec/vendor_utils.go @@ -637,11 +637,6 @@ func validateURI(uri string) error { if uri == "" { return fmt.Errorf("URI cannot be empty") } - // Maximum length check - if len(uri) > 2048 { - return fmt.Errorf("URI exceeds maximum length of 2048 characters") - } - if strings.Contains(uri, " ") { return fmt.Errorf("URI cannot contain spaces") } From 26fb6f6c5692d4a4697d31ae1364a1e1f62d24d4 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 28 Dec 2024 15:06:38 +0200 Subject: [PATCH 04/12] remove character url validate --- internal/exec/vendor_utils.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/internal/exec/vendor_utils.go b/internal/exec/vendor_utils.go index 913dd2415..339608475 100644 --- a/internal/exec/vendor_utils.go +++ b/internal/exec/vendor_utils.go @@ -640,10 +640,6 @@ func validateURI(uri string) error { if strings.Contains(uri, " ") { return fmt.Errorf("URI cannot contain spaces") } - // Validate characters - if strings.ContainsAny(uri, "<>|&;$") { - return fmt.Errorf("URI contains invalid characters") - } // Validate scheme-specific format if strings.HasPrefix(uri, "oci://") { if !strings.Contains(uri[6:], "/") { From dcd008664869f3c590bf66c704c6eaeba98c439f Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 28 Dec 2024 15:47:45 +0200 Subject: [PATCH 05/12] fix log error --- internal/exec/vendor_model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/exec/vendor_model.go b/internal/exec/vendor_model.go index 1209e6805..f35e3a0e9 100644 --- a/internal/exec/vendor_model.go +++ b/internal/exec/vendor_model.go @@ -161,7 +161,7 @@ func (m *modelVendor) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } version := grayColor.Render(version) return m, tea.Sequence( - tea.Printf("%s %s %s", mark, pkg.name, version), + tea.Printf("%s %s %s %s", mark, pkg.name, version, errMsg), tea.Quit, ) } From ee879d9a8045b417bc8b95d4333d2ce82fa94d3d Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sun, 29 Dec 2024 15:52:47 +0200 Subject: [PATCH 06/12] add git schema to source on vendor yaml --- examples/demo-vendoring/vendor.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo-vendoring/vendor.yaml b/examples/demo-vendoring/vendor.yaml index 72786a00f..6fa67b14b 100644 --- a/examples/demo-vendoring/vendor.yaml +++ b/examples/demo-vendoring/vendor.yaml @@ -9,7 +9,7 @@ spec: sources: - component: "github/stargazers" - source: "github.com/cloudposse/atmos.git//examples/demo-library/{{ .Component }}?ref={{.Version}}" + source: "git::https://github.com/cloudposse/atmos.git//examples/demo-library/{{ .Component }}?ref={{.Version}}" version: "main" targets: - "components/terraform/{{ .Component }}/{{.Version}}" From f10db51a7469fdfb6d5b8736d3baa6ebe089c607 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sun, 29 Dec 2024 17:55:25 +0200 Subject: [PATCH 07/12] modify source on vendor yaml --- examples/demo-vendoring/vendor.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo-vendoring/vendor.yaml b/examples/demo-vendoring/vendor.yaml index 6fa67b14b..72786a00f 100644 --- a/examples/demo-vendoring/vendor.yaml +++ b/examples/demo-vendoring/vendor.yaml @@ -9,7 +9,7 @@ spec: sources: - component: "github/stargazers" - source: "git::https://github.com/cloudposse/atmos.git//examples/demo-library/{{ .Component }}?ref={{.Version}}" + source: "github.com/cloudposse/atmos.git//examples/demo-library/{{ .Component }}?ref={{.Version}}" version: "main" targets: - "components/terraform/{{ .Component }}/{{.Version}}" From 4ebd7991da8ab3a3171e07587b6aadb6cf1646b9 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sun, 29 Dec 2024 18:10:52 +0200 Subject: [PATCH 08/12] use git on vendor test --- examples/tests/vendor.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tests/vendor.yaml b/examples/tests/vendor.yaml index 17bba24fc..ab64e00df 100644 --- a/examples/tests/vendor.yaml +++ b/examples/tests/vendor.yaml @@ -45,7 +45,7 @@ spec: - test - networking - component: "vpc-flow-logs-bucket" - source: "github.com/cloudposse/terraform-aws-components.git//modules/vpc-flow-logs-bucket?ref={{.Version}}" + source: "git::https://github.com/cloudposse/terraform-aws-components.git//modules/vpc-flow-logs-bucket?ref={{.Version}}" version: "1.323.0" targets: - "components/terraform/infra/vpc-flow-logs-bucket/{{.Version}}" From 3818cbfb431408d97b8c2b81c2faf16ae213b3d9 Mon Sep 17 00:00:00 2001 From: Haitham Rageh Date: Wed, 1 Jan 2025 01:29:13 +0200 Subject: [PATCH 09/12] fix windows path --- internal/exec/vendor_model.go | 2 +- internal/exec/vendor_utils.go | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/internal/exec/vendor_model.go b/internal/exec/vendor_model.go index f35e3a0e9..312dc222e 100644 --- a/internal/exec/vendor_model.go +++ b/internal/exec/vendor_model.go @@ -246,7 +246,7 @@ func downloadAndInstall(p *pkgAtmosVendor, dryRun bool, atmosConfig schema.Atmos } // Create temp directory - tempDir, err := os.MkdirTemp("", fmt.Sprintf("atmos-vendor-%d-*", time.Now().Unix())) + tempDir, err := os.MkdirTemp("", "atmos-vendor") if err != nil { return installedPkgMsg{ err: fmt.Errorf("failed to create temp directory: %w", err), diff --git a/internal/exec/vendor_utils.go b/internal/exec/vendor_utils.go index 339608475..b4e5c100b 100644 --- a/internal/exec/vendor_utils.go +++ b/internal/exec/vendor_utils.go @@ -377,7 +377,7 @@ func ExecuteAtmosVendorInternal( if err != nil { return err } - targetPath := filepath.Join(vendorConfigFilePath, target) + targetPath := filepath.Join(filepath.ToSlash(vendorConfigFilePath), filepath.ToSlash(target)) pkgName := s.Component if pkgName == "" { pkgName = uri @@ -507,12 +507,22 @@ func determineSourceType(uri *string, vendorConfigFilePath string) (bool, bool, useLocalFileSystem := false sourceIsLocalFile := false if !useOciScheme { - if absPath, err := u.JoinAbsolutePathWithPath(vendorConfigFilePath, *uri); err == nil { + if absPath, err := u.JoinAbsolutePathWithPath(filepath.ToSlash(vendorConfigFilePath), *uri); err == nil { uri = &absPath useLocalFileSystem = true sourceIsLocalFile = u.FileExists(*uri) } + u, err := url.Parse(*uri) + if err == nil && u.Scheme != "" { + if u.Scheme == "file" { + trimmedPath := strings.TrimPrefix(filepath.ToSlash(u.Path), "/") + *uri = filepath.Clean(trimmedPath) + useLocalFileSystem = true + } + } + } + return useOciScheme, useLocalFileSystem, sourceIsLocalFile } @@ -580,6 +590,8 @@ func generateSkipFunction(atmosConfig schema.AtmosConfiguration, tempDir string, if filepath.Base(src) == ".git" { return true, nil } + tempDir = filepath.ToSlash(tempDir) + src = filepath.ToSlash(src) trimmedSrc := u.TrimBasePathFromPath(tempDir+"/", src) From 44fa7004af501a32676e6b242dcde9a3f825da95 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 4 Jan 2025 18:18:11 +0200 Subject: [PATCH 10/12] add test case for vendor --- examples/tests/test-vendor/atmos.yaml | 40 +++++++++++++++++ .../test-vendor/test-components/README.md | 13 ++++++ .../tests/test-vendor/test-components/main.tf | 7 +++ .../test-vendor/test-components/outputs.tf | 4 ++ .../test-vendor/test-components/providers.tf | 1 + .../test-vendor/test-components/variables.tf | 5 +++ .../test-vendor/test-components/versions.tf | 5 +++ examples/tests/test-vendor/vendor.yaml | 43 +++++++++++++++++++ internal/exec/vendor_component_utils.go | 9 ++++ tests/cli_test.go | 31 ++++++++++--- tests/test_cases.yaml | 35 +++++++++++++++ 11 files changed, 187 insertions(+), 6 deletions(-) create mode 100644 examples/tests/test-vendor/atmos.yaml create mode 100644 examples/tests/test-vendor/test-components/README.md create mode 100644 examples/tests/test-vendor/test-components/main.tf create mode 100644 examples/tests/test-vendor/test-components/outputs.tf create mode 100644 examples/tests/test-vendor/test-components/providers.tf create mode 100644 examples/tests/test-vendor/test-components/variables.tf create mode 100644 examples/tests/test-vendor/test-components/versions.tf create mode 100644 examples/tests/test-vendor/vendor.yaml diff --git a/examples/tests/test-vendor/atmos.yaml b/examples/tests/test-vendor/atmos.yaml new file mode 100644 index 000000000..0f0506e81 --- /dev/null +++ b/examples/tests/test-vendor/atmos.yaml @@ -0,0 +1,40 @@ +base_path: "./" + +components: + terraform: + base_path: "components/terraform" + apply_auto_approve: false + deploy_run_init: true + init_run_reconfigure: true + auto_generate_backend_file: false + +stacks: + base_path: "stacks" + included_paths: + - "deploy/**/*" + excluded_paths: + - "**/_defaults.yaml" + name_pattern: "{stage}" + +vendor: + # Single file + base_path: "./vendor.yaml" + + # Directory with multiple files + #base_path: "./vendor" + + # Absolute path + #base_path: "vendor.d/vendor1.yaml" + +logs: + file: "/dev/stderr" + level: Info + +# Custom CLI commands + +# No arguments or flags are required +commands: +- name: "test" + description: "Run all tests" + steps: + - atmos vendor pull --everything diff --git a/examples/tests/test-vendor/test-components/README.md b/examples/tests/test-vendor/test-components/README.md new file mode 100644 index 000000000..a1b28ebfd --- /dev/null +++ b/examples/tests/test-vendor/test-components/README.md @@ -0,0 +1,13 @@ +# Example Terraform IPinfo Component + +This Terraform module retrieves data from the IPinfo API for a specified IP address. If no IP address is specified, it retrieves data for the requester's IP address. + +## Usage + +### Inputs + +- `ip_address` (optional): The IP address to retrieve information for. If not specified, the requester's IP address will be used. The default value is an empty string. + +### Outputs + +- `metadata`: The data retrieved from IPinfo for the specified IP address, in JSON format. diff --git a/examples/tests/test-vendor/test-components/main.tf b/examples/tests/test-vendor/test-components/main.tf new file mode 100644 index 000000000..0e3e9d0b0 --- /dev/null +++ b/examples/tests/test-vendor/test-components/main.tf @@ -0,0 +1,7 @@ +data "http" "ipinfo" { + url = var.ip_address != "" ? "https://ipinfo.io/${var.ip_address}" : "https://ipinfo.io" + + request_headers = { + Accept = "application/json" + } +} diff --git a/examples/tests/test-vendor/test-components/outputs.tf b/examples/tests/test-vendor/test-components/outputs.tf new file mode 100644 index 000000000..12bb2bb8d --- /dev/null +++ b/examples/tests/test-vendor/test-components/outputs.tf @@ -0,0 +1,4 @@ +output "metadata" { + description = "The data retrieved from IPinfo for the specified IP address" + value = jsondecode(data.http.ipinfo.response_body) +} diff --git a/examples/tests/test-vendor/test-components/providers.tf b/examples/tests/test-vendor/test-components/providers.tf new file mode 100644 index 000000000..0b91fe2aa --- /dev/null +++ b/examples/tests/test-vendor/test-components/providers.tf @@ -0,0 +1 @@ +provider "http" {} diff --git a/examples/tests/test-vendor/test-components/variables.tf b/examples/tests/test-vendor/test-components/variables.tf new file mode 100644 index 000000000..85f32544d --- /dev/null +++ b/examples/tests/test-vendor/test-components/variables.tf @@ -0,0 +1,5 @@ +variable "ip_address" { + description = "The IP address to retrieve information for (optional)" + type = string + default = "" +} diff --git a/examples/tests/test-vendor/test-components/versions.tf b/examples/tests/test-vendor/test-components/versions.tf new file mode 100644 index 000000000..e2a3d732d --- /dev/null +++ b/examples/tests/test-vendor/test-components/versions.tf @@ -0,0 +1,5 @@ +terraform { + required_version = ">= 1.0.0" + + required_providers {} +} diff --git a/examples/tests/test-vendor/vendor.yaml b/examples/tests/test-vendor/vendor.yaml new file mode 100644 index 000000000..258a28e81 --- /dev/null +++ b/examples/tests/test-vendor/vendor.yaml @@ -0,0 +1,43 @@ +apiVersion: atmos/v1 +kind: AtmosVendorConfig +metadata: + name: demo-vendoring + description: Atmos vendoring manifest for Atmos demo component library +spec: + # Import other vendor manifests, if necessary + imports: [] + + sources: + - component: "github/stargazers" + source: "github.com/cloudposse/atmos.git//examples/demo-library/{{ .Component }}?ref={{.Version}}" + version: "main" + targets: + - "components/terraform/{{ .Component }}/{{.Version}}" + included_paths: + - "**/*.tf" + - "**/*.tfvars" + - "**/*.md" + tags: + - demo + - github + + - component: "test-components" + source: "file:///./test-components" + version: "main" + targets: + - "components/terraform/{{ .Component }}/{{.Version}}" + tags: + - demo + + - component: "weather" + source: "git::https://github.com/cloudposse/atmos.git//examples/demo-library/{{ .Component }}?ref={{.Version}}" + version: "main" + targets: + - "components/terraform/{{ .Component }}/{{.Version}}" + tags: + - demo + - component: "my-vpc1" + source: "oci://public.ecr.aws/cloudposse/components/terraform/stable/aws/vpc:{{.Version}}" + version: "latest" + targets: + - "components/terraform/infra/my-vpc1" diff --git a/internal/exec/vendor_component_utils.go b/internal/exec/vendor_component_utils.go index 493bea958..5babacf6d 100644 --- a/internal/exec/vendor_component_utils.go +++ b/internal/exec/vendor_component_utils.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "net/url" "os" "path/filepath" "strings" @@ -244,6 +245,14 @@ func ExecuteComponentVendorInternal( sourceIsLocalFile = true } } + u, err := url.Parse(uri) + if err == nil && u.Scheme != "" { + if u.Scheme == "file" { + trimmedPath := strings.TrimPrefix(filepath.ToSlash(u.Path), "/") + uri = filepath.Clean(trimmedPath) + useLocalFileSystem = true + } + } } var pType pkgType if useOciScheme { diff --git a/tests/cli_test.go b/tests/cli_test.go index 255503cc8..1965559ff 100644 --- a/tests/cli_test.go +++ b/tests/cli_test.go @@ -4,7 +4,8 @@ import ( "bytes" "errors" "fmt" - "io/ioutil" + "io" + "log" "os" "os/exec" "path/filepath" // For resolving absolute paths @@ -39,7 +40,13 @@ type TestSuite struct { } func loadTestSuite(filePath string) (*TestSuite, error) { - data, err := ioutil.ReadFile(filePath) + // Open the file + f, err := os.Open(filePath) + if err != nil { + log.Fatalf("Failed to open file: %v", err) + } + defer f.Close() + data, err := io.ReadAll(f) if err != nil { return nil, err } @@ -169,6 +176,7 @@ func TestCLICommands(t *testing.T) { if exitCode != tc.Expect.ExitCode { t.Errorf("Description: %s", tc.Description) t.Errorf("Reason: Expected exit code %d, got %d", tc.Expect.ExitCode, exitCode) + t.Errorf("error: %v", cmd.Stderr) } // Validate stdout @@ -211,12 +219,17 @@ func verifyOutput(t *testing.T, outputType, output string, patterns []string) bo } return success } - func verifyFileExists(t *testing.T, files []string) bool { success := true for _, file := range files { - if _, err := os.Stat(file); errors.Is(err, os.ErrNotExist) { - t.Errorf("Reason: Expected file does not exist: %q", file) + fileAbs, err := filepath.Abs(file) + if err != nil { + log.Println(err) + return false + } + + if _, err := os.Stat(fileAbs); errors.Is(err, os.ErrNotExist) { + t.Errorf("Reason: Expected file does not exist: %q", fileAbs) success = false } } @@ -226,7 +239,13 @@ func verifyFileExists(t *testing.T, files []string) bool { func verifyFileContains(t *testing.T, filePatterns map[string][]string) bool { success := true for file, patterns := range filePatterns { - content, err := ioutil.ReadFile(file) + // Open the file + f, err := os.Open(file) + if err != nil { + log.Fatalf("Failed to open file: %v", err) + } + defer f.Close() + content, err := io.ReadAll(f) if err != nil { t.Errorf("Reason: Failed to read file %q: %v", file, err) success = false diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 9ebb6641f..1c2fcd567 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -168,3 +168,38 @@ tests: stderr: - "^$" exit_code: 0 + - name: atmos vendor pull + enabled: true + description: "Ensure atmos vendor pull command executes without errors and files are present." + workdir: "../examples/tests/test-vendor/" + command: "atmos" + args: + - "vendor" + - "pull" + expect: + file_exists: [ + "./components/terraform/github/stargazers/main/main.tf", + "./components/terraform/github/stargazers/main/outputs.tf", + "./components/terraform/github/stargazers/main/providers.tf", + "./components/terraform/github/stargazers/main/variables.tf", + "./components/terraform/github/stargazers/main/versions.tf", + + "./components/terraform/infra/my-vpc1/main.tf", + "./components/terraform/infra/my-vpc1/outputs.tf", + "./components/terraform/infra/my-vpc1/providers.tf", + "./components/terraform/infra/my-vpc1/variables.tf", + "./components/terraform/infra/my-vpc1/versions.tf", + + "./components/terraform/test-components/main/main.tf", + "./components/terraform/test-components/main/outputs.tf", + "./components/terraform/test-components/main/providers.tf", + "./components/terraform/test-components/main/variables.tf", + "./components/terraform/test-components/main/versions.tf", + + "./components/terraform/weather/main/main.tf", + "./components/terraform/weather/main/outputs.tf", + "./components/terraform/weather/main/providers.tf", + "./components/terraform/weather/main/variables.tf", + "./components/terraform/weather/main/versions.tf", + ] + exit_code: 0 From ceef619b3ded7dbb0fbb6922270dfeb015b43a53 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 4 Jan 2025 18:37:46 +0200 Subject: [PATCH 11/12] fix yaml format --- tests/test_cases.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index b160e2df4..31b73b65d 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -197,7 +197,7 @@ tests: stderr: - "^$" exit_code: 0 - - name: atmos vendor pull + - name: atmos vendor pull enabled: true description: "Ensure atmos vendor pull command executes without errors and files are present." workdir: "../examples/tests/test-vendor/" @@ -206,7 +206,8 @@ tests: - "vendor" - "pull" expect: - file_exists: [ + file_exists: + [ "./components/terraform/github/stargazers/main/main.tf", "./components/terraform/github/stargazers/main/outputs.tf", "./components/terraform/github/stargazers/main/providers.tf", @@ -230,5 +231,5 @@ tests: "./components/terraform/weather/main/providers.tf", "./components/terraform/weather/main/variables.tf", "./components/terraform/weather/main/versions.tf", - ] + ] exit_code: 0 From bc02f6e23c33c355f3c4d15585a35259a8fc34d0 Mon Sep 17 00:00:00 2001 From: haitham911 Date: Sat, 4 Jan 2025 22:33:53 +0200 Subject: [PATCH 12/12] use yaml syntax --- tests/test_cases.yaml | 45 +++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 31b73b65d..109acac21 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -207,29 +207,24 @@ tests: - "pull" expect: file_exists: - [ - "./components/terraform/github/stargazers/main/main.tf", - "./components/terraform/github/stargazers/main/outputs.tf", - "./components/terraform/github/stargazers/main/providers.tf", - "./components/terraform/github/stargazers/main/variables.tf", - "./components/terraform/github/stargazers/main/versions.tf", - - "./components/terraform/infra/my-vpc1/main.tf", - "./components/terraform/infra/my-vpc1/outputs.tf", - "./components/terraform/infra/my-vpc1/providers.tf", - "./components/terraform/infra/my-vpc1/variables.tf", - "./components/terraform/infra/my-vpc1/versions.tf", - - "./components/terraform/test-components/main/main.tf", - "./components/terraform/test-components/main/outputs.tf", - "./components/terraform/test-components/main/providers.tf", - "./components/terraform/test-components/main/variables.tf", - "./components/terraform/test-components/main/versions.tf", - - "./components/terraform/weather/main/main.tf", - "./components/terraform/weather/main/outputs.tf", - "./components/terraform/weather/main/providers.tf", - "./components/terraform/weather/main/variables.tf", - "./components/terraform/weather/main/versions.tf", - ] + - "./components/terraform/github/stargazers/main/main.tf" + - "./components/terraform/github/stargazers/main/outputs.tf" + - "./components/terraform/github/stargazers/main/providers.tf" + - "./components/terraform/github/stargazers/main/variables.tf" + - "./components/terraform/github/stargazers/main/versions.tf" + - "./components/terraform/infra/my-vpc1/main.tf" + - "./components/terraform/infra/my-vpc1/outputs.tf" + - "./components/terraform/infra/my-vpc1/providers.tf" + - "./components/terraform/infra/my-vpc1/variables.tf" + - "./components/terraform/infra/my-vpc1/versions.tf" + - "./components/terraform/test-components/main/main.tf" + - "./components/terraform/test-components/main/outputs.tf" + - "./components/terraform/test-components/main/providers.tf" + - "./components/terraform/test-components/main/variables.tf" + - "./components/terraform/test-components/main/versions.tf" + - "./components/terraform/weather/main/main.tf" + - "./components/terraform/weather/main/outputs.tf" + - "./components/terraform/weather/main/providers.tf" + - "./components/terraform/weather/main/variables.tf" + - "./components/terraform/weather/main/versions.tf" exit_code: 0