Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vrrp: T1972: Ability to set IP address on not vrrp interface #1143

Merged
merged 1 commit into from Jan 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 13 additions & 3 deletions data/templates/high-availability/keepalived.conf.tmpl
Expand Up @@ -28,6 +28,9 @@ vrrp_instance {{ name }} {
virtual_router_id {{ group_config.vrid }}
priority {{ group_config.priority }}
advert_int {{ group_config.advertise_interval }}
{% if group_config.track is defined and group_config.track.exclude_vrrp_interface is defined %}
dont_track_primary
{% endif %}
{% if group_config.no_preempt is not defined and group_config.preempt_delay is defined and group_config.preempt_delay is not none %}
preempt_delay {{ group_config.preempt_delay }}
{% elif group_config.no_preempt is defined %}
Expand Down Expand Up @@ -61,8 +64,8 @@ vrrp_instance {{ name }} {
{% endif %}
{% if group_config.address is defined and group_config.address is not none %}
virtual_ipaddress {
{% for addr in group_config.address %}
{{ addr }}
{% for addr, addr_config in group_config.address.items() %}
{{ addr }}{{ ' dev ' + addr_config.interface if addr_config.interface is defined }}
{% endfor %}
}
{% endif %}
Expand All @@ -73,6 +76,13 @@ vrrp_instance {{ name }} {
{% endfor %}
}
{% endif %}
{% if group_config.track is defined and group_config.track.interface is defined and group_config.track.interface is not none %}
track_interface {
{% for interface in group_config.track.interface %}
{{ interface }}
{% endfor %}
}
{% endif %}
{% if group_config.health_check is defined and group_config.health_check.script is defined and group_config.health_check.script is not none %}
track_script {
healthcheck_{{ name }}
Expand Down Expand Up @@ -113,8 +123,8 @@ vrrp_sync_group {{ name }} {
{% endfor %}
{% endif %}

# Virtual-server configuration
{% if virtual_server is defined and virtual_server is not none %}
# Virtual-server configuration
{% for vserver, vserver_config in virtual_server.items() %}
virtual_server {{ vserver }} {{ vserver_config.port }} {
delay_loop {{ vserver_config.delay_loop }}
Expand Down
37 changes: 34 additions & 3 deletions interface-definitions/high-availability.xml.in
Expand Up @@ -177,8 +177,37 @@
<valueless/>
</properties>
</leafNode>
<node name="track">
<properties>
<help>Track settings</help>
</properties>
<children>
<leafNode name="exclude-vrrp-interface">
<properties>
<valueless/>
<help>Disable track state of main interface</help>
</properties>
</leafNode>
<leafNode name="interface">
<properties>
<help>Interface name state check</help>
<completionHelp>
<script>${vyos_completion_dir}/list_interfaces.py --broadcast</script>
</completionHelp>
<valueHelp>
<format>txt</format>
<description>Interface name</description>
</valueHelp>
<constraint>
<validator name="interface-name"/>
</constraint>
<multi/>
</properties>
</leafNode>
</children>
</node>
#include <include/vrrp-transition-script.xml.i>
<leafNode name="address">
<tagNode name="address">
<properties>
<help>Virtual IP address</help>
<valueHelp>
Expand All @@ -193,9 +222,11 @@
<validator name="ipv4-host"/>
<validator name="ipv6-host"/>
</constraint>
<multi/>
</properties>
</leafNode>
<children>
#include <include/generic-interface-broadcast.xml.i>
</children>
</tagNode>
<leafNode name="excluded-address">
<properties>
<help>Virtual address (If you need additional IPv4 and IPv6 in same group)</help>
Expand Down
30 changes: 30 additions & 0 deletions smoketest/scripts/cli/test_ha_vrrp.py
Expand Up @@ -166,5 +166,35 @@ def test_03_sync_group(self):
for group in groups:
self.assertIn(f'{group}', config)

def test_04_exclude_vrrp_interface(self):
group = 'VyOS-WAN'
none_vrrp_interface = 'eth2'
vlan_id = '24'
vip = '100.64.24.1/24'
vip_dev = '192.0.2.2/24'
vrid = '150'
group_base = base_path + ['vrrp', 'group', group]

self.cli_set(['interfaces', 'ethernet', vrrp_interface, 'vif', vlan_id, 'address', '100.64.24.11/24'])
self.cli_set(group_base + ['interface', f'{vrrp_interface}.{vlan_id}'])
self.cli_set(group_base + ['address', vip])
self.cli_set(group_base + ['address', vip_dev, 'interface', none_vrrp_interface])
self.cli_set(group_base + ['track', 'exclude-vrrp-interface'])
self.cli_set(group_base + ['track', 'interface', none_vrrp_interface])
self.cli_set(group_base + ['vrid', vrid])

# commit changes
self.cli_commit()

config = getConfig(f'vrrp_instance {group}')

self.assertIn(f'interface {vrrp_interface}.{vlan_id}', config)
self.assertIn(f'virtual_router_id {vrid}', config)
self.assertIn(f'dont_track_primary', config)
self.assertIn(f' {vip}', config)
self.assertIn(f' {vip_dev} dev {none_vrrp_interface}', config)
self.assertIn(f'track_interface', config)
self.assertIn(f' {none_vrrp_interface}', config)

if __name__ == '__main__':
unittest.main(verbosity=2)