Repository: apache/solr-operator

Issue:
Bump "default" Solr version to latest 9.x
I noticed recently that various parts of this repository default to using Solr 8.11, which is now EOL.  These usages range from the internal and relatively innocuous (e2e and "smoke test" scripting) to the user-facing and dangerous (documentation, example YAML, and the default tag for the Solr helm chart).

This ticket covers updating all of these places to use the latest Solr 9.x version instead (currently Solr 9.9.0).

There are a few places in the operator code itself that go out of their way to extend support to Solr 8.11.  These need cleaned up, but can be tackled in separate, follow-on tickets.

Hints from issue comments:

Solution patch:
diff --git a/api/v1beta1/solrcloud_types.go b/api/v1beta1/solrcloud_types.go
index 0a689a2..1893026 100644
--- a/api/v1beta1/solrcloud_types.go
+++ b/api/v1beta1/solrcloud_types.go
@@ -37,7 +37,7 @@ const (
 
 	DefaultSolrReplicas = int32(3)
 	DefaultSolrRepo     = "library/solr"
-	DefaultSolrVersion  = "8.11"
+	DefaultSolrVersion  = "9.10.0"
 	DefaultSolrJavaMem  = "-Xms1g -Xmx2g"
 	DefaultSolrOpts     = ""
 	DefaultSolrLogLevel = "INFO"
diff --git a/dev-docs/e2e-testing.md b/dev-docs/e2e-testing.md
index 42a31df..7360fc2 100644
--- a/dev-docs/e2e-testing.md
+++ b/dev-docs/e2e-testing.md
@@ -47,7 +47,7 @@ $ make e2e-tests TEST_SEED=89724023 SOLR_IMAGE=apache/solr-nightly:10.0.0-SNAPSH
   The default parallelism is `3`.
 - **SOLR_IMAGE** - The solr docker image label to use in the integration tests.
   It is recommended to use only supported versions for the Solr Operator version being tested.
-  Default is `solr:8.11`.
+  Default is `solr:9.10.0`.
 - **KUBERETES_VERSION** - A full Kubernetes version, starting with `v`, to use when creating the KinD Cluster.
   To find a list of all possible versions, check the [KinD Node Docker tags](https://hub.docker.com/r/kindest/node/tags).
   Default is `v1.26.6`.
diff --git a/docs/local_tutorial.md b/docs/local_tutorial.md
index 9bb8085..ba1743d 100644
--- a/docs/local_tutorial.md
+++ b/docs/local_tutorial.md
@@ -122,9 +122,9 @@ After inspecting the status of you Kube cluster, you should see a deployment for
 To start a Solr Cloud cluster, we will create a yaml that will tell the Solr Operator what version of Solr Cloud to run, and how many nodes, with how much memory etc.
 
 ```bash
-# Create a 3-node cluster v8.11 with 300m Heap each:
+# Create a 3-node cluster v9.10.0 with 300m Heap each:
 helm install example-solr apache-solr/solr --version 0.10.0-prerelease \
-  --set image.tag=8.11 \
+  --set image.tag=9.10.0 \
   --set solrOptions.javaMemory="-Xms300m -Xmx300m" \
   --set addressability.external.method=Ingress \
   --set addressability.external.domainName="ing.local.domain" \
@@ -207,13 +207,13 @@ By default, the helm chart does not set the `replicas` field, so it is safe to u
 So we wish to upgrade to a newer Solr version:
 
 ```bash
-# Take note of the current version, which is 8.11.2
+# Take note of the current version
 curl -s http://default-example-solrcloud.ing.local.domain/solr/admin/info/system | grep solr-i
 
 # Update the solrCloud configuration with the new version, keeping all previous settings and the number of nodes set by the autoscaler.
 helm upgrade example-solr apache-solr/solr --version 0.10.0-prerelease \
   --reuse-values \
-  --set image.tag=8.7
+  --set image.tag=9.10.0
 
 # Click the 'Show all details" button in Admin UI and start hitting the "Refresh" button
 # See how the operator upgrades one pod at a time. Solr version is in the 'node' column
diff --git a/example/test_solrcloud.yaml b/example/test_solrcloud.yaml
index 04c7499..6e348cc 100644
--- a/example/test_solrcloud.yaml
+++ b/example/test_solrcloud.yaml
@@ -28,7 +28,7 @@ spec:
               storage: "5Gi"
   replicas: 3
   solrImage:
-    tag: "8.11"
+    tag: "9.10.0"
   solrJavaMem: "-Xms1g -Xmx3g"
   solrModules:
     - jaegertracer-configurator
diff --git a/example/test_solrcloud_backuprepos.yaml b/example/test_solrcloud_backuprepos.yaml
index 8cb2004..0213abf 100644
--- a/example/test_solrcloud_backuprepos.yaml
+++ b/example/test_solrcloud_backuprepos.yaml
@@ -20,7 +20,7 @@ metadata:
 spec:
   replicas: 1
   solrImage:
-    tag: "8.11"
+    tag: "9.10.0"
   backupRepositories:
     # "Volume" repositories store backup data in a Kubernetes volume.
     - name: "volume_repository_1"
diff --git a/example/test_solrcloud_private_repo.yaml b/example/test_solrcloud_private_repo.yaml
index fd8d5f9..73ef1cd 100644
--- a/example/test_solrcloud_private_repo.yaml
+++ b/example/test_solrcloud_private_repo.yaml
@@ -21,5 +21,5 @@ spec:
   replicas: 3
   solrImage:
     repository: myprivate-repo.jfrog.io/solr
-    tag: "8.11"
+    tag: "9.10.0"
     imagePullSecret: "k8s-docker-registry-secret"
diff --git a/example/test_solrcloud_toleration_example.yaml b/example/test_solrcloud_toleration_example.yaml
index 68b322f..fb4fe6f 100644
--- a/example/test_solrcloud_toleration_example.yaml
+++ b/example/test_solrcloud_toleration_example.yaml
@@ -20,7 +20,7 @@ metadata:
 spec:
   replicas: 1
   solrImage:
-    tag: "8.11"
+    tag: "9.10.0"
   customSolrKubeOptions:
     podOptions:
       nodeSelector:
diff --git a/example/test_solrprometheusexporter.yaml b/example/test_solrprometheusexporter.yaml
index fa64926..69adc8b 100644
--- a/example/test_solrprometheusexporter.yaml
+++ b/example/test_solrprometheusexporter.yaml
@@ -23,4 +23,4 @@ spec:
       name: "example"
   numThreads: 4
   image:
-    tag: "8.11"
+    tag: "9.10.0"
diff --git a/helm/solr-operator/Chart.yaml b/helm/solr-operator/Chart.yaml
index ddbd812..1e174e1 100644
--- a/helm/solr-operator/Chart.yaml
+++ b/helm/solr-operator/Chart.yaml
@@ -114,7 +114,7 @@ annotations:
                     storage: "20Gi"
         replicas: 3
         solrImage:
-          tag: 8.11
+          tag: 9.10.0
         solrJavaMem: "-Xms4g -Xmx4g"
         customSolrKubeOptions:
           podOptions:
@@ -155,7 +155,7 @@ annotations:
             name: "example"
         numThreads: 4
         image:
-          tag: 8.11
+          tag: 9.10.0
     - apiVersion: solr.apache.org/v1beta1
       kind: SolrBackup
       metadata:
diff --git a/helm/solr/Chart.yaml b/helm/solr/Chart.yaml
index 96f31c2..66e0251 100644
--- a/helm/solr/Chart.yaml
+++ b/helm/solr/Chart.yaml
@@ -16,7 +16,7 @@ apiVersion: v2
 name: solr
 description: A SolrCloud cluster running on Kubernetes via the Solr Operator
 version: 0.10.0-prerelease
-appVersion: 8.11.1
+appVersion: 9.10.0
 kubeVersion: ">= 1.22.0-0"
 home: https://solr.apache.org
 sources:
@@ -65,7 +65,7 @@ annotations:
       url: https://solr.apache.org/operator/resources#tutorials
   artifacthub.io/images: |
     - name: solr
-      image: solr:8.11
+      image: solr:9.10.0
       whitelisted: true
   artifacthub.io/signKey: |
     fingerprint: <fingerprint>
diff --git a/helm/solr/README.md b/helm/solr/README.md
index 5a94b80..a2c29c9 100644
--- a/helm/solr/README.md
+++ b/helm/solr/README.md
@@ -36,7 +36,7 @@ There may be breaking changes between the version you are using and the version
 To install a SolrCloud for the first time in your cluster, you can use the latest version or a specific version, run with the following commands:
 
 ```bash
-helm install example apache-solr/solr --version 0.10.0-prerelease --set image.tag=8.11
+helm install example apache-solr/solr --version 0.10.0-prerelease --set image.tag=9.10.0
 ```
 
 The command deploys a SolrCloud object on the Kubernetes cluster with the default configuration.
@@ -50,7 +50,7 @@ _Note that the Helm chart version does not contain a `v` prefix, which the Solr
 If you are upgrading your SolrCloud deployment, you should always use a specific version of the chart and upgrade **after [upgrading the Solr Operator](https://artifacthub.io/packages/helm/apache-solr/solr-operator#upgrading-the-solr-operator) to the same version**:
 
 ```bash
-helm upgrade example apache-solr/solr --version 0.10.0-prerelease --reuse-values --set image.tag=8.11
+helm upgrade example apache-solr/solr --version 0.10.0-prerelease --reuse-values --set image.tag=9.10.0
 ```
 
 The upgrade will be done according to the `upgradeStrategy.method` chosen in the values.
@@ -76,19 +76,19 @@ Descriptions on how to use these options can be found in the [SolrCloud document
 
 ### Running Solr
 
-| Key | Type | Default | Description |
-|-----|------|---------|-------------|
+| Key | Type | Default           | Description |
+|-----|------|-------------------|-------------|
 | fullnameOverride | string | `""` | A custom name for the Solr Operator Deployment |
 | nameOverride | string | `""` |  |
 | replicas | int | `3` | The number of Solr pods to run in the Solr Cloud. If you want to use autoScaling, do not set this field. |
 | image.repository | string | `"solr"` | The repository of the Solr image |
-| image.tag | string | `"8.11"` | The tag/version of Solr to run |
-| image.pullPolicy | string |  | PullPolicy for the Solr image, defaults to the empty Pod behavior |
-| image.imagePullSecret | string |  | PullSecret for the Solr image |
+| image.tag | string | `"9.10.0"` | The tag/version of Solr to run |
+| image.pullPolicy | string | | PullPolicy for the Solr image, defaults to the empty Pod behavior |
+| image.imagePullSecret | string | | PullSecret for the Solr image |
 | busyBoxImage.repository | string | `"busybox"` | The repository of the BusyBox image |
 | busyBoxImage.tag | string | `"1.28.0-glibc"` | The tag/version of BusyBox to run |
-| busyBoxImage.pullPolicy | string |  | PullPolicy for the BusyBox image, defaults to the empty Pod behavior |
-| busyBoxImage.imagePullSecret | string |  | PullSecret for the BusyBox image |
+| busyBoxImage.pullPolicy | string | | PullPolicy for the BusyBox image, defaults to the empty Pod behavior |
+| busyBoxImage.imagePullSecret | string | | PullSecret for the BusyBox image |
 | solrOptions.javaMemory | string | `"-Xms1g -Xmx2g"` | Java memory parameters |
 | solrOptions.javaOpts | string | `""` | Additional java arguments to pass via the command line.  ZooKeeper-connection related properties should be reserved for `solrOptions.zkJavaOpts` (see below). |
 | solrOptions.zkJavaOpts | string | `""` | Additional java arguments required to connect to ZooKeeper to pass via the command line |
@@ -104,11 +104,11 @@ Descriptions on how to use these options can be found in the [SolrCloud document
 | updateStrategy.method | string | `"Managed"` | The method for conducting updates of Solr pods. Either `Managed`, `StatefulSet` or `Manual`. See the [docs](https://apache.github.io/solr-operator/docs/solr-cloud/solr-cloud-crd.html#update-strategy) for more information |
 | updateStrategy.managedUpdate.maxPodsUnavailable | int-or-string | `"25%"` | The number of Solr pods in a Solr Cloud that are allowed to be unavailable during the rolling restart. Either a static number, or a percentage representing the percentage of total pods requested for the statefulSet. |
 | updateStrategy.managedUpdate.maxShardReplicasUnavailable | int-or-string | `1` | The number of replicas for each shard allowed to be unavailable during the restart. Either a static number, or a percentage representing the percentage of the number of replicas for a shard. |
-| updateStrategy.restartSchedule | [string (CRON)](https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format) | | A CRON schedule for automatically restarting the Solr Cloud. [Refer here](https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format) for all possible CRON syntaxes accepted. |
+| updateStrategy.restartSchedule | [string (CRON)](https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format) |                   | A CRON schedule for automatically restarting the Solr Cloud. [Refer here](https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format) for all possible CRON syntaxes accepted. |
 | availability.podDisruptionBudget.enabled | boolean | `true` | Create [PodDisruptionBudget(s)](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) to ensure the availability of SolrNodes. |
 | availability.podDisruptionBudget.method | string | `"ClusterWide"` | The method by which PodDisruptionBudgets should be created. The only option currently is `ClusterWide`. |
 | serviceAccount.create | boolean | `false` | Create a serviceAccount to be used for all pods being deployed (Solr & ZK). If `serviceAccount.name` is not specified, the full name of the deployment will be used. |
-| serviceAccount.name | string |  | The optional default service account used for Solr and ZK unless overridden below. If `serviceAccount.create` is set to `false`, this serviceAccount must exist in the target namespace. |
+| serviceAccount.name | string | | The optional default service account used for Solr and ZK unless overridden below. If `serviceAccount.create` is set to `false`, this serviceAccount must exist in the target namespace. |
 | backupRepositories | []object | | A list of BackupRepositories to connect your SolrCloud to. Visit the [SolrBackup docs](https://apache.github.io/solr-operator/docs/solr-backup) or run `kubectl explain solrcloud.spec.backupRepositories` to see the available options. |
 | scaling.vacatePodsOnScaleDown | boolean | `true` | While scaling down the SolrCloud, move replicas off of Solr Pods before they are deleted. This only affects pods that will not exist after the scaleDown operation.  |
 | scaling.populatePodsOnScaleUp | boolean | `true` | While scaling up the SolrCloud, migrate replicas onto the new Solr Pods after they are created. This uses the Balance Replicas API in Solr that is only available in Solr 9.3+. This option will be ignored if using an unsupported version of Solr.  |



Test patch:
diff --git a/hack/release/smoke_test/test_cluster.sh b/hack/release/smoke_test/test_cluster.sh
index 27b3aa1..b99e722 100755
--- a/hack/release/smoke_test/test_cluster.sh
+++ b/hack/release/smoke_test/test_cluster.sh
@@ -33,7 +33,7 @@ Test the release candidate in a Kind cluster
     -i  Solr Operator docker image to use (Optional, defaults to apache/solr-operator:<version>)
     -g  GPG Key (fingerprint) used to sign the artifacts (Optional, if not provided then the helm chart will not be verified)
     -k  Kubernetes Version to test with (full tag, e.g. v1.26.6) (Optional, defaults to a compatible version)
-    -t  Full solr image, or image tag (for the official Solr image), to test with (e.g. apache/solr-nightly:9.0.0, 8.11). (Optional, defaults to a compatible version)
+    -t  Full solr image, or image tag (for the official Solr image), to test with (e.g. apache/solr-nightly:9.0.0, 9.10.0). (Optional, defaults to a compatible version)
 EOF
 }
 
@@ -77,7 +77,7 @@ if [[ -z "${KUBERNETES_VERSION:-}" ]]; then
   KUBERNETES_VERSION="v1.26.6"
 fi
 if [[ -z "${SOLR_IMAGE:-}" ]]; then
-  SOLR_IMAGE="${SOLR_VERSION:-8.11}"
+  SOLR_IMAGE="${SOLR_VERSION:-9.10.0}"
 fi
 if [[ "${SOLR_IMAGE}" != *":"* ]]; then
   SOLR_IMAGE="solr:${SOLR_IMAGE}"
diff --git a/tests/e2e/suite_test.go b/tests/e2e/suite_test.go
index c746443..1ac10f8 100644
--- a/tests/e2e/suite_test.go
+++ b/tests/e2e/suite_test.go
@@ -76,7 +76,7 @@ var (
 	logger       logr.Logger
 
 	defaultOperatorImage = "apache/solr-operator:" + version.FullVersion()
-	defaultSolrImage     = "solr:8.11"
+	defaultSolrImage     = "solr:9.10.0"
 
 	operatorImage = getEnvWithDefault(operatorImageEnv, defaultOperatorImage)
 	solrImage     = getEnvWithDefault(solrImageEnv, defaultSolrImage)
diff --git a/tests/scripts/manage_e2e_tests.sh b/tests/scripts/manage_e2e_tests.sh
index 2da32c4..09a0c77 100755
--- a/tests/scripts/manage_e2e_tests.sh
+++ b/tests/scripts/manage_e2e_tests.sh
@@ -35,7 +35,7 @@ Available actions are: run-tests, create-cluster, destroy-cluster, kubeconfig
     -h  Display this help and exit
     -i  Solr Operator docker image to use (Optional, defaults to apache/solr-operator:<version>)
     -k  Kubernetes Version to test with (full tag, e.g. v1.24.16) (Optional, defaults to a compatible version)
-    -s  Full solr image, or image tag (for the official Solr image), to test with (e.g. apache/solr-nightly:9.4.0, 8.11). (Optional, defaults to a compatible version)
+    -s  Full solr image, or image tag (for the official Solr image), to test with (e.g. apache/solr-nightly:9.4.0, 9.10.0). (Optional, defaults to a compatible version)
     -a  Load additional local images into the test Kubernetes cluster. Provide option multiple times for multiple images. (Optional)
 EOF
 }
@@ -76,7 +76,7 @@ if [[ -z "${KUBERNETES_VERSION:-}" ]]; then
   KUBERNETES_VERSION="v1.26.6"
 fi
 if [[ -z "${SOLR_IMAGE:-}" ]]; then
-  SOLR_IMAGE="${SOLR_VERSION:-9.8.1}"
+  SOLR_IMAGE="${SOLR_VERSION:-9.10.0}"
 fi
 if [[ "${SOLR_IMAGE}" != *":"* ]]; then
   SOLR_IMAGE="solr:${SOLR_IMAGE}"