Skip to content

Commit 1134051

Browse files
authored
Merge branch 'master' into update-console-backend-images
2 parents fdc7fbd + e7f9335 commit 1134051

15 files changed

Lines changed: 1351 additions & 60 deletions

Makefile

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ IMG ?= $(IMAGE):$(VERSION)
6565
# Set the Operator SDK version to use.
6666
# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit.
6767
OPERATOR_SDK_VERSION ?= v1.35.0
68-
68+
# Set the path to Operator SDK - OPERATOR_SDK_VERSION will be ignored.
69+
OPERATOR_SDK ?= bin/operator-sdk
6970

7071
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
7172
ifeq (,$(shell go env GOBIN))
@@ -131,19 +132,6 @@ test-e2e: manifests generate fmt vet ## Run e2e tests.
131132
test-metrics:
132133
go test -timeout 30m ./test/e2e -ginkgo.focus="Argo CD metrics controller" -coverprofile cover.out -ginkgo.v
133134

134-
.PHONY: operator-sdk
135-
OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk
136-
operator-sdk: ## Download operator-sdk locally if necessary.
137-
ifeq (,$(wildcard $(OPERATOR_SDK)))
138-
@{ \
139-
set -e ;\
140-
mkdir -p $(dir $(OPERATOR_SDK)) ;\
141-
OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \
142-
curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$${OS}_$${ARCH} ;\
143-
chmod +x $(OPERATOR_SDK) ;\
144-
}
145-
endif
146-
147135
.PHONY: test-route
148136
test-route:
149137
go test -timeout 30m ./test/e2e -ginkgo.focus="Argo CD ConsoleLink controller" -coverprofile cover.out -ginkgo.v
@@ -211,7 +199,7 @@ build: generate fmt vet ## Build manager binary.
211199

212200
.PHONY: run
213201
run: manifests generate fmt vet ## Run a controller from your host.
214-
CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES=argo-rollouts,test-rom-ns-1,rom-ns-1,openshift-gitops ARGOCD_CLUSTER_CONFIG_NAMESPACES="openshift-gitops, argocd-e2e-cluster-config, argocd-test-impersonation-1-046, argocd-agent-principal-1-051, argocd-agent-agent-1-052, appset-argocd, appset-old-ns, appset-new-ns, ns-hosting-principal, ns-hosting-managed-agent, ns-hosting-autonomous-agent" REDIS_CONFIG_PATH="build/redis" go run ./cmd/main.go
202+
CLUSTER_SCOPED_ARGO_ROLLOUTS_NAMESPACES=argo-rollouts,test-rom-ns-1,rom-ns-1,openshift-gitops ARGOCD_CLUSTER_CONFIG_NAMESPACES="openshift-gitops, argocd-e2e-cluster-config, argocd-test-impersonation-1-046, argocd-agent-principal-1-051, argocd-agent-agent-1-052, appset-argocd, appset-old-ns, appset-new-ns, ns-hosting-principal, ns-hosting-managed-agent, ns-hosting-autonomous-agent, appset-argocd-clusterrole" REDIS_CONFIG_PATH="build/redis" go run ./cmd/main.go
215203

216204
.PHONY: docker-build
217205
docker-build: test ## Build container image with the manager.
@@ -223,27 +211,17 @@ docker-push: ## Push container image with the manager.
223211

224212
##@ Build Dependencies
225213

226-
## Location to install dependencies to
227-
LOCALBIN ?= $(shell pwd)/bin
228-
$(LOCALBIN):
229-
mkdir -p $(LOCALBIN)
214+
# Do not use OPERATOR_SDK variable not to overwrite the user provided path
215+
bin/operator-sdk:
216+
mkdir -p bin
217+
curl -sSLo bin/operator-sdk \
218+
https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$(shell go env GOOS)_$(shell go env GOARCH)
219+
chmod +x bin/operator-sdk
230220

221+
# Install to bin/operator-sdk unless already there or explicit OPERATOR_SDK provided
231222
.PHONY: operator-sdk
232-
OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk
233-
operator-sdk: ## Download operator-sdk locally if necessary.
234-
ifeq (,$(wildcard $(OPERATOR_SDK)))
235-
ifeq (,$(shell which operator-sdk 2>/dev/null))
236-
@{ \
237-
set -e ;\
238-
mkdir -p $(dir $(OPERATOR_SDK)) ;\
239-
OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \
240-
curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$${OS}_$${ARCH} ;\
241-
chmod +x $(OPERATOR_SDK) ;\
242-
}
243-
else
244-
OPERATOR_SDK = $(shell which operator-sdk)
245-
endif
246-
endif
223+
operator-sdk: $(OPERATOR_SDK)
224+
@$(OPERATOR_SDK) version
247225

248226
ifndef ignore-not-found
249227
ignore-not-found = false
@@ -271,6 +249,10 @@ deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in
271249
undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config.
272250
$(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=true -f -
273251

252+
.PHONY: olm-deploy
253+
olm-deploy: ## Build the operator bundle and deploy it to OpenShift through OLM
254+
./hack/scripts/olm-deploy.sh
255+
274256
CONTROLLER_GEN = $(shell pwd)/bin/controller-gen
275257
.PHONY: controller-gen
276258
controller-gen: ## Download controller-gen locally if necessary.

controllers/gitopsservice_controller.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ var (
7373

7474
const (
7575
gitopsServicePrefix = "gitops-service-"
76+
kamResourceName = "kam"
7677
)
7778

7879
// SetupWithManager sets up the controller with the Manager.
@@ -259,6 +260,8 @@ func (r *ReconcileGitopsService) Reconcile(ctx context.Context, request reconcil
259260
Namespace: namespace,
260261
}
261262

263+
r.cleanKAMResources(ctx, reqLogger)
264+
262265
if !r.DisableDefaultInstall {
263266
// Create/reconcile the default Argo CD instance, unless default install is disabled
264267
if result, err := r.reconcileDefaultArgoCDInstance(instance, reqLogger); err != nil {
@@ -312,6 +315,44 @@ func (r *ReconcileGitopsService) Reconcile(ctx context.Context, request reconcil
312315
}
313316
}
314317

318+
// Detect the unsupported KAM components across Deployments , Routes , Services and deletes them to perform cleanup as KAM is no longer supported since 1.15
319+
func (r *ReconcileGitopsService) cleanKAMResources(ctx context.Context, reqLogger logr.Logger) {
320+
321+
// KAM Deployment
322+
cleanupKAMDeployment := &appsv1.Deployment{}
323+
if err := r.Client.Get(ctx, types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, cleanupKAMDeployment); err == nil {
324+
reqLogger.Info("Detected unsupported KAM Deployment, deleting", "Name", kamResourceName, "Namespace", serviceNamespace)
325+
if err := r.Client.Delete(ctx, cleanupKAMDeployment); err != nil && !errors.IsNotFound(err) {
326+
reqLogger.Error(err, "Failed to delete KAM Deployment", "Name", kamResourceName, "Namespace", serviceNamespace)
327+
}
328+
} else if !errors.IsNotFound(err) {
329+
reqLogger.Error(err, "Failed to retrieve KAM Deployment", "Name", kamResourceName, "Namespace", serviceNamespace)
330+
}
331+
332+
// KAM Service
333+
cleanupKAMService := &corev1.Service{}
334+
if err := r.Client.Get(ctx, types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, cleanupKAMService); err == nil {
335+
reqLogger.Info("Detected unsupported KAM Service, deleting", "Name", kamResourceName, "Namespace", serviceNamespace)
336+
if err := r.Client.Delete(ctx, cleanupKAMService); err != nil && !errors.IsNotFound(err) {
337+
reqLogger.Error(err, "Failed to delete KAM Service", "Name", kamResourceName, "Namespace", serviceNamespace)
338+
}
339+
} else if !errors.IsNotFound(err) {
340+
reqLogger.Error(err, "Failed to retrieve KAM Service", "Name", kamResourceName, "Namespace", serviceNamespace)
341+
}
342+
343+
// KAM Route
344+
cleanupKAMRoute := &routev1.Route{}
345+
if err := r.Client.Get(ctx, types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, cleanupKAMRoute); err == nil {
346+
reqLogger.Info("Detected unsupported KAM Route, deleting", "Name", kamResourceName, "Namespace", serviceNamespace)
347+
if err := r.Client.Delete(ctx, cleanupKAMRoute); err != nil && !errors.IsNotFound(err) {
348+
reqLogger.Error(err, "Failed to delete KAM Route", "Name", kamResourceName, "Namespace", serviceNamespace)
349+
}
350+
} else if !errors.IsNotFound(err) {
351+
reqLogger.Error(err, "Failed to retrieve KAM Route", "Name", kamResourceName, "Namespace", serviceNamespace)
352+
}
353+
354+
}
355+
315356
func (r *ReconcileGitopsService) ensureDefaultArgoCDInstanceDoesntExist() error {
316357

317358
defaultArgoCDInstance, err := argocd.NewCR(common.ArgoCDInstanceName, serviceNamespace, r.Client)

controllers/gitopsservice_controller_test.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,132 @@ func TestReconcileBackend_DefaultRequestsAndLimits(t *testing.T) {
889889
assert.Equal(t, deployment.Spec.Template.Spec.Containers[0].Resources.Limits["cpu"], resourcev1.MustParse("500m"))
890890
}
891891

892+
// Tests for KAM component cleanup
893+
// No resources exist
894+
func TestCleanKAMResources_NoResourcesExist(t *testing.T) {
895+
logf.SetLogger(zap.New(zap.UseDevMode(true)))
896+
s := scheme.Scheme
897+
addKnownTypesToScheme(s)
898+
fakeClient := fake.NewClientBuilder().WithScheme(s).Build()
899+
reconciler := newReconcileGitOpsService(fakeClient, s)
900+
reqLogger := logs.WithValues("Request.Namespace", "test", "Request.Name", "test")
901+
902+
// No KAM resources exist - function should be a silent no-op
903+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
904+
}
905+
906+
// Deployment exist
907+
func TestCleanKAMResources_DeploymentExist(t *testing.T) {
908+
logf.SetLogger(zap.New(zap.UseDevMode(true)))
909+
s := scheme.Scheme
910+
addKnownTypesToScheme(s)
911+
912+
kamDeploy := &appsv1.Deployment{
913+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
914+
}
915+
fakeClient := fake.NewClientBuilder().WithScheme(s).WithObjects(kamDeploy).Build()
916+
reconciler := newReconcileGitOpsService(fakeClient, s)
917+
reqLogger := logs.WithValues("Request.Namespace", "test", "Request.Name", "test")
918+
919+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
920+
921+
err := fakeClient.Get(context.TODO(), types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, &appsv1.Deployment{})
922+
if !errors.IsNotFound(err) {
923+
t.Fatalf("expected KAM Deployment to be deleted , got err: %v", err)
924+
}
925+
}
926+
927+
// Service exist
928+
func TestCleanKAMResources_ServiceExist(t *testing.T) {
929+
logf.SetLogger(zap.New(zap.UseDevMode(true)))
930+
s := scheme.Scheme
931+
addKnownTypesToScheme(s)
932+
kamService := &corev1.Service{
933+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
934+
}
935+
fakeClient := fake.NewClientBuilder().WithScheme(s).WithObjects(kamService).Build()
936+
reconciler := newReconcileGitOpsService(fakeClient, s)
937+
reqLogger := logs.WithValues("Request.Namespace", "test", "Request.Name", "test")
938+
939+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
940+
941+
err := fakeClient.Get(context.TODO(), types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, &corev1.Service{})
942+
if !errors.IsNotFound(err) {
943+
t.Fatalf("expected KAM Service to be deleted , got err: %v", err)
944+
}
945+
}
946+
947+
// Route exist
948+
func TestCleanKAMResources_RouteExist(t *testing.T) {
949+
logf.SetLogger(zap.New(zap.UseDevMode(true)))
950+
s := scheme.Scheme
951+
addKnownTypesToScheme(s)
952+
kamRoute := &routev1.Route{
953+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
954+
}
955+
fakeClient := fake.NewClientBuilder().WithScheme(s).WithObjects(kamRoute).Build()
956+
reconciler := newReconcileGitOpsService(fakeClient, s)
957+
reqLogger := logs.WithValues("Request.Namespace", "test", "Request.Name", "test")
958+
959+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
960+
961+
err := fakeClient.Get(context.TODO(), types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, &routev1.Route{})
962+
if !errors.IsNotFound(err) {
963+
t.Fatalf("expected KAM Route to be deleted , got err: %v", err)
964+
}
965+
}
966+
967+
// All Resources exist
968+
func TestCleanKAMResources_AllResourcesExist(t *testing.T) {
969+
logf.SetLogger(zap.New(zap.UseDevMode(true)))
970+
s := scheme.Scheme
971+
addKnownTypesToScheme(s)
972+
kamDeploy := &appsv1.Deployment{
973+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
974+
}
975+
kamService := &corev1.Service{
976+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
977+
}
978+
kamRoute := &routev1.Route{
979+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
980+
}
981+
fakeClient := fake.NewClientBuilder().WithScheme(s).WithObjects(kamDeploy, kamService, kamRoute).Build()
982+
reconciler := newReconcileGitOpsService(fakeClient, s)
983+
reqLogger := logs.WithValues("Request.Namespace", "test", "Request.Name", "test")
984+
985+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
986+
987+
if err := fakeClient.Get(context.TODO(), types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, &appsv1.Deployment{}); !errors.IsNotFound(err) {
988+
t.Fatalf("expected KAM Deployment to be deleted , got err: %v", err)
989+
}
990+
if err := fakeClient.Get(context.TODO(), types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, &corev1.Service{}); !errors.IsNotFound(err) {
991+
t.Fatalf("expected KAM Service to be deleted , got err: %v", err)
992+
}
993+
if err := fakeClient.Get(context.TODO(), types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, &routev1.Route{}); !errors.IsNotFound(err) {
994+
t.Fatalf("expected KAM Route to be deleted , got err: %v", err)
995+
}
996+
}
997+
998+
// Idempotency
999+
func TestCleanKAMResources_Idempotent(t *testing.T) {
1000+
logf.SetLogger(zap.New(zap.UseDevMode(true)))
1001+
s := scheme.Scheme
1002+
addKnownTypesToScheme(s)
1003+
kamDeploy := &appsv1.Deployment{
1004+
ObjectMeta: v1.ObjectMeta{Name: kamResourceName, Namespace: serviceNamespace},
1005+
}
1006+
fakeClient := fake.NewClientBuilder().WithScheme(s).WithObjects(kamDeploy).Build()
1007+
reconciler := newReconcileGitOpsService(fakeClient, s)
1008+
reqLogger := logs.WithValues("Request.Namespace", "test", "Request.Name", "test")
1009+
1010+
// First call - deletes the KAM resource
1011+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
1012+
1013+
// Second call - must not panic even if the resources are already deleted
1014+
reconciler.cleanKAMResources(context.TODO(), reqLogger)
1015+
1016+
}
1017+
8921018
func addKnownTypesToScheme(scheme *runtime.Scheme) {
8931019
scheme.AddKnownTypes(configv1.GroupVersion, &configv1.ClusterVersion{})
8941020
scheme.AddKnownTypes(pipelinesv1alpha1.GroupVersion, &pipelinesv1alpha1.GitopsService{})

docs/Lightspeed BYOK Gitops configuration guide.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ We have curated and optimized specialized knowledge sets for the following compo
1616
* Red Hat OpenShift GitOps Operator
1717
* ArgoCD Agent
1818

19-
This knowledge is packaged into a container [image](https://quay.io/rhn-support-alkumari/argocd-byok-image:v0.0.2) and can be configured in Lightspeed using the instructions below.
19+
This knowledge is packaged into a container [image](https://quay.io/devtools_gitops/argocd_lightspeed_byok:v0.0.4) and can be configured in Lightspeed using the instructions below.
2020

2121
## Prerequisites
2222

@@ -42,7 +42,7 @@ metadata:
4242
spec:
4343
ols:
4444
rag:
45-
- image: quay.io/rhn-support-alkumari/argocd-byok-image:v0.0.4
45+
- image: quay.io/devtools_gitops/argocd_lightspeed_byok:v0.0.4
4646
```
4747

4848
Note: Where image specifies the tag for the image that is present in the image registry so that the OpenShift Lightspeed Operator can access the custom content.

0 commit comments

Comments
 (0)