Skip to content

Commit

Permalink
Merge pull request #3957 from vyos/mergify/bp/sagitta/pr-3916
Browse files Browse the repository at this point in the history
T6619: Remove the remaining uses of per-protocol FRR configs (backport #3916)
  • Loading branch information
c-po authored Aug 13, 2024
2 parents e1d5cb8 + b4b200c commit 8baa5b5
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 14 deletions.
9 changes: 0 additions & 9 deletions data/templates/frr/static_mcast.frr.j2
Original file line number Diff line number Diff line change
@@ -1,13 +1,4 @@
!
{% for route_gr in old_mroute %}
{% for nh in old_mroute[route_gr] %}
{% if old_mroute[route_gr][nh] %}
no ip mroute {{ route_gr }} {{ nh }} {{ old_mroute[route_gr][nh] }}
{% else %}
no ip mroute {{ route_gr }} {{ nh }}
{% endif %}
{% endfor %}
{% endfor %}
{% for route_gr in mroute %}
{% for nh in mroute[route_gr] %}
{% if mroute[route_gr][nh] %}
Expand Down
49 changes: 49 additions & 0 deletions smoketest/scripts/cli/test_protocols_static_multicast.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/usr/bin/env python3
#
# Copyright (C) 2024 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import unittest

from base_vyostest_shim import VyOSUnitTestSHIM


base_path = ['protocols', 'static', 'multicast']


class TestProtocolsStaticMulticast(VyOSUnitTestSHIM.TestCase):

def tearDown(self):
self.cli_delete(base_path)
self.cli_commit()

mroute = self.getFRRconfig('ip mroute', end='')
self.assertFalse(mroute)

def test_01_static_multicast(self):

self.cli_set(base_path + ['route', '224.202.0.0/24', 'next-hop', '224.203.0.1'])
self.cli_set(base_path + ['interface-route', '224.203.0.0/24', 'next-hop-interface', 'eth0'])

self.cli_commit()

# Verify FRR bgpd configuration
frrconfig = self.getFRRconfig('ip mroute', end='')

self.assertIn('ip mroute 224.202.0.0/24 224.203.0.1', frrconfig)
self.assertIn('ip mroute 224.203.0.0/24 eth0', frrconfig)


if __name__ == '__main__':
unittest.main(verbosity=2)
27 changes: 22 additions & 5 deletions src/conf_mode/protocols_static_multicast.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@
from sys import exit

from vyos import ConfigError
from vyos import frr
from vyos.config import Config
from vyos.utils.process import call
from vyos.template import render
from vyos.template import render, render_to_string

from vyos import airbag
airbag.enable()
Expand Down Expand Up @@ -92,23 +93,39 @@ def verify(mroute):
if IPv4Address(route[0]) < IPv4Address('224.0.0.0'):
raise ConfigError(route + " not a multicast network")


def generate(mroute):
if mroute is None:
return None

render(config_file, 'frr/static_mcast.frr.j2', mroute)
mroute['new_frr_config'] = render_to_string('frr/static_mcast.frr.j2', mroute)
return None


def apply(mroute):
if mroute is None:
return None
static_daemon = 'staticd'

frr_cfg = frr.FRRConfig()
frr_cfg.load_configuration(static_daemon)

if os.path.exists(config_file):
call(f'vtysh -d staticd -f {config_file}')
os.remove(config_file)
if 'old_mroute' in mroute:
for route_gr in mroute['old_mroute']:
for nh in mroute['old_mroute'][route_gr]:
if mroute['old_mroute'][route_gr][nh]:
frr_cfg.modify_section(f'^ip mroute {route_gr} {nh} {mroute["old_mroute"][route_gr][nh]}')
else:
frr_cfg.modify_section(f'^ip mroute {route_gr} {nh}')

if 'new_frr_config' in mroute:
frr_cfg.add_before(frr.default_add_before, mroute['new_frr_config'])

frr_cfg.commit_configuration(static_daemon)

return None


if __name__ == '__main__':
try:
c = get_config()
Expand Down

0 comments on commit 8baa5b5

Please sign in to comment.