blob: 838b9f5eb13e082df03a08ef588635324b69bfbe [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 (
"strings"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
)
// StatefulSetOptions defines custom options for StatefulSets
type StatefulSetOptions struct {
// Annotations to be added for the StatefulSet.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
// Labels to be added for the StatefulSet.
// +optional
Labels map[string]string `json:"labels,omitempty"`
// PodManagementPolicy defines the policy for creating pods under a stateful set.
// Override the default value of Parallel.
// This cannot be updated on an existing StatefulSet, the StatefulSet must be deleted and recreated for a change in this field to take effect.
//
// +optional
// +kubebuilder:validation:Enum=OrderedReady;Parallel
PodManagementPolicy appsv1.PodManagementPolicyType `json:"podManagementPolicy,omitempty"`
}
// DeploymentOptions defines custom options for Deployments
type DeploymentOptions struct {
// Annotations to be added for the Deployment.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
// Labels to be added for the Deployment.
// +optional
Labels map[string]string `json:"labels,omitempty"`
}
// PodOptions defines the common pod configuration for Pods, including when used
// in deployments, stateful-sets, etc.
type PodOptions struct {
// The scheduling constraints on pods.
// +optional
Affinity *corev1.Affinity `json:"affinity,omitempty"`
// Resources is the resource requirements for the container.
// This field cannot be updated once the cluster is created.
// +optional
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
// Additional non-data volumes to load into the default container.
// +optional
Volumes []AdditionalVolume `json:"volumes,omitempty"`
// PodSecurityContext is the security context for the pod.
// +optional
PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"`
// Additional environment variables to pass to the default container.
// +optional
EnvVariables []corev1.EnvVar `json:"envVars,omitempty"`
// Annotations to be added for pods.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
// Labels to be added for pods.
// +optional
Labels map[string]string `json:"labels,omitempty"`
// Tolerations to be added for the StatefulSet.
// +optional
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
// Node Selector to be added for the StatefulSet.
// +optional
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
// Liveness probe parameters
// +optional
LivenessProbe *corev1.Probe `json:"livenessProbe,omitempty"`
// Readiness probe parameters
// +optional
ReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty"`
// Startup probe parameters
// +optional
StartupProbe *corev1.Probe `json:"startupProbe,omitempty"`
// PriorityClassName for the pod
// +optional
PriorityClassName string `json:"priorityClassName,omitempty"`
// Sidecar containers to run in the pod. These are in addition to the Solr Container
// +optional
SidecarContainers []corev1.Container `json:"sidecarContainers,omitempty"`
// Additional init containers to run in the pod.
// These will run along with the init container that sets up the "solr.xml".
// +optional
InitContainers []corev1.Container `json:"initContainers,omitempty"`
// ImagePullSecrets to apply to the pod.
// These are for init/sidecarContainers in addition to the imagePullSecret defined for the
// solr image.
// +optional
ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
// Optional duration in seconds the pod needs to terminate gracefully.
// +kubebuilder:validation:Minimum=10
// +optional
TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"`
// Optional Service Account to run the pod under.
// +optional
ServiceAccountName string `json:"serviceAccountName,omitempty"`
}
// ServiceOptions defines custom options for services
type ServiceOptions struct {
// Annotations to be added for the Service.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
// Labels to be added for the Service.
// +optional
Labels map[string]string `json:"labels,omitempty"`
}
// IngressOptions defines custom options for ingresses
type IngressOptions struct {
// Annotations to be added for the Ingress.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
// Labels to be added for the Ingress.
// +optional
Labels map[string]string `json:"labels,omitempty"`
}
// ConfigMapOptions defines custom options for configMaps
type ConfigMapOptions struct {
// Annotations to be added for the ConfigMap.
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
// Labels to be added for the ConfigMap.
// +optional
Labels map[string]string `json:"labels,omitempty"`
// Name of a user provided ConfigMap in the same namespace containing a custom solr.xml
// +optional
ProvidedConfigMap string `json:"providedConfigMap,omitempty"`
}
// AdditionalVolume provides information on additional volumes that should be loaded into pods
type AdditionalVolume struct {
// Name of the volume
Name string `json:"name"`
// Source is the source of the Volume to be loaded into the solrCloud Pod
Source corev1.VolumeSource `json:"source"`
// DefaultContainerMount defines how to mount this volume into the default container.
// If this volume is to be used only with sidecar or non-default init containers,
// then this option is not necessary.
// +optional
DefaultContainerMount *corev1.VolumeMount `json:"defaultContainerMount,omitempty"`
}
// ContainerImage defines the fields needed for a Docker repository image. The
// format here matches the predominant format used in Helm charts.
type ContainerImage struct {
// +optional
Repository string `json:"repository,omitempty"`
// +optional
Tag string `json:"tag,omitempty"`
// +optional
PullPolicy corev1.PullPolicy `json:"pullPolicy,omitempty"`
// +optional
ImagePullSecret string `json:"imagePullSecret,omitempty"`
}
func (c *ContainerImage) withDefaults(repo string, version string, policy corev1.PullPolicy) (changed bool) {
if c.Repository == "" && repo != "" {
changed = true
c.Repository = repo
}
if c.Tag == "" && version != "" {
changed = true
c.Tag = version
}
if c.PullPolicy == "" && policy != "" {
changed = true
c.PullPolicy = policy
}
return changed
}
func (c *ContainerImage) ToImageName() (name string) {
return c.Repository + ":" + c.Tag
}
func ImageVersion(image string) (version string) {
split := strings.Split(image, ":")
if len(split) < 2 {
return ""
} else {
return split[1]
}
}
// SolrNodeStatus is the status of a solrNode in the cloud, with readiness status
// and internal and external addresses
type ZookeeperConnectionInfo struct {
// The connection string to connect to the ensemble from within the Kubernetes cluster
// +optional
InternalConnectionString string `json:"internalConnectionString,omitempty"`
// The connection string to connect to the ensemble from outside of the Kubernetes cluster
// If external and no internal connection string is provided, the external cnx string will be used as the internal cnx string
// +optional
ExternalConnectionString *string `json:"externalConnectionString,omitempty"`
// The ChRoot to connect solr at
// +optional
ChRoot string `json:"chroot,omitempty"`
// ZooKeeper ACL to use when connecting with ZK.
// This ACL should have ALL permission in the given chRoot.
// +optional
AllACL *ZookeeperACL `json:"acl,omitempty"`
// ZooKeeper ACL to use when connecting with ZK for reading operations.
// This ACL should have READ permission in the given chRoot.
// +optional
ReadOnlyACL *ZookeeperACL `json:"readOnlyAcl,omitempty"`
}
func (ci *ZookeeperConnectionInfo) withDefaults() (changed bool) {
if ci.InternalConnectionString == "" {
if ci.ExternalConnectionString != nil {
changed = true
ci.InternalConnectionString = *ci.ExternalConnectionString
}
}
if ci.ChRoot == "" {
changed = true
ci.ChRoot = "/"
} else if !strings.HasPrefix(ci.ChRoot, "/") {
changed = true
ci.ChRoot = "/" + ci.ChRoot
}
return changed
}
// ZookeeperSpec defines the internal zookeeper ensemble to run for solr
type ZookeeperACL struct {
// The name of the Kubernetes Secret that stores the username and password for the ACL.
// This secret must be in the same namespace as the solrCloud or prometheusExporter is running in.
SecretRef string `json:"secret"`
// The name of the key in the given secret that contains the ACL username
UsernameKey string `json:"usernameKey"`
// The name of the key in the given secret that contains the ACL password
PasswordKey string `json:"passwordKey"`
}