pod-init-script.yaml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. # This is a bash script that runs on each pod when it starts up, and handles issues in the environment
  2. # like configuration processing.
  3. apiVersion: v1
  4. kind: ConfigMap
  5. metadata:
  6. name: "{{ .Release.Name }}-init-script"
  7. labels:
  8. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
  9. app.kubernetes.io/managed-by: {{ .Release.Service }}
  10. app.kubernetes.io/instance: {{ .Release.Name | quote }}
  11. app.kubernetes.io/name: {{ template "neo4j.name" . }}
  12. app.kubernetes.io/component: init
  13. data:
  14. init.sh: |-
  15. # Local hostname (graph-neo4j-core-0) converted to graph_neo4j_core_0
  16. # So that if a var is defined graph_neo4j_core_0_MYSETTING
  17. # its host-specific value will override whatever the default MYSETTING
  18. # is in the environment.
  19. # In this way we can give a single configmap to all 3 pods in a stateful
  20. # set, and still be able to do per-pod bespoke config.
  21. export override_prefix=$(hostname | sed s/-/_/g)
  22. # Ensure HOST is set, but take a default from the outer environment if present.
  23. export HOST=${HOST:-$(hostname -f)}
  24. declare -A NEO4J_SETTINGS
  25. # Populate NEO4J_SETTINGS with keys for all settings overriden as env vars
  26. for variable_name in $(compgen -e) ; do
  27. if [[ "${variable_name}" == "${override_prefix}"* ]]; then
  28. NEO4J_SETTINGS[${variable_name#"${override_prefix}_"}]=""
  29. fi
  30. done
  31. # HTTPS
  32. NEO4J_SETTINGS[dbms_connector_https_enabled]=true
  33. # Default settings values; either inherit from outward settings,
  34. # or, lacking any definition, take the local host
  35. NEO4J_SETTINGS[NEO4J_dbms_connector_bolt_advertised__address]=${NEO4J_dbms_connector_bolt_advertised__address:-$HOST:7687}
  36. NEO4J_SETTINGS[NEO4J_dbms_connector_http_advertised__address]=${NEO4J_dbms_connector_http_advertised__address:-$HOST:7474}
  37. NEO4J_SETTINGS[NEO4J_dbms_connector_https_advertised__address]=${NEO4J_dbms_connector_https_advertised__address:-$HOST:7473}
  38. # Important: note the label selector only does discovery against first 3 cores. This is intentional;
  39. # the list service API may return other hosts which aren't yet ready, and this will fail discovery
  40. # This setting is intentionally overridable for power users; discovery type of k8s is not.
  41. # See: https://github.com/neo4j-contrib/neo4j-helm/issues/80
  42. default_label_selector="neo4j.com/cluster={{ template "neo4j.fullname" . }},neo4j.com/role=CORE,neo4j.com/coreindex in (0, 1, 2)"
  43. NEO4J_SETTINGS[NEO4J_causal__clustering_kubernetes_label__selector]=${NEO4J_causal__clustering_kubernetes_label__selector:-$default_label_selector}
  44. neo4jAdminMemrec() {
  45. echo "Calling neo4j-admin memrec to suggest memory settings:"
  46. # Neo4j-admin memrec outputs configuration like this: dbms.memory.heap.max_size=9000m
  47. # with a lot of comments. We strip the comments, then
  48. # process its output into a docker env var by following the Neo4j docker rules:
  49. # underscores doubled, dots -> _
  50. # So dbms.memory.heap.max_size=9000m => export NEO4J_dbms_memory_heap_max__size=9000m
  51. echo '' > /var/lib/neo4j/conf/memory-recommendations.sh
  52. for line in $( /var/lib/neo4j/bin/neo4j-admin memrec | grep -v '^Selecting\ JVM' | grep -v '^\#' ) ; do
  53. # print out the memory recommendation that is being applied
  54. echo "${line}"
  55. echo "export $( echo "${line}" | sed 's/_/__/g' | sed 's/\./_/g' | sed 's/^/NEO4J_/g' )" >> /var/lib/neo4j/conf/memory-recommendations.sh
  56. done
  57. . /var/lib/neo4j/conf/memory-recommendations.sh
  58. }
  59. {{- if .Values.dbms.memory.use_memrec }}
  60. neo4jAdminMemrec
  61. {{- else }}
  62. {{- if .Values.dbms.memory.heap.initial_size }}
  63. NEO4J_SETTINGS[NEO4J_dbms_memory_heap_initial__size]={{ .Values.dbms.memory.heap.initial_size }}
  64. {{- end }}
  65. {{- if .Values.dbms.memory.heap.max_size }}
  66. NEO4J_SETTINGS[NEO4J_dbms_memory_heap_max__size]={{ .Values.dbms.memory.heap.max_size }}
  67. {{- end }}
  68. {{- if .Values.dbms.memory.pagecache.size }}
  69. NEO4J_SETTINGS[NEO4J_dbms_memory_pagecache_size]={{ .Values.dbms.memory.pagecache.size }}
  70. {{- end }}
  71. {{- if .Values.dbms.memory.transaction.max_size }}
  72. NEO4J_SETTINGS[NEO4J_dbms_memory_transaction_max__size]={{ .Values.dbms.memory.transaction.max_size }}
  73. {{- end }}
  74. {{- if .Values.dbms.memory.transaction.global_max_size }}
  75. NEO4J_SETTINGS[NEO4J_dbms_memory_transaction_global__max__size]={{ .Values.dbms.memory.transaction.global_max_size }}
  76. {{- end }}
  77. {{- if .Values.dbms.memory.transaction.memory_allocation }}
  78. NEO4J_SETTINGS[NEO4J_dbms_tx__state_memory__allocation]={{ .Values.dbms.memory.transaction.memory_allocation }}
  79. {{- end }}
  80. {{- end }}
  81. echo "Configuration override prefix = $override_prefix"
  82. # Check to see if a particular env var has a host-specific override. If it does,
  83. # return the override. Otherwise return the default value.
  84. getSettingValue() {
  85. # Setting key: $1
  86. # Default value: $2
  87. # Return: modify $SETTING_VALUE
  88. export override_varname=$override_prefix"_"$1
  89. # echo "Checking for override $override_varname"
  90. if [ -z "${!override_varname}" ] ; then
  91. SETTING_VALUE=$2
  92. else
  93. SETTING_VALUE=${!override_varname}
  94. fi
  95. }
  96. # For each config item, set an env var to the appropriate
  97. # metadata value or default value. This sets us up for envsubst
  98. for setting in "${!NEO4J_SETTINGS[@]}" ; do
  99. # echo setting $setting
  100. # echo default
  101. getSettingValue $setting "${NEO4J_SETTINGS[$setting]}"
  102. # echo "Setting $setting to $SETTING_VALUE"
  103. # Set the variable named setting to the result.
  104. # See: https://stackoverflow.com/questions/9714902/how-to-use-a-variables-value-as-another-variables-name-in-bash
  105. export $setting="$SETTING_VALUE"
  106. done
  107. {{- if not .Values.core.standalone }}
  108. # This discovery mechanism only applies for clustered installs.
  109. # These settings are *not* overrideable, because they must match the addresses the
  110. # core members see to avoid akka rejections, and to facilitate basic cluster formation.
  111. # K8S discovery requires an LB service per pod, and a service account with permissions to query the discovery API
  112. export NEO4J_causal__clustering_discovery__type=K8S
  113. # See discovery-lb, this is the name of the port used to form.
  114. export NEO4J_causal__clustering_kubernetes_service__port__name="tcp-discovery"
  115. {{- end }}
  116. if [ "${AUTH_ENABLED:-}" == "true" ]; then
  117. export NEO4J_AUTH="neo4j/${NEO4J_SECRETS_PASSWORD}"
  118. else
  119. export NEO4J_AUTH="none"
  120. fi
  121. # Once passed through to auth, unset this so Neo4j doesn't misinterpret it as config.
  122. unset NEO4J_SECRETS_PASSWORD