From 9c46aa7bb5c45fa8ddfa48b65f00f92e99eb64dd Mon Sep 17 00:00:00 2001 From: aida-shumburo Date: Thu, 26 Sep 2024 16:17:50 -0400 Subject: [PATCH] Add new unreliable_los option (#453) * add new unreliable_los option * add changelog * remove print statement and extra spacing * update config for deleted option * current UT tests * get rid of not needed comment * add more UT tests * add list of choices and update regression tests for 'unreliable_los' * fix sanity check error * fix spelling of 'unreliable_los' choice * remove commented out line * update regression test --- ...dd-unreliable-los-option-to-interface.yaml | 2 + .../sonic/argspec/interfaces/interfaces.py | 6 +- .../sonic/config/interfaces/interfaces.py | 16 +- .../sonic/facts/interfaces/interfaces.py | 2 + plugins/modules/sonic_interfaces.py | 7 + .../roles/sonic_interfaces/defaults/main.yml | 9 + .../sonic/fixtures/sonic_interfaces.yaml | 179 +++++++++++++++++- .../network/sonic/test_sonic_interfaces.py | 28 +++ 8 files changed, 236 insertions(+), 13 deletions(-) create mode 100644 changelogs/fragments/453-add-unreliable-los-option-to-interface.yaml diff --git a/changelogs/fragments/453-add-unreliable-los-option-to-interface.yaml b/changelogs/fragments/453-add-unreliable-los-option-to-interface.yaml new file mode 100644 index 000000000..9a891bc90 --- /dev/null +++ b/changelogs/fragments/453-add-unreliable-los-option-to-interface.yaml @@ -0,0 +1,2 @@ +minor_changes: + - sonic_interfaces - add new unreliable-los option to interface resource module (https://github.com/ansible-collections/dellemc.enterprise_sonic/pull/453) \ No newline at end of file diff --git a/plugins/module_utils/network/sonic/argspec/interfaces/interfaces.py b/plugins/module_utils/network/sonic/argspec/interfaces/interfaces.py index 407dbde6b..29cefa1f9 100644 --- a/plugins/module_utils/network/sonic/argspec/interfaces/interfaces.py +++ b/plugins/module_utils/network/sonic/argspec/interfaces/interfaces.py @@ -65,7 +65,11 @@ def __init__(self, **kwargs): "FEC_FC", "FEC_DISABLED", "FEC_DEFAULT", - "FEC_AUTO"]} + "FEC_AUTO"]}, + "unreliable_los": {"type": "str", + "choices": ["UNRELIABLE_LOS_MODE_ON", + "UNRELIABLE_LOS_MODE_OFF", + "UNRELIABLE_LOS_MODE_AUTO"]} }, "type": "list" }, diff --git a/plugins/module_utils/network/sonic/config/interfaces/interfaces.py b/plugins/module_utils/network/sonic/config/interfaces/interfaces.py index 94168d04e..78f3a2486 100644 --- a/plugins/module_utils/network/sonic/config/interfaces/interfaces.py +++ b/plugins/module_utils/network/sonic/config/interfaces/interfaces.py @@ -79,7 +79,7 @@ port_num_regex = re.compile(r'[\d]{1,4}$') loopback_attribute = ('description', 'enabled') non_eth_attribute = ('description', 'mtu', 'enabled') -eth_attribute = ('description', 'mtu', 'enabled', 'auto_negotiate', 'speed', 'fec', 'advertised_speed') +eth_attribute = ('description', 'mtu', 'enabled', 'auto_negotiate', 'speed', 'fec', 'advertised_speed', 'unreliable_los') non_eth_attributes_default_value = { "description": '', @@ -92,7 +92,8 @@ "enabled": False, "auto_negotiate": False, "fec": 'FEC_DISABLED', - "advertised_speed": [] + "advertised_speed": [], + "unreliable_los": "UNRELIABLE_LOS_MODE_AUTO" } default_intf_speeds = {} port_group_interfaces = None @@ -426,7 +427,8 @@ def build_create_request(self, c_attr, h_attr, intf_name, attr): "speed": 'port-speed', "auto_negotiate": 'auto-negotiate', "fec": 'openconfig-if-ethernet-ext2:port-fec', - "advertised_speed": 'openconfig-if-ethernet-ext2:advertised-speed' + "advertised_speed": 'openconfig-if-ethernet-ext2:advertised-speed', + "unreliable_los": 'openconfig-if-ethernet-ext2:unreliable-los' } config_url = (url + eth_conf_url) % quote(intf_name, safe='') @@ -599,7 +601,8 @@ def build_delete_request(self, c_attr, h_attr, intf_name, attr): "speed": 'port-speed', "auto_negotiate": 'auto-negotiate', "fec": 'openconfig-if-ethernet-ext2:port-fec', - "advertised_speed": 'openconfig-if-ethernet-ext2:advertised-speed' + "advertised_speed": 'openconfig-if-ethernet-ext2:advertised-speed', + "unreliable_los": 'openconfig-if-ethernet-ext2:unreliable-los' } config_url = (url + eth_conf_url) % quote(intf_name, safe='') @@ -624,6 +627,11 @@ def build_delete_request(self, c_attr, h_attr, intf_name, attr): payload_attr = attributes_payload[attr] payload['openconfig-if-ethernet:config'][payload_attr] = 'FEC_DISABLED' return {"path": config_url, "method": PATCH, "data": payload} + + elif attr in ('unreliable_los'): + payload_attr = attributes_payload[attr] + payload['openconfig-if-ethernet:config'][payload_attr] = 'UNRELIABLE_LOS_MODE_AUTO' + return {"path": config_url, "method": PATCH, "data": payload} else: payload_attr = attributes_payload[attr] if attr == 'auto_negotiate': diff --git a/plugins/module_utils/network/sonic/facts/interfaces/interfaces.py b/plugins/module_utils/network/sonic/facts/interfaces/interfaces.py index 3c5cc7a43..afd4d4b10 100644 --- a/plugins/module_utils/network/sonic/facts/interfaces/interfaces.py +++ b/plugins/module_utils/network/sonic/facts/interfaces/interfaces.py @@ -149,6 +149,8 @@ def transform_config(self, conf): trans_cfg['advertised_speed'].sort() if 'openconfig-if-ethernet-ext2:port-fec' in eth_conf: trans_cfg['fec'] = eth_conf['openconfig-if-ethernet-ext2:port-fec'].split(':', 1)[-1] + if 'openconfig-if-ethernet-ext2:unreliable-los' in eth_conf: + trans_cfg['unreliable_los'] = eth_conf['openconfig-if-ethernet-ext2:unreliable-los'].split(':', 1)[-1] return trans_cfg diff --git a/plugins/modules/sonic_interfaces.py b/plugins/modules/sonic_interfaces.py index 6da0fe29f..981f7d78b 100644 --- a/plugins/modules/sonic_interfaces.py +++ b/plugins/modules/sonic_interfaces.py @@ -107,6 +107,13 @@ - FEC_DISABLED - FEC_DEFAULT - FEC_AUTO + unreliable_los: + description: Monitoring type to be used for generating a loss of service alarm. + type: str + choices: + - UNRELIABLE_LOS_MODE_ON + - UNRELIABLE_LOS_MODE_OFF + - UNRELIABLE_LOS_MODE_AUTO state: description: - The state the configuration should be left in. diff --git a/tests/regression/roles/sonic_interfaces/defaults/main.yml b/tests/regression/roles/sonic_interfaces/defaults/main.yml index c8d5f7d5a..96d94127c 100644 --- a/tests/regression/roles/sonic_interfaces/defaults/main.yml +++ b/tests/regression/roles/sonic_interfaces/defaults/main.yml @@ -33,6 +33,7 @@ tests: description: ansible Ethernet96 mtu: 6445 enabled: false + unreliable_los: UNRELIABLE_LOS_MODE_AUTO - name: test_case_02 description: Update interface parameters state: merged @@ -41,18 +42,22 @@ tests: description: ansible Ethernet96 mtu: 6444 enabled: true + unreliable_los: UNRELIABLE_LOS_MODE_OFF - name: "{{ interface8 }}" description: ansible Ethernet100 mtu: 6000 enabled: true + unreliable_los: UNRELIABLE_LOS_MODE_ON - name: "{{ interface10 }}" description: ansible Ethernet108 mtu: 5666 enabled: false + unreliable_los: UNRELIABLE_LOS_MODE_AUTO - name: "{{ interface9 }}" description: ansible Ethernet104 mtu: 5222 enabled: true + unreliable_los: UNRELIABLE_LOS_MODE_ON - name: test_case_03 description: Configure interface parameter speed state: merged @@ -74,6 +79,7 @@ tests: input: - name: "{{ interface8 }}" fec: FEC_AUTO + unreliable_los: UNRELIABLE_LOS_MODE_OFF - name: test_case_06 description: Delete interface parameters state: deleted @@ -82,9 +88,11 @@ tests: description: - name: "{{ interface8 }}" mtu: 6000 + unreliable_los: UNRELIABLE_LOS_MODE_OFF - name: "{{ interface10 }}" enabled: - name: "{{ interface9 }}" + unreliable_los: UNRELIABLE_LOS_MODE_ON - name: test_case_07 description: Update interface parameters state: merged @@ -186,6 +194,7 @@ tests: description: ansible Interface2 descr mtu: 7500 enabled: true + unreliable_los: UNRELIABLE_LOS_MODE_ON - name: test_case_18 description: Replace interface mtu parameters state: replaced diff --git a/tests/unit/modules/network/sonic/fixtures/sonic_interfaces.yaml b/tests/unit/modules/network/sonic/fixtures/sonic_interfaces.yaml index 40a5bbd17..0707651e8 100644 --- a/tests/unit/modules/network/sonic/fixtures/sonic_interfaces.yaml +++ b/tests/unit/modules/network/sonic/fixtures/sonic_interfaces.yaml @@ -9,6 +9,7 @@ merged_01: - name: Loopback1 description: "Test Desc for Loopback1" enabled: false + state: merged existing_interfaces_config: - path: "data/openconfig-interfaces:interfaces" response: @@ -36,7 +37,6 @@ merged_01: - state: member-if-end: "Eth1/4" member-if-start: "Eth1/1" - expected_config_requests: - path: "data/openconfig-interfaces:interfaces" method: "patch" @@ -71,6 +71,33 @@ merged_01: data: openconfig-interfaces:config: enabled: false + +merged_02: + module_args: + config: + - name: Eth1/15 + unreliable_los: UNRELIABLE_LOS_MODE_ON + state: merged + existing_interfaces_config: + - path: "data/openconfig-interfaces:interfaces" + response: + code: 200 + value: + openconfig-interfaces:interfaces: + interface: + - name: 'Eth1/15' + config: + mtu: 2000 + description: '' + enabled: true + expected_config_requests: + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/openconfig-if-ethernet:ethernet/config" + method: "patch" + data: + openconfig-if-ethernet:config: + openconfig-if-ethernet-ext2:unreliable-los: UNRELIABLE_LOS_MODE_ON + + deleted_01: module_args: state: deleted @@ -110,7 +137,6 @@ deleted_01: code: 200 value: sonic-port:valid_speeds: "100000, 40000" - expected_config_requests: - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F1/config/description" method: "delete" @@ -169,8 +195,6 @@ deleted_02: code: 200 value: sonic-port:valid_speeds: "100000, 40000" - - expected_config_requests: - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F1/openconfig-if-ethernet:ethernet/config" method: "patch" @@ -189,6 +213,35 @@ deleted_02: openconfig-if-ethernet-ext2:advertised-speed: '40000' - path: "data/openconfig-interfaces:interfaces/interface=Loopback123" method: "delete" + +deleted_03: + module_args: + state: deleted + config: + - name: 'Eth1/15' + unreliable_los: UNRELIABLE_LOS_MODE_ON + existing_interfaces_config: + - path: "data/openconfig-interfaces:interfaces" + response: + code: 200 + value: + openconfig-interfaces:interfaces: + interface: + - name: 'Eth1/15' + config: + mtu: 6767 + openconfig-if-ethernet:ethernet: + config: + port-speed: openconfig-if-ethernet:SPEED_40GB + openconfig-if-ethernet-ext2:unreliable-los: 'UNRELIABLE_LOS_MODE_ON' + expected_config_requests: + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/openconfig-if-ethernet:ethernet/config" + method: "patch" + data: + openconfig-if-ethernet:config: + openconfig-if-ethernet-ext2:unreliable-los: UNRELIABLE_LOS_MODE_AUTO + + replaced_01: module_args: state: replaced @@ -248,8 +301,6 @@ replaced_01: code: 200 value: sonic-port:valid_speeds: "100000, 40000" - - expected_config_requests: - path: "data/openconfig-interfaces:interfaces" method: "patch" @@ -282,6 +333,63 @@ replaced_01: openconfig-if-ethernet:config: port-speed: "openconfig-if-ethernet:SPEED_40GB" +replaced_02: + module_args: + state: replaced + config: + - name: 'Eth1/15' + mtu: 2000 + speed: "SPEED_40GB" + unreliable_los: UNRELIABLE_LOS_MODE_OFF + existing_interfaces_config: + - path: "data/openconfig-interfaces:interfaces" + response: + code: 200 + value: + openconfig-interfaces:interfaces: + interface: + - name: 'Eth1/15' + config: + mtu: 6767 + openconfig-if-ethernet:ethernet: + config: + port-speed: openconfig-if-ethernet:SPEED_25GB + openconfig-if-ethernet-ext2:unreliable-los: 'UNRELIABLE_LOS_MODE_ON' + - path: "data/openconfig-port-group:port-groups" + response: + code: 200 + value: + openconfig-port-group:port-groups: + port-group: + - state: + member-if-end: "Eth1/4" + member-if-start: "Eth1/3" + - path: "data/sonic-port:sonic-port/PORT/PORT_LIST=Eth1%2F15/valid_speeds" + response: + code: 200 + value: + sonic-port:valid_speeds: "100000, 40000" + expected_config_requests: + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/config" + method: "patch" + data: + openconfig-interfaces:config: + mtu: 2000 + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/config/enabled" + method: "patch" + data: + enabled: False + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/openconfig-if-ethernet:ethernet/config" + method: "patch" + data: + openconfig-if-ethernet:config: + port-speed: "openconfig-if-ethernet:SPEED_40GB" + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/openconfig-if-ethernet:ethernet/config" + method: "patch" + data: + openconfig-if-ethernet:config: + openconfig-if-ethernet-ext2:unreliable-los: UNRELIABLE_LOS_MODE_OFF + overridden_01: module_args: state: overridden @@ -338,8 +446,6 @@ overridden_01: code: 200 value: sonic-port:valid_speeds: "100000, 40000" - - expected_config_requests: - path: "data/openconfig-interfaces:interfaces/interface=Loopback1" method: "delete" @@ -381,3 +487,60 @@ overridden_01: data: openconfig-if-ethernet:config: auto-negotiate: false + +overridden_02: + module_args: + state: overridden + config: + - name: Eth1/15 + mtu: 1600 + speed: "SPEED_40GB" + unreliable_los: UNRELIABLE_LOS_MODE_OFF + existing_interfaces_config: + - path: "data/openconfig-interfaces:interfaces" + response: + code: 200 + value: + openconfig-interfaces:interfaces: + interface: + - name: 'Eth1/15' + config: + mtu: 2000 + openconfig-if-ethernet:ethernet: + config: + port-speed: openconfig-if-ethernet:SPEED_25GB + openconfig-if-ethernet-ext2:unreliable-los: 'UNRELIABLE_LOS_MODE_ON' + - path: "data/openconfig-port-group:port-groups" + response: + code: 200 + value: + openconfig-port-group:port-groups: + port-group: + - state: + member-if-end: "Eth1/4" + member-if-start: "Eth1/3" + - path: "data/sonic-port:sonic-port/PORT/PORT_LIST=Eth1%2F15/valid_speeds" + response: + code: 200 + value: + sonic-port:valid_speeds: "100000, 40000" + expected_config_requests: + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/config" + method: "patch" + data: + openconfig-interfaces:config: + mtu: 1600 + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/config/enabled" + method: "patch" + data: + enabled: False + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/openconfig-if-ethernet:ethernet/config" + method: "patch" + data: + openconfig-if-ethernet:config: + port-speed: "openconfig-if-ethernet:SPEED_40GB" + - path: "data/openconfig-interfaces:interfaces/interface=Eth1%2F15/openconfig-if-ethernet:ethernet/config" + method: "patch" + data: + openconfig-if-ethernet:config: + openconfig-if-ethernet-ext2:unreliable-los: "UNRELIABLE_LOS_MODE_OFF" \ No newline at end of file diff --git a/tests/unit/modules/network/sonic/test_sonic_interfaces.py b/tests/unit/modules/network/sonic/test_sonic_interfaces.py index fadc8d0de..ebe4d4998 100644 --- a/tests/unit/modules/network/sonic/test_sonic_interfaces.py +++ b/tests/unit/modules/network/sonic/test_sonic_interfaces.py @@ -61,6 +61,13 @@ def test_sonic_interfaces_merged_01(self): result = self.execute_module(changed=True) self.validate_config_requests() + def test_sonic_interfaces_merged_02(self): + set_module_args(self.fixture_data['merged_02']['module_args']) + self.initialize_facts_get_requests(self.fixture_data['merged_02']['existing_interfaces_config']) + self.initialize_config_requests(self.fixture_data['merged_02']['expected_config_requests']) + result = self.execute_module(changed=True) + self.validate_config_requests() + def test_sonic_interfaces_deleted_01(self): set_module_args(self.fixture_data['deleted_01']['module_args']) self.initialize_facts_get_requests(self.fixture_data['deleted_01']['existing_interfaces_config']) @@ -75,6 +82,13 @@ def test_sonic_interfaces_deleted_02(self): result = self.execute_module(changed=True) self.validate_config_requests() + def test_sonic_interfaces_deleted_03(self): + set_module_args(self.fixture_data['deleted_03']['module_args']) + self.initialize_facts_get_requests(self.fixture_data['deleted_03']['existing_interfaces_config']) + self.initialize_config_requests(self.fixture_data['deleted_03']['expected_config_requests']) + result = self.execute_module(changed=True) + self.validate_config_requests() + def test_sonic_interfaces_replaced_01(self): set_module_args(self.fixture_data['replaced_01']['module_args']) self.initialize_facts_get_requests(self.fixture_data['replaced_01']['existing_interfaces_config']) @@ -82,9 +96,23 @@ def test_sonic_interfaces_replaced_01(self): result = self.execute_module(changed=True) self.validate_config_requests() + def test_sonic_interfaces_replaced_02(self): + set_module_args(self.fixture_data['replaced_02']['module_args']) + self.initialize_facts_get_requests(self.fixture_data['replaced_02']['existing_interfaces_config']) + self.initialize_config_requests(self.fixture_data['replaced_02']['expected_config_requests']) + result = self.execute_module(changed=True) + self.validate_config_requests() + def test_sonic_interfaces_overridden_01(self): set_module_args(self.fixture_data['overridden_01']['module_args']) self.initialize_facts_get_requests(self.fixture_data['overridden_01']['existing_interfaces_config']) self.initialize_config_requests(self.fixture_data['overridden_01']['expected_config_requests']) result = self.execute_module(changed=True) self.validate_config_requests() + + def test_sonic_interfaces_overridden_02(self): + set_module_args(self.fixture_data['overridden_02']['module_args']) + self.initialize_facts_get_requests(self.fixture_data['overridden_02']['existing_interfaces_config']) + self.initialize_config_requests(self.fixture_data['overridden_02']['expected_config_requests']) + result = self.execute_module(changed=True) + self.validate_config_requests()