Loadbalancer: Add support for Redis
authorYanis Guenane <yanis.guenane@enovance.com>
Tue, 7 Apr 2015 10:42:35 +0000 (12:42 +0200)
committerYanis Guenane <yanis.guenane@enovance.com>
Thu, 16 Apr 2015 19:13:40 +0000 (21:13 +0200)
Add support for Redis in the loadbalancer setup.
Redis loadbalancing system is particular as it does not provide
clustering capabilities yet, hence this pattern[1] will be applied.

[1] https://github.com/falsecz/haredis

Change-Id: I80a6c284af9eceb6b669a03c5d93256261523331

manifests/loadbalancer.pp
manifests/redis_notification.pp [new file with mode: 0644]
templates/redis/redis-notifications.sh.erb [new file with mode: 0644]

index 1d60507..cb54682 100644 (file)
 #  (optional) Enable or not RabbitMQ binding
 #  Defaults to false
 #
+# [*redis*]
+#  (optional) Enable or not Redis binding
+#  Defaults to false
+#
 class tripleo::loadbalancer (
   $controller_virtual_ip,
   $control_virtual_interface,
@@ -157,6 +161,7 @@ class tripleo::loadbalancer (
   $horizon                   = false,
   $mysql                     = false,
   $rabbitmq                  = false,
+  $redis                     = false,
 ) {
 
   if !$controller_host and !$controller_hosts {
@@ -572,4 +577,26 @@ class tripleo::loadbalancer (
     }
   }
 
+  if $redis {
+    haproxy::listen { 'redis':
+      ipaddress        => [$controller_virtual_ip],
+      ports            => 6379,
+      options          => {
+        'timeout'   => [ 'client 0', 'server 0' ],
+        'mode'      => 'tcp',
+        'balance'   => 'first',
+        'option'    => ['tcp-check',],
+        'tcp-check' => ['send info\ replication\r\n','expect string role:master'],
+      },
+      collect_exported => false,
+    }
+    haproxy::balancermember { 'redis':
+      listening_service => 'redis',
+      ports             => '6379',
+      ipaddresses       => $controller_hosts_real,
+      server_names      => $controller_hosts_names_real,
+      options           => ['check', 'inter 2000', 'rise 2', 'fall 5'],
+    }
+  }
+
 }
diff --git a/manifests/redis_notification.pp b/manifests/redis_notification.pp
new file mode 100644 (file)
index 0000000..ad059a0
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright 2015 Red Hat, Inc.
+# All Rights Reserved.
+#
+# 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.
+#
+# == Class: tripleo::redis_notification
+#
+# Configure the Redis notification script that talks to HAProxy
+#
+# === Parameters:
+#
+# [*haproxy_monitor_ip*]
+#  (String) IP address on which HAProxy is listening on
+#  Defaults to 127.0.0.1
+#
+class tripleo::redis_notification (
+  $haproxy_monitor_ip = '127.0.0.1',
+) {
+
+  file { '/usr/local/bin/redis-notifications.sh' :
+    ensure  => file,
+    content => template('tripleo/redis/redis-notifications.sh.erb'),
+    owner   => 'root',
+    group   => 'root',
+    mode    => '0755',
+  }
+
+}
diff --git a/templates/redis/redis-notifications.sh.erb b/templates/redis/redis-notifications.sh.erb
new file mode 100644 (file)
index 0000000..aa368e9
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/bash
+HAPROXY="<%= @haproxy_monitor_ip %>:1993"
+CMD="$1"
+ARGS="$2"
+ARG1=`echo $ARGS | awk '{print $1}'`
+
+
+call_curl () {
+       DATA=`echo "s=$1&action=$2&b=%234" | sed -e s/:/%3A/`
+       curl --silent -o /dev/null $HAPROXY --data "$DATA"
+       echo curl $HAPROXY --data "$DATA"
+       return 0
+}
+
+
+[ "$CMD" = "+odown" ] && [ "$ARG1" = "master" ] && \
+       call_curl `echo $ARGS | awk '{print $2 ":" $3 ":" $4}'` 'disable'
+
+[ "$CMD" = "+sdown" ] && [ "$ARG1" = "slave" ] && \
+       call_curl `echo $ARGS | awk '{print $6 ":" $3 ":" $4}'` 'disable'
+
+[ "$CMD" = "+switch-master" ] && \
+       call_curl `echo $ARGS | awk '{print $1 ":" $4 ":" $5}'` 'enable' &&
+       call_curl `echo $ARGS | awk '{print $1 ":" $2 ":" $3}'` 'disable'
+
+[ "$CMD" = "-odown" ] && [ "$ARG1" = "master" ] && \
+       call_curl `echo $ARGS | awk '{print $2 ":" $3 ":" $4}'` 'enable'
+
+# without exit code, sentinel thinks the script is still running and locks any further execution
+exit 0