Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: import all vars exported from package #428

Merged
merged 7 commits into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ packages:
package: output-var
```

Variables that you want to make available to other package are in the `export` block of the Zarf package to export a variable from. To have another package ingest an exported variable, use the `imports` key to name both the `variable` and `package` that the variable is exported from.
Variables that you want to make available to other packages are in the `export` block of the Zarf package to export a variable from. By default, all exported variables are available to all of the packages in a bundle. To have another package ingest a specific exported variable, like in the case of variable name collisions, use the `imports` key to name both the `variable` and `package` that the variable is exported from, like in the example above.

In the example above, the `OUTPUT` variable is created as part of a Zarf Action in the [output-var](src/test/packages/zarf/no-cluster/output-var) package, and the [receive-var](src/test/packages/zarf/no-cluster/receive-var) package expects a variable called `OUTPUT`.

Expand Down
7 changes: 7 additions & 0 deletions src/pkg/bundle/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,13 @@ func deployPackages(packages []types.Package, resume bool, b *Bundle, zarfPackag
func (b *Bundle) loadVariables(pkg types.Package, bundleExportedVars map[string]map[string]string) map[string]string {
pkgVars := make(map[string]string)

// load all exported variables
for _, exportedVarMap := range bundleExportedVars {
for varName, varValue := range exportedVarMap {
pkgVars[strings.ToUpper(varName)] = varValue
}
}

// Set variables in order or precendence (least specific to most specific)
// imported vars
for _, imp := range pkg.Imports {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
kind: UDSBundle
metadata:
name: export-name-collision
description: show how to specify import vars in case of name collisions
version: 0.0.1

packages:
- name: output-var
repository: localhost:888/output-var
ref: 0.0.1
exports:
- name: OUTPUT
- name: PRECEDENCE

- name: output-var-collision
repository: localhost:888/output-var-collision
ref: 0.0.1
exports:
- name: OUTPUT

- name: receive-var
repository: localhost:888/receive-var
ref: 0.0.1
imports:
- package: output-var-collision
name: OUTPUT
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
kind: UDSBundle
metadata:
name: import-all-bad-name
description: show errors for bad imports
version: 0.0.1

packages:
- name: output-var
repository: localhost:888/output-var
ref: 0.0.1
exports:
- name: OUTPUT
- name: PRECEDENCE

- name: receive-var
repository: localhost:888/receive-var
ref: 0.0.1
imports:
- package: output-varz
name: OUTPUTZ
17 changes: 17 additions & 0 deletions src/test/bundles/02-simple-vars/import-all/uds-bundle.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
kind: UDSBundle
metadata:
name: import-all
description: show how global exports work
version: 0.0.1

packages:
- name: output-var
repository: localhost:888/output-var
ref: 0.0.1
exports:
- name: OUTPUT
- name: PRECEDENCE

- name: receive-var
repository: localhost:888/receive-var
ref: 0.0.1
6 changes: 6 additions & 0 deletions src/test/e2e/commands_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ func createLocal(t *testing.T, bundlePath string, arch string) {
require.NoError(t, err)
}

func createLocalError(t *testing.T, bundlePath string, arch string) (stderr string) {
cmd := strings.Split(fmt.Sprintf("create %s --insecure --confirm -a %s", bundlePath, arch), " ")
_, stderr, _ = e2e.UDS(cmd...)
return stderr
}

func createRemoteInsecure(t *testing.T, bundlePath, registry, arch string) {
cmd := strings.Split(fmt.Sprintf("create %s -o %s --confirm --insecure -a %s", bundlePath, registry, arch), " ")
_, _, err := e2e.UDS(cmd...)
Expand Down
31 changes: 31 additions & 0 deletions src/test/e2e/variable_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,38 @@ func TestBundleVariables(t *testing.T) {
os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/02-simple-vars", "uds-config.yaml"))

_, stderr := deploy(t, bundleTarballPath)
bundleVariablesTestChecks(t, stderr, bundleTarballPath)
remove(t, bundleTarballPath)

// Run same test checks but with package that isn't explicitly importing vars
UncleGedd marked this conversation as resolved.
Show resolved Hide resolved
bundleDir = "src/test/bundles/02-simple-vars/import-all"
bundleTarballPath = filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-import-all-%s-0.0.1.tar.zst", e2e.Arch))
createLocal(t, bundleDir, e2e.Arch)
_, stderr = deploy(t, bundleTarballPath)
bundleVariablesTestChecks(t, stderr, bundleTarballPath)

// Test with bad variable name in import
bundleDir = "src/test/bundles/02-simple-vars/import-all-bad-name"
stderr = createLocalError(t, bundleDir, e2e.Arch)
require.Contains(t, stderr, "does not have a matching export")

// Test name collisions with exported variables
zarfPkgPath3 := "src/test/packages/no-cluster/output-var-collision"
e2e.CreateZarfPkg(t, zarfPkgPath3, false)

pkg = filepath.Join(zarfPkgPath3, fmt.Sprintf("zarf-package-output-var-collision-%s-0.0.1.tar.zst", e2e.Arch))
zarfPublish(t, pkg, "localhost:888")

bundleDir = "src/test/bundles/02-simple-vars/export-name-collision"
bundleTarballPath = filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-export-name-collision-%s-0.0.1.tar.zst", e2e.Arch))
createLocal(t, bundleDir, e2e.Arch)
createRemoteInsecure(t, bundleDir, "localhost:888", e2e.Arch)
_, stderr = deploy(t, bundleTarballPath)
require.Contains(t, stderr, "This fun-fact was imported: Daffodils are the national flower of Wales")
require.NotContains(t, stderr, "This fun-fact was imported: Unicorns are the national animal of Scotland")
}

func bundleVariablesTestChecks(t *testing.T, stderr string, bundleTarballPath string) {
require.NotContains(t, stderr, "CLIVersion is set to 'unset' which can cause issues with package creation and deployment")
require.Contains(t, stderr, "This fun-fact was imported: Unicorns are the national animal of Scotland")
require.Contains(t, stderr, "This fun-fact demonstrates precedence: The Red Dragon is the national symbol of Wales")
Expand Down
22 changes: 22 additions & 0 deletions src/test/packages/no-cluster/output-var-collision/zarf.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
kind: ZarfPackageConfig
metadata:
name: output-var-collision
description: |
Exports variable with same name as variable exported from output-var package
version: 0.0.1

variables:
- name: COUNTRY
default: Wales
- name: FLOWER
default: Daffodils

components:
- name: echo
required: true
actions:
onDeploy:
after:
- cmd: echo ""${ZARF_VAR_FLOWER}" are the national flower of "${ZARF_VAR_COUNTRY}""
setVariables:
- name: OUTPUT
Loading