diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 0ba645efe6..5d34cdd474 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -13,8 +13,6 @@ jobs: # Build the OLM image and save it as an artifact build: runs-on: ubuntu-latest - outputs: - sha: ${{ steps.vars.outputs.sha }} steps: # checkout code and setup go - uses: actions/checkout@v4 @@ -22,15 +20,13 @@ jobs: with: go-version-file: "go.mod" # build binaries and image for e2e test (includes experimental features) - - name: Build controller image - run: make e2e-build - - name: Save image - run: docker save quay.io/operator-framework/olm:local -o olm-image.tar - - name: Upload Docker image as artifact + - name: Build OLM Image + run: make e2e-build save-image + - name: Upload Artifacts uses: actions/upload-artifact@v4 with: - name: olm-image.tar - path: olm-image.tar + name: docker-images + path: "*.tar.gz" # Run e2e tests in parallel jobs # Take olm image from the previous stage @@ -53,14 +49,17 @@ jobs: - uses: actions/setup-go@v5 with: go-version-file: "go.mod" - - # load the olm image - - name: Load OLM Docker image + - name: Download build artifacts uses: actions/download-artifact@v4 with: - name: olm-image.tar - path: . - - run: docker load < olm-image.tar + name: docker-images + path: images/ + - name: Load Docker images + run: | + for image in images/*.tar.gz; do + echo "Loading image $image" + docker load -i $image + done # set e2e environment variables # Set ginkgo output and parallelism @@ -87,7 +86,7 @@ jobs: KIND_CLUSTER_NAME="kind-olmv0-${i}" \ KIND_CREATE_OPTS="--kubeconfig=${E2E_KUBECONFIG_ROOT}/kubeconfig-${i}" \ HELM_INSTALL_OPTS="--kubeconfig ${E2E_KUBECONFIG_ROOT}/kubeconfig-${i}" \ - make kind-create deploy; + make kind-create load-test-images deploy; done # run non-flakes if matrix-id is not 'flakes' diff --git a/Makefile b/Makefile index 8e6e295892..d90848d3ad 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ export CONFIGMAP_SERVER_IMAGE ?= quay.io/operator-framework/configmap-operator-r PKG := github.com/operator-framework/operator-lifecycle-manager IMAGE_REPO ?= quay.io/operator-framework/olm -IMAGE_TAG ?= "dev" +IMAGE_TAG ?= "local" # Go build settings # @@ -102,8 +102,8 @@ KUBEBUILDER_ASSETS ?= $(shell $(SETUP_ENVTEST) use -p path $(KUBE_MINOR).x) # Kind node image tags are in the format x.y.z we pin to version x.y.0 because patch releases and node images # are not guaranteed to be available when a new version of the kube apis is released -KIND_CLUSTER_IMAGE := kindest/node:v$(KUBE_MINOR).0 -KIND_CLUSTER_NAME ?= kind-olmv0 +export KIND_CLUSTER_IMAGE := kindest/node:v$(KUBE_MINOR).0 +export KIND_CLUSTER_NAME ?= kind-olmv0 # Targets # # Disable -j flag for make @@ -145,9 +145,20 @@ image: export GOOS = linux image: clean build #HELP Build image image for linux on host architecture docker build -t $(IMAGE_REPO):$(IMAGE_TAG) -f Dockerfile bin +.PHONY: save-image +TARGZ_FILE ?= olm-image.tar.gz +save-image: + docker save $(IMAGE_REPO):$(IMAGE_TAG) | gzip > "$(TARGZ_FILE)" + + +.PHONE: build-e2e-fixture-images +build-e2e-fixture-images: #HELP Build images for e2e testing + ./scripts/e2e_test_fixtures.sh + .PHONY: e2e-build # the e2e and experimental_metrics tags are required to get e2e tests to pass # search the code for go:build e2e or go:build experimental_metrics to see where these tags are used + e2e-build: export GO_BUILD_TAGS += e2e experimental_metrics #HELP Build image for e2e testing e2e-build: IMAGE_TAG = local e2e-build: image @@ -207,13 +218,18 @@ kind-clean: $(KIND) #HELP Delete kind cluster $KIND_CLUSTER_NAME (default: kind- .PHONY: kind-create kind-create: kind-clean #HELP Create a new kind cluster $KIND_CLUSTER_NAME (default: kind-olmv0) - $(KIND) create cluster --name $(KIND_CLUSTER_NAME) --image $(KIND_CLUSTER_IMAGE) $(KIND_CREATE_OPTS) + ./scripts/kind_with_registry.sh $(KIND) export kubeconfig --name $(KIND_CLUSTER_NAME) +.PHONY: load-test-images +export REGISTRY ?= localhost:5001 +load-test-images: #HELP Load the OLM images into the kind cluster's registry + ./scripts/e2e_test_fixtures.sh --push-to="$(REGISTRY)" + .PHONY: deploy -OLM_IMAGE := quay.io/operator-framework/olm:local +OLM_IMAGE ?= $(IMAGE_REPO):$(IMAGE_TAG) deploy: $(KIND) $(HELM) #HELP Deploy OLM to kind cluster $KIND_CLUSTER_NAME (default: kind-olmv0) using $OLM_IMAGE (default: quay.io/operator-framework/olm:local) - $(KIND) load docker-image $(OLM_IMAGE) --name $(KIND_CLUSTER_NAME); \ + $(KIND) load docker-image $(OLM_IMAGE) --name $(KIND_CLUSTER_NAME) $(HELM) upgrade --install olm deploy/chart \ --set debug=true \ --set olm.image.ref=$(OLM_IMAGE) \ diff --git a/scripts/build_test_images.sh b/scripts/build_test_images.sh deleted file mode 100755 index 32f1fcaa6e..0000000000 --- a/scripts/build_test_images.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -# Busybox Operator Index Image -docker build -t quay.io/olmtest/busybox-bundle:1.0.0 ./test/images/busybox-index/busybox/1.0.0 -docker build -t quay.io/olmtest/busybox-bundle:2.0.0 ./test/images/busybox-index/busybox/2.0.0 - -docker build -t quay.io/olmtest/busybox-dependency-bundle:1.0.0 ./test/images/busybox-index/busybox-dependency/1.0.0 -docker build -t quay.io/olmtest/busybox-dependency-bundle:2.0.0 ./test/images/busybox-index/busybox-dependency/2.0.0 - -docker push quay.io/olmtest/busybox-bundle:1.0.0 -docker push quay.io/olmtest/busybox-bundle:2.0.0 -docker push quay.io/olmtest/busybox-dependency-bundle:1.0.0 -docker push quay.io/olmtest/busybox-dependency-bundle:2.0.0 - -opm index add --bundles quay.io/olmtest/busybox-dependency-bundle:1.0.0,quay.io/olmtest/busybox-bundle:1.0.0 --tag quay.io/olmtest/busybox-dependencies-index:1.0.0-with-ListBundles-method -c docker -docker push quay.io/olmtest/busybox-dependencies-index:1.0.0-with-ListBundles-method - -opm index add --bundles quay.io/olmtest/busybox-dependency-bundle:2.0.0,quay.io/olmtest/busybox-bundle:2.0.0 --tag quay.io/olmtest/busybox-dependencies-index:2.0.0-with-ListBundles-method --from-index quay.io/olmtest/busybox-dependencies-index:1.0.0-with-ListBundles-method -c docker -docker push quay.io/olmtest/busybox-dependencies-index:2.0.0-with-ListBundles-method diff --git a/scripts/e2e_test_fixtures.sh b/scripts/e2e_test_fixtures.sh new file mode 100755 index 0000000000..6d8c39381a --- /dev/null +++ b/scripts/e2e_test_fixtures.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +KIND=${KIND:-kind} +CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-docker} + +# Default values +OPERATOR_REGISTRY_VERSION="${OPERATOR_REGISTRY_VERSION:-$(go list -m github.com/operator-framework/operator-registry | cut -d" " -f2 | sed 's/^v//')}" +KIND_CLUSTER_NAME="${KIND_CLUSTER_NAME:-kind-olmv0}" +REGISTRY="${REGISTRY:-localhost:5001}" + +# Fixtures +# Note: the following catalogs reference bundles stored in quay.io/olmtest +INDEX_V1="${REGISTRY}/busybox-dependencies-index:1.0.0-with-ListBundles-method-${OPM_VERSION}" +INDEX_V2="${REGISTRY}/busybox-dependencies-index:2.0.0-with-ListBundles-method-${OPM_VERSION}" +TEST_CATALOG_IMAGE="${REGISTRY}/test-catalog:e2e" + +## Build +${CONTAINER_RUNTIME} build -t "${INDEX_V1}" --build-arg="OPM_VERSION=v${OPERATOR_REGISTRY_VERSION}" -f ./test/images/busybox-index/index.Dockerfile ./test/images/busybox-index/indexv1 +${CONTAINER_RUNTIME} build -t "${INDEX_V2}" --build-arg="OPM_VERSION=v${OPERATOR_REGISTRY_VERSION}" -f ./test/images/busybox-index/index.Dockerfile ./test/images/busybox-index/indexv2 + +# The following catalog used for e2e tests related to serving an extracted registry +# See catalog_e2e_test.go +# let's just reuse one of the other catalogs for this - the tests don't care about the content +# only that a catalog's content can be extracted and served by a different container +${CONTAINER_RUNTIME} tag "${INDEX_V2}" "${TEST_CATALOG_IMAGE}" + +### Push +${CONTAINER_RUNTIME} push "${INDEX_V1}" +${CONTAINER_RUNTIME} push "${INDEX_V2}" +${CONTAINER_RUNTIME} push "${TEST_CATALOG_IMAGE}" diff --git a/scripts/kind_with_registry.sh b/scripts/kind_with_registry.sh new file mode 100755 index 0000000000..1a05734664 --- /dev/null +++ b/scripts/kind_with_registry.sh @@ -0,0 +1,77 @@ +#!/bin/sh +set -o errexit +set -x + +. ".bingo/variables.env" + +# Original source: https://kind.sigs.k8s.io/docs/user/local-registry/ +KIND_CLUSTER_NAME=${KIND_CLUSTER_NAME:-kind-olmv0} +KIND=${KIND:-kind} +DOCKER=${DOCKER:-docker} +KUBECTL=${KUBECTL:-kubectl} + +# 1. Create registry container unless it already exists +reg_name='kind-registry' +reg_port='5001' +if [ "$(${DOCKER} inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then + ${DOCKER} run \ + -d --restart=always -p "127.0.0.1:${reg_port}:5000" --network bridge --name "${reg_name}" \ + registry:2 +fi + +# 2. Create kind cluster with containerd registry config dir enabled +# TODO: kind will eventually enable this by default and this patch will +# be unnecessary. +# +# See: +# https://github.com/kubernetes-sigs/kind/issues/2875 +# https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration +# See: https://github.com/containerd/containerd/blob/main/docs/hosts.md +if [ -n "${KIND_CLUSTER_IMAGE}" ]; then + KIND_IMAGE="--image=${KIND_CLUSTER_IMAGE}" +fi +cat <=0.0.0 <2.0.0" + } + ] +} +{ + "schema": "olm.bundle", + "name": "busybox.v2.0.0", + "package": "busybox", + "image": "quay.io/olmtest/busybox-bundle:2.0.0", + "properties": [ + { + "type": "olm.gvk.required", + "value": { + "group": "olm.test.io", + "kind": "Foo", + "version": "v1" + } + }, + { + "type": "olm.package", + "value": { + "packageName": "busybox", + "version": "2.0.0" + } + }, + { + "type": "olm.csv.metadata", + "value": { + "annotations": { + "olm.skipRange": ">=0.0.0 <2.0.0" + }, + "apiServiceDefinitions": {}, + "crdDescriptions": { + "required": [ + { + "name": "foos.olm.test.io", + "version": "v1", + "kind": "Foo", + "displayName": "Foo", + "description": "Foo resources for testing dependencies" + } + ] + }, + "description": "A busybox CSV.\n", + "displayName": "busybox", + "installModes": [ + { + "type": "OwnNamespace", + "supported": true + }, + { + "type": "SingleNamespace", + "supported": true + }, + { + "type": "MultiNamespace", + "supported": true + }, + { + "type": "AllNamespaces", + "supported": true + } + ], + "maturity": "alpha", + "provider": { + "name": "Red Hat" + } + } + } + ], + "relatedImages": [ + { + "name": "", + "image": "busybox" + }, + { + "name": "", + "image": "quay.io/olmtest/busybox-bundle:2.0.0" + } + ] +} +{ + "schema": "olm.package", + "name": "busybox-dependency", + "defaultChannel": "alpha" +} +{ + "schema": "olm.channel", + "name": "alpha", + "package": "busybox-dependency", + "entries": [ + { + "name": "busybox-dependency.v2.0.0", + "skipRange": ">=0.0.0 <2.0.0" + } + ] +} +{ + "schema": "olm.bundle", + "name": "busybox-dependency.v2.0.0", + "package": "busybox-dependency", + "image": "quay.io/olmtest/busybox-dependency-bundle:2.0.0", + "properties": [ + { + "type": "olm.gvk", + "value": { + "group": "olm.test.io", + "kind": "Foo", + "version": "v1" + } + }, + { + "type": "olm.package", + "value": { + "packageName": "busybox-dependency", + "version": "2.0.0" + } + }, + { + "type": "olm.csv.metadata", + "value": { + "annotations": { + "olm.skipRange": ">=0.0.0 <2.0.0" + }, + "apiServiceDefinitions": {}, + "crdDescriptions": { + "owned": [ + { + "name": "foos.olm.test.io", + "version": "v1", + "kind": "Foo", + "displayName": "Foo", + "description": "Foo resources for testing dependencies" + } + ] + }, + "description": "A busybox-dependency CSV.\n", + "displayName": "busybox-dependency", + "installModes": [ + { + "type": "OwnNamespace", + "supported": true + }, + { + "type": "SingleNamespace", + "supported": true + }, + { + "type": "MultiNamespace", + "supported": true + }, + { + "type": "AllNamespaces", + "supported": true + } + ], + "maturity": "alpha", + "provider": { + "name": "Red Hat" + } + } + } + ], + "relatedImages": [ + { + "name": "", + "image": "busybox" + }, + { + "name": "", + "image": "quay.io/olmtest/busybox-dependency-bundle:2.0.0" + } + ] +}