From c3039903aff9f2c3cb33f4fdd9e9634aa9f09997 Mon Sep 17 00:00:00 2001
From: sarthurdev <965089+sarthurdev@users.noreply.github.com>
Date: Thu, 9 Mar 2023 14:47:11 +0100
Subject: qos: T5018: Use configdep to fix interface mirror/redirect issue

This will check if mirror/redirect is present on a QoS interface and use `vyos.configdep` module to update the interface again after QoS is applied.
---
 src/conf_mode/qos.py | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

(limited to 'src')

diff --git a/src/conf_mode/qos.py b/src/conf_mode/qos.py
index dca713283..1be2c283f 100755
--- a/src/conf_mode/qos.py
+++ b/src/conf_mode/qos.py
@@ -21,7 +21,9 @@ from netifaces import interfaces
 
 from vyos.base import Warning
 from vyos.config import Config
+from vyos.configdep import set_dependents, call_dependents
 from vyos.configdict import dict_merge
+from vyos.ifconfig import Section
 from vyos.qos import CAKE
 from vyos.qos import DropTail
 from vyos.qos import FairQueue
@@ -83,6 +85,18 @@ def get_config(config=None):
                                get_first_key=True,
                                no_tag_node_value_mangle=True)
 
+    if 'interface' in qos:
+        for ifname, if_conf in qos['interface'].items():
+            if_node = Section.get_config_path(ifname)
+
+            if not if_node:
+                continue
+
+            path = f'interfaces {if_node}'
+            if conf.exists(f'{path} mirror') or conf.exists(f'{path} redirect'):
+                type_node = path.split(" ")[1] # return only interface type node
+                set_dependents(type_node, conf, ifname)
+
     if 'policy' in qos:
         for policy in qos['policy']:
             # when calling defaults() we need to use the real CLI node, thus we
@@ -245,6 +259,8 @@ def apply(qos):
             tmp = shaper_type(interface)
             tmp.update(shaper_config, direction)
 
+    call_dependents()
+
     return None
 
 if __name__ == '__main__':
-- 
cgit v1.2.3