From 2c9a910c21af618b46123ab64a039e9ab392ea1f Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Mon, 3 Jun 2024 20:45:59 -0600 Subject: [PATCH 1/7] fix: arch check in PreDeployValidation --- src/pkg/bundle/deploy.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pkg/bundle/deploy.go b/src/pkg/bundle/deploy.go index b7e4f79a..df101f12 100644 --- a/src/pkg/bundle/deploy.go +++ b/src/pkg/bundle/deploy.go @@ -285,8 +285,8 @@ func (b *Bundle) PreDeployValidation() (string, string, string, error) { } b.cfg.DeployOpts.Source = source - // validate config's arch against cluster - err = ValidateArch(config.GetArch()) + // validate bundle's arch against cluster + err = ValidateArch(b.bundle.Build.Architecture) if err != nil { return "", "", "", err } From 97b0927b2d36eba70bb4842d685ba0b0a963bbfc Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Tue, 4 Jun 2024 08:58:13 -0600 Subject: [PATCH 2/7] move arch validation after loading bundle metadata --- src/pkg/bundle/deploy.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pkg/bundle/deploy.go b/src/pkg/bundle/deploy.go index df101f12..7f06cfd8 100644 --- a/src/pkg/bundle/deploy.go +++ b/src/pkg/bundle/deploy.go @@ -285,12 +285,6 @@ func (b *Bundle) PreDeployValidation() (string, string, string, error) { } b.cfg.DeployOpts.Source = source - // validate bundle's arch against cluster - err = ValidateArch(b.bundle.Build.Architecture) - if err != nil { - return "", "", "", err - } - // create a new provider provider, err := NewBundleProvider(b.cfg.DeployOpts.Source, b.tmp) if err != nil { @@ -320,6 +314,12 @@ func (b *Bundle) PreDeployValidation() (string, string, string, error) { return "", "", "", err } + // validate bundle's arch against cluster + err = ValidateArch(b.bundle.Build.Architecture) + if err != nil { + return "", "", "", err + } + bundleName := b.bundle.Metadata.Name return bundleName, string(bundleYAML), source, err } From 58a2f0c4d12862a9447c457aa9c4bdbcb352f2c4 Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Tue, 4 Jun 2024 09:35:20 -0600 Subject: [PATCH 3/7] use GetArch() to check for -a in predeployvalidation for multi arch bundles --- src/pkg/bundle/deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pkg/bundle/deploy.go b/src/pkg/bundle/deploy.go index 7f06cfd8..1b1abc20 100644 --- a/src/pkg/bundle/deploy.go +++ b/src/pkg/bundle/deploy.go @@ -315,7 +315,7 @@ func (b *Bundle) PreDeployValidation() (string, string, string, error) { } // validate bundle's arch against cluster - err = ValidateArch(b.bundle.Build.Architecture) + err = ValidateArch(config.GetArch(b.bundle.Build.Architecture)) if err != nil { return "", "", "", err } From 3638af79688e495b6b8405b782b7de3e72568283 Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:31:13 -0600 Subject: [PATCH 4/7] add docs --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index f1679521..a96e502b 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,16 @@ This means that setting the `--architecture` flag takes precedence over all othe UDS CLI supports multi-arch bundles. This means you can push bundles with different architectures to the same remote OCI repository, at the same tag. For example, you can push both an `amd64` and `arm64` bundle to `ghcr.io//:0.0.1`. +### Architecture Validation +When deploying a local bundle, the bundle's architecture will be used for comparison against the cluster architecture to ensure compatability. If deploying a remote bundle, by default the bundle is pulled based on system architecture, which is then checked against the cluster. + +> [!NOTE] +> It is possible to override the bundle architecture used at validation time by using the `--architecture` / `-a` flag. + +If, for example, you have a multi-arch remote bundle that you want to deploy from an arm64 machine to an amd64 cluster, the validation with fail because the system arch does not match the cluster arch. However, you can pull the correct bundle version by specificying the arch with the command line architecture flag. + +e.g. +`uds deploy -a amd64 --confirm` ## Configuration The UDS CLI can be configured with a `uds-config.yaml` file. This file can be placed in the current working directory or specified with an environment variable called `UDS_CONFIG`. The basic structure of the `uds-config.yaml` is as follows: From c2c4f150b5b900be6d57c651e7915bef796a5132 Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:05:24 -0600 Subject: [PATCH 5/7] add e2e test for arch check. --- src/test/common.go | 4 +-- src/test/e2e/bundle_test.go | 47 ++++++++++++++++++---------- src/test/e2e/dev_test.go | 2 +- src/test/e2e/optional_bundle_test.go | 4 +-- src/test/e2e/variable_test.go | 22 ++++++------- 5 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/test/common.go b/src/test/common.go index cf527278..fcaecf12 100644 --- a/src/test/common.go +++ b/src/test/common.go @@ -166,9 +166,9 @@ func (e2e *UDSE2ETest) DownloadZarfInitPkg(t *testing.T, zarfVersion string) { } // CreateZarfPkg creates a Zarf package in the given path -func (e2e *UDSE2ETest) CreateZarfPkg(t *testing.T, path string, forceCreate bool) { +func (e2e *UDSE2ETest) CreateZarfPkg(t *testing.T, path string, forceCreate bool, arch string) { // check if pkg already exists - pattern := fmt.Sprintf("%s/*-%s-*.tar.zst", path, e2e.Arch) + pattern := fmt.Sprintf("%s/*-%s-*.tar.zst", path, arch) matches, err := filepath.Glob(pattern) require.NoError(t, err) if !forceCreate && len(matches) > 0 { diff --git a/src/test/e2e/bundle_test.go b/src/test/e2e/bundle_test.go index ae225d25..0eae4bf8 100644 --- a/src/test/e2e/bundle_test.go +++ b/src/test/e2e/bundle_test.go @@ -35,7 +35,7 @@ func TestUDSLogs(t *testing.T) { func TestSimpleBundleWithZarfAction(t *testing.T) { zarfPkgPath := "src/test/packages/no-cluster/real-simple" - e2e.CreateZarfPkg(t, zarfPkgPath, false) + e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) os.Setenv("UDS_LOG_LEVEL", "debug") createLocal(t, "src/test/bundles/11-real-simple", e2e.Arch) _, stderr := deploy(t, fmt.Sprintf("src/test/bundles/11-real-simple/uds-bundle-real-simple-%s-0.0.1.tar.zst", e2e.Arch)) @@ -46,8 +46,8 @@ func TestCreateWithNoPath(t *testing.T) { // need to use remote pkgs because we move the uds-bundle.yaml to the current directory zarfPkgPath1 := "src/test/packages/no-cluster/output-var" zarfPkgPath2 := "src/test/packages/no-cluster/receive-var" - e2e.CreateZarfPkg(t, zarfPkgPath1, false) - e2e.CreateZarfPkg(t, zarfPkgPath2, false) + e2e.CreateZarfPkg(t, zarfPkgPath1, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath2, false, e2e.Arch) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -76,7 +76,7 @@ func TestBundleWithLocalAndRemotePkgs(t *testing.T) { defer e2e.TeardownRegistry(t, 888) e2e.SetupDockerRegistry(t, 889) defer e2e.TeardownRegistry(t, 889) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) bundleDir := "src/test/bundles/03-local-and-remote" bundleTarballName := fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch) @@ -112,8 +112,8 @@ func TestBundleWithLocalAndRemotePkgs(t *testing.T) { func TestLocalBundleWithRemotePkgs(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", false) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -138,7 +138,7 @@ func TestLocalBundleWithRemotePkgs(t *testing.T) { func TestPackagesFlag(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) @@ -193,7 +193,7 @@ func TestPackagesFlag(t *testing.T) { func TestResumeFlag(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) @@ -248,8 +248,8 @@ func TestResumeFlag(t *testing.T) { func TestRemoteBundleWithRemotePkgs(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", false) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -292,7 +292,7 @@ func TestRemoteBundleWithRemotePkgs(t *testing.T) { func TestBundleWithGitRepo(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/gitrepo", false) + e2e.CreateZarfPkg(t, "src/test/packages/gitrepo", false, e2e.Arch) bundleDir := "src/test/bundles/05-gitrepo" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-gitrepo-%s-0.0.1.tar.zst", e2e.Arch)) @@ -303,7 +303,7 @@ func TestBundleWithGitRepo(t *testing.T) { func TestBundleWithYmlFile(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", true) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", true, e2e.Arch) bundleDir := "src/test/bundles/09-uds-bundle-yml" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-yml-example-%s-0.0.1.tar.zst", e2e.Arch)) @@ -372,8 +372,8 @@ func TestRemoteBundleWithNoSBOM(t *testing.T) { func TestPackageNaming(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", false) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -504,7 +504,7 @@ func TestBundleWithComposedPkgComponent(t *testing.T) { defer e2e.TeardownRegistry(t, 888) zarfPkgPath := "src/test/packages/prometheus" pkg := filepath.Join(zarfPkgPath, fmt.Sprintf("zarf-package-prometheus-%s-0.0.1.tar.zst", e2e.Arch)) - e2e.CreateZarfPkg(t, zarfPkgPath, false) + e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) zarfPublish(t, pkg, "localhost:888") bundleDir := "src/test/bundles/13-composable-component" @@ -517,7 +517,7 @@ func TestBundleWithComposedPkgComponent(t *testing.T) { func TestBundleTmpDir(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) @@ -619,8 +619,21 @@ func TestInvalidBundle(t *testing.T) { deployZarfInit(t) zarfPkgPath := "src/test/packages/helm" e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) - e2e.CreateZarfPkg(t, zarfPkgPath, false) + e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) bundleDir := "src/test/bundles/07-helm-overrides/invalid" stderr := createLocalError(bundleDir, e2e.Arch) require.Contains(t, stderr, "unknown field") } + +func TestArchCheck(t *testing.T) { + deployZarfInit(t) + zarfPkgPath := "src/test/packages/helm" + e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) + e2e.CreateZarfPkg(t, zarfPkgPath, false, "arm64") + bundleDir := "src/test/bundles/07-helm-overrides" + bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-overrides-%s-0.0.1.tar.zst", "arm64")) + createLocal(t, bundleDir, "arm64") + cmd := strings.Split(fmt.Sprintf("deploy %s --confirm", bundlePath), " ") + _, stderr, _ := e2e.UDS(cmd...) + require.Contains(t, stderr, "arch arm64 does not match cluster arch, [amd64]") +} diff --git a/src/test/e2e/dev_test.go b/src/test/e2e/dev_test.go index b0dbf759..42a52a3f 100644 --- a/src/test/e2e/dev_test.go +++ b/src/test/e2e/dev_test.go @@ -20,7 +20,7 @@ func TestDevDeploy(t *testing.T) { t.Run("Test dev deploy with local and remote pkgs", func(t *testing.T) { - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) diff --git a/src/test/e2e/optional_bundle_test.go b/src/test/e2e/optional_bundle_test.go index 13a52f2f..9f0a5924 100644 --- a/src/test/e2e/optional_bundle_test.go +++ b/src/test/e2e/optional_bundle_test.go @@ -22,11 +22,11 @@ func TestBundleOptionalComponents(t *testing.T) { // create 2 Zarf pkgs to be bundled zarfPkgPath := "src/test/packages/podinfo-nginx" - e2e.CreateZarfPkg(t, zarfPkgPath, false) + e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) zarfPkgPath = "src/test/packages/prometheus" pkg := filepath.Join(zarfPkgPath, fmt.Sprintf("zarf-package-prometheus-%s-0.0.1.tar.zst", e2e.Arch)) - e2e.CreateZarfPkg(t, zarfPkgPath, false) + e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) zarfPublish(t, pkg, "localhost:888") // create bundle and publish diff --git a/src/test/e2e/variable_test.go b/src/test/e2e/variable_test.go index 7ff5be77..8b4506f9 100644 --- a/src/test/e2e/variable_test.go +++ b/src/test/e2e/variable_test.go @@ -15,8 +15,8 @@ import ( ) func TestBundleVariables(t *testing.T) { - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false) - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/receive-var", false) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/receive-var", false, e2e.Arch) os.Setenv("UDS_ANIMAL", "Unicorns") os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/02-variables", "uds-config.yaml")) @@ -35,7 +35,7 @@ func TestBundleVariables(t *testing.T) { }) t.Run("var name collision with exported vars", func(t *testing.T) { - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var-collision", false) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var-collision", false, e2e.Arch) bundleDir := "src/test/bundles/02-variables/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) @@ -72,7 +72,7 @@ func bundleVariablesTestChecks(t *testing.T, stderr string, bundleTarballPath st func TestBundleWithHelmOverrides(t *testing.T) { deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) bundleDir := "src/test/bundles/07-helm-overrides" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-overrides-%s-0.0.1.tar.zst", e2e.Arch)) err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/07-helm-overrides", "uds-config.yaml")) @@ -160,7 +160,7 @@ func TestBundleWithHelmOverrides(t *testing.T) { func TestBundleWithHelmOverridesValuesFile(t *testing.T) { deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) bundleDir := "src/test/bundles/07-helm-overrides/values-file" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-values-file-%s-0.0.1.tar.zst", e2e.Arch)) err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/07-helm-overrides", "uds-config.yaml")) @@ -202,7 +202,7 @@ func TestBundleWithDupPkgs(t *testing.T) { defer e2e.TeardownRegistry(t, 888) zarfPkgPath := "src/test/packages/helm" e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) - e2e.CreateZarfPkg(t, zarfPkgPath, false) + e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) name := "duplicates" pkg := filepath.Join(zarfPkgPath, fmt.Sprintf("zarf-package-helm-overrides-%s-0.0.1.tar.zst", e2e.Arch)) zarfPublish(t, pkg, "localhost:888") @@ -244,7 +244,7 @@ func TestBundleWithEnvVarHelmOverrides(t *testing.T) { // set up configs and env vars deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) color := "purple" b64Secret := "dGhhdCBhaW50IG15IHRydWNr" err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/07-helm-overrides", "uds-config.yaml")) @@ -299,8 +299,8 @@ func TestVariablePrecedence(t *testing.T) { // precedence rules: env var > uds-config.variables > uds-config.shared > default deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false) - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false, e2e.Arch) bundleDir := "src/test/bundles/08-var-precedence" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-var-precedence-%s-0.0.1.tar.zst", e2e.Arch)) err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/08-var-precedence", "uds-config.yaml")) @@ -338,9 +338,9 @@ func TestVariablePrecedence(t *testing.T) { func TestExportVarsAsGlobalVars(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false, e2e.Arch) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) bundleDir := "src/test/bundles/12-exported-pkg-vars" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-export-vars-%s-0.0.1.tar.zst", e2e.Arch)) From be910932d3fff204101cfa14be28ad533ea21fe8 Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Tue, 4 Jun 2024 12:57:49 -0600 Subject: [PATCH 6/7] remove arch param from CreateZarfPkg and make duplicate func --- src/test/common.go | 19 +++++++++++++-- src/test/e2e/bundle_test.go | 36 ++++++++++++++-------------- src/test/e2e/dev_test.go | 2 +- src/test/e2e/optional_bundle_test.go | 4 ++-- src/test/e2e/variable_test.go | 22 ++++++++--------- 5 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/test/common.go b/src/test/common.go index fcaecf12..dd846335 100644 --- a/src/test/common.go +++ b/src/test/common.go @@ -166,9 +166,9 @@ func (e2e *UDSE2ETest) DownloadZarfInitPkg(t *testing.T, zarfVersion string) { } // CreateZarfPkg creates a Zarf package in the given path -func (e2e *UDSE2ETest) CreateZarfPkg(t *testing.T, path string, forceCreate bool, arch string) { +func (e2e *UDSE2ETest) CreateZarfPkg(t *testing.T, path string, forceCreate bool) { // check if pkg already exists - pattern := fmt.Sprintf("%s/*-%s-*.tar.zst", path, arch) + pattern := fmt.Sprintf("%s/*-%s-*.tar.zst", path, e2e.Arch) matches, err := filepath.Glob(pattern) require.NoError(t, err) if !forceCreate && len(matches) > 0 { @@ -180,6 +180,21 @@ func (e2e *UDSE2ETest) CreateZarfPkg(t *testing.T, path string, forceCreate bool require.NoError(t, err) } +// CreateZarfPkgWithArch creates a Zarf package of a user specified arch in the given path +func (e2e *UDSE2ETest) CreateZarfPkgWithArch(t *testing.T, path string, forceCreate bool, arch string) { + // check if pkg already exists + pattern := fmt.Sprintf("%s/*-%s-*.tar.zst", path, arch) + matches, err := filepath.Glob(pattern) + require.NoError(t, err) + if !forceCreate && len(matches) > 0 { + fmt.Println("Zarf pkg already exists, skipping create") + return + } + args := strings.Split(fmt.Sprintf("zarf package create %s -o %s -a %s --confirm", path, path, arch), " ") + _, _, err = e2e.UDS(args...) + require.NoError(t, err) +} + // DeleteZarfPkg deletes a Zarf package from the given path func (e2e *UDSE2ETest) DeleteZarfPkg(t *testing.T, path string) { // check if pkg already exists diff --git a/src/test/e2e/bundle_test.go b/src/test/e2e/bundle_test.go index 0eae4bf8..538599bd 100644 --- a/src/test/e2e/bundle_test.go +++ b/src/test/e2e/bundle_test.go @@ -35,7 +35,7 @@ func TestUDSLogs(t *testing.T) { func TestSimpleBundleWithZarfAction(t *testing.T) { zarfPkgPath := "src/test/packages/no-cluster/real-simple" - e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath, false) os.Setenv("UDS_LOG_LEVEL", "debug") createLocal(t, "src/test/bundles/11-real-simple", e2e.Arch) _, stderr := deploy(t, fmt.Sprintf("src/test/bundles/11-real-simple/uds-bundle-real-simple-%s-0.0.1.tar.zst", e2e.Arch)) @@ -46,8 +46,8 @@ func TestCreateWithNoPath(t *testing.T) { // need to use remote pkgs because we move the uds-bundle.yaml to the current directory zarfPkgPath1 := "src/test/packages/no-cluster/output-var" zarfPkgPath2 := "src/test/packages/no-cluster/receive-var" - e2e.CreateZarfPkg(t, zarfPkgPath1, false, e2e.Arch) - e2e.CreateZarfPkg(t, zarfPkgPath2, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath1, false) + e2e.CreateZarfPkg(t, zarfPkgPath2, false) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -76,7 +76,7 @@ func TestBundleWithLocalAndRemotePkgs(t *testing.T) { defer e2e.TeardownRegistry(t, 888) e2e.SetupDockerRegistry(t, 889) defer e2e.TeardownRegistry(t, 889) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) bundleDir := "src/test/bundles/03-local-and-remote" bundleTarballName := fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch) @@ -112,8 +112,8 @@ func TestBundleWithLocalAndRemotePkgs(t *testing.T) { func TestLocalBundleWithRemotePkgs(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", false, e2e.Arch) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -138,7 +138,7 @@ func TestLocalBundleWithRemotePkgs(t *testing.T) { func TestPackagesFlag(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) @@ -193,7 +193,7 @@ func TestPackagesFlag(t *testing.T) { func TestResumeFlag(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) @@ -248,8 +248,8 @@ func TestResumeFlag(t *testing.T) { func TestRemoteBundleWithRemotePkgs(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", false, e2e.Arch) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -292,7 +292,7 @@ func TestRemoteBundleWithRemotePkgs(t *testing.T) { func TestBundleWithGitRepo(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/gitrepo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/gitrepo", false) bundleDir := "src/test/bundles/05-gitrepo" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-gitrepo-%s-0.0.1.tar.zst", e2e.Arch)) @@ -303,7 +303,7 @@ func TestBundleWithGitRepo(t *testing.T) { func TestBundleWithYmlFile(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", true, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", true) bundleDir := "src/test/bundles/09-uds-bundle-yml" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-yml-example-%s-0.0.1.tar.zst", e2e.Arch)) @@ -372,8 +372,8 @@ func TestRemoteBundleWithNoSBOM(t *testing.T) { func TestPackageNaming(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/nginx", false, e2e.Arch) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/nginx", false) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) e2e.SetupDockerRegistry(t, 888) defer e2e.TeardownRegistry(t, 888) @@ -504,7 +504,7 @@ func TestBundleWithComposedPkgComponent(t *testing.T) { defer e2e.TeardownRegistry(t, 888) zarfPkgPath := "src/test/packages/prometheus" pkg := filepath.Join(zarfPkgPath, fmt.Sprintf("zarf-package-prometheus-%s-0.0.1.tar.zst", e2e.Arch)) - e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath, false) zarfPublish(t, pkg, "localhost:888") bundleDir := "src/test/bundles/13-composable-component" @@ -517,7 +517,7 @@ func TestBundleWithComposedPkgComponent(t *testing.T) { func TestBundleTmpDir(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) @@ -619,7 +619,7 @@ func TestInvalidBundle(t *testing.T) { deployZarfInit(t) zarfPkgPath := "src/test/packages/helm" e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) - e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath, false) bundleDir := "src/test/bundles/07-helm-overrides/invalid" stderr := createLocalError(bundleDir, e2e.Arch) require.Contains(t, stderr, "unknown field") @@ -629,7 +629,7 @@ func TestArchCheck(t *testing.T) { deployZarfInit(t) zarfPkgPath := "src/test/packages/helm" e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) - e2e.CreateZarfPkg(t, zarfPkgPath, false, "arm64") + e2e.CreateZarfPkgWithArch(t, zarfPkgPath, false, "arm64") bundleDir := "src/test/bundles/07-helm-overrides" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-overrides-%s-0.0.1.tar.zst", "arm64")) createLocal(t, bundleDir, "arm64") diff --git a/src/test/e2e/dev_test.go b/src/test/e2e/dev_test.go index 42a52a3f..b0dbf759 100644 --- a/src/test/e2e/dev_test.go +++ b/src/test/e2e/dev_test.go @@ -20,7 +20,7 @@ func TestDevDeploy(t *testing.T) { t.Run("Test dev deploy with local and remote pkgs", func(t *testing.T) { - e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/podinfo", false) bundleDir := "src/test/bundles/03-local-and-remote" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-test-local-and-remote-%s-0.0.1.tar.zst", e2e.Arch)) diff --git a/src/test/e2e/optional_bundle_test.go b/src/test/e2e/optional_bundle_test.go index 9f0a5924..13a52f2f 100644 --- a/src/test/e2e/optional_bundle_test.go +++ b/src/test/e2e/optional_bundle_test.go @@ -22,11 +22,11 @@ func TestBundleOptionalComponents(t *testing.T) { // create 2 Zarf pkgs to be bundled zarfPkgPath := "src/test/packages/podinfo-nginx" - e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath, false) zarfPkgPath = "src/test/packages/prometheus" pkg := filepath.Join(zarfPkgPath, fmt.Sprintf("zarf-package-prometheus-%s-0.0.1.tar.zst", e2e.Arch)) - e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath, false) zarfPublish(t, pkg, "localhost:888") // create bundle and publish diff --git a/src/test/e2e/variable_test.go b/src/test/e2e/variable_test.go index 8b4506f9..7ff5be77 100644 --- a/src/test/e2e/variable_test.go +++ b/src/test/e2e/variable_test.go @@ -15,8 +15,8 @@ import ( ) func TestBundleVariables(t *testing.T) { - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false, e2e.Arch) - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/receive-var", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/receive-var", false) os.Setenv("UDS_ANIMAL", "Unicorns") os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/02-variables", "uds-config.yaml")) @@ -35,7 +35,7 @@ func TestBundleVariables(t *testing.T) { }) t.Run("var name collision with exported vars", func(t *testing.T) { - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var-collision", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var-collision", false) bundleDir := "src/test/bundles/02-variables/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) @@ -72,7 +72,7 @@ func bundleVariablesTestChecks(t *testing.T, stderr string, bundleTarballPath st func TestBundleWithHelmOverrides(t *testing.T) { deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false) bundleDir := "src/test/bundles/07-helm-overrides" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-overrides-%s-0.0.1.tar.zst", e2e.Arch)) err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/07-helm-overrides", "uds-config.yaml")) @@ -160,7 +160,7 @@ func TestBundleWithHelmOverrides(t *testing.T) { func TestBundleWithHelmOverridesValuesFile(t *testing.T) { deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false) bundleDir := "src/test/bundles/07-helm-overrides/values-file" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-values-file-%s-0.0.1.tar.zst", e2e.Arch)) err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/07-helm-overrides", "uds-config.yaml")) @@ -202,7 +202,7 @@ func TestBundleWithDupPkgs(t *testing.T) { defer e2e.TeardownRegistry(t, 888) zarfPkgPath := "src/test/packages/helm" e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) - e2e.CreateZarfPkg(t, zarfPkgPath, false, e2e.Arch) + e2e.CreateZarfPkg(t, zarfPkgPath, false) name := "duplicates" pkg := filepath.Join(zarfPkgPath, fmt.Sprintf("zarf-package-helm-overrides-%s-0.0.1.tar.zst", e2e.Arch)) zarfPublish(t, pkg, "localhost:888") @@ -244,7 +244,7 @@ func TestBundleWithEnvVarHelmOverrides(t *testing.T) { // set up configs and env vars deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false) color := "purple" b64Secret := "dGhhdCBhaW50IG15IHRydWNr" err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/07-helm-overrides", "uds-config.yaml")) @@ -299,8 +299,8 @@ func TestVariablePrecedence(t *testing.T) { // precedence rules: env var > uds-config.variables > uds-config.shared > default deployZarfInit(t) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false) bundleDir := "src/test/bundles/08-var-precedence" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-var-precedence-%s-0.0.1.tar.zst", e2e.Arch)) err := os.Setenv("UDS_CONFIG", filepath.Join("src/test/bundles/08-var-precedence", "uds-config.yaml")) @@ -338,9 +338,9 @@ func TestVariablePrecedence(t *testing.T) { func TestExportVarsAsGlobalVars(t *testing.T) { deployZarfInit(t) - e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/no-cluster/output-var", false) e2e.HelmDepUpdate(t, "src/test/packages/helm/unicorn-podinfo") - e2e.CreateZarfPkg(t, "src/test/packages/helm", false, e2e.Arch) + e2e.CreateZarfPkg(t, "src/test/packages/helm", false) bundleDir := "src/test/bundles/12-exported-pkg-vars" bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-export-vars-%s-0.0.1.tar.zst", e2e.Arch)) From 6deae0ebf1300b7d53d8b1be962e1f04bf6e0935 Mon Sep 17 00:00:00 2001 From: TristanHoladay <40547442+TristanHoladay@users.noreply.github.com> Date: Wed, 5 Jun 2024 08:42:09 -0600 Subject: [PATCH 7/7] handle testArchCheck based on system arch --- src/test/e2e/bundle_test.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/test/e2e/bundle_test.go b/src/test/e2e/bundle_test.go index 538599bd..8db3e99c 100644 --- a/src/test/e2e/bundle_test.go +++ b/src/test/e2e/bundle_test.go @@ -626,14 +626,20 @@ func TestInvalidBundle(t *testing.T) { } func TestArchCheck(t *testing.T) { + testArch := "arm64" + + // use arch that is different from system arch + if e2e.Arch == "arm64" { + testArch = "amd64" + } + deployZarfInit(t) zarfPkgPath := "src/test/packages/helm" - e2e.HelmDepUpdate(t, fmt.Sprintf("%s/unicorn-podinfo", zarfPkgPath)) - e2e.CreateZarfPkgWithArch(t, zarfPkgPath, false, "arm64") + e2e.CreateZarfPkgWithArch(t, zarfPkgPath, false, testArch) bundleDir := "src/test/bundles/07-helm-overrides" - bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-overrides-%s-0.0.1.tar.zst", "arm64")) - createLocal(t, bundleDir, "arm64") + bundlePath := filepath.Join(bundleDir, fmt.Sprintf("uds-bundle-helm-overrides-%s-0.0.1.tar.zst", testArch)) + createLocal(t, bundleDir, testArch) cmd := strings.Split(fmt.Sprintf("deploy %s --confirm", bundlePath), " ") _, stderr, _ := e2e.UDS(cmd...) - require.Contains(t, stderr, "arch arm64 does not match cluster arch, [amd64]") + require.Contains(t, stderr, fmt.Sprintf("arch %s does not match cluster arch, [%s]", testArch, e2e.Arch)) }