From 6eba1a21df59cc1638a2047f24080ebe657b497e Mon Sep 17 00:00:00 2001 From: Dominic Cleal Date: Fri, 21 Feb 2014 10:56:57 +0000 Subject: [PATCH 2/3] Keepalived: add more virtual/real server settings and checks Fixes RHBZ#1064388 (cherry picked from commit 1f6ec69ffcd46a5b6937025973a2f2337df2727d) Conflicts: NEWS --- lenses/keepalived.aug | 81 +++++++++++++++++++++++-- lenses/tests/test_keepalived.aug | 128 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 6 deletions(-) diff --git a/lenses/keepalived.aug b/lenses/keepalived.aug index 1fe3aa2..9fd02ff 100644 --- a/lenses/keepalived.aug +++ b/lenses/keepalived.aug @@ -83,6 +83,10 @@ let field (kw:regexp) (sto:lens) = indent . Build.key_value_line_comment kw sep_ A single word *) let flag (kw:regexp) = [ indent . key kw . comment_or_eol ] +(* View: ip_port + An IP port pair *) +let ip_port = [ label "ip" . sto_word ] . sep_spc . [ label "port" . sto_num ] + (* View: lens_block A generic block with a title lens. The definition is very similar to Build.block_newlines @@ -220,22 +224,87 @@ let vrrpd_conf = vrrp_sync_group | vrrp_instance | vrrp_script (************************************************************************ - * Group: LVS CONFIGURATION + * Group: REAL SERVER CHECKS CONFIGURATION *************************************************************************) (* View: tcp_check_field *) -let tcp_check_field = field /connect_(timeout|port)/ sto_num +let tcp_check_field = + let word_re = "bindto" + in let num_re = /connect_(timeout|port)/ + in field word_re sto_word + | field num_re sto_num + +(* View: misc_check_field *) +let misc_check_field = + let flag_re = "misc_dynamic" + in let num_re = "misc_timeout" + in let to_eol_re = "misc_path" + in field num_re sto_num + | flag flag_re + | field to_eol_re sto_to_eol + +(* View: smtp_host_check_field *) +let smtp_host_check_field = + let word_re = "connect_ip" | "bindto" + in let num_re = "connect_port" + in field word_re sto_word + | field num_re sto_num + +(* View: smtp_check_field *) +let smtp_check_field = + let word_re = "connect_ip" | "bindto" + in let num_re = "connect_timeout" | "retry" | "delay_before_retry" + in let to_eol_re = "helo_name" + in field word_re sto_word + | field num_re sto_num + | field to_eol_re sto_to_eol + | block "host" smtp_host_check_field + +(* View: http_url_check_field *) +let http_url_check_field = + let word_re = "digest" + in let num_re = "status_code" + in let to_eol_re = "path" + in field word_re sto_word + | field num_re sto_num + | field to_eol_re sto_to_eol + +(* View: http_check_field *) +let http_check_field = + let num_re = /connect_(timeout|port)/ | "nb_get_retry" | "delay_before_retry" + in field num_re sto_num + | block "url" http_url_check_field (* View: real_server_field *) -let real_server_field = field "weight" sto_num - | block "TCP_CHECK" tcp_check_field +let real_server_field = + let num_re = "weight" + in let flag_re = "inhibit_on_failure" + in let to_eol_re = /notify_(up|down)/ + in field num_re sto_num + | flag flag_re + | field to_eol_re sto_to_eol + | block "TCP_CHECK" tcp_check_field + | block "MISC_CHECK" misc_check_field + | block "SMTP_CHECK" smtp_check_field + | block /(HTTP|SSL)_GET/ http_check_field + +(************************************************************************ + * Group: LVS CONFIGURATION + *************************************************************************) (* View: virtual_server_field *) let virtual_server_field = - let num_re = "delay_loop" - in let word_re = /lb_(algo|kind)/ | "nat_mask" | "protocol" + let num_re = "delay_loop" | "persistence_timeout" | "quorum" | "hysteresis" + in let word_re = /lb_(algo|kind)/ | "nat_mask" | "protocol" | "persistence_granularity" + | "virtualhost" + in let flag_re = "ops" | "ha_suspend" | "alpha" | "omega" + in let to_eol_re = /quorum_(up|down)/ + in let ip_port_re = "sorry_server" in field num_re sto_num | field word_re sto_word + | flag flag_re + | field to_eol_re sto_to_eol + | field ip_port_re ip_port | named_block_arg "real_server" "ip" "port" real_server_field (* View: virtual_server *) diff --git a/lenses/tests/test_keepalived.aug b/lenses/tests/test_keepalived.aug index 615509e..371df25 100644 --- a/lenses/tests/test_keepalived.aug +++ b/lenses/tests/test_keepalived.aug @@ -118,6 +118,8 @@ virtual_server 192.168.1.11 22 { protocol TCP + sorry_server 10.20.40.30 22 + ! there can be as many real_server blocks as you need real_server 10.20.40.10 22 { @@ -269,6 +271,10 @@ weight 2 # add 2 points of prio if OK { } { "protocol" = "TCP" } { } + { "sorry_server" + { "ip" = "10.20.40.30" } + { "port" = "22" } } + { } { "#comment" = "there can be as many real_server blocks as you need" } { } { "real_server" @@ -312,3 +318,125 @@ weight 2 # add 2 points of prio if OK { } { "#comment" = "that's all" } +(* Variable: tcp_check + An example of a TCP health checker *) +let tcp_check = "virtual_server 192.168.1.11 22 { + real_server 10.20.40.10 22 { + TCP_CHECK { + connect_timeout 3 + connect_port 22 + bindto 192.168.1.1 + } + } +} +" +test Keepalived.lns get tcp_check = + { "virtual_server" + { "ip" = "192.168.1.11" } + { "port" = "22" } + { "real_server" + { "ip" = "10.20.40.10" } + { "port" = "22" } + { "TCP_CHECK" + { "connect_timeout" = "3" } + { "connect_port" = "22" } + { "bindto" = "192.168.1.1" } } } } + +(* Variable: misc_check + An example of a MISC health checker *) +let misc_check = "virtual_server 192.168.1.11 22 { + real_server 10.20.40.10 22 { + MISC_CHECK { + misc_path /usr/local/bin/server_test + misc_timeout 3 + misc_dynamic + } + } +} +" +test Keepalived.lns get misc_check = + { "virtual_server" + { "ip" = "192.168.1.11" } + { "port" = "22" } + { "real_server" + { "ip" = "10.20.40.10" } + { "port" = "22" } + { "MISC_CHECK" + { "misc_path" = "/usr/local/bin/server_test" } + { "misc_timeout" = "3" } + { "misc_dynamic" } } } } + +(* Variable: smtp_check + An example of an SMTP health checker *) +let smtp_check = "virtual_server 192.168.1.11 22 { + real_server 10.20.40.10 22 { + SMTP_CHECK { + host { + connect_ip 10.20.40.11 + connect_port 587 + bindto 192.168.1.1 + } + connect_timeout 3 + retry 5 + delay_before_retry 10 + helo_name \"Testing Augeas\" + } + } +} +" +test Keepalived.lns get smtp_check = + { "virtual_server" + { "ip" = "192.168.1.11" } + { "port" = "22" } + { "real_server" + { "ip" = "10.20.40.10" } + { "port" = "22" } + { "SMTP_CHECK" + { "host" + { "connect_ip" = "10.20.40.11" } + { "connect_port" = "587" } + { "bindto" = "192.168.1.1" } } + { "connect_timeout" = "3" } + { "retry" = "5" } + { "delay_before_retry" = "10" } + { "helo_name" = "\"Testing Augeas\"" } } } } + +(* Variable: http_check + An example of an HTTP health checker *) +let http_check = "virtual_server 192.168.1.11 22 { + real_server 10.20.40.10 22 { + HTTP_GET { + url { + path /mrtg2/ + digest 9b3a0c85a887a256d6939da88aabd8cd + status_code 200 + } + connect_timeout 3 + connect_port 8080 + nb_get_retry 5 + delay_before_retry 10 + } + SSL_GET { + connect_port 8443 + } + } +} +" +test Keepalived.lns get http_check = + { "virtual_server" + { "ip" = "192.168.1.11" } + { "port" = "22" } + { "real_server" + { "ip" = "10.20.40.10" } + { "port" = "22" } + { "HTTP_GET" + { "url" + { "path" = "/mrtg2/" } + { "digest" = "9b3a0c85a887a256d6939da88aabd8cd" } + { "status_code" = "200" } } + { "connect_timeout" = "3" } + { "connect_port" = "8080" } + { "nb_get_retry" = "5" } + { "delay_before_retry" = "10" } } + { "SSL_GET" + { "connect_port" = "8443" } } } } -- 1.8.5.3