123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- # This is a bash script that runs on each pod when it starts up, and handles issues in the environment
- # like configuration processing.
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: "{{ .Release.Name }}-init-script"
- labels:
- helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- app.kubernetes.io/managed-by: {{ .Release.Service }}
- app.kubernetes.io/instance: {{ .Release.Name | quote }}
- app.kubernetes.io/name: {{ template "neo4j.name" . }}
- app.kubernetes.io/component: init
- data:
- init.sh: |-
- # Local hostname (graph-neo4j-core-0) converted to graph_neo4j_core_0
- # So that if a var is defined graph_neo4j_core_0_MYSETTING
- # its host-specific value will override whatever the default MYSETTING
- # is in the environment.
- # In this way we can give a single configmap to all 3 pods in a stateful
- # set, and still be able to do per-pod bespoke config.
- export override_prefix=$(hostname | sed s/-/_/g)
- # Ensure HOST is set, but take a default from the outer environment if present.
- export HOST=${HOST:-$(hostname -f)}
- declare -A NEO4J_SETTINGS
- # Populate NEO4J_SETTINGS with keys for all settings overriden as env vars
- for variable_name in $(compgen -e) ; do
- if [[ "${variable_name}" == "${override_prefix}"* ]]; then
- NEO4J_SETTINGS[${variable_name#"${override_prefix}_"}]=""
- fi
- done
- # HTTPS
- NEO4J_SETTINGS[dbms_connector_https_enabled]=true
- # Default settings values; either inherit from outward settings,
- # or, lacking any definition, take the local host
- NEO4J_SETTINGS[NEO4J_dbms_connector_bolt_advertised__address]=${NEO4J_dbms_connector_bolt_advertised__address:-$HOST:7687}
- NEO4J_SETTINGS[NEO4J_dbms_connector_http_advertised__address]=${NEO4J_dbms_connector_http_advertised__address:-$HOST:7474}
- NEO4J_SETTINGS[NEO4J_dbms_connector_https_advertised__address]=${NEO4J_dbms_connector_https_advertised__address:-$HOST:7473}
- # Important: note the label selector only does discovery against first 3 cores. This is intentional;
- # the list service API may return other hosts which aren't yet ready, and this will fail discovery
- # This setting is intentionally overridable for power users; discovery type of k8s is not.
- # See: https://github.com/neo4j-contrib/neo4j-helm/issues/80
- default_label_selector="neo4j.com/cluster={{ template "neo4j.fullname" . }},neo4j.com/role=CORE,neo4j.com/coreindex in (0, 1, 2)"
- NEO4J_SETTINGS[NEO4J_causal__clustering_kubernetes_label__selector]=${NEO4J_causal__clustering_kubernetes_label__selector:-$default_label_selector}
- neo4jAdminMemrec() {
- echo "Calling neo4j-admin memrec to suggest memory settings:"
- # Neo4j-admin memrec outputs configuration like this: dbms.memory.heap.max_size=9000m
- # with a lot of comments. We strip the comments, then
- # process its output into a docker env var by following the Neo4j docker rules:
- # underscores doubled, dots -> _
- # So dbms.memory.heap.max_size=9000m => export NEO4J_dbms_memory_heap_max__size=9000m
- echo '' > /var/lib/neo4j/conf/memory-recommendations.sh
- for line in $( /var/lib/neo4j/bin/neo4j-admin memrec | grep -v '^Selecting\ JVM' | grep -v '^\#' ) ; do
- # print out the memory recommendation that is being applied
- echo "${line}"
- echo "export $( echo "${line}" | sed 's/_/__/g' | sed 's/\./_/g' | sed 's/^/NEO4J_/g' )" >> /var/lib/neo4j/conf/memory-recommendations.sh
- done
- . /var/lib/neo4j/conf/memory-recommendations.sh
- }
- {{- if .Values.dbms.memory.use_memrec }}
- neo4jAdminMemrec
- {{- else }}
- {{- if .Values.dbms.memory.heap.initial_size }}
- NEO4J_SETTINGS[NEO4J_dbms_memory_heap_initial__size]={{ .Values.dbms.memory.heap.initial_size }}
- {{- end }}
- {{- if .Values.dbms.memory.heap.max_size }}
- NEO4J_SETTINGS[NEO4J_dbms_memory_heap_max__size]={{ .Values.dbms.memory.heap.max_size }}
- {{- end }}
- {{- if .Values.dbms.memory.pagecache.size }}
- NEO4J_SETTINGS[NEO4J_dbms_memory_pagecache_size]={{ .Values.dbms.memory.pagecache.size }}
- {{- end }}
- {{- if .Values.dbms.memory.transaction.max_size }}
- NEO4J_SETTINGS[NEO4J_dbms_memory_transaction_max__size]={{ .Values.dbms.memory.transaction.max_size }}
- {{- end }}
- {{- if .Values.dbms.memory.transaction.global_max_size }}
- NEO4J_SETTINGS[NEO4J_dbms_memory_transaction_global__max__size]={{ .Values.dbms.memory.transaction.global_max_size }}
- {{- end }}
- {{- if .Values.dbms.memory.transaction.memory_allocation }}
- NEO4J_SETTINGS[NEO4J_dbms_tx__state_memory__allocation]={{ .Values.dbms.memory.transaction.memory_allocation }}
- {{- end }}
- {{- end }}
- echo "Configuration override prefix = $override_prefix"
- # Check to see if a particular env var has a host-specific override. If it does,
- # return the override. Otherwise return the default value.
- getSettingValue() {
- # Setting key: $1
- # Default value: $2
- # Return: modify $SETTING_VALUE
- export override_varname=$override_prefix"_"$1
- # echo "Checking for override $override_varname"
- if [ -z "${!override_varname}" ] ; then
- SETTING_VALUE=$2
- else
- SETTING_VALUE=${!override_varname}
- fi
- }
- # For each config item, set an env var to the appropriate
- # metadata value or default value. This sets us up for envsubst
- for setting in "${!NEO4J_SETTINGS[@]}" ; do
- # echo setting $setting
- # echo default
- getSettingValue $setting "${NEO4J_SETTINGS[$setting]}"
- # echo "Setting $setting to $SETTING_VALUE"
- # Set the variable named setting to the result.
- # See: https://stackoverflow.com/questions/9714902/how-to-use-a-variables-value-as-another-variables-name-in-bash
- export $setting="$SETTING_VALUE"
- done
- {{- if not .Values.core.standalone }}
- # This discovery mechanism only applies for clustered installs.
- # These settings are *not* overrideable, because they must match the addresses the
- # core members see to avoid akka rejections, and to facilitate basic cluster formation.
- # K8S discovery requires an LB service per pod, and a service account with permissions to query the discovery API
- export NEO4J_causal__clustering_discovery__type=K8S
- # See discovery-lb, this is the name of the port used to form.
- export NEO4J_causal__clustering_kubernetes_service__port__name="tcp-discovery"
- {{- end }}
- if [ "${AUTH_ENABLED:-}" == "true" ]; then
- export NEO4J_AUTH="neo4j/${NEO4J_SECRETS_PASSWORD}"
- else
- export NEO4J_AUTH="none"
- fi
- # Once passed through to auth, unset this so Neo4j doesn't misinterpret it as config.
- unset NEO4J_SECRETS_PASSWORD
|