Skip to content

Commit 6f4982a

Browse files
MLE-26747: Operator 1.2.0 Release Changes Commit
MLE-26747: Operator 1.2.0 Release Changes Commit
2 parents d42ba79 + e374a61 commit 6f4982a

31 files changed

Lines changed: 2759 additions & 221 deletions

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright (c) 2024-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
22

33
# Build the manager binary
4-
FROM golang:1.24.9 AS builder
4+
FROM golang:1.25.7 AS builder
55
ARG TARGETOS
66
ARG TARGETARCH
77

Jenkinsfile

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2024-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
1+
// Copyright (c) 2024-2026 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
22

33
/* groovylint-disable CompileStatic, LineLength, VariableTypeRequired */
44
// This Jenkinsfile defines internal MarkLogic build pipeline.
@@ -149,6 +149,18 @@ void runMinikubeCleanup() {
149149
'''
150150
}
151151

152+
void runIstioMinikubeSetup() {
153+
sh """
154+
make e2e-setup-minikube-istio IMG=${operatorRepo}:${VERSION}
155+
"""
156+
}
157+
158+
void runIstioE2eTests() {
159+
sh """
160+
make e2e-test-istio IMG=${operatorRepo}:${VERSION} E2E_ISTIO_AMBIENT=true
161+
"""
162+
}
163+
152164
void runBlackDuckScan() {
153165
// Trigger BlackDuck scan job with CONTAINER_IMAGES parameter when params.PUBLISH_IMAGE is true
154166
if (params.PUBLISH_IMAGE) {
@@ -201,7 +213,8 @@ pipeline {
201213
triggers {
202214
// Trigger nightly builds on the develop branch
203215
parameterizedCron( env.BRANCH_NAME == 'develop' ? '''00 05 * * * % E2E_MARKLOGIC_IMAGE_VERSION=ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi-rootless:latest-12
204-
00 05 * * * % E2E_MARKLOGIC_IMAGE_VERSION=ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi-rootless:latest-11; PUBLISH_IMAGE=false''' : '')
216+
00 05 * * * % E2E_MARKLOGIC_IMAGE_VERSION=ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi-rootless:latest-11; PUBLISH_IMAGE=false
217+
00 07 * * * % E2E_MARKLOGIC_IMAGE_VERSION=ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi-rootless:latest-12; VERIFY_ISTIO_AMBIENT=true''' : '')
205218
}
206219

207220
environment {
@@ -214,9 +227,10 @@ pipeline {
214227

215228
parameters {
216229
string(name: 'E2E_MARKLOGIC_IMAGE_VERSION', defaultValue: 'ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi-rootless:latest-12', description: 'Docker image to use for tests.', trim: true)
217-
string(name: 'VERSION', defaultValue: '1.1.0', description: 'Version to tag the image with.', trim: true)
230+
string(name: 'VERSION', defaultValue: '1.2.0', description: 'Version to tag the image with.', trim: true)
218231
booleanParam(name: 'PUBLISH_IMAGE', defaultValue: false, description: 'Publish image to internal registry')
219232
string(name: 'emailList', defaultValue: emailList, description: 'List of email for build notification', trim: true)
233+
booleanParam(name: 'VERIFY_ISTIO_AMBIENT', defaultValue: true, description: 'Run Istio ambient mode e2e tests (requires fresh minikube cluster with Istio)')
220234
}
221235

222236
stages {
@@ -245,6 +259,35 @@ pipeline {
245259
}
246260

247261
stage('Cleanup Environment') {
262+
steps {
263+
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
264+
runMinikubeCleanup()
265+
}
266+
}
267+
}
268+
269+
stage('Istio-Minikube-Setup') {
270+
when {
271+
expression { return params.VERIFY_ISTIO_AMBIENT }
272+
}
273+
steps {
274+
runIstioMinikubeSetup()
275+
}
276+
}
277+
278+
stage('Run-Istio-e2e-Tests') {
279+
when {
280+
expression { return params.VERIFY_ISTIO_AMBIENT }
281+
}
282+
steps {
283+
runIstioE2eTests()
284+
}
285+
}
286+
287+
stage('Istio-Cleanup') {
288+
when {
289+
expression { return params.VERIFY_ISTIO_AMBIENT }
290+
}
248291
steps {
249292
runMinikubeCleanup()
250293
}

Makefile

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
# Copyright (c) 2024-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
1+
# Copyright (c) 2024-2026 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
22

33
# VERSION defines the project version for the bundle.
44
# Update this value when you upgrade the version of your project.
55
# To re-generate a bundle for another specific version without changing the standard setup, you can:
66
# - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2)
77
# - use environment variables to overwrite this value (e.g export VERSION=0.0.2)
8-
VERSION ?= 1.1.1
8+
VERSION ?= 1.2.0
9+
10+
# Tool Versions
11+
KUSTOMIZE_VERSION ?= v5.5.0
12+
CONTROLLER_TOOLS_VERSION ?= v0.19.0
13+
ISTIO_VERSION ?= 1.28.3
14+
OPERATOR_SDK_VERSION ?= v1.34.2
15+
GOLANGCI_LINT_VERSION ?= v1.62.2
16+
17+
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
18+
ENVTEST_K8S_VERSION = 1.31.0
919

1020
# VERIFY_HUGE_PAGES defines if hugepages test is enabled or not for e2e test
1121
VERIFY_HUGE_PAGES ?= false
@@ -14,10 +24,9 @@ export E2E_DOCKER_IMAGE ?= $(IMG)
1424
export E2E_KUSTOMIZE_VERSION ?= $(KUSTOMIZE_VERSION)
1525
export E2E_CONTROLLER_TOOLS_VERSION ?= $(CONTROLLER_TOOLS_VERSION)
1626
export E2E_MARKLOGIC_IMAGE_VERSION ?= progressofficial/marklogic-db:12.0.0-ubi9-rootless-2.2.2
27+
export FLUENT_BIT_IMAGE ?= fluent/fluent-bit:4.1.1
1728
export E2E_KUBERNETES_VERSION ?= v1.31.13
18-
19-
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
20-
ENVTEST_K8S_VERSION = 1.31.0
29+
export E2E_ISTIO_AMBIENT ?= false
2130

2231

2332
# CHANNELS define the bundle channels used in the bundle.
@@ -61,10 +70,6 @@ ifeq ($(USE_IMAGE_DIGESTS), true)
6170
BUNDLE_GEN_FLAGS += --use-image-digests
6271
endif
6372

64-
# Set the Operator SDK version to use. By default, what is installed on the system is used.
65-
# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit.
66-
OPERATOR_SDK_VERSION ?= v1.34.2
67-
6873
# Image URL to use all building/pushing image targets
6974
# Image for dev: ml-marklogic-operator-dev.bed-artifactory.bedford.progress.com/marklogic-operator-kubernetes
7075
IMG ?= progressofficial/marklogic-operator-kubernetes:$(VERSION)
@@ -157,15 +162,43 @@ else
157162
go test -v -count=1 -timeout 30m ./test/e2e
158163
endif
159164

165+
.PHONY: e2e-test-istio # Run Istio ambient mode e2e tests
166+
e2e-test-istio:
167+
@echo "=====Running Istio ambient mode e2e tests"
168+
E2E_ISTIO_AMBIENT=true go test -v -count=1 -timeout 30m ./test/e2e -run "Test(Istio|NonIstio)"
169+
160170
.PHONY: e2e-setup-minikube
161171
e2e-setup-minikube: kustomize controller-gen build docker-build
162172
minikube version
163173
minikube delete || true
164174
minikube start --driver=docker --kubernetes-version=$(E2E_KUBERNETES_VERSION) --memory=8192 --cpus=2
165175
minikube addons enable ingress
176+
minikube addons enable storage-provisioner
177+
minikube addons enable default-storageclass
178+
minikube image load $(IMG)
179+
minikube image load $(E2E_MARKLOGIC_IMAGE_VERSION)
180+
minikube image load "docker.io/haproxytech/haproxy-alpine:3.2"
181+
minikube image load $(FLUENT_BIT_IMAGE)
182+
minikube image ls
183+
184+
.PHONY: e2e-setup-minikube-istio
185+
e2e-setup-minikube-istio: kustomize controller-gen build docker-build istioctl ## Setup minikube with Istio ambient mode for e2e tests.
186+
minikube version
187+
minikube delete || true
188+
minikube start --driver=docker --kubernetes-version=$(E2E_KUBERNETES_VERSION) --memory=8192 --cpus=2
189+
minikube addons enable ingress
190+
minikube addons enable storage-provisioner
191+
minikube addons enable default-storageclass
192+
@echo "=====Installing Istio with ambient profile====="
193+
$(ISTIOCTL) install --set profile=ambient -y
194+
@echo "=====Waiting for Istio components to be ready====="
195+
kubectl wait --for=condition=Ready pods --all -n istio-system --timeout=120s
196+
@echo "=====Istio ambient mode installed successfully====="
197+
kubectl get pods -n istio-system
166198
minikube image load $(IMG)
167199
minikube image load $(E2E_MARKLOGIC_IMAGE_VERSION)
168200
minikube image load "docker.io/haproxytech/haproxy-alpine:3.2"
201+
minikube image load $(FLUENT_BIT_IMAGE)
169202
minikube image ls
170203

171204
.PHONY: e2e-cleanup-minikube
@@ -174,7 +207,6 @@ e2e-cleanup-minikube:
174207
minikube delete
175208

176209
GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
177-
GOLANGCI_LINT_VERSION ?= v1.62.2
178210
golangci-lint:
179211
@[ -f $(GOLANGCI_LINT) ] || { \
180212
set -e ;\
@@ -263,10 +295,7 @@ KUBECTL ?= kubectl
263295
KUSTOMIZE ?= $(LOCALBIN)/kustomize
264296
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
265297
ENVTEST ?= $(LOCALBIN)/setup-envtest
266-
267-
## Tool Versions
268-
KUSTOMIZE_VERSION ?= v5.5.0
269-
CONTROLLER_TOOLS_VERSION ?= v0.19.0
298+
ISTIOCTL ?= $(LOCALBIN)/istioctl
270299

271300
.PHONY: kustomize
272301
kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading.
@@ -288,6 +317,41 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
288317
$(ENVTEST): $(LOCALBIN)
289318
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
290319

320+
.PHONY: istioctl
321+
istioctl: $(ISTIOCTL) ## Download istioctl locally if necessary.
322+
$(ISTIOCTL): $(LOCALBIN)
323+
ifeq (,$(wildcard $(ISTIOCTL)))
324+
ifeq (, $(shell which istioctl 2>/dev/null))
325+
@{ \
326+
set -e ;\
327+
mkdir -p $(dir $(ISTIOCTL)) ;\
328+
OS=$$(uname | tr '[:upper:]' '[:lower:]') ;\
329+
if [ "$$OS" = "darwin" ]; then OS=osx; fi ;\
330+
ARCH=$$(go env GOARCH) ;\
331+
ARCHIVE="istio-$(ISTIO_VERSION)-$${OS}-$${ARCH}.tar.gz" ;\
332+
URL="https://github.com/istio/istio/releases/download/$(ISTIO_VERSION)/$${ARCHIVE}" ;\
333+
TMP_DIR=$$(mktemp -d) ;\
334+
echo "Downloading istioctl $(ISTIO_VERSION) for $${OS}-$${ARCH}..." ;\
335+
curl -sSLo "$$TMP_DIR/$${ARCHIVE}" "$${URL}" ;\
336+
curl -sSLo "$$TMP_DIR/$${ARCHIVE}.sha256" "$${URL}.sha256" ;\
337+
cd "$$TMP_DIR" ;\
338+
if command -v sha256sum >/dev/null 2>&1; then \
339+
sha256sum -c "$${ARCHIVE}.sha256" ;\
340+
else \
341+
shasum -a 256 -c "$${ARCHIVE}.sha256" ;\
342+
fi ;\
343+
tar xzf "$${ARCHIVE}" ;\
344+
cd - > /dev/null ;\
345+
mv "$$TMP_DIR/istio-$(ISTIO_VERSION)/bin/istioctl" "$(ISTIOCTL)" ;\
346+
rm -rf "$$TMP_DIR" ;\
347+
chmod +x "$(ISTIOCTL)" ;\
348+
echo "istioctl successfully installed to $(ISTIOCTL)" ;\
349+
}
350+
else
351+
ISTIOCTL = $(shell which istioctl)
352+
endif
353+
endif
354+
291355
.PHONY: operator-sdk
292356
OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk
293357
operator-sdk: ## Download operator-sdk locally if necessary.
@@ -370,7 +434,7 @@ $(HELMIFY): $(LOCALBIN)
370434

371435
helm: manifests kustomize helmify
372436
cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG)
373-
$(KUSTOMIZE) build config/default | $(HELMIFY) -image-pull-secrets -original-name charts/marklogic-operator-kubernetes
437+
$(KUSTOMIZE) build config/default | $(HELMIFY) -image-pull-secrets -original-name charts/marklogic-operator-kubernetes
374438

375439
.PHONY: image-scan
376440
image-scan: docker-build

README.md

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# MarkLogic Operator for Kuberentes
1+
# MarkLogic Operator for Kubernetes
22

33
## Introduction
44

@@ -29,71 +29,89 @@ helm repo update
2929

3030
2. Install or upgrade the Helm Chart for MarkLogic Operator:
3131
```sh
32-
helm upgrade marklogic-operator marklogic-operator/marklogic-operator-kubernetes --version=1.1.1 --install --namespace marklogic-operator-system --create-namespace
32+
helm upgrade marklogic-operator marklogic-operator/marklogic-operator-kubernetes --version=1.2.0 --install --namespace marklogic-operator-system --create-namespace
3333
```
3434

35-
3. Make sure the Marklogic Operator pod is running:
35+
3. Make sure the MarkLogic Operator pod is running:
3636
```sh
3737
kubectl get pods -n marklogic-operator-system
3838
```
3939

4040
4. Use this command to verify CRDs are correctly installed:
4141
```sh
42-
kubectl get crd -n marklogic-operator-system | grep 'marklogic'
42+
kubectl get crd -n marklogic-operator-system | grep 'marklogic'
4343
```
4444

4545
### Install MarkLogic Cluster
46-
Once MarkLogic Operator Pod is running, use your custom manifests or choose from sample manifests from this repository located in the ./config/samples directory.
47-
Optionally, create a dedicated namespace for new MarkLogic resources.
48-
```sh
49-
kubectl create namespace <namespace-name>
50-
```
51-
To deploy marklogic single group, use the `quick_start.yaml` from the config/samples:
52-
```sh
53-
kubectl apply -f quick_start.yaml --namespace=<namespace-name>
54-
```
55-
Once the installation is complete and the pod is in a running state, the MarkLogic Admin UI can be accessed using the port-forwarding command:
46+
Once MarkLogic Operator Pod is running, use your custom manifests or choose from sample manifests from this repository located in the `./config/samples` directory.
47+
Optionally, create a dedicated namespace for new MarkLogic resources:
48+
```sh
49+
kubectl create namespace <namespace-name>
50+
```
51+
52+
To deploy a MarkLogic single group, use the `quick_start.yaml` from the `config/samples`:
53+
```sh
54+
kubectl apply -f quick_start.yaml --namespace=<namespace-name>
55+
```
5656

57-
```sh
58-
kubectl port-forward <pod-name> 8000:8000 8001:8001 --namespace=<namespace-name>
59-
```
57+
Once the installation is complete and the pod is in a running state, the MarkLogic Admin UI can be accessed using the port-forwarding command:
58+
```sh
59+
kubectl port-forward <pod-name> 8000:8000 8001:8001 --namespace=<namespace-name>
60+
```
6061

6162
If you used the automatically generated admin credentials, use these steps to extract the admin username, password, and wallet-password from a secret:
6263

6364
1. Run this command to fetch all of the secret names:
64-
```sh
65-
kubectl get secrets --namespace=<namespace-name>
66-
```
67-
The MarkLogic admin secret name is in the format `<marklogicCluster-name>-admin`. For example if markLogicCluster name is `single-node`, the secret name is `single-node-admin`.
65+
```sh
66+
kubectl get secrets --namespace=<namespace-name>
67+
```
68+
The MarkLogic admin secret name is in the format `<marklogicCluster-name>-admin`. For example, if the markLogicCluster name is `single-node`, the secret name is `single-node-admin`.
6869

6970
2. Using the secret name from step 1, retrieve the MarkLogic admin credentials using these commands:
70-
```sh
71-
kubectl get secret single-node-admin --namespace=<namespace-name> -o jsonpath='{.data.username}' | base64 --decode; echo
71+
```sh
72+
kubectl get secret single-node-admin --namespace=<namespace-name> -o jsonpath='{.data.username}' | base64 --decode; echo
7273

73-
kubectl get secret single-node-admin --namespace=<namespace-name> -o jsonpath='{.data.password}' | base64 --decode; echo
74+
kubectl get secret single-node-admin --namespace=<namespace-name> -o jsonpath='{.data.password}' | base64 --decode; echo
7475

75-
kubectl get secret single-node-admin --namespace=<namespace-name> -o jsonpath='{.data.wallet-password}' | base64 --decode; echo
76-
```
76+
kubectl get secret single-node-admin --namespace=<namespace-name> -o jsonpath='{.data.wallet-password}' | base64 --decode; echo
77+
```
7778

7879
For additional manifests to deploy a MarkLogic cluster inside a Kubernetes cluster, see [Operator manifest](https://docs.progress.com/bundle/marklogic-server-on-kubernetes/operator/Operator-manifest.html) in the documentation.
7980

8081
## Clean Up
8182

8283
#### Cleaning up MarkLogic Cluster
83-
Use this step to delete MarkLogic cluster and other resources created from the manifests used in the above [step](#install-marklogic-cluster):
84-
```sh
85-
kubectl delete -f quick_start.yaml --namespace=<namespace-name>
86-
```
84+
Use this step to delete the MarkLogic cluster and other resources created from the manifests used in the above [step](#install-marklogic-cluster):
85+
```sh
86+
kubectl delete -f quick_start.yaml --namespace=<namespace-name>
87+
```
88+
89+
Manually delete the persistent volume claims:
90+
```sh
91+
kubectl delete pvc -n <namespace-name> -l app.kubernetes.io/name=marklogic
92+
```
8793

8894
#### Deleting Helm chart
89-
Use these steps to delete MarkLogic Operator Helm chart and the namespace created:
95+
Use these steps to delete the MarkLogic Operator Helm chart and the namespace created:
9096
```sh
9197
helm delete marklogic-operator --namespace marklogic-operator-system
9298
kubectl delete namespace marklogic-operator-system
9399
```
94100

101+
> **Note for version 1.2.0 and later:** The MarkLogic Operator includes the `helm.sh/resource-policy: keep` annotation. When you delete the operator using the Helm command above, the Custom Resource Definitions (CRDs) and your existing MarkLogic deployments are preserved and will **not** be deleted automatically.
102+
103+
#### Deleting Custom Resource Definitions (CRDs)
104+
To perform a complete system wipe and manually delete the Custom Resource Definitions (CRDs):
105+
106+
**Warning:** Deleting a CRD will automatically delete all Custom Resources of that type across the entire Kubernetes cluster. Only proceed if you are certain you want to permanently remove all MarkLogic resources.
107+
108+
```sh
109+
kubectl delete crd marklogicclusters.marklogic.progress.com
110+
kubectl delete crd marklogicgroups.marklogic.progress.com
111+
```
112+
95113
## Known Issues and Limitations
96114

97-
1. The latest released version of fluent/fluent-bit:4.1.1 has high security vulnerabilities. If you decide to enable the log collection feature, choose and deploy the fluent-bit or an alternate image with no vulnerabilities as per your requirements.
98-
2. Known Issues and Limitations for the MarkLogic Server Docker image can be viewed using the link: https://github.com/marklogic/marklogic-docker?tab=readme-ov-file#Known-Issues-and-Limitations.
99-
3. If you're updating the group name configuration, ensure that you delete the pod to apply the changes, as we are using the OnDelete upgrade strategy.
115+
1. The latest released version of `fluent/fluent-bit:4.1.1` has high security vulnerabilities. If you decide to enable the log collection feature, choose and deploy the fluent-bit or an alternate image with no vulnerabilities as per your requirements.
116+
2. Known Issues and Limitations for the MarkLogic Server Docker image can be viewed using the link: [https://github.com/marklogic/marklogic-docker?tab=readme-ov-file#Known-Issues-and-Limitations](https://github.com/marklogic/marklogic-docker?tab=readme-ov-file#Known-Issues-and-Limitations).
117+
3. If you're updating the group name configuration, ensure that you delete the pod to apply the changes, as we are using the OnDelete upgrade strategy.

0 commit comments

Comments
 (0)