From 33e10ccc33e3b25dcdd3d4ee57bfdc4e2c331a6e Mon Sep 17 00:00:00 2001
From: Christian Poessinger <christian@poessinger.com>
Date: Sun, 31 Jan 2021 10:16:30 +0100
Subject: smoketest: vrf: verify interfaces can be bound/unbound

---
 smoketest/scripts/cli/test_vrf.py | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/smoketest/scripts/cli/test_vrf.py b/smoketest/scripts/cli/test_vrf.py
index 5270e758a..749863476 100755
--- a/smoketest/scripts/cli/test_vrf.py
+++ b/smoketest/scripts/cli/test_vrf.py
@@ -21,14 +21,29 @@ from netifaces import interfaces
 
 from vyos.configsession import ConfigSession
 from vyos.configsession import ConfigSessionError
+from vyos.ifconfig import Interface
+from vyos.ifconfig import Section
 from vyos.util import read_file
 from vyos.validate import is_intf_addr_assigned
-from vyos.ifconfig import Interface
 
 base_path = ['vrf']
 vrfs = ['red', 'green', 'blue', 'foo-bar', 'baz_foo']
 
 class VRFTest(unittest.TestCase):
+    _interfaces = []
+
+    @classmethod
+    def setUpClass(cls):
+        # we need to filter out VLAN interfaces identified by a dot (.)
+        # in their name - just in case!
+        if 'TEST_ETH' in os.environ:
+            tmp = os.environ['TEST_ETH'].split()
+            cls._interfaces = tmp
+        else:
+            for tmp in Section.interfaces('ethernet'):
+                if not '.' in tmp:
+                    cls._interfaces.append(tmp)
+
     def setUp(self):
         self.session = ConfigSession(os.getpid())
 
@@ -120,5 +135,26 @@ class VRFTest(unittest.TestCase):
         with self.assertRaises(ConfigSessionError):
             self.session.commit()
 
+    def test_vrf_assign_interface(self):
+        vrf = vrfs[0]
+        table = '5000'
+        self.session.set(['vrf', 'name', vrf, 'table', table])
+
+        for interface in self._interfaces:
+            section = Section.section(interface)
+            self.session.set(['interfaces', section, interface, 'vrf', vrf])
+
+        # commit changes
+        self.session.commit()
+
+        # Verify & cleanup
+        for interface in self._interfaces:
+            # os.readlink resolves to: '../../../../../virtual/net/foovrf'
+            tmp = os.readlink(f'/sys/class/net/{interface}/master').split('/')[-1]
+            self.assertEqual(tmp, vrf)
+            # cleanup
+            section = Section.section(interface)
+            self.session.delete(['interfaces', section, interface, 'vrf'])
+
 if __name__ == '__main__':
     unittest.main(verbosity=2, failfast=True)
-- 
cgit v1.2.3