diff options
| -rw-r--r-- | data/templates/high-availability/keepalived.conf.j2 | 34 | ||||
| -rw-r--r-- | interface-definitions/high-availability.xml.in | 2 | ||||
| -rw-r--r-- | interface-definitions/include/vrrp/garp.xml.i | 74 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_ha_vrrp.py | 41 | ||||
| -rwxr-xr-x | src/conf_mode/high-availability.py | 2 | 
5 files changed, 147 insertions, 6 deletions
| diff --git a/data/templates/high-availability/keepalived.conf.j2 b/data/templates/high-availability/keepalived.conf.j2 index 828636dc0..23abb66dc 100644 --- a/data/templates/high-availability/keepalived.conf.j2 +++ b/data/templates/high-availability/keepalived.conf.j2 @@ -8,6 +8,23 @@ global_defs {  {% if vrrp.global_parameters.startup_delay is vyos_defined %}      vrrp_startup_delay {{ vrrp.global_parameters.startup_delay }}  {% endif %} +{% if vrrp.global_parameters.garp is vyos_defined %} +{%     if vrrp.global_parameters.garp.interval is vyos_defined %} +    vrrp_garp_interval {{ vrrp.global_parameters.garp.interval }} +{%     endif %} +{%     if vrrp.global_parameters.garp.master_delay is vyos_defined %} +    vrrp_garp_master_delay {{ vrrp.global_parameters.garp.master_delay }} +{%     endif %} +{%     if vrrp.global_parameters.garp.master_refresh is vyos_defined %} +    vrrp_garp_master_refresh {{ vrrp.global_parameters.garp.master_refresh }} +{%     endif %} +{%     if vrrp.global_parameters.garp.master_refresh_repeat is vyos_defined %} +    vrrp_garp_master_refresh_repeat {{ vrrp.global_parameters.garp.master_refresh_repeat }} +{%     endif %} +{%     if vrrp.global_parameters.garp.master_repeat is vyos_defined %} +    vrrp_garp_master_repeat {{ vrrp.global_parameters.garp.master_repeat }} +{%     endif %} +{% endif %}      notify_fifo /run/keepalived/keepalived_notify_fifo      notify_fifo_script /usr/libexec/vyos/system/keepalived-fifo.py  } @@ -31,6 +48,23 @@ vrrp_instance {{ name }} {      virtual_router_id {{ group_config.vrid }}      priority {{ group_config.priority }}      advert_int {{ group_config.advertise_interval }} +{%         if group_config.garp is vyos_defined %} +{%             if group_config.garp.interval is vyos_defined %} +    garp_interval {{ group_config.garp.interval }} +{%             endif %} +{%             if group_config.garp.master_delay is vyos_defined %} +    garp_master_delay {{ group_config.garp.master_delay }} +{%             endif %} +{%             if group_config.garp.master_repeat is vyos_defined %} +    garp_master_repeat {{ group_config.garp.master_repeat }} +{%             endif %} +{%             if group_config.garp.master_refresh is vyos_defined %} +    garp_master_refresh {{ group_config.garp.master_refresh }} +{%             endif %} +{%             if group_config.garp.master_refresh_repeat is vyos_defined %} +    garp_master_refresh_repeat {{ group_config.garp.master_refresh_repeat }} +{%             endif %} +{%         endif %}  {%         if group_config.track.exclude_vrrp_interface is vyos_defined %}      dont_track_primary  {%         endif %} diff --git a/interface-definitions/high-availability.xml.in b/interface-definitions/high-availability.xml.in index 37cb90a8d..4bb3b1537 100644 --- a/interface-definitions/high-availability.xml.in +++ b/interface-definitions/high-availability.xml.in @@ -16,6 +16,7 @@                <help>VRRP global parameters</help>              </properties>              <children> +              #include <include/vrrp/garp.xml.i>                <leafNode name="startup-delay">                  <properties>                    <help>Time VRRP startup process (in seconds)</help> @@ -36,6 +37,7 @@              </properties>              <children>                #include <include/generic-interface-broadcast.xml.i> +              #include <include/vrrp/garp.xml.i>                <leafNode name="advertise-interval">                  <properties>                    <help>Advertise interval</help> diff --git a/interface-definitions/include/vrrp/garp.xml.i b/interface-definitions/include/vrrp/garp.xml.i new file mode 100644 index 000000000..b321c9591 --- /dev/null +++ b/interface-definitions/include/vrrp/garp.xml.i @@ -0,0 +1,74 @@ +<!-- include start from vrrp/garp.xml.i --> +<node name="garp"> +  <properties> +    <help>Gratuitous ARP parameters</help> +  </properties> +  <children> +    <leafNode name="master-delay"> +      <properties> +        <help>Delay for second set of gratuitous ARPs after transition to MASTER</help> +        <valueHelp> +          <format>u32:1-1000</format> +          <description>Delay for second set of gratuitous ARPs after transition to MASTER</description> +        </valueHelp> +        <constraint> +          <validator name="numeric" argument="--range 1-1000"/> +        </constraint> +      </properties> +      <defaultValue>5</defaultValue> +    </leafNode> +    <leafNode name="master-repeat"> +      <properties> +        <help>Number of gratuitous ARP messages to send at a time after transition to MASTER</help> +        <valueHelp> +          <format>u32:1-255</format> +          <description>Number of gratuitous ARP messages to send at a time after transition to MASTER</description> +        </valueHelp> +        <constraint> +          <validator name="numeric" argument="--range 1-255"/> +        </constraint> +      </properties> +      <defaultValue>5</defaultValue> +    </leafNode> +    <leafNode name="master-refresh"> +      <properties> +        <help>Minimum time interval for refreshing gratuitous ARPs while MASTER. 0 means no refresh</help> +        <valueHelp> +          <format>u32:1-255</format> +          <description>Minimum time interval for refreshing gratuitous ARPs while MASTER. 0 means no refresh</description> +        </valueHelp> +        <constraint> +          <validator name="numeric" argument="--range 1-255"/> +        </constraint> +      </properties> +      <defaultValue>5</defaultValue> +    </leafNode> +    <leafNode name="master-refresh-repeat"> +      <properties> +        <help>Number of gratuitous ARP messages to send at a time while MASTER</help> +        <valueHelp> +          <format>u32:1-255</format> +          <description>Number of gratuitous ARP messages to send at a time while MASTER</description> +        </valueHelp> +        <constraint> +          <validator name="numeric" argument="--range 1-255"/> +        </constraint> +      </properties> +      <defaultValue>1</defaultValue> +    </leafNode> +    <leafNode name="interval"> +      <properties> +        <help>Delay between gratuitous ARP messages sent on an interface</help> +        <valueHelp> +          <format><0.000-1000></format> +          <description>Delay between gratuitous ARP messages sent on an interface</description> +        </valueHelp> +        <constraint> +          <validator name="numeric" argument="--range 0.000-1000 --float"/> +        </constraint> +      </properties> +      <defaultValue>0</defaultValue> +    </leafNode> +  </children> +</node> +<!-- include end --> diff --git a/smoketest/scripts/cli/test_ha_vrrp.py b/smoketest/scripts/cli/test_ha_vrrp.py index f18a4ab86..3a4de2d8d 100755 --- a/smoketest/scripts/cli/test_ha_vrrp.py +++ b/smoketest/scripts/cli/test_ha_vrrp.py @@ -88,6 +88,14 @@ class TestVRRP(VyOSUnitTestSHIM.TestCase):          priority = '123'          preempt_delay = '400'          startup_delay = '120' +        garp_master_delay = '2' +        garp_master_repeat = '3' +        garp_master_refresh = '4' +        garp_master_refresh_repeat = '5' +        garp_interval = '1.5' +        group_garp_master_delay = '12' +        group_garp_master_repeat = '13' +        group_garp_master_refresh = '14'          for group in groups:              vlan_id = group.lstrip('VLAN') @@ -112,13 +120,32 @@ class TestVRRP(VyOSUnitTestSHIM.TestCase):              self.cli_set(group_base + ['authentication', 'type', 'plaintext-password'])              self.cli_set(group_base + ['authentication', 'password', f'{group}']) -            # Global parameters -            config = getConfig(f'global_defs') -            self.cli_set(global_param_base + ['startup-delay', f'{startup_delay}']) +            # GARP +            self.cli_set(group_base + ['garp', 'master-delay', group_garp_master_delay]) +            self.cli_set(group_base + ['garp', 'master-repeat', group_garp_master_repeat]) +            self.cli_set(group_base + ['garp', 'master-refresh', group_garp_master_refresh]) + +        # Global parameters +        #config = getConfig(f'global_defs') +        self.cli_set(global_param_base + ['startup-delay', f'{startup_delay}']) +        self.cli_set(global_param_base + ['garp', 'interval', f'{garp_interval}']) +        self.cli_set(global_param_base + ['garp', 'master-delay', f'{garp_master_delay}']) +        self.cli_set(global_param_base + ['garp', 'master-repeat', f'{garp_master_repeat}']) +        self.cli_set(global_param_base + ['garp', 'master-refresh', f'{garp_master_refresh}']) +        self.cli_set(global_param_base + ['garp', 'master-refresh-repeat', f'{garp_master_refresh_repeat}'])          # commit changes          self.cli_commit() +        # Check Global parameters +        config = getConfig(f'global_defs') +        self.assertIn(f'vrrp_startup_delay {startup_delay}', config) +        self.assertIn(f'vrrp_garp_interval {garp_interval}', config) +        self.assertIn(f'vrrp_garp_master_delay {garp_master_delay}', config) +        self.assertIn(f'vrrp_garp_master_repeat {garp_master_repeat}', config) +        self.assertIn(f'vrrp_garp_master_refresh {garp_master_refresh}', config) +        self.assertIn(f'vrrp_garp_master_refresh_repeat {garp_master_refresh_repeat}', config) +          for group in groups:              vlan_id = group.lstrip('VLAN')              vip = f'100.64.{vlan_id}.1/24' @@ -137,9 +164,11 @@ class TestVRRP(VyOSUnitTestSHIM.TestCase):              # Authentication              self.assertIn(f'auth_pass "{group}"', config)              self.assertIn(f'auth_type PASS', config) -            # Global parameters -            config = getConfig(f'global_defs') -            self.assertIn(f'vrrp_startup_delay {startup_delay}', config) + +            #GARP +            self.assertIn(f'garp_master_delay {group_garp_master_delay}', config) +            self.assertIn(f'garp_master_refresh {group_garp_master_refresh}', config) +            self.assertIn(f'garp_master_repeat {group_garp_master_repeat}', config)      def test_03_sync_group(self):          sync_group = 'VyOS' diff --git a/src/conf_mode/high-availability.py b/src/conf_mode/high-availability.py index 4ed16d0d7..bc3e67b40 100755 --- a/src/conf_mode/high-availability.py +++ b/src/conf_mode/high-availability.py @@ -51,6 +51,8 @@ def get_config(config=None):      if 'vrrp' in ha:          if 'group' in ha['vrrp']:              default_values_vrrp = defaults(base_vrrp + ['group']) +            if 'garp' in default_values_vrrp: +                del default_values_vrrp['garp']              for group in ha['vrrp']['group']:                  ha['vrrp']['group'][group] = dict_merge(default_values_vrrp, ha['vrrp']['group'][group]) | 
