blob: 6decc9015ec4e3fb0dee3f07a7d3d3fb2cf551e3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package v1beta1
import (
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
SolrPrometheusExporterTechnologyLabel = "solr-prometheus-exporter"
)
// SolrPrometheusExporterSpec defines the desired state of SolrPrometheusExporter
type SolrPrometheusExporterSpec struct {
// Reference of the Solr instance to collect metrics for
SolrReference SolrReference `json:"solrReference"`
// Image of Solr Prometheus Exporter to run.
// +optional
Image *ContainerImage `json:"image,omitempty"`
// Provide custom options for kubernetes objects created for the SolrPrometheusExporter.
// +optional
CustomKubeOptions CustomExporterKubeOptions `json:"customKubeOptions,omitempty"`
// The entrypoint into the exporter. Defaults to the official docker-solr location.
// +optional
ExporterEntrypoint string `json:"exporterEntrypoint,omitempty"`
// Number of threads to use for the prometheus exporter
// Defaults to 1
// +optional
NumThreads int32 `json:"numThreads,omitempty"`
// The interval to scrape Solr at (in seconds)
// Defaults to 60 seconds
// +optional
ScrapeInterval int32 `json:"scrapeInterval,omitempty"`
// The xml config for the metrics
// +optional
Config string `json:"metricsConfig,omitempty"`
}
func (ps *SolrPrometheusExporterSpec) withDefaults(namespace string) (changed bool) {
changed = ps.SolrReference.withDefaults(namespace) || changed
if ps.Image == nil {
ps.Image = &ContainerImage{}
}
changed = ps.Image.withDefaults(DefaultSolrRepo, DefaultSolrVersion, DefaultPullPolicy) || changed
if ps.NumThreads == 0 {
ps.NumThreads = 1
changed = true
}
return changed
}
// SolrReference defines a reference to an internal or external solrCloud or standalone solr
// One, and only one, of Cloud or Standalone must be provided.
type SolrReference struct {
// Reference of a solrCloud instance
// +optional
Cloud *SolrCloudReference `json:"cloud,omitempty"`
// Reference of a standalone solr instance
// +optional
Standalone *StandaloneSolrReference `json:"standalone,omitempty"`
// Settings to configure the SolrJ client used to request metrics from TLS enabled Solr pods
// +optional
SolrTLS *SolrTLSOptions `json:"solrTLS,omitempty"`
// If Solr is secured, you'll need to provide credentials for the Prometheus exporter to authenticate via a
// kubernetes.io/basic-auth secret which must contain a username and password. If basic auth is enabled on the
// SolrCloud instance, the default secret (unless you are supplying your own) is named using the pattern:
// <SOLR_CLOUD_NAME>-solrcloud-basic-auth. If using the security.json bootstrapped by the Solr operator,
// then the username is "k8s-oper".
// +optional
BasicAuthSecret string `json:"basicAuthSecret,omitempty"`
}
func (sr *SolrReference) withDefaults(namespace string) (changed bool) {
if sr.Cloud != nil {
changed = sr.Cloud.withDefaults(namespace) || changed
}
return changed
}
// SolrCloudReference defines a reference to an internal or external solrCloud.
// Internal (to the kube cluster) clouds should be specified via the Name and Namespace options.
// External clouds should be specified by their Zookeeper connection information.
type SolrCloudReference struct {
// The name of a solr cloud running within the kubernetes cluster
// +optional
Name string `json:"name,omitempty"`
// The namespace of a solr cloud running within the kubernetes cluster
// +optional
Namespace string `json:"namespace,omitempty"`
// The ZK Connection information for a cloud, could be used for solr's running outside of the kube cluster
// +optional
ZookeeperConnectionInfo *ZookeeperConnectionInfo `json:"zkConnectionInfo,omitempty"`
}
func (scr *SolrCloudReference) withDefaults(namespace string) (changed bool) {
if scr.Name != "" {
if scr.Namespace == "" {
scr.Namespace = namespace
changed = true
}
}
if scr.ZookeeperConnectionInfo != nil {
changed = scr.ZookeeperConnectionInfo.withDefaults() || changed
}
return changed
}
// SolrPrometheusExporterStatus defines the observed state of SolrPrometheusExporter
type StandaloneSolrReference struct {
// The address of the standalone solr
Address string `json:"address"`
}
type CustomExporterKubeOptions struct {
// SolrPodOptions defines the custom options for the solrPrometheusExporter pods.
// +optional
PodOptions *PodOptions `json:"podOptions,omitempty"`
// DeploymentOptions defines the custom options for the solrPrometheusExporter Deployment.
// +optional
DeploymentOptions *DeploymentOptions `json:"deploymentOptions,omitempty"`
// ServiceOptions defines the custom options for the solrPrometheusExporter Service.
// +optional
ServiceOptions *ServiceOptions `json:"serviceOptions,omitempty"`
// ServiceOptions defines the custom options for the solrPrometheusExporter ConfigMap.
// +optional
ConfigMapOptions *ConfigMapOptions `json:"configMapOptions,omitempty"`
}
// SolrPrometheusExporterStatus defines the observed state of SolrPrometheusExporter
type SolrPrometheusExporterStatus struct {
// An address the prometheus exporter can be connected to from within the Kube cluster
// InternalAddress string `json:"internalAddress"`
// An address the prometheus exporter can be connected to from outside of the Kube cluster
// Will only be provided when an ingressUrl is provided for the cloud
// +optional
// ExternalAddress string `json:"externalAddress,omitempty"`
// Is the prometheus exporter up and running
Ready bool `json:"ready"`
}
//+kubebuilder:object:root=true
//+kubebuilder:resource:scope=Namespaced
//+kubebuilder:resource:shortName=solrmetrics
//+kubebuilder:subresource:status
//+kubebuilder:storageversion
//+kubebuilder:printcolumn:name="Ready",type="boolean",JSONPath=".status.ready",description="Whether the prometheus exporter is ready"
//+kubebuilder:printcolumn:name="Scrape Interval",type="integer",JSONPath=".spec.scrapeInterval",description="Scrape interval for metrics (in ms)"
//+kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
// SolrPrometheusExporter is the Schema for the solrprometheusexporters API
type SolrPrometheusExporter struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec SolrPrometheusExporterSpec `json:"spec,omitempty"`
Status SolrPrometheusExporterStatus `json:"status,omitempty"`
}
// WithDefaults set default values when not defined in the spec.
func (spe *SolrPrometheusExporter) WithDefaults() bool {
return spe.Spec.withDefaults(spe.Namespace)
}
func (spe *SolrPrometheusExporter) SharedLabels() map[string]string {
return spe.SharedLabelsWith(map[string]string{})
}
func (spe *SolrPrometheusExporter) SharedLabelsWith(labels map[string]string) map[string]string {
newLabels := map[string]string{}
if labels != nil {
for k, v := range labels {
newLabels[k] = v
}
}
newLabels[SolrPrometheusExporterTechnologyLabel] = spe.Name
return newLabels
}
// MetricsDeploymentName returns the name of the metrics deployment for the cloud
func (sc *SolrPrometheusExporter) MetricsDeploymentName() string {
return fmt.Sprintf("%s-solr-metrics", sc.GetName())
}
// MetricsConfigMapName returns the name of the metrics service for the cloud
func (sc *SolrPrometheusExporter) MetricsConfigMapName() string {
return fmt.Sprintf("%s-solr-metrics", sc.GetName())
}
// MetricsServiceName returns the name of the metrics service for the cloud
func (sc *SolrPrometheusExporter) MetricsServiceName() string {
return fmt.Sprintf("%s-solr-metrics", sc.GetName())
}
func (sc *SolrPrometheusExporter) MetricsIngressPrefix() string {
return fmt.Sprintf("%s-%s-solr-metrics", sc.Namespace, sc.Name)
}
func (sc *SolrPrometheusExporter) MetricsIngressUrl(ingressBaseUrl string) string {
return fmt.Sprintf("%s.%s", sc.MetricsIngressPrefix(), ingressBaseUrl)
}
//+kubebuilder:object:root=true
// SolrPrometheusExporterList contains a list of SolrPrometheusExporter
type SolrPrometheusExporterList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []SolrPrometheusExporter `json:"items"`
}
func init() {
SchemeBuilder.Register(&SolrPrometheusExporter{}, &SolrPrometheusExporterList{})
}