| ################################################################################ |
| # Copyright (c) 2020 AT&T Intellectual Property. # |
| # Copyright (c) 2020 Nokia. # |
| # # |
| # Licensed 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. # |
| ################################################################################ |
| |
| apiVersion: v1 |
| kind: ConfigMap |
| metadata: |
| name: {{ template "common.configmapname.dbaas" . }}-config |
| labels: |
| heritage: {{ .Release.Service }} |
| release: {{ .Release.Name }} |
| chart: {{ .Chart.Name }}-{{ .Chart.Version }} |
| app: {{ include "common.namespace.platform" . }}-{{ include "common.name.dbaas" . }} |
| data: |
| redis.conf: | |
| dir "/data" |
| {{- if $.Values.dbaas.enableHighAvailability }} |
| {{- range $key, $value := .Values.dbaas.redis.ha_config }} |
| {{ $key }} {{ $value }} |
| {{- end }} |
| {{- else }} |
| {{- range $key, $value := .Values.dbaas.redis.sa_config }} |
| {{ $key }} {{ $value }} |
| {{- end }} |
| {{- end }} |
| |
| {{- if $.Values.dbaas.enableHighAvailability }} |
| sentinel.conf: | |
| dir "/data" |
| {{- $root := . -}} |
| {{- range $key, $value := .Values.dbaas.sentinel.config }} |
| sentinel {{ $key }} {{ $root.Values.dbaas.redis.masterGroupName }} {{ $value }} |
| {{- end }} |
| protected-mode {{ index .Values.dbaas.sentinel "protected-mode" }} |
| |
| init.sh: | |
| HOSTNAME="$(hostname)" |
| INDEX="${HOSTNAME##*-}" |
| MASTER="$(redis-cli -h {{ template "common.servicename.dbaas.tcp" . }}.{{ include "common.namespace.platform" . }} -p {{ include "common.serviceport.dbaas.sentinel" . }} sentinel get-master-addr-by-name {{ .Values.dbaas.redis.masterGroupName }} | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" |
| MASTER_GROUP="{{ .Values.dbaas.redis.masterGroupName }}" |
| QUORUM="{{ .Values.dbaas.sentinel.quorum }}" |
| REDIS_CONF=/data/conf/redis.conf |
| REDIS_PORT={{ include "common.serviceport.dbaas.redis" . }} |
| SENTINEL_CONF=/data/conf/sentinel.conf |
| SENTINEL_PORT={{ include "common.serviceport.dbaas.sentinel" . }} |
| SERVICE={{ include "common.servicename.dbaas.tcp" . }} |
| set -eu |
| |
| sentinel_update() { |
| echo "Updating sentinel config" |
| sed -i "1s/^/$(cat sentinel-id)\\n/" "$SENTINEL_CONF" |
| sed -i "2s/^/sentinel monitor $MASTER_GROUP $1 $REDIS_PORT $QUORUM \\n/" "$SENTINEL_CONF" |
| echo "sentinel announce-ip $ANNOUNCE_IP" >> $SENTINEL_CONF |
| echo "sentinel announce-port $SENTINEL_PORT" >> $SENTINEL_CONF |
| } |
| |
| redis_update() { |
| echo "Updating redis config" |
| echo "slaveof $1 $REDIS_PORT" >> "$REDIS_CONF" |
| echo "slave-announce-ip $ANNOUNCE_IP" >> $REDIS_CONF |
| echo "slave-announce-port $REDIS_PORT" >> $REDIS_CONF |
| } |
| |
| redis_master_update() { |
| echo "Updating redis default master config" |
| echo "slave-announce-ip $ANNOUNCE_IP" >> $REDIS_CONF |
| echo "slave-announce-port $REDIS_PORT" >> $REDIS_CONF |
| } |
| |
| copy_config() { |
| if [ -f "$SENTINEL_CONF" ]; then |
| grep "sentinel myid" "$SENTINEL_CONF" > sentinel-id || true |
| fi |
| cp /readonly-config/redis.conf "$REDIS_CONF" |
| cp /readonly-config/sentinel.conf "$SENTINEL_CONF" |
| } |
| |
| setup_defaults() { |
| echo "Setting up defaults" |
| if [ "$INDEX" = "0" ]; then |
| echo "Setting this pod as the default master" |
| sed -i "s/^.*slaveof.*//" "$REDIS_CONF" |
| redis_master_update |
| sentinel_update "$ANNOUNCE_IP" |
| else |
| DEFAULT_MASTER="$(getent hosts "{{ include "common.statefulsetname.dbaas" . }}-server-0.$SERVICE" | awk '{ print $1 }')" |
| if [ -z "$DEFAULT_MASTER" ]; then |
| echo "Unable to resolve host" |
| exit 1 |
| fi |
| echo "Setting default slave config.." |
| redis_update "$DEFAULT_MASTER" |
| sentinel_update "$DEFAULT_MASTER" |
| fi |
| } |
| |
| find_master() { |
| echo "Attempting to find master" |
| if [ "$(redis-cli -h "$MASTER"{{ if .Values.auth }} -a "$AUTH"{{ end }} ping)" != "PONG" ]; then |
| echo "Can't ping master, attempting to force failover" |
| if redis-cli -h "$SERVICE" -p "$SENTINEL_PORT" sentinel failover "$MASTER_GROUP" | grep -q 'NOGOODSLAVE' ; then |
| setup_defaults |
| return 0 |
| fi |
| sleep 10 |
| MASTER="$(redis-cli -h $SERVICE -p $SENTINEL_PORT sentinel get-master-addr-by-name $MASTER_GROUP | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" |
| if [ "$MASTER" ]; then |
| sentinel_update "$MASTER" |
| redis_update "$MASTER" |
| else |
| echo "Could not failover, exiting..." |
| exit 1 |
| fi |
| else |
| echo "Found reachable master, updating config" |
| sentinel_update "$MASTER" |
| redis_update "$MASTER" |
| fi |
| } |
| |
| mkdir -p /data/conf/ |
| |
| echo "Initializing config.." |
| copy_config |
| |
| # ANNOUNCE_IP=$(getent hosts "{{ include "common.statefulsetname.dbaas" . }}-server-$INDEX.$SERVICE" | awk '{ print $1 }') |
| if [ -z "$ANNOUNCE_IP" ]; then |
| "Could not resolve the announce ip for this pod" |
| exit 1 |
| elif [ "$MASTER" ]; then |
| find_master |
| else |
| setup_defaults |
| fi |
| |
| if [ "${AUTH:-}" ]; then |
| echo "Setting auth values" |
| sed -i "s/replace-default-auth/$AUTH/" "$REDIS_CONF" "$SENTINEL_CONF" |
| fi |
| |
| echo "Ready..." |
| |
| {{- end }} |