diff options
| author | Daniil Baturin <daniil@baturin.org> | 2023-05-10 02:42:38 +0100 | 
|---|---|---|
| committer | Daniil Baturin <daniil@baturin.org> | 2023-05-10 12:01:41 +0100 | 
| commit | 8dc6b0aa8d7bbecfc5087a7406725812779eaaf6 (patch) | |
| tree | 93669fb803f76099d02b42a2c4b82930194680ec | |
| parent | 9495ac100114b932569592ee5ea2d4c0bba0a2a3 (diff) | |
| download | vyos-1x-8dc6b0aa8d7bbecfc5087a7406725812779eaaf6.tar.gz vyos-1x-8dc6b0aa8d7bbecfc5087a7406725812779eaaf6.zip | |
vrrp: T5215: Add built-in ping check for VRRP groups
| -rw-r--r-- | data/templates/high-availability/keepalived.conf.j2 | 8 | ||||
| -rw-r--r-- | interface-definitions/high-availability.xml.in | 19 | ||||
| -rwxr-xr-x | src/conf_mode/high-availability.py | 7 | 
3 files changed, 31 insertions, 3 deletions
| diff --git a/data/templates/high-availability/keepalived.conf.j2 b/data/templates/high-availability/keepalived.conf.j2 index 6ea5f91d0..85b89c70c 100644 --- a/data/templates/high-availability/keepalived.conf.j2 +++ b/data/templates/high-availability/keepalived.conf.j2 @@ -32,9 +32,13 @@ global_defs {  {% if vrrp.group is vyos_defined %}  {%     for name, group_config in vrrp.group.items() if group_config.disable is not vyos_defined %} -{%         if group_config.health_check.script is vyos_defined %} +{%         if group_config.health_check is vyos_defined %}  vrrp_script healthcheck_{{ name }} { +{%             if group_config.health_check.script is vyos_defined %}      script "{{ group_config.health_check.script }}" +{%             elif group_config.health_check.ping is vyos_defined %} +    script "/usr/bin/ping -c1 {{ group_config.health_check.ping }}" +{%             endif %}      interval {{ group_config.health_check.interval }}      fall {{ group_config.health_check.failure_count }}      rise 1 @@ -121,7 +125,7 @@ vrrp_instance {{ name }} {  {%             endfor %}      }  {%         endif %} -{%         if group_config.health_check.script is vyos_defined %} +{%         if group_config.health_check is vyos_defined %}      track_script {          healthcheck_{{ name }}      } diff --git a/interface-definitions/high-availability.xml.in b/interface-definitions/high-availability.xml.in index 9b52fe82e..94253def3 100644 --- a/interface-definitions/high-availability.xml.in +++ b/interface-definitions/high-availability.xml.in @@ -96,7 +96,7 @@                #include <include/generic-disable-node.xml.i>                <node name="health-check">                  <properties> -                  <help>Health check script</help> +                  <help>Health check</help>                  </properties>                  <children>                    <leafNode name="failure-count"> @@ -117,6 +117,23 @@                      </properties>                      <defaultValue>60</defaultValue>                    </leafNode> +                  <leafNode name="ping"> +                    <properties> +                      <help>ICMP ping health check</help> +                      <valueHelp> +                        <format>ipv4</format> +                        <description>IPv4 ping target address</description> +                      </valueHelp> +                      <valueHelp> +                        <format>ipv6</format> +                        <description>IPv6 ping target address</description> +                      </valueHelp> +                      <constraint> +                        <validator name="ipv4-address"/> +                        <validator name="ipv6-address"/> +                      </constraint> +                    </properties> +                  </leafNode>                    <leafNode name="script">                      <properties>                        <help>Health check script file</help> diff --git a/src/conf_mode/high-availability.py b/src/conf_mode/high-availability.py index 5e76dd9f9..7a63f5b4b 100755 --- a/src/conf_mode/high-availability.py +++ b/src/conf_mode/high-availability.py @@ -106,6 +106,13 @@ def verify(ha):                  if not {'password', 'type'} <= set(group_config['authentication']):                      raise ConfigError(f'Authentication requires both type and passwortd to be set in VRRP group "{group}"') +            if 'health_check' in group_config: +                from vyos.utils.dict import check_mutually_exclusive_options +                try: +                    check_mutually_exclusive_options(group_config["health_check"], ["script", "ping"], required=True) +                except ValueError as e: +                    raise ConfigError(f'Health check config is incorrect in VRRP group "{group}": {e}') +              # Keepalived doesn't allow mixing IPv4 and IPv6 in one group, so we mirror that restriction              # We also need to make sure VRID is not used twice on the same interface with the              # same address family. | 
