You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ho...@apache.org on 2021/08/26 19:36:23 UTC
[solr-operator] branch main updated: Ability to schedule automatic
restarts for SolrPrometheusExporters (#313)
This is an automated email from the ASF dual-hosted git repository.
houston pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr-operator.git
The following commit(s) were added to refs/heads/main by this push:
new 579eec1 Ability to schedule automatic restarts for SolrPrometheusExporters (#313)
579eec1 is described below
commit 579eec13c8710bbb866c75f11afd5f9455f1702d
Author: Houston Putman <ho...@apache.org>
AuthorDate: Thu Aug 26 15:36:15 2021 -0400
Ability to schedule automatic restarts for SolrPrometheusExporters (#313)
---
api/v1beta1/solrprometheusexporter_types.go | 13 +++++++
.../solr.apache.org_solrprometheusexporters.yaml | 3 ++
controllers/solrprometheusexporter_controller.go | 45 +++++++++++++++++-----
helm/solr-operator/Chart.yaml | 9 ++++-
helm/solr-operator/crds/crds.yaml | 3 ++
5 files changed, 63 insertions(+), 10 deletions(-)
diff --git a/api/v1beta1/solrprometheusexporter_types.go b/api/v1beta1/solrprometheusexporter_types.go
index 3339354..e344963 100644
--- a/api/v1beta1/solrprometheusexporter_types.go
+++ b/api/v1beta1/solrprometheusexporter_types.go
@@ -61,6 +61,19 @@ type SolrPrometheusExporterSpec struct {
// with the `spec.solrReference.solrTLS.mountedServerTLSDir` option
// +optional
BusyBoxImage *ContainerImage `json:"busyBoxImage,omitempty"`
+
+ // Perform a scheduled restart on the given schedule, in CRON format.
+ //
+ // Multiple CRON syntaxes are supported
+ // - Standard CRON (e.g. "CRON_TZ=Asia/Seoul 0 6 * * ?")
+ // - Predefined Schedules (e.g. "@yearly", "@weekly", etc.)
+ // - Intervals (e.g. "@every 10h30m")
+ //
+ // For more information please check this reference:
+ // https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format
+ //
+ // +optional
+ RestartSchedule string `json:"restartSchedule,omitempty"`
}
func (ps *SolrPrometheusExporterSpec) withDefaults(namespace string) (changed bool) {
diff --git a/config/crd/bases/solr.apache.org_solrprometheusexporters.yaml b/config/crd/bases/solr.apache.org_solrprometheusexporters.yaml
index 5682b7f..751b864 100644
--- a/config/crd/bases/solr.apache.org_solrprometheusexporters.yaml
+++ b/config/crd/bases/solr.apache.org_solrprometheusexporters.yaml
@@ -3376,6 +3376,9 @@ spec:
description: Number of threads to use for the prometheus exporter Defaults to 1
format: int32
type: integer
+ restartSchedule:
+ description: "Perform a scheduled restart on the given schedule, in CRON format. \n Multiple CRON syntaxes are supported - Standard CRON (e.g. \"CRON_TZ=Asia/Seoul 0 6 * * ?\") - Predefined Schedules (e.g. \"@yearly\", \"@weekly\", etc.) - Intervals (e.g. \"@every 10h30m\") \n For more information please check this reference: https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format"
+ type: string
scrapeInterval:
description: The interval to scrape Solr at (in seconds) Defaults to 60 seconds
format: int32
diff --git a/controllers/solrprometheusexporter_controller.go b/controllers/solrprometheusexporter_controller.go
index bf9cf07..431e102 100644
--- a/controllers/solrprometheusexporter_controller.go
+++ b/controllers/solrprometheusexporter_controller.go
@@ -85,13 +85,15 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
return ctrl.Result{Requeue: true}, nil
}
+ requeueOrNot := ctrl.Result{}
+
configMapKey := util.PrometheusExporterConfigMapKey
configXmlMd5 := ""
if prometheusExporter.Spec.Config == "" && prometheusExporter.Spec.CustomKubeOptions.ConfigMapOptions != nil && prometheusExporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap != "" {
foundConfigMap := &corev1.ConfigMap{}
err = r.Get(context.TODO(), types.NamespacedName{Name: prometheusExporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap, Namespace: prometheusExporter.Namespace}, foundConfigMap)
if err != nil {
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
if foundConfigMap.Data != nil {
@@ -99,11 +101,11 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
if ok {
configXmlMd5 = fmt.Sprintf("%x", md5.Sum([]byte(configXml)))
} else {
- return ctrl.Result{}, fmt.Errorf("required '%s' key not found in provided ConfigMap %s",
+ return requeueOrNot, fmt.Errorf("required '%s' key not found in provided ConfigMap %s",
configMapKey, prometheusExporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap)
}
} else {
- return ctrl.Result{}, fmt.Errorf("provided ConfigMap %s has no data",
+ return requeueOrNot, fmt.Errorf("provided ConfigMap %s has no data",
prometheusExporter.Spec.CustomKubeOptions.ConfigMapOptions.ProvidedConfigMap)
}
}
@@ -138,7 +140,7 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
}
}
if err != nil {
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
}
@@ -166,13 +168,13 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
}
}
if err != nil {
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
// Get the ZkConnectionString to connect to
solrConnectionInfo := util.SolrConnectionInfo{}
if solrConnectionInfo, err = getSolrConnectionInfo(r, prometheusExporter); err != nil {
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
// Make sure the TLS config is in order
@@ -180,7 +182,7 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
if prometheusExporter.Spec.SolrReference.SolrTLS != nil {
tls, err = r.reconcileTLSConfig(prometheusExporter)
if err != nil {
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
}
@@ -207,6 +209,31 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
deploymentLogger := logger.WithValues("deployment", deploy.Name)
foundDeploy := &appsv1.Deployment{}
err = r.Get(context.TODO(), types.NamespacedName{Name: deploy.Name, Namespace: deploy.Namespace}, foundDeploy)
+
+ // Set the annotation for a scheduled restart, if necessary.
+ if nextRestartAnnotation, reconcileWaitDuration, err := util.ScheduleNextRestart(prometheusExporter.Spec.RestartSchedule, foundDeploy.Spec.Template.Annotations); err != nil {
+ logger.Error(err, "Cannot parse restartSchedule cron: %s", prometheusExporter.Spec.RestartSchedule)
+ } else {
+ if nextRestartAnnotation != "" {
+ if deploy.Spec.Template.Annotations == nil {
+ deploy.Spec.Template.Annotations = make(map[string]string, 1)
+ }
+ // Set the new restart time annotation
+ deploy.Spec.Template.Annotations[util.SolrScheduledRestartAnnotation] = nextRestartAnnotation
+ // TODO: Create event for the CRD.
+ } else if existingRestartAnnotation, exists := foundDeploy.Spec.Template.Annotations[util.SolrScheduledRestartAnnotation]; exists {
+ if deploy.Spec.Template.Annotations == nil {
+ deploy.Spec.Template.Annotations = make(map[string]string, 1)
+ }
+ // Keep the existing nextRestart annotation if it exists and we aren't setting a new one.
+ deploy.Spec.Template.Annotations[util.SolrScheduledRestartAnnotation] = existingRestartAnnotation
+ }
+ if reconcileWaitDuration != nil {
+ // Set the requeueAfter if it has not been set, or is greater than the time we need to wait to restart again
+ updateRequeueAfter(&requeueOrNot, *reconcileWaitDuration)
+ }
+ }
+
if err != nil && errors.IsNotFound(err) {
deploymentLogger.Info("Creating Deployment")
if err = controllerutil.SetControllerReference(prometheusExporter, deploy, r.scheme); err == nil {
@@ -225,7 +252,7 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
ready = foundDeploy.Status.ReadyReplicas > 0
}
if err != nil {
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
if ready != prometheusExporter.Status.Ready {
@@ -234,7 +261,7 @@ func (r *SolrPrometheusExporterReconciler) Reconcile(req ctrl.Request) (ctrl.Res
err = r.Status().Update(context.TODO(), prometheusExporter)
}
- return ctrl.Result{}, err
+ return requeueOrNot, err
}
func getSolrConnectionInfo(r *SolrPrometheusExporterReconciler, prometheusExporter *solrv1beta1.SolrPrometheusExporter) (solrConnectionInfo util.SolrConnectionInfo, err error) {
diff --git a/helm/solr-operator/Chart.yaml b/helm/solr-operator/Chart.yaml
index 1080e83..78525ff 100644
--- a/helm/solr-operator/Chart.yaml
+++ b/helm/solr-operator/Chart.yaml
@@ -64,7 +64,7 @@ annotations:
- name: Zookeeper Operator Release Notes
url: https://github.com/pravega/zookeeper-operator/releases/tag/v0.2.12
- kind: added
- description: Ability to schedule automatic restarts
+ description: Ability to schedule automatic restarts for SolrClouds
links:
- name: Github Issue
url: https://github.com/apache/solr-operator/issues/281
@@ -142,6 +142,13 @@ annotations:
url: https://github.com/apache/solr-operator/issues/268
- name: Github PR
url: https://github.com/apache/solr-operator/pull/293
+ - kind: added
+ description: Ability to schedule automatic restarts for SolrPrometheusExporters
+ links:
+ - name: Github Issue
+ url: https://github.com/apache/solr-operator/issues/310
+ - name: Github PR
+ url: https://github.com/apache/solr-operator/pull/313
artifacthub.io/images: |
- name: solr-operator
image: apache/solr-operator:v0.4.0-prerelease
diff --git a/helm/solr-operator/crds/crds.yaml b/helm/solr-operator/crds/crds.yaml
index b42f33a..ae4cc91 100644
--- a/helm/solr-operator/crds/crds.yaml
+++ b/helm/solr-operator/crds/crds.yaml
@@ -10035,6 +10035,9 @@ spec:
description: Number of threads to use for the prometheus exporter Defaults to 1
format: int32
type: integer
+ restartSchedule:
+ description: "Perform a scheduled restart on the given schedule, in CRON format. \n Multiple CRON syntaxes are supported - Standard CRON (e.g. \"CRON_TZ=Asia/Seoul 0 6 * * ?\") - Predefined Schedules (e.g. \"@yearly\", \"@weekly\", etc.) - Intervals (e.g. \"@every 10h30m\") \n For more information please check this reference: https://pkg.go.dev/github.com/robfig/cron/v3?utm_source=godoc#hdr-CRON_Expression_Format"
+ type: string
scrapeInterval:
description: The interval to scrape Solr at (in seconds) Defaults to 60 seconds
format: int32