From f1d7099ed0d6f85ffaf9b9f44a2350ce44e40765 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 20 Aug 2024 22:05:40 -0300 Subject: [PATCH 01/13] Pointed nginx to use their quay images (which are multiarch) --- client/serviceinterface_update_test.go | 2 +- pkg/domain/podman/main_test.go | 2 +- pkg/domain/podman/site_test.go | 2 +- .../integration/acceptance/annotation/annotated_resource.go | 6 +++--- test/integration/acceptance/custom/headless/headless.go | 2 +- test/integration/examples/http/http.go | 6 +++--- test/integration/performance/http_test.go | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/serviceinterface_update_test.go b/client/serviceinterface_update_test.go index 4672b066e..c8bf6f2ff 100644 --- a/client/serviceinterface_update_test.go +++ b/client/serviceinterface_update_test.go @@ -130,7 +130,7 @@ var httpDeployment *appsv1.Deployment = &appsv1.Deployment{ Containers: []corev1.Container{ { Name: "nginx", - Image: "quay.io/skupper/nginx-unprivileged", + Image: "quay.io/nginx/nginx-unprivileged", ImagePullPolicy: corev1.PullIfNotPresent, Ports: []corev1.ContainerPort{ { diff --git a/pkg/domain/podman/main_test.go b/pkg/domain/podman/main_test.go index 7ada9a352..3f39203ec 100644 --- a/pkg/domain/podman/main_test.go +++ b/pkg/domain/podman/main_test.go @@ -32,7 +32,7 @@ var ( const ( ENV_PODMAN_ENDPOINT = "SKUPPER_TEST_PODMAN_ENDPOINT" NS = "podman-system-test" - NGINX_IMAGE = "quay.io/skupper/nginx-unprivileged:stable-alpine" + NGINX_IMAGE = "quay.io/nginx/nginx-unprivileged:stable-alpine" ) // newBasicSite returns a new instance of a basic Site instance diff --git a/pkg/domain/podman/site_test.go b/pkg/domain/podman/site_test.go index ee796497d..e9da5719a 100644 --- a/pkg/domain/podman/site_test.go +++ b/pkg/domain/podman/site_test.go @@ -460,7 +460,7 @@ func mockContainers() []*container.Container { }, { ID: strings.Replace(uuid.New().String(), "-", "", -1), Name: "nginx", - Image: "docker.io/nginxinc/nginx-unprivileged:stable-alpine", + Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", Labels: map[string]string{}, Networks: map[string]container.ContainerNetworkInfo{ "skupper": { diff --git a/test/integration/acceptance/annotation/annotated_resource.go b/test/integration/acceptance/annotation/annotated_resource.go index d01dd163f..f8e6ebb7c 100644 --- a/test/integration/acceptance/annotation/annotated_resource.go +++ b/test/integration/acceptance/annotation/annotated_resource.go @@ -250,7 +250,7 @@ func createDeployment(cluster *client.VanClient, annotations map[string]string) }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ - {Name: "nginx", Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", Ports: []corev1.ContainerPort{{Name: "web", ContainerPort: 8080}}, ImagePullPolicy: corev1.PullIfNotPresent}, + {Name: "nginx", Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", Ports: []corev1.ContainerPort{{Name: "web", ContainerPort: 8080}}, ImagePullPolicy: corev1.PullIfNotPresent}, }, RestartPolicy: corev1.RestartPolicyAlways, }, @@ -325,7 +325,7 @@ func createStatefulSet(cluster *client.VanClient, annotations map[string]string) }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ - {Name: "nginx", Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", Ports: []corev1.ContainerPort{{Name: "web", ContainerPort: 8080}}, ImagePullPolicy: corev1.PullIfNotPresent}, + {Name: "nginx", Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", Ports: []corev1.ContainerPort{{Name: "web", ContainerPort: 8080}}, ImagePullPolicy: corev1.PullIfNotPresent}, }, RestartPolicy: corev1.RestartPolicyAlways, }, @@ -373,7 +373,7 @@ func createDaemonSet(cluster *client.VanClient, annotations map[string]string) ( }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ - {Name: "nginx", Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", Ports: []corev1.ContainerPort{{Name: "web", ContainerPort: 8080}}, ImagePullPolicy: corev1.PullIfNotPresent}, + {Name: "nginx", Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", Ports: []corev1.ContainerPort{{Name: "web", ContainerPort: 8080}}, ImagePullPolicy: corev1.PullIfNotPresent}, }, RestartPolicy: corev1.RestartPolicyAlways, }, diff --git a/test/integration/acceptance/custom/headless/headless.go b/test/integration/acceptance/custom/headless/headless.go index ccfaf7452..91238f279 100644 --- a/test/integration/acceptance/custom/headless/headless.go +++ b/test/integration/acceptance/custom/headless/headless.go @@ -26,7 +26,7 @@ const ( appPort = "8080" appPortInt = 8080 appPortName = "web" - appImage = "quay.io/skupper/nginx-unprivileged:stable-alpine" + appImage = "quay.io/nginx/nginx-unprivileged:stable-alpine" pod0Name = appName + "-0" pod1Name = appName + "-1" ) diff --git a/test/integration/examples/http/http.go b/test/integration/examples/http/http.go index 8fe4d2594..e8b497825 100644 --- a/test/integration/examples/http/http.go +++ b/test/integration/examples/http/http.go @@ -94,7 +94,7 @@ var nginxDep = &appsv1.Deployment{ Containers: []apiv1.Container{ { Name: "nginx1", - Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", + Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", ImagePullPolicy: apiv1.PullIfNotPresent, Ports: []apiv1.ContainerPort{ { @@ -331,7 +331,7 @@ var nghttp1TlsDep = &appsv1.Deployment{ Containers: []apiv1.Container{ { Name: "nghttp1tls", - Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", + Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", ImagePullPolicy: apiv1.PullIfNotPresent, Ports: []apiv1.ContainerPort{ { @@ -575,7 +575,7 @@ var nghttp1TlsDepWithCertFiles = &appsv1.Deployment{ Containers: []apiv1.Container{ { Name: "nghttp1tls", - Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", + Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", ImagePullPolicy: apiv1.PullIfNotPresent, Ports: []apiv1.ContainerPort{ { diff --git a/test/integration/performance/http_test.go b/test/integration/performance/http_test.go index 271f7aead..cc4cd3ffd 100644 --- a/test/integration/performance/http_test.go +++ b/test/integration/performance/http_test.go @@ -426,7 +426,7 @@ func getHttpServerInfo(settings *httpSettings) *common.ServerInfo { func getHttpDeployment() *appsv1.Deployment { dep, _ := k8s.NewDeployment("http-server", "", k8s.DeploymentOpts{ - Image: "quay.io/skupper/nginx-unprivileged:stable-alpine", + Image: "quay.io/nginx/nginx-unprivileged:stable-alpine", Labels: map[string]string{"app": "http-server"}, }) return dep From c25d8b1bfeb7329fe1496d0395e58a5ef535a05f Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 20 Aug 2024 22:58:22 -0300 Subject: [PATCH 02/13] Skip hipstershop on non-amd64 clusters --- .../custom/hipstershop/hipstershop.go | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/integration/examples/custom/hipstershop/hipstershop.go b/test/integration/examples/custom/hipstershop/hipstershop.go index e63af8593..189becb66 100644 --- a/test/integration/examples/custom/hipstershop/hipstershop.go +++ b/test/integration/examples/custom/hipstershop/hipstershop.go @@ -7,6 +7,7 @@ import ( "os" "strings" "testing" + "time" "github.com/skupperproject/skupper/api/types" "github.com/skupperproject/skupper/pkg/utils" @@ -40,6 +41,42 @@ var ( } ) +// Hipstershop is currently supported only on amd64 +// +// https://github.com/GoogleCloudPlatform/microservices-demo/issues/622#issuecomment-2066712947 +// +// # If the target clusters are found to contain any non-amd64 nodes, the test is skipped +// +// Notice that it is perfectly valid to run this test from an arm64 machine; only the cluster +// needs to be amd64 +// +// TODO: make it more granular, allow for hibrid clusters? +// TODO: move this to a shared package, allow for list of accepted archs? +func checkArch(t *testing.T, clusters ...*base.ClusterContext) error { + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute*10) + defer cancel() + + for _, c := range clusters { + list, err := c.VanClient.KubeClient.CoreV1().Nodes().List(ctx, v1.ListOptions{}) + if err != nil { + return err + } + for _, node := range list.Items { + arch := node.Labels["beta.kubernetes.io/arch"] + if arch != "amd64" { + t.Skipf( + "at least one cluster node is not amd64 -- skipping (%s at %s is %s)", + node.Name, + c.VanClient.RestConfig.Host, + arch, + ) + } + } + } + return nil +} + func Setup(t *testing.T, testRunner base.ClusterTestRunner) { var err error @@ -50,6 +87,8 @@ func Setup(t *testing.T, testRunner base.ClusterTestRunner) { prv1, err := testRunner.GetPrivateContext(1) assert.Assert(t, err) + assert.Assert(t, checkArch(t, pub1, pub2, prv1)) + // creating namespaces assert.Assert(t, pub1.CreateNamespace()) assert.Assert(t, pub2.CreateNamespace()) From a727ce8e54ec5f63eb72ccc6d2f9864507f3b157 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 20 Aug 2024 23:08:14 -0300 Subject: [PATCH 03/13] Pointing the curl image from dockerhub to quay https://hub.docker.com/r/curlimages/curl points to the quay presence --- test/utils/tools/curl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/utils/tools/curl.go b/test/utils/tools/curl.go index 0a3c44432..0650a07d7 100644 --- a/test/utils/tools/curl.go +++ b/test/utils/tools/curl.go @@ -204,7 +204,7 @@ func DeployCurl(kubeClient kubernetes.Interface, ns, pod string) (*v1.Pod, error }, Spec: v1.PodSpec{ Containers: []v1.Container{ - {Name: "curl", Image: "curlimages/curl", Command: strings.Split("tail -f /dev/null", " ")}, + {Name: "curl", Image: "quay.io/curl/curl", Command: strings.Split("tail -f /dev/null", " ")}, }, RestartPolicy: v1.RestartPolicyAlways, TerminationGracePeriodSeconds: &terminationPeriodSecs, From f1929f4f0168fdcf01b095078c1a88cfaf73b674 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Thu, 22 Aug 2024 17:02:23 -0300 Subject: [PATCH 04/13] Adapted test images makefile for multi-arch Some images need to be 'reassembled' instead of simply copied --- test/images/Dockerfile.nghttp2 | 2 +- test/images/Makefile | 75 +++++++++++++++++++++++++++++----- test/images/README.md | 8 +++- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/test/images/Dockerfile.nghttp2 b/test/images/Dockerfile.nghttp2 index 6b69a2ff2..bb0c7b15a 100644 --- a/test/images/Dockerfile.nghttp2 +++ b/test/images/Dockerfile.nghttp2 @@ -1,4 +1,4 @@ -FROM alpine:latest +FROM --platform=$TARGETPLATFORM alpine:latest LABEL description="A supporting test image containing nghttp2 (client, server and load tester), for Skupper testing. By default, this image does not start any nghttp2 project; the user needs to overwrite CMD with the command they want" LABEL maintainer="Skupper project" diff --git a/test/images/Makefile b/test/images/Makefile index d70dfe75d..5fcda071a 100644 --- a/test/images/Makefile +++ b/test/images/Makefile @@ -1,7 +1,7 @@ # This make file provides three operations: # # - Copy a list of images (hardcoded below) to a main repository (by default, -# quay.io/skupper) +# quay.io/skupper), possibly modifying and reassembling them # - Generate and push images to that same repository, based on Dockerfiles # - Copy both lists of images above (external and generated) to another, # configurable repository @@ -12,19 +12,22 @@ # the MAIN_REPO: # # make docker.io/svagi/nghttp2 +# make docker.io/nginxinc/nginx-unprivileged # make nghttp2 # -# The possible values are those listed on EXTERNAL_IMAGES and GENERATED_IMAGES. +# The possible values are those listed on EXTERNAL_IMAGES, REASSEMBLE_IMAGES +# and GENERATED_IMAGES. # # You can also only build an image (and not push it). Just add _build to the # image name listed in GENERATED_IMAGES: # # make nghttp2_build # -# Alternativelly, one can build/push or copy all generated, all external, or -# all of them: +# Alternativelly, one can build/push or copy all generated, all external, all +# reassembled, or all of them: # # make external_images +# make reassembled_images # make generated_images # make everything # @@ -59,6 +62,7 @@ # # make COPY_REPO=192.168.0.1:5000/internal nghttp2_copy # make COPY_REPO=192.168.0.1:5000/internal docker.io/ssorj/quiver_copy +# make COPY_REPO=192.168.0.1:5000/internal docker.io/nginxinc/nginx-unprivileged_copy # # This Makefile is intended to be executed manually, with the login of # individual users, and not by a robot account on a CI. @@ -80,6 +84,7 @@ SKOPEO = skopeo # That is required for their use with Openshift 3.11 FORMAT_OPTIONS = --format docker TRANSFORM_OPTIONS = --format v2s2 +PLATFORM = linux/amd64,linux/arm64 # Repositories MAIN_REPO = quay.io/skupper @@ -90,7 +95,6 @@ COPY_REPO = localhost:5000/local # (such as in docker.io/library/mongo\:5.0). Otherwise, you'll get an error # like `multiple target patterns. Stop.` EXTERNAL_IMAGES := \ - docker.io/nginxinc/nginx-unprivileged \ docker.io/ssorj/quiver \ docker.io/library/postgres \ docker.io/library/redis \ @@ -98,7 +102,22 @@ EXTERNAL_IMAGES := \ docker.io/maistra/examples-bookinfo-ratings-v1\:0.12.0 \ docker.io/maistra/examples-bookinfo-details-v1\:0.12.0 \ docker.io/maistra/examples-bookinfo-reviews-v3\:0.12.0 \ - docker.io/library/mongo\:5.0 \ + docker.io/library/mongo\:5.0 + +# These manifest lists require special handling; they contain 'images' with +# os/arch/variant "unknown" and the following entry in LayersData.Annotations: +# +# in-toto.io/predicate-type": "https://slsa.dev/provenance/v0.2 +# +# That makes a plain skopeo copy --all --format v2s2 to fail with an error +# like the one below: +# +# copying image 8/14 from manifest list: creating an updated image manifest: Unknown media type during manifest conversion: "application/vnd.in-toto+json" +# +# For that reason, we need to first copy the image locally, change its +# manifest, and only then copy it to its destination. +REASSEMBLE_IMAGES := \ + docker.io/nginxinc/nginx-unprivileged \ docker.io/nginxinc/nginx-unprivileged\:stable-alpine # These are the images that are generated by this Makefile (as opposed to @@ -117,6 +136,7 @@ generated_build := $(patsubst %,%_build,$(GENERATED_IMAGES)) # The copy target names, to be used with the copy operation generated_copy := $(patsubst %,%_copy,$(GENERATED_IMAGES)) external_copy := $(patsubst %,%_copy,$(EXTERNAL_IMAGES)) +reassembled_copy := $(patsubst %,%_copy,$(REASSEMBLE_IMAGES)) # We don't want someone to just run `make` and start copying stuff # around, so instead the default operation is to just give some @@ -133,17 +153,18 @@ all: # `podman build` on it, tagging it on the MAIN_REPO $(generated_build): TARGET = $(patsubst %_build,%,$@) $(generated_build): - $(PODMAN) build $(FORMAT_OPTIONS) --file Dockerfile.$(TARGET) --tag $(MAIN_REPO)/$(TARGET) + $(PODMAN) build --platform $(PLATFORM) $(FORMAT_OPTIONS) --file Dockerfile.$(TARGET) --manifest $(MAIN_REPO)/$(TARGET) -# This is generic the push target, for images built here (GENERATED_IMAGES) +# This is the generic the push target, for images built here (GENERATED_IMAGES) # Each image depends on its respective _build target %: %_build $(PODMAN) push $(MAIN_REPO)/$@ # Shortcut targets external_images: $(EXTERNAL_IMAGES) +reassembled_images: $(REASSEMBLE_IMAGES) generated_images: $(GENERATED_IMAGES) -everything: external_images generated_images +everything: external_images generated_images reassembled_images # This is the main target for the external images; it copies them from their # original locations _into_ MAIN_REPO. Do not confuse this for the `copy` operation @@ -157,10 +178,37 @@ $(EXTERNAL_IMAGES): docker://$@ \ docker://$(MAIN_REPO)/$(TARGET) +# This is the main target for the reassembled images; it copies them from their +# original locations to a temporary directory, modifies the manifest.json and then +# copies them _into_ MAIN_REPO. +# +# The first line prepares a target-local TARGET variable, which contains only +# the last part of the URL +$(REASSEMBLE_IMAGES): TARGET = $(shell echo "$@" | sed s_.*/__ ) +$(REASSEMBLE_IMAGES): REASSEMBLE_TMPDIR ::= /tmp/$(shell mktemp -d image-reassembly-XXX ) +$(REASSEMBLE_IMAGES): + $(SKOPEO) copy --all \ + docker://$@ \ + dir://$(REASSEMBLE_TMPDIR) + + ls $(REASSEMBLE_TMPDIR) + + jq \ + '(.manifests[] | select (.platform.os == "unknown")) |= del (.) | del (..|nulls)' \ + $(REASSEMBLE_TMPDIR)/manifest.json > $(REASSEMBLE_TMPDIR)/manifest.json.new + + mv $(REASSEMBLE_TMPDIR)/manifest.json.new $(REASSEMBLE_TMPDIR)/manifest.json + + $(SKOPEO) copy --all $(TRANSFORM_OPTIONS) \ + dir://$(REASSEMBLE_TMPDIR) \ + docker://$(MAIN_REPO)/$(TARGET) + + rm -rf $(REASSEMBLE_TMPDIR) + # # Copy operation # -copy: $(generated_copy) $(external_copy) +copy: $(generated_copy) $(external_copy) $(reassembled_copy) # The targets for external and generated images are basically the same; the # only difference is the way the original/main target needs to be manipulated @@ -178,3 +226,10 @@ $(external_copy): $(SKOPEO) copy $(TRANSFORM_OPTIONS) \ docker://$(MAIN_REPO)/$(TARGET) \ docker://$(COPY_REPO)/$(TARGET) + +# Remove _copy, but also everything till the last / +$(reassembled_copy): TARGET = $(shell echo "$@" | sed -e "s/_copy$$//" -e 's_.*/__' ) +$(reassembled_copy): + $(SKOPEO) copy $(TRANSFORM_OPTIONS) \ + docker://$(MAIN_REPO)/$(TARGET) \ + docker://$(COPY_REPO)/$(TARGET) diff --git a/test/images/README.md b/test/images/README.md index 7e52f780e..d97626e69 100644 --- a/test/images/README.md +++ b/test/images/README.md @@ -1,4 +1,4 @@ -# Images for external dependencies +# Images for external test dependencies The Makefile on this directory allows for the manipulation of container images pertaining to external test dependencies, such as Mongo or quiver. @@ -26,6 +26,10 @@ Note that this is not a full repo copy; it's restricted to the list of images contained on the Makefile. Skupper images (such as the router or controller) are not copied by this operation. +Note also that it is not a simple copy. As Skupper can run on some older +Kubernetes that do not support the OCI format, there are some transformations +done during the copy as well. + See the Makefile contents for information on how to execute the different operations. @@ -33,5 +37,5 @@ operations. # skupper-test image Note that the `skupper-test` image used by Skupper integration is part of -Skupper's own test code, so it's build by the main Makefile at ../.., and not +Skupper's own test code, so it's built by the main Makefile at ../.., and not here. From ee2f6984a4a882be754457e53e0406d200ffce12 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Sat, 7 Sep 2024 16:25:03 -0300 Subject: [PATCH 05/13] Added --no-cache to generated_build --- test/images/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/images/Makefile b/test/images/Makefile index 5fcda071a..7fadeea43 100644 --- a/test/images/Makefile +++ b/test/images/Makefile @@ -153,9 +153,9 @@ all: # `podman build` on it, tagging it on the MAIN_REPO $(generated_build): TARGET = $(patsubst %_build,%,$@) $(generated_build): - $(PODMAN) build --platform $(PLATFORM) $(FORMAT_OPTIONS) --file Dockerfile.$(TARGET) --manifest $(MAIN_REPO)/$(TARGET) + $(PODMAN) build --platform $(PLATFORM) --no-cache $(FORMAT_OPTIONS) --file Dockerfile.$(TARGET) --manifest $(MAIN_REPO)/$(TARGET) -# This is the generic the push target, for images built here (GENERATED_IMAGES) +# This is the generic push target, for images built here (GENERATED_IMAGES) # Each image depends on its respective _build target %: %_build $(PODMAN) push $(MAIN_REPO)/$@ From 98956d0f4f63774286f3c20f854e6dd3c3a05acf Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Sat, 7 Sep 2024 17:24:51 -0300 Subject: [PATCH 06/13] Changed all skopeo copy to --all; moved postgres and redis to reassemble --- test/images/Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/images/Makefile b/test/images/Makefile index 7fadeea43..0074635ee 100644 --- a/test/images/Makefile +++ b/test/images/Makefile @@ -96,8 +96,6 @@ COPY_REPO = localhost:5000/local # like `multiple target patterns. Stop.` EXTERNAL_IMAGES := \ docker.io/ssorj/quiver \ - docker.io/library/postgres \ - docker.io/library/redis \ docker.io/maistra/examples-bookinfo-productpage-v1\:0.12.0 \ docker.io/maistra/examples-bookinfo-ratings-v1\:0.12.0 \ docker.io/maistra/examples-bookinfo-details-v1\:0.12.0 \ @@ -117,6 +115,8 @@ EXTERNAL_IMAGES := \ # For that reason, we need to first copy the image locally, change its # manifest, and only then copy it to its destination. REASSEMBLE_IMAGES := \ + docker.io/library/postgres \ + docker.io/library/redis \ docker.io/nginxinc/nginx-unprivileged \ docker.io/nginxinc/nginx-unprivileged\:stable-alpine @@ -174,7 +174,7 @@ everything: external_images generated_images reassembled_images # the last part of the URL $(EXTERNAL_IMAGES): TARGET = $(shell echo "$@" | sed s_.*/__ ) $(EXTERNAL_IMAGES): - $(SKOPEO) copy $(TRANSFORM_OPTIONS) \ + $(SKOPEO) copy --all $(TRANSFORM_OPTIONS) \ docker://$@ \ docker://$(MAIN_REPO)/$(TARGET) @@ -216,20 +216,20 @@ copy: $(generated_copy) $(external_copy) $(reassembled_copy) $(generated_copy): TARGET = $(patsubst %_copy,%,$@) $(generated_copy): - $(SKOPEO) copy $(TRANSFORM_OPTIONS) \ + $(SKOPEO) copy --all $(TRANSFORM_OPTIONS) \ docker://$(MAIN_REPO)/$(TARGET) \ docker://$(COPY_REPO)/$(TARGET) # Remove _copy, but also everything till the last / $(external_copy): TARGET = $(shell echo "$@" | sed -e "s/_copy$$//" -e 's_.*/__' ) $(external_copy): - $(SKOPEO) copy $(TRANSFORM_OPTIONS) \ + $(SKOPEO) copy --all $(TRANSFORM_OPTIONS) \ docker://$(MAIN_REPO)/$(TARGET) \ docker://$(COPY_REPO)/$(TARGET) # Remove _copy, but also everything till the last / $(reassembled_copy): TARGET = $(shell echo "$@" | sed -e "s/_copy$$//" -e 's_.*/__' ) $(reassembled_copy): - $(SKOPEO) copy $(TRANSFORM_OPTIONS) \ + $(SKOPEO) copy --all $(TRANSFORM_OPTIONS) \ docker://$(MAIN_REPO)/$(TARGET) \ docker://$(COPY_REPO)/$(TARGET) From 3fc4f7b647323e0c28bc89c4f8f006780b446f20 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Mon, 9 Sep 2024 23:03:53 -0300 Subject: [PATCH 07/13] refactor checkArch into arch.Skip; skip wrk2; DumpTestInfo on errors --- ...ckerfile.nghttp2 => Containerfile.nghttp2} | 0 .../custom/hipstershop/hipstershop.go | 43 ++------------- test/integration/examples/http/http.go | 13 +++-- .../performance/common/perfrunner.go | 13 +++++ test/integration/performance/http_test.go | 7 ++- test/utils/arch/k8s.go | 55 +++++++++++++++++++ 6 files changed, 86 insertions(+), 45 deletions(-) rename test/images/{Dockerfile.nghttp2 => Containerfile.nghttp2} (100%) create mode 100644 test/utils/arch/k8s.go diff --git a/test/images/Dockerfile.nghttp2 b/test/images/Containerfile.nghttp2 similarity index 100% rename from test/images/Dockerfile.nghttp2 rename to test/images/Containerfile.nghttp2 diff --git a/test/integration/examples/custom/hipstershop/hipstershop.go b/test/integration/examples/custom/hipstershop/hipstershop.go index 189becb66..e8a90d0e0 100644 --- a/test/integration/examples/custom/hipstershop/hipstershop.go +++ b/test/integration/examples/custom/hipstershop/hipstershop.go @@ -7,10 +7,10 @@ import ( "os" "strings" "testing" - "time" "github.com/skupperproject/skupper/api/types" "github.com/skupperproject/skupper/pkg/utils" + "github.com/skupperproject/skupper/test/utils/arch" "github.com/skupperproject/skupper/test/utils/base" "github.com/skupperproject/skupper/test/utils/constants" "github.com/skupperproject/skupper/test/utils/k8s" @@ -41,42 +41,6 @@ var ( } ) -// Hipstershop is currently supported only on amd64 -// -// https://github.com/GoogleCloudPlatform/microservices-demo/issues/622#issuecomment-2066712947 -// -// # If the target clusters are found to contain any non-amd64 nodes, the test is skipped -// -// Notice that it is perfectly valid to run this test from an arm64 machine; only the cluster -// needs to be amd64 -// -// TODO: make it more granular, allow for hibrid clusters? -// TODO: move this to a shared package, allow for list of accepted archs? -func checkArch(t *testing.T, clusters ...*base.ClusterContext) error { - - ctx, cancel := context.WithTimeout(context.Background(), time.Minute*10) - defer cancel() - - for _, c := range clusters { - list, err := c.VanClient.KubeClient.CoreV1().Nodes().List(ctx, v1.ListOptions{}) - if err != nil { - return err - } - for _, node := range list.Items { - arch := node.Labels["beta.kubernetes.io/arch"] - if arch != "amd64" { - t.Skipf( - "at least one cluster node is not amd64 -- skipping (%s at %s is %s)", - node.Name, - c.VanClient.RestConfig.Host, - arch, - ) - } - } - } - return nil -} - func Setup(t *testing.T, testRunner base.ClusterTestRunner) { var err error @@ -87,7 +51,10 @@ func Setup(t *testing.T, testRunner base.ClusterTestRunner) { prv1, err := testRunner.GetPrivateContext(1) assert.Assert(t, err) - assert.Assert(t, checkArch(t, pub1, pub2, prv1)) + // Hipstershop is currently supported only on amd64 + // + // https://github.com/GoogleCloudPlatform/microservices-demo/issues/622#issuecomment-2066712947 + assert.Assert(t, arch.Skip(t, pub1, pub2, prv1)) // creating namespaces assert.Assert(t, pub1.CreateNamespace()) diff --git a/test/integration/examples/http/http.go b/test/integration/examples/http/http.go index e8b497825..a5c8a15cd 100644 --- a/test/integration/examples/http/http.go +++ b/test/integration/examples/http/http.go @@ -809,7 +809,7 @@ func runHeyTestTable(t *testing.T, jobCluster *base.ClusterContext) { } } -func runTests(t *testing.T, r base.ClusterTestRunner) { +func runTests(t *testing.T, r *base.ClusterTestRunnerBase) { pubCluster1, err := r.GetPublicContext(1) assert.Assert(t, err) @@ -891,7 +891,7 @@ func runTests(t *testing.T, r base.ClusterTestRunner) { runHeyTestTable(t, pubCluster1) } -func setup(ctx context.Context, t *testing.T, r base.ClusterTestRunner) { +func setup(ctx context.Context, t *testing.T, r *base.ClusterTestRunnerBase) { prv1Cluster, err := r.GetPrivateContext(1) assert.Assert(t, err) @@ -1003,13 +1003,18 @@ func setup(ctx context.Context, t *testing.T, r base.ClusterTestRunner) { } -func Run(ctx context.Context, t *testing.T, r base.ClusterTestRunner) { +func Run(ctx context.Context, t *testing.T, r *base.ClusterTestRunnerBase) { defer tearDown(ctx, r) + defer func() { + if t.Failed() { + r.DumpTestInfo("TestHttp") + } + }() setup(ctx, t, r) runTests(t, r) } -func tearDown(ctx context.Context, r base.ClusterTestRunner) { +func tearDown(ctx context.Context, r *base.ClusterTestRunnerBase) { prv1Cluster, _ := r.GetPrivateContext(1) // Deleting Skupper services diff --git a/test/integration/performance/common/perfrunner.go b/test/integration/performance/common/perfrunner.go index 962dab23c..1acd52d30 100644 --- a/test/integration/performance/common/perfrunner.go +++ b/test/integration/performance/common/perfrunner.go @@ -11,6 +11,7 @@ import ( "github.com/skupperproject/skupper/api/types" "github.com/skupperproject/skupper/pkg/kube" "github.com/skupperproject/skupper/pkg/utils" + "github.com/skupperproject/skupper/test/utils/arch" "github.com/skupperproject/skupper/test/utils/base" "github.com/skupperproject/skupper/test/utils/constants" "github.com/skupperproject/skupper/test/utils/k8s" @@ -69,6 +70,18 @@ func runClientJobs(perfTest PerformanceTest) error { } for _, job := range app.Client.Jobs { + if job.Job.Labels["type"] == "wrk2" { + // wrk2 is not available for arm64 + // https://github.com/giltene/wrk2/issues/104 + err, skip := arch.Check(clientCluster) + if skip { + logger.Printf("! Skipping job %q: %v", job.Name, err) + continue + } + if err != nil { + return err + } + } resultInfo := resultInfo{job: job} stepLog.Printf("- Running client job %s at %s", job.Name, clientCluster.Namespace) diff --git a/test/integration/performance/http_test.go b/test/integration/performance/http_test.go index cc4cd3ffd..f434bcd89 100644 --- a/test/integration/performance/http_test.go +++ b/test/integration/performance/http_test.go @@ -324,7 +324,7 @@ func getHttpJobs(settings *httpSettings, serviceName string) []common.JobInfo { for _, clients := range settings.clients { // wrk job jobWrkName := fmt.Sprintf("%s-wrk-clients-%d", jobPrefix, clients) - labelsWrk := map[string]string{"job": jobWrkName} + labelsWrk := map[string]string{"job": jobWrkName, "type": "wrk"} job := &batchv1.Job{ ObjectMeta: metav1.ObjectMeta{Name: jobWrkName, Labels: labelsWrk}, Spec: batchv1.JobSpec{ @@ -355,7 +355,7 @@ func getHttpJobs(settings *httpSettings, serviceName string) []common.JobInfo { log.Printf("rate is required for wrk2 - setting to (default) %d", wrk2Rate) } jobWrk2Name := fmt.Sprintf("%s-wrk2-rate-%d-clients-%d", jobPrefix, wrk2Rate, clients) - labelsWrk2 := map[string]string{"job": jobWrk2Name} + labelsWrk2 := map[string]string{"job": jobWrk2Name, "type": "wrk2"} job = &batchv1.Job{ ObjectMeta: metav1.ObjectMeta{Name: jobWrk2Name, Labels: labelsWrk2}, Spec: batchv1.JobSpec{ @@ -374,6 +374,7 @@ func getHttpJobs(settings *httpSettings, serviceName string) []common.JobInfo { }, }, } + jobs = append(jobs, common.JobInfo{ Name: jobWrk2Name, Clients: clients, @@ -382,7 +383,7 @@ func getHttpJobs(settings *httpSettings, serviceName string) []common.JobInfo { // hey job jobHeyName := fmt.Sprintf("%s-hey-clients-%d", jobPrefix, clients) - labelsHey := map[string]string{"job": jobHeyName} + labelsHey := map[string]string{"job": jobHeyName, "type": "hey"} heyArgs := []string{"-z", strconv.Itoa(settings.duration) + "s", "-c", strconv.Itoa(clients)} if settings.rate > 0 { heyArgs = append(heyArgs, "-q", strconv.Itoa(settings.rate)) diff --git a/test/utils/arch/k8s.go b/test/utils/arch/k8s.go new file mode 100644 index 000000000..ddddc50d7 --- /dev/null +++ b/test/utils/arch/k8s.go @@ -0,0 +1,55 @@ +package arch + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/skupperproject/skupper/test/utils/base" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// If the target clusters are found to contain any non-amd64 nodes, the test is skipped +// +// Notice that it is perfectly valid to run such a test from an arm64 machine; only the cluster +// needs to be amd64 +// +// Usage: check first skip; only check err if skip is false. If skip is true, error +// will be non-nil, with information on why skipping +// +// TODO: make it more granular, allow for hibrid clusters? +// TODO: allow for list of accepted archs? +func Check(clusters ...*base.ClusterContext) (err error, skip bool) { + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute*10) + defer cancel() + + for _, c := range clusters { + list, err := c.VanClient.KubeClient.CoreV1().Nodes().List(ctx, v1.ListOptions{}) + if err != nil { + return err, false + } + for _, node := range list.Items { + arch := node.Labels["beta.kubernetes.io/arch"] + if arch != "amd64" { + return fmt.Errorf( + "at least one cluster node is not amd64 -- skipping (%s at %s is %s)", + node.Name, + c.VanClient.RestConfig.Host, + arch, + ), true + } + } + } + return nil, false +} + +// Calls arch.Check, and skip the test as needed +func Skip(t *testing.T, clusters ...*base.ClusterContext) error { + err, skip := Check(clusters...) + if skip { + t.Skipf("%v", err) + } + return err +} From 5a3c9f6b554d9f1f10e5aac35cdfa50987085559 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Mon, 9 Sep 2024 23:05:44 -0300 Subject: [PATCH 08/13] Added key, iperf3, nghttp2, wrk into list of images --- test/images/Containerfile.hey | 22 ++++++++++++++++++++++ test/images/Containerfile.iperf3 | 9 +++++++++ test/images/Containerfile.nghttp2 | 2 ++ test/images/Containerfile.wrk | 17 +++++++++++++++++ test/images/Containerfile.wrk2 | 13 +++++++++++++ test/images/Makefile | 20 ++++++++++++++------ 6 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 test/images/Containerfile.hey create mode 100644 test/images/Containerfile.iperf3 create mode 100644 test/images/Containerfile.wrk create mode 100644 test/images/Containerfile.wrk2 diff --git a/test/images/Containerfile.hey b/test/images/Containerfile.hey new file mode 100644 index 000000000..af92df90a --- /dev/null +++ b/test/images/Containerfile.hey @@ -0,0 +1,22 @@ +ARG TARGETPLATFORM + +FROM --platform=$TARGETPLATFORM golang:1.21 AS builder + +ARG TARGETOS +ARG TARGETARCH + +WORKDIR /go/src/app +RUN git clone https://github.com/rakyll/hey.git ./ +RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o hey ./hey.go + +FROM --platform=$TARGETPLATFORM registry.access.redhat.com/ubi9-minimal + +# Create user and group and switch to user's context +RUN microdnf -y install shadow-utils \ +&& microdnf clean all +RUN useradd --uid 10000 runner +USER 10000 + +WORKDIR /app +COPY --from=builder /go/src/app/hey . +CMD ["/app/hey"] diff --git a/test/images/Containerfile.iperf3 b/test/images/Containerfile.iperf3 new file mode 100644 index 000000000..4fbc10241 --- /dev/null +++ b/test/images/Containerfile.iperf3 @@ -0,0 +1,9 @@ +ARG TARGETPLATFORM + +FROM --platform=$TARGETPLATFORM registry.access.redhat.com/ubi9-minimal + +# Create user and group and switch to user's context +RUN microdnf -y install iperf3 \ +&& microdnf clean all +RUN useradd --uid 10000 runner +USER 10000 diff --git a/test/images/Containerfile.nghttp2 b/test/images/Containerfile.nghttp2 index bb0c7b15a..dffd3d719 100644 --- a/test/images/Containerfile.nghttp2 +++ b/test/images/Containerfile.nghttp2 @@ -1,3 +1,5 @@ +ARG TARGETPLATFORM + FROM --platform=$TARGETPLATFORM alpine:latest LABEL description="A supporting test image containing nghttp2 (client, server and load tester), for Skupper testing. By default, this image does not start any nghttp2 project; the user needs to overwrite CMD with the command they want" diff --git a/test/images/Containerfile.wrk b/test/images/Containerfile.wrk new file mode 100644 index 000000000..37afea6d1 --- /dev/null +++ b/test/images/Containerfile.wrk @@ -0,0 +1,17 @@ +ARG TARGETPLATFORM + +FROM --platform=$TARGETPLATFORM registry.fedoraproject.org/fedora-minimal AS build + +RUN microdnf -y install gcc git make unzip openssl-devel && microdnf -y clean all + +WORKDIR /home/root +RUN git clone https://github.com/wg/wrk.git + +WORKDIR /home/root/wrk +RUN make WITH_OPENSSL=/usr + +FROM registry.fedoraproject.org/fedora-minimal + +COPY --from=build /home/root/wrk/wrk /usr/bin/wrk + +CMD ["/usr/bin/wrk"] diff --git a/test/images/Containerfile.wrk2 b/test/images/Containerfile.wrk2 new file mode 100644 index 000000000..b4b2a26f3 --- /dev/null +++ b/test/images/Containerfile.wrk2 @@ -0,0 +1,13 @@ +ARG TARGETPLATFORM + +FROM --platform=$TARGETPLATFORM alpine:latest as builder + +RUN apk add --update alpine-sdk openssl-dev zlib-dev && apk add --no-cache git && git clone https://github.com/giltene/wrk2.git && cd wrk2 && make && mv wrk /bin/ + + +FROM alpine:latest + +RUN apk add --update libgcc openssl zlib +COPY --from=builder /bin/wrk /bin/ + +CMD ["/bin/sh"] diff --git a/test/images/Makefile b/test/images/Makefile index 0074635ee..ef8d10a95 100644 --- a/test/images/Makefile +++ b/test/images/Makefile @@ -2,7 +2,7 @@ # # - Copy a list of images (hardcoded below) to a main repository (by default, # quay.io/skupper), possibly modifying and reassembling them -# - Generate and push images to that same repository, based on Dockerfiles +# - Generate and push images to that same repository, based on Containerfiles # - Copy both lists of images above (external and generated) to another, # configurable repository # @@ -122,9 +122,14 @@ REASSEMBLE_IMAGES := \ # These are the images that are generated by this Makefile (as opposed to # created elsewhere and just copied here). To add a new image, simply create -# Dockerfile.IMAGENAME and add the IMAGENAME below. +# Containerfile.IMAGENAME and add the IMAGENAME below. GENERATED_IMAGES := \ - nghttp2 + hey \ + nghttp2 \ + wrk + + # wrk2 does not support ARM: https://github.com/giltene/wrk2/issues/104 + # wrk2 # --- end of configuration --- @@ -149,16 +154,19 @@ all: @echo Normal use, however, is to select individual targets. @echo Check Makefile contents for documentation. -# For a generated image, we simply have a Dockerfile named after it and call +# For a generated image, we simply have a Containerfile named after it and call # `podman build` on it, tagging it on the MAIN_REPO $(generated_build): TARGET = $(patsubst %_build,%,$@) $(generated_build): - $(PODMAN) build --platform $(PLATFORM) --no-cache $(FORMAT_OPTIONS) --file Dockerfile.$(TARGET) --manifest $(MAIN_REPO)/$(TARGET) + # First, we need to remove any existing manifest, as the command below is additive + # (it would append builds to an existing manifest) + -$(PODMAN) manifest rm $(MAIN_REPO)/$(TARGET) + $(PODMAN) build --platform $(PLATFORM) --no-cache $(FORMAT_OPTIONS) --file Containerfile.$(TARGET) --manifest $(MAIN_REPO)/$(TARGET) # This is the generic push target, for images built here (GENERATED_IMAGES) # Each image depends on its respective _build target %: %_build - $(PODMAN) push $(MAIN_REPO)/$@ + $(PODMAN) manifest push $(MAIN_REPO)/$@ # Shortcut targets external_images: $(EXTERNAL_IMAGES) From e7264066059f71584b4a98e821429ab82a599d70 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 10 Sep 2024 01:14:32 -0300 Subject: [PATCH 09/13] Adding iperf3 --- test/images/Containerfile.iperf3 | 13 +++++++++++-- test/images/Makefile | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/test/images/Containerfile.iperf3 b/test/images/Containerfile.iperf3 index 4fbc10241..a25fe7087 100644 --- a/test/images/Containerfile.iperf3 +++ b/test/images/Containerfile.iperf3 @@ -1,9 +1,18 @@ ARG TARGETPLATFORM -FROM --platform=$TARGETPLATFORM registry.access.redhat.com/ubi9-minimal +FROM --platform=$TARGETPLATFORM quay.io/fedora/fedora-minimal + +LABEL description="A supporting test image" +LABEL maintainer="Skupper project" +LABEL origin=https://github.com/skupperproject/skupper/blob/main/test/images + +EXPOSE 5201 # Create user and group and switch to user's context -RUN microdnf -y install iperf3 \ +RUN microdnf -y install iperf3 shadow-utils \ && microdnf clean all RUN useradd --uid 10000 runner USER 10000 + +ENTRYPOINT iperf3 +CMD [] diff --git a/test/images/Makefile b/test/images/Makefile index ef8d10a95..373a5e686 100644 --- a/test/images/Makefile +++ b/test/images/Makefile @@ -125,6 +125,7 @@ REASSEMBLE_IMAGES := \ # Containerfile.IMAGENAME and add the IMAGENAME below. GENERATED_IMAGES := \ hey \ + iperf3 \ nghttp2 \ wrk From 54db37a27a9c889b66dc9d28b4ddec90cbf9ae90 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 10 Sep 2024 09:50:12 -0300 Subject: [PATCH 10/13] Added postgres --- test/images/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/test/images/Makefile b/test/images/Makefile index 373a5e686..4d402fed3 100644 --- a/test/images/Makefile +++ b/test/images/Makefile @@ -96,6 +96,7 @@ COPY_REPO = localhost:5000/local # like `multiple target patterns. Stop.` EXTERNAL_IMAGES := \ docker.io/ssorj/quiver \ + docker.io/library/postgres\:9.5 \ docker.io/maistra/examples-bookinfo-productpage-v1\:0.12.0 \ docker.io/maistra/examples-bookinfo-ratings-v1\:0.12.0 \ docker.io/maistra/examples-bookinfo-details-v1\:0.12.0 \ From 380b11fb4373247e16927ccd55398ff5f24a91f2 Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 10 Sep 2024 12:14:05 -0300 Subject: [PATCH 11/13] Fix iperf's entrypoint --- test/images/Containerfile.iperf3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/images/Containerfile.iperf3 b/test/images/Containerfile.iperf3 index a25fe7087..1147f20b8 100644 --- a/test/images/Containerfile.iperf3 +++ b/test/images/Containerfile.iperf3 @@ -14,5 +14,5 @@ RUN microdnf -y install iperf3 shadow-utils \ RUN useradd --uid 10000 runner USER 10000 -ENTRYPOINT iperf3 CMD [] +ENTRYPOINT ["/usr/bin/iperf3"] From 782b106a698afd6832c4d823f984899374ee7f6e Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:29:31 -0300 Subject: [PATCH 12/13] Skip TestPostgres for ARM. See #1650 --- test/integration/performance/common/setup.go | 8 ++++++++ test/integration/performance/postgres_test.go | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/test/integration/performance/common/setup.go b/test/integration/performance/common/setup.go index 678171962..2b6f7d771 100644 --- a/test/integration/performance/common/setup.go +++ b/test/integration/performance/common/setup.go @@ -22,6 +22,7 @@ import ( "github.com/skupperproject/skupper/pkg/kube" pkgutils "github.com/skupperproject/skupper/pkg/utils" "github.com/skupperproject/skupper/test/utils" + "github.com/skupperproject/skupper/test/utils/arch" "github.com/skupperproject/skupper/test/utils/base" "github.com/skupperproject/skupper/test/utils/constants" v1 "k8s.io/api/core/v1" @@ -37,6 +38,13 @@ var ( debug bool ) +// Tests do not have access to common.testRunner, so they can call this +// function to check on cluster architectures, and skip accordingly. +func CheckArch(t *testing.T) error { + err := arch.Skip(t, testRunner.ClusterContexts...) + return err +} + func DebugMode() bool { return debug } diff --git a/test/integration/performance/postgres_test.go b/test/integration/performance/postgres_test.go index 1d877f934..fddff2402 100644 --- a/test/integration/performance/postgres_test.go +++ b/test/integration/performance/postgres_test.go @@ -45,6 +45,10 @@ type postgresSettings struct { } func TestPostgres(t *testing.T) { + // TestPostgres is currently not functional for ARM + // https://github.com/skupperproject/skupper/issues/1650 + common.CheckArch(t) + settings := parsePostgresSettings() p := &PostgresTest{ Name: "postgres", @@ -61,6 +65,7 @@ func TestPostgres(t *testing.T) { LatencyUnit: common.LatencyUnitMs, } assert.Assert(t, common.RunPerformanceTest(p)) + } func (p *PostgresTest) App() common.PerformanceApp { From 199a492e34bfe975b81feadf911f90fe459479ef Mon Sep 17 00:00:00 2001 From: Danilo Gonzalez Hashimoto <97529980+hash-d@users.noreply.github.com> Date: Tue, 10 Sep 2024 18:39:55 -0300 Subject: [PATCH 13/13] Update hey Command, inline with new image --- test/integration/examples/http/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/examples/http/http.go b/test/integration/examples/http/http.go index a5c8a15cd..07e4561b6 100644 --- a/test/integration/examples/http/http.go +++ b/test/integration/examples/http/http.go @@ -643,7 +643,7 @@ var h1HeyBaseJob = &batchv1.Job{ { Name: "h1heybase", Image: "quay.io/skupper/hey", - Command: []string{"hey_linux_amd64"}, + Command: []string{"/app/hey"}, ImagePullPolicy: apiv1.PullAlways, }, },