Skip to content

Commit 64e9ab7

Browse files
kaovilaiclaude
andcommitted
Replace operator-sdk run bundle with catalog-based OLM deployment
The operator-sdk run bundle command has limitations and a pending PR (#7040) that is not getting merged. This replaces it with a catalog-based approach using opm and direct OLM resource creation. Changes: - Add CATALOG_SOURCE_NAME and BUNDLE_CHANNEL variables for configurability - Update deploy-olm to build catalog using existing catalog-build/catalog-push - Create CatalogSource with grpcPodConfig.securityContextConfig: restricted - Create OperatorGroup and Subscription directly via oc apply - Wait for CatalogSource READY, InstallPlan, and CSV Succeeded states - Simplify undeploy-olm to remove operator-sdk cleanup dependency - Update create-sts-subscription helper to use variables - Update deploy-olm-stsflow console URL to use BUNDLE_CHANNEL variable Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 664e936 commit 64e9ab7

1 file changed

Lines changed: 102 additions & 14 deletions

File tree

Makefile

Lines changed: 102 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,12 @@ ifneq ($(origin CATALOG_BASE_IMG), undefined)
389389
FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG)
390390
endif
391391

392+
# Catalog source name for deploy-olm
393+
CATALOG_SOURCE_NAME ?= oadp-operator-catalog
394+
395+
# Bundle channel (from bundle/metadata/annotations.yaml)
396+
BUNDLE_CHANNEL ?= dev
397+
392398
# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'.
393399
# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see:
394400
# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator
@@ -535,28 +541,110 @@ OADP_TEST_NAMESPACE ?= openshift-adp
535541
.PHONY: deploy-olm
536542
deploy-olm: THIS_OPERATOR_IMAGE?=ttl.sh/oadp-operator-$(GIT_REV):$(TTL_DURATION) # Set target specific variable
537543
deploy-olm: THIS_BUNDLE_IMAGE?=ttl.sh/oadp-operator-bundle-$(GIT_REV):$(TTL_DURATION) # Set target specific variable
544+
deploy-olm: THIS_CATALOG_IMAGE?=ttl.sh/oadp-operator-catalog-$(GIT_REV):$(TTL_DURATION) # Set target specific variable
538545
deploy-olm: DEPLOY_TMP:=$(shell mktemp -d)/ # Set target specific variable
539546
deploy-olm: undeploy-olm ## Build current branch operator image, bundle image, push and install via OLM. For more information, check docs/developer/install_from_source.md
540547
@make versions
541548
@echo "DEPLOY_TMP: $(DEPLOY_TMP)"
542-
# build and push operator and bundle image
543-
# use $(OPERATOR_SDK) to install bundle to authenticated cluster
549+
# build and push operator, bundle, and catalog images
544550
cp -r . $(DEPLOY_TMP) && cd $(DEPLOY_TMP) && \
545-
IMG=$(THIS_OPERATOR_IMAGE) BUNDLE_IMG=$(THIS_BUNDLE_IMAGE) \
546-
make docker-build docker-push bundle bundle-build bundle-push; \
551+
IMG=$(THIS_OPERATOR_IMAGE) BUNDLE_IMG=$(THIS_BUNDLE_IMAGE) BUNDLE_IMGS=$(THIS_BUNDLE_IMAGE) CATALOG_IMG=$(THIS_CATALOG_IMAGE) \
552+
make docker-build docker-push bundle bundle-build bundle-push catalog-build catalog-push; \
547553
chmod -R 777 $(DEPLOY_TMP) && rm -rf $(DEPLOY_TMP)
548-
$(OPERATOR_SDK) run bundle --security-context-config restricted $(THIS_BUNDLE_IMAGE) --namespace $(OADP_TEST_NAMESPACE)
554+
# Create CatalogSource with restricted security context
555+
@echo "Creating CatalogSource $(CATALOG_SOURCE_NAME)..."
556+
@echo -e "apiVersion: operators.coreos.com/v1alpha1\nkind: CatalogSource\nmetadata:\n name: $(CATALOG_SOURCE_NAME)\n namespace: $(OADP_TEST_NAMESPACE)\nspec:\n sourceType: grpc\n image: $(THIS_CATALOG_IMAGE)\n displayName: OADP Operator Catalog\n publisher: OADP Team\n grpcPodConfig:\n securityContextConfig: restricted" | $(OC_CLI) apply -f -
557+
# Wait for CatalogSource to be ready
558+
@echo "Waiting for CatalogSource to be ready..."
559+
@timeout=120; \
560+
while [ $$timeout -gt 0 ]; do \
561+
STATE=$$($(OC_CLI) get catalogsource $(CATALOG_SOURCE_NAME) -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.status.connectionState.lastObservedState}' 2>/dev/null); \
562+
if [ "$$STATE" = "READY" ]; then \
563+
echo "CatalogSource is ready"; \
564+
break; \
565+
fi; \
566+
echo -n "."; \
567+
sleep 2; \
568+
timeout=$$((timeout-2)); \
569+
done; \
570+
if [ $$timeout -le 0 ]; then \
571+
echo "Timeout waiting for CatalogSource"; \
572+
$(OC_CLI) get catalogsource $(CATALOG_SOURCE_NAME) -n $(OADP_TEST_NAMESPACE) -o yaml; \
573+
exit 1; \
574+
fi
575+
# Create OperatorGroup if not exists
576+
@echo "Checking OperatorGroup..."
577+
@OG_COUNT=$$($(OC_CLI) get operatorgroup -n $(OADP_TEST_NAMESPACE) --no-headers 2>/dev/null | wc -l | tr -d ' '); \
578+
if [ "$$OG_COUNT" -eq "0" ]; then \
579+
echo "Creating OperatorGroup..."; \
580+
echo -e "apiVersion: operators.coreos.com/v1\nkind: OperatorGroup\nmetadata:\n name: oadp-operator-group\n namespace: $(OADP_TEST_NAMESPACE)\nspec:\n targetNamespaces:\n - $(OADP_TEST_NAMESPACE)" | $(OC_CLI) apply -f -; \
581+
else \
582+
echo "OperatorGroup already exists"; \
583+
fi
584+
# Create Subscription
585+
@echo "Creating Subscription..."
586+
@echo -e "apiVersion: operators.coreos.com/v1alpha1\nkind: Subscription\nmetadata:\n name: oadp-operator\n namespace: $(OADP_TEST_NAMESPACE)\nspec:\n channel: $(BUNDLE_CHANNEL)\n name: oadp-operator\n source: $(CATALOG_SOURCE_NAME)\n sourceNamespace: $(OADP_TEST_NAMESPACE)\n installPlanApproval: Automatic" | $(OC_CLI) apply -f -
587+
# Wait for operator to be ready
588+
@echo "Waiting for InstallPlan to be created..."
589+
@timeout=60; \
590+
while [ $$timeout -gt 0 ]; do \
591+
INSTALL_PLAN=$$($(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.status.installPlanRef.name}' 2>/dev/null); \
592+
if [ -n "$$INSTALL_PLAN" ]; then \
593+
echo "InstallPlan $$INSTALL_PLAN found"; \
594+
break; \
595+
fi; \
596+
echo -n "."; \
597+
sleep 2; \
598+
timeout=$$((timeout-2)); \
599+
done; \
600+
if [ $$timeout -le 0 ]; then \
601+
echo "Timeout waiting for InstallPlan"; \
602+
exit 1; \
603+
fi
604+
@echo "Waiting for CSV to exist..."
605+
@timeout=120; \
606+
CSV_NAME=""; \
607+
while [ $$timeout -gt 0 ]; do \
608+
CSV_NAME=$$($(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.status.currentCSV}' 2>/dev/null); \
609+
if [ -n "$$CSV_NAME" ]; then \
610+
if $(OC_CLI) get csv/$$CSV_NAME -n $(OADP_TEST_NAMESPACE) >/dev/null 2>&1; then \
611+
echo "CSV $$CSV_NAME found"; \
612+
break; \
613+
fi; \
614+
fi; \
615+
echo -n "."; \
616+
sleep 2; \
617+
timeout=$$((timeout-2)); \
618+
done; \
619+
if [ $$timeout -le 0 ]; then \
620+
echo "Timeout waiting for CSV to exist"; \
621+
exit 1; \
622+
fi
623+
@echo "Waiting for CSV to be ready..."
624+
@CSV_NAME=$$($(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.status.currentCSV}' 2>/dev/null); \
625+
if [ -n "$$CSV_NAME" ]; then \
626+
$(OC_CLI) wait --for=jsonpath='{.status.phase}'=Succeeded csv/$$CSV_NAME -n $(OADP_TEST_NAMESPACE) --timeout=300s; \
627+
fi
628+
@echo "Operator is ready!"
629+
@$(OC_CLI) get subscription oadp-operator -n $(OADP_TEST_NAMESPACE)
630+
@$(OC_CLI) get csv -n $(OADP_TEST_NAMESPACE)
549631

550632
.PHONY: undeploy-olm
551-
undeploy-olm: login-required operator-sdk ## Uninstall current branch operator via OLM
633+
undeploy-olm: login-required ## Uninstall current branch operator via OLM
552634
$(OC_CLI) whoami # Check if logged in
553635
$(OC_CLI) create namespace $(OADP_TEST_NAMESPACE) || true
554-
-$(OPERATOR_SDK) cleanup oadp-operator --namespace $(OADP_TEST_NAMESPACE) || true
555-
# Also try to clean up any leftover resources
636+
# Delete Subscription
556637
-$(OC_CLI) delete subscription oadp-operator -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
557-
-$(OC_CLI) get subscription -n $(OADP_TEST_NAMESPACE) -o name | xargs -I {} $(OC_CLI) get {} -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.metadata.name}{"\t"}{.spec.source}{"\n"}' | grep "oadp-operator-catalog" | cut -f1 | xargs -I {} $(OC_CLI) delete subscription {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
638+
# Delete any subscriptions using our catalog
639+
-$(OC_CLI) get subscription -n $(OADP_TEST_NAMESPACE) -o name 2>/dev/null | xargs -I {} $(OC_CLI) get {} -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.metadata.name}{"\t"}{.spec.source}{"\n"}' 2>/dev/null | grep "$(CATALOG_SOURCE_NAME)" | cut -f1 | xargs -I {} $(OC_CLI) delete subscription {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true || true
640+
# Delete CSV with OADP label
558641
-$(OC_CLI) delete csv -l operators.coreos.com/oadp-operator.$(OADP_TEST_NAMESPACE) -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
559-
-$(OC_CLI) delete catalogsource oadp-operator-catalog -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
642+
# Delete any CSV starting with oadp-operator
643+
-$(OC_CLI) get csv -n $(OADP_TEST_NAMESPACE) -o name 2>/dev/null | grep oadp-operator | xargs -I {} $(OC_CLI) delete {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true || true
644+
# Delete CatalogSource
645+
-$(OC_CLI) delete catalogsource $(CATALOG_SOURCE_NAME) -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
646+
# Delete OperatorGroup (only if we created it)
647+
-$(OC_CLI) delete operatorgroup oadp-operator-group -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
560648

561649
# Create subscription YAML helper function
562650
# Parameters:
@@ -568,9 +656,9 @@ create-sts-subscription = \
568656
echo " name: oadp-operator" >> $(1) && \
569657
echo " namespace: $(OADP_TEST_NAMESPACE)" >> $(1) && \
570658
echo "spec:" >> $(1) && \
571-
echo " channel: operator-sdk-run-bundle" >> $(1) && \
659+
echo " channel: $(BUNDLE_CHANNEL)" >> $(1) && \
572660
echo " name: oadp-operator" >> $(1) && \
573-
echo " source: oadp-operator-catalog" >> $(1) && \
661+
echo " source: $(CATALOG_SOURCE_NAME)" >> $(1) && \
574662
echo " sourceNamespace: $(OADP_TEST_NAMESPACE)" >> $(1) && \
575663
echo " installPlanApproval: Automatic" >> $(1) && \
576664
echo " config:" >> $(1) && \
@@ -631,14 +719,14 @@ apply-sts-subscription = \
631719
.PHONY: deploy-olm-stsflow
632720
deploy-olm-stsflow: deploy-olm ## Deploy via OLM then uninstall CSV/Subscription and provide console URL for standardized flow
633721
@echo "Uninstalling CSV and Subscription to trigger standardized flow UI..."
634-
-$(OC_CLI) get subscription -n $(OADP_TEST_NAMESPACE) -o name | xargs -I {} $(OC_CLI) get {} -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.metadata.name}{"\t"}{.spec.source}{"\n"}' | grep "oadp-operator-catalog" | cut -f1 | xargs -I {} $(OC_CLI) delete subscription {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
722+
-$(OC_CLI) get subscription -n $(OADP_TEST_NAMESPACE) -o name 2>/dev/null | xargs -I {} $(OC_CLI) get {} -n $(OADP_TEST_NAMESPACE) -o jsonpath='{.metadata.name}{"\t"}{.spec.source}{"\n"}' 2>/dev/null | grep "$(CATALOG_SOURCE_NAME)" | cut -f1 | xargs -I {} $(OC_CLI) delete subscription {} -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true || true
635723
-$(OC_CLI) delete csv oadp-operator.v$(VERSION) -n $(OADP_TEST_NAMESPACE) --ignore-not-found=true
636724
@echo ""
637725
@echo "==========================================================================="
638726
@echo "Open the following URL in your browser to trigger the standardized flow UI:"
639727
@echo ""
640728
@CONSOLE_URL=$$($(OC_CLI) get route console -n openshift-console -o jsonpath='{.spec.host}'); \
641-
echo "https://$$CONSOLE_URL/operatorhub/ns/$(OADP_TEST_NAMESPACE)?keyword=oadp-operator&details-item=oadp-operator-oadp-operator-catalog-$(OADP_TEST_NAMESPACE)&channel=operator-sdk-run-bundle&version=$(VERSION)"
729+
echo "https://$$CONSOLE_URL/operatorhub/ns/$(OADP_TEST_NAMESPACE)?keyword=oadp-operator&details-item=oadp-operator-$(CATALOG_SOURCE_NAME)-$(OADP_TEST_NAMESPACE)&channel=$(BUNDLE_CHANNEL)&version=$(VERSION)"
642730
@echo ""
643731
@echo "==========================================================================="
644732

0 commit comments

Comments
 (0)