From df65f0a1b7a6ec58bd4e3c058d8e4eafec7750d9 Mon Sep 17 00:00:00 2001 From: Houston Putman Date: Thu, 5 Mar 2020 12:36:06 -0500 Subject: [PATCH] A start for adding node labels as sysProps for Solr. Signed-off-by: Houston Putman --- api/v1beta1/solrcloud_types.go | 12 +++++++ api/v1beta1/zz_generated.deepcopy.go | 5 +++ .../bases/solr.bloomberg.com_solrclouds.yaml | 16 +++++++++ controllers/util/solr_util.go | 35 ++++++++++++++++++- helm/solr-operator/crds/crds.yaml | 16 +++++++++ 5 files changed, 83 insertions(+), 1 deletion(-) diff --git a/api/v1beta1/solrcloud_types.go b/api/v1beta1/solrcloud_types.go index 198bd36e..9444c64f 100644 --- a/api/v1beta1/solrcloud_types.go +++ b/api/v1beta1/solrcloud_types.go @@ -40,6 +40,9 @@ const ( DefaultBusyBoxImageRepo = "library/busybox" DefaultBusyBoxImageVersion = "1.28.0-glibc" + DefaultJqImageRepo = "gempesaw/curl-jq" + DefaultJqImageVersion = "latest" + DefaultZkReplicas = int32(3) DefaultZkStorage = "5Gi" DefaultZkRepo = "emccorp/zookeeper" @@ -103,6 +106,9 @@ type SolrCloudSpec struct { // +optional BusyBoxImage *ContainerImage `json:"busyBoxImage,omitempty"` + // +optional + JqImage *ContainerImage `json:"jqImage,omitempty"` + // +optional SolrJavaMem string `json:"solrJavaMem,omitempty"` @@ -179,6 +185,12 @@ func (spec *SolrCloudSpec) withDefaults() (changed bool) { } changed = spec.BusyBoxImage.withDefaults(DefaultBusyBoxImageRepo, DefaultBusyBoxImageVersion, DefaultPullPolicy) || changed + if spec.JqImage == nil { + c := ContainerImage{} + spec.JqImage = &c + } + changed = spec.JqImage.withDefaults(DefaultJqImageRepo, DefaultJqImageVersion, DefaultPullPolicy) || changed + return changed } diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index 8b85e7ed..f3bfe8e3 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -759,6 +759,11 @@ func (in *SolrCloudSpec) DeepCopyInto(out *SolrCloudSpec) { *out = new(ContainerImage) **out = **in } + if in.JqImage != nil { + in, out := &in.JqImage, &out.JqImage + *out = new(ContainerImage) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SolrCloudSpec. diff --git a/config/crd/bases/solr.bloomberg.com_solrclouds.yaml b/config/crd/bases/solr.bloomberg.com_solrclouds.yaml index dc5cb6f4..6613964a 100644 --- a/config/crd/bases/solr.bloomberg.com_solrclouds.yaml +++ b/config/crd/bases/solr.bloomberg.com_solrclouds.yaml @@ -3715,6 +3715,22 @@ spec: backing this claim. type: string type: object + jqImage: + description: ContainerImage defines the fields needed for a Docker repository + image. The format here matches the predominant format used in Helm + charts. + properties: + imagePullSecret: + type: string + pullPolicy: + description: PullPolicy describes a policy for if/when to pull a + container image + type: string + repository: + type: string + tag: + type: string + type: object replicas: description: The number of solr nodes to run format: int32 diff --git a/controllers/util/solr_util.go b/controllers/util/solr_util.go index c6a2c816..5b87e48e 100644 --- a/controllers/util/solr_util.go +++ b/controllers/util/solr_util.go @@ -80,6 +80,7 @@ func GenerateStatefulSet(solrCloud *solr.SolrCloud, solrCloudStatus *solr.SolrCl } // Volumes & Mounts + kubeNodeInfoVolumeName := "kube-node-info" solrVolumes := []corev1.Volume{ { Name: "solr-xml", @@ -98,10 +99,15 @@ func GenerateStatefulSet(solrCloud *solr.SolrCloud, solrCloudStatus *solr.SolrCl }, }, }, + { + Name: kubeNodeInfoVolumeName, + VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}, + }, } solrDataVolumeName := "data" - volumeMounts := []corev1.VolumeMount{{Name: solrDataVolumeName, MountPath: "/var/solr/data"}} + nodeInfoPath := "/kubernetes/etc/node" + volumeMounts := []corev1.VolumeMount{{Name: solrDataVolumeName, MountPath: "/var/solr/data"}, {Name: kubeNodeInfoVolumeName, MountPath: nodeInfoPath}} var pvcs []corev1.PersistentVolumeClaim if solrCloud.Spec.DataPvcSpec != nil { pvcs = []corev1.PersistentVolumeClaim{ @@ -213,6 +219,10 @@ func GenerateStatefulSet(solrCloud *solr.SolrCloud, solrCloudStatus *solr.SolrCl Name: "GC_TUNE", Value: solrCloud.Spec.SolrGCTune, }, + { + Name: "SOLR_INCLUDE", + Value: nodeInfoPath + "/node.sh", + }, } // Add Custom EnvironmentVariables to the solr container @@ -265,6 +275,29 @@ func GenerateStatefulSet(solrCloud *solr.SolrCloud, solrCloudStatus *solr.SolrCl }, }, }, + { + Name: "kube-node-labels", + Image: solrCloud.Spec.JqImage.ToImageName(), + ImagePullPolicy: solrCloud.Spec.JqImage.PullPolicy, + Command: []string{"sh", "-c", "curl -s \"https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api/v1/nodes/${NODE_NAME}\" -H \"Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)\" --cacert '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt' | jq -r '.metadata.labels | to_entries | map(\"-D\"+.key+\"=\"+.value)| \"export SOLR_OPTS=\\\"${SOLR_OPTS} \" + join(\" \") + \"\\\"\"' > /node-data/node.sh"}, + VolumeMounts: []corev1.VolumeMount{ + { + Name: kubeNodeInfoVolumeName, + MountPath: "/node-data", + }, + }, + Env: []corev1.EnvVar{ + { + Name: "NODE_NAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "spec.nodeName", + }, + }, + }, + }, + }, }, HostAliases: hostAliases, Containers: []corev1.Container{ diff --git a/helm/solr-operator/crds/crds.yaml b/helm/solr-operator/crds/crds.yaml index 0db94e78..7b780e37 100644 --- a/helm/solr-operator/crds/crds.yaml +++ b/helm/solr-operator/crds/crds.yaml @@ -5193,6 +5193,22 @@ spec: backing this claim. type: string type: object + jqImage: + description: ContainerImage defines the fields needed for a Docker repository + image. The format here matches the predominant format used in Helm + charts. + properties: + imagePullSecret: + type: string + pullPolicy: + description: PullPolicy describes a policy for if/when to pull a + container image + type: string + repository: + type: string + tag: + type: string + type: object replicas: description: The number of solr nodes to run format: int32