Skip to content

Commit

Permalink
Fix vendor pull directory creation issue (#782)
Browse files Browse the repository at this point in the history
* folder creation vendor fix

* display error logic

* Revert "display error logic"

This reverts commit 1b5f112.

* restore condition to continue vendor process if not exists

* handle empty stack yaml file configuration (#791)

* fix: handle empty stack YAML configuration and adjust file content retrieval

* fix: return existing content from GetFileContent instead of an empty string

* fix: remove unnecessary blank lines in ProcessYAMLConfigFile and GetFileContent functions

* Set Default Schema to Remote Schema (#777)

* feat: set default Atmos manifest URL if not specified in configuration

* feat: log trace message when using default Atmos JSON Schema file

* fix: improve error message for missing Atmos JSON Schema file

* Update internal/exec/validate_stacks.go

* fix: change log level from trace to info for default Atmos JSON Schema message

* fix: change log level from info to trace for default Atmos JSON Schema message

---------

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <[email protected]>
Co-authored-by: Andriy Knysh <[email protected]>

* added better error handling

* added vendor config integration tests

* explain package name choose

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <[email protected]>

---------

Co-authored-by: Andriy Knysh <[email protected]>
Co-authored-by: Haitham Rageh <[email protected]>
Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <[email protected]>
  • Loading branch information
4 people authored Dec 5, 2024
1 parent cf830c5 commit 0ea2472
Show file tree
Hide file tree
Showing 2 changed files with 146 additions and 1 deletion.
3 changes: 2 additions & 1 deletion internal/exec/vendor_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,8 @@ func ReadAndProcessVendorConfigFile(

if !u.FileExists(pathToVendorConfig) {
vendorConfigFileExists = false
return vendorConfig, vendorConfigFileExists, "", fmt.Errorf("vendor config file or directory '%s' does not exist", pathToVendorConfig)
u.LogWarning(cliConfig, fmt.Sprintf("Vendor config file '%s' does not exist. Proceeding without vendor configurations", pathToVendorConfig))
return vendorConfig, vendorConfigFileExists, "", nil
}

foundVendorConfigFile = pathToVendorConfig
Expand Down
144 changes: 144 additions & 0 deletions pkg/vender/vendor_config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
// The package name `vendor` is reserved in Go for dependency management.
// To avoid conflicts, the name `vender` was chosen as an alternative.
package vender

import (
"os"
"path"
"testing"

"github.com/stretchr/testify/assert"

e "github.com/cloudposse/atmos/internal/exec"
"github.com/cloudposse/atmos/pkg/schema"
)

func TestVendorConfigScenarios(t *testing.T) {
testDir := t.TempDir()

// Initialize CLI config with required paths
cliConfig := schema.CliConfiguration{
BasePath: testDir,
Components: schema.Components{
Terraform: schema.Terraform{
BasePath: "components/terraform",
},
},
}
cliConfig.Logs.Level = "Trace"

// Setup test component directory
componentPath := path.Join(testDir, "components", "terraform", "myapp")
err := os.MkdirAll(componentPath, 0755)
assert.Nil(t, err)

// Test Case 1: vendor.yaml exists and component is defined in it
t.Run("vendor.yaml exists with defined component", func(t *testing.T) {
// Create vendor.yaml
vendorYaml := `apiVersion: atmos/v1
kind: AtmosVendorConfig
metadata:
name: test-vendor-config
spec:
sources:
- component: myapp
source: github.com/cloudposse/terraform-null-label.git//exports?ref={{.Version}}
version: 0.25.0
included_paths:
- "**/*.tf"
`
vendorYamlPath := path.Join(testDir, "vendor.yaml")
err := os.WriteFile(vendorYamlPath, []byte(vendorYaml), 0644)
assert.Nil(t, err)

// Test vendoring with component flag
vendorConfig, exists, configFile, err := e.ReadAndProcessVendorConfigFile(cliConfig, vendorYamlPath)
assert.Nil(t, err)
assert.True(t, exists)
assert.NotEmpty(t, configFile)

// Verify the component exists in vendor config
var found bool
for _, source := range vendorConfig.Spec.Sources {
if source.Component == "myapp" {
found = true
break
}
}
assert.True(t, found, "Component 'myapp' should be defined in vendor.yaml")

// Clean up
err = os.Remove(vendorYamlPath)
assert.Nil(t, err)
})

// Test Case 2: No vendor.yaml but component.yaml exists
t.Run("component.yaml exists without vendor.yaml", func(t *testing.T) {
// Create component.yaml
componentYaml := `apiVersion: atmos/v1
kind: ComponentVendorConfig
metadata:
name: myapp-vendor-config
spec:
source:
uri: github.com/cloudposse/terraform-null-label.git//exports?ref={{.Version}}
version: 0.25.0
`
componentYamlPath := path.Join(componentPath, "component.yaml")
err := os.WriteFile(componentYamlPath, []byte(componentYaml), 0644)
assert.Nil(t, err)

// Test component vendoring
componentConfig, compPath, err := e.ReadAndProcessComponentVendorConfigFile(cliConfig, "myapp", "terraform")
assert.Nil(t, err)
assert.NotNil(t, componentConfig)
assert.Equal(t, componentPath, compPath)

// Clean up
err = os.Remove(componentYamlPath)
assert.Nil(t, err)
})

// Test Case 3: Neither vendor.yaml nor component.yaml exists
t.Run("no vendor.yaml or component.yaml", func(t *testing.T) {
// Test vendoring with component flag
vendorYamlPath := path.Join(testDir, "vendor.yaml")
_, exists, _, err := e.ReadAndProcessVendorConfigFile(cliConfig, vendorYamlPath)
assert.Nil(t, err)
assert.False(t, exists)

// Test component vendoring
_, _, err = e.ReadAndProcessComponentVendorConfigFile(cliConfig, "myapp", "terraform")
assert.Error(t, err)
assert.Contains(t, err.Error(), "does not exist")
})

// Test Case 4: No component specified with vendor.yaml
t.Run("no component specified with vendor.yaml", func(t *testing.T) {
// Create vendor.yaml
vendorYaml := `apiVersion: atmos/v1
kind: AtmosVendorConfig
metadata:
name: test-vendor-config
spec:
sources:
- component: myapp
source: github.com/cloudposse/terraform-null-label.git//exports?ref={{.Version}}
version: 0.25.0
`
vendorYamlPath := path.Join(testDir, "vendor.yaml")
err := os.WriteFile(vendorYamlPath, []byte(vendorYaml), 0644)
assert.Nil(t, err)

// Test vendoring without component flag
vendorConfig, exists, configFile, err := e.ReadAndProcessVendorConfigFile(cliConfig, vendorYamlPath)
assert.Nil(t, err)
assert.True(t, exists)
assert.NotEmpty(t, configFile)
assert.NotNil(t, vendorConfig.Spec.Sources)

// Clean up
err = os.Remove(vendorYamlPath)
assert.Nil(t, err)
})
}

0 comments on commit 0ea2472

Please sign in to comment.