From 12a2d8c1ca7fab2321072cccda91760ae38fa957 Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Tue, 10 Sep 2019 04:06:21 +0000 Subject: [PATCH 1/5] Support sub port interface admin status change Signed-off-by: Wenda Ni --- config/main.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/config/main.py b/config/main.py index 177b49bc3b..8155b5cc98 100755 --- a/config/main.py +++ b/config/main.py @@ -19,6 +19,7 @@ SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen' SYSLOG_IDENTIFIER = "config" +VLAN_SUB_INTERFACE_SEPARATOR = '.' # ========================== Syslog wrappers ========================== @@ -73,16 +74,26 @@ def interface_alias_to_name(interface_alias): config_db.connect() port_dict = config_db.get_table('PORT') + vlan_id = -1 + sub_intf_sep_idx = -1 + if interface_alias is not None: + sub_intf_sep_idx = interface_alias.find(VLAN_SUB_INTERFACE_SEPARATOR) + if (sub_intf_sep_idx != -1): + vlan_id = interface_alias[sub_intf_sep_idx + 1:] + # interface_alias holds the parent port name so the subsequent logic still applies + interface_alias = interface_alias[:sub_intf_sep_idx] + if interface_alias is not None: if not port_dict: click.echo("port_dict is None!") raise click.Abort() for port_name in port_dict.keys(): if interface_alias == port_dict[port_name]['alias']: - return port_name + return port_name if sub_intf_sep_idx == -1 else port_name + VLAN_SUB_INTERFACE_SEPARATOR + vlan_id - # Interface alias not in port_dict, just return interface_alias - return interface_alias + # Interface alias not in port_dict, just return interface_alias, e.g., + # portchannel is passed in as argument, which does not have an alias + return interface_alias if sub_intf_sep_idx == -1 else interface_alias + VLAN_SUB_INTERFACE_SEPARATOR + vlan_id def interface_name_is_valid(interface_name): @@ -92,6 +103,7 @@ def interface_name_is_valid(interface_name): config_db.connect() port_dict = config_db.get_table('PORT') port_channel_dict = config_db.get_table('PORTCHANNEL') + sub_port_intf_dict = config_db.get_table('VLAN_SUB_INTERFACE') if get_interface_naming_mode() == "alias": interface_name = interface_alias_to_name(interface_name) @@ -107,6 +119,10 @@ def interface_name_is_valid(interface_name): for port_channel_name in port_channel_dict.keys(): if interface_name == port_channel_name: return True + if sub_port_intf_dict: + for sub_port_intf_name in sub_port_intf_dict.keys(): + if interface_name == sub_port_intf_name: + return True return False def interface_name_to_alias(interface_name): @@ -873,7 +889,10 @@ def startup(ctx, interface_name): ctx.fail("Interface name is invalid. Please enter a valid interface name!!") if interface_name.startswith("Ethernet"): - config_db.mod_entry("PORT", interface_name, {"admin_status": "up"}) + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.mod_entry("VLAN_SUB_INTERFACE", interface_name, {"admin_status": "up"}) + else: + config_db.mod_entry("PORT", interface_name, {"admin_status": "up"}) elif interface_name.startswith("PortChannel"): config_db.mod_entry("PORTCHANNEL", interface_name, {"admin_status": "up"}) # @@ -895,7 +914,10 @@ def shutdown(ctx, interface_name): ctx.fail("Interface name is invalid. Please enter a valid interface name!!") if interface_name.startswith("Ethernet"): - config_db.mod_entry("PORT", interface_name, {"admin_status": "down"}) + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.mod_entry("VLAN_SUB_INTERFACE", interface_name, {"admin_status": "down"}) + else: + config_db.mod_entry("PORT", interface_name, {"admin_status": "down"}) elif interface_name.startswith("PortChannel"): config_db.mod_entry("PORTCHANNEL", interface_name, {"admin_status": "down"}) From 9ac2264a6717789bbc1c2c24dc747b1483e921ad Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Thu, 12 Sep 2019 00:28:32 +0000 Subject: [PATCH 2/5] Initialize vlan_id as an empty string Signed-off-by: Wenda Ni --- config/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/main.py b/config/main.py index 84e895ba2f..67c5b6e43a 100755 --- a/config/main.py +++ b/config/main.py @@ -75,7 +75,7 @@ def interface_alias_to_name(interface_alias): config_db.connect() port_dict = config_db.get_table('PORT') - vlan_id = -1 + vlan_id = "" sub_intf_sep_idx = -1 if interface_alias is not None: sub_intf_sep_idx = interface_alias.find(VLAN_SUB_INTERFACE_SEPARATOR) From 0016753e70111f49ea94adfd6a6ef5810942fa4a Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Thu, 12 Sep 2019 04:54:35 +0000 Subject: [PATCH 3/5] Remove parentheses Signed-off-by: Wenda Ni --- config/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/main.py b/config/main.py index 67c5b6e43a..5387837e6c 100755 --- a/config/main.py +++ b/config/main.py @@ -79,7 +79,7 @@ def interface_alias_to_name(interface_alias): sub_intf_sep_idx = -1 if interface_alias is not None: sub_intf_sep_idx = interface_alias.find(VLAN_SUB_INTERFACE_SEPARATOR) - if (sub_intf_sep_idx != -1): + if sub_intf_sep_idx != -1: vlan_id = interface_alias[sub_intf_sep_idx + 1:] # interface_alias holds the parent port name so the subsequent logic still applies interface_alias = interface_alias[:sub_intf_sep_idx] From 20c8fe751f9c27c8c3b7bc1a46d1f2bfc77fb4a4 Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Tue, 17 Sep 2019 23:54:39 +0000 Subject: [PATCH 4/5] Take care of parent port being port channel Signed-off-by: Wenda Ni --- config/main.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/config/main.py b/config/main.py index 5387837e6c..e0b41cb78a 100755 --- a/config/main.py +++ b/config/main.py @@ -1045,7 +1045,10 @@ def startup(ctx, interface_name): else: config_db.mod_entry("PORT", interface_name, {"admin_status": "up"}) elif interface_name.startswith("PortChannel"): - config_db.mod_entry("PORTCHANNEL", interface_name, {"admin_status": "up"}) + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.mod_entry("VLAN_SUB_INTERFACE", interface_name, {"admin_status": "up"}) + else: + config_db.mod_entry("PORTCHANNEL", interface_name, {"admin_status": "up"}) # # 'shutdown' subcommand # @@ -1070,7 +1073,10 @@ def shutdown(ctx, interface_name): else: config_db.mod_entry("PORT", interface_name, {"admin_status": "down"}) elif interface_name.startswith("PortChannel"): - config_db.mod_entry("PORTCHANNEL", interface_name, {"admin_status": "down"}) + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.mod_entry("VLAN_SUB_INTERFACE", interface_name, {"admin_status": "down"}) + else: + config_db.mod_entry("PORTCHANNEL", interface_name, {"admin_status": "down"}) # # 'speed' subcommand From 30b9e4ee3c6c2ef47118f9c3214c0c7c5a5567cd Mon Sep 17 00:00:00 2001 From: Wenda Ni Date: Wed, 18 Sep 2019 01:27:56 +0000 Subject: [PATCH 5/5] Add sub port interface to `config interface ip add/del` Signed-off-by: Wenda Ni --- config/main.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/config/main.py b/config/main.py index 837d4accf0..6b8d1a7445 100755 --- a/config/main.py +++ b/config/main.py @@ -1122,11 +1122,19 @@ def add(ctx, interface_name, ip_addr): try: ipaddress.ip_network(unicode(ip_addr), strict=False) if interface_name.startswith("Ethernet"): - config_db.set_entry("INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) - config_db.set_entry("INTERFACE", interface_name, {"NULL": "NULL"}) + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.set_entry("VLAN_SUB_INTERFACE", interface_name, {"admin_status": "up"}) + config_db.set_entry("VLAN_SUB_INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) + else: + config_db.set_entry("INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) + config_db.set_entry("INTERFACE", interface_name, {"NULL": "NULL"}) elif interface_name.startswith("PortChannel"): - config_db.set_entry("PORTCHANNEL_INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) - config_db.set_entry("PORTCHANNEL_INTERFACE", interface_name, {"NULL": "NULL"}) + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.set_entry("VLAN_SUB_INTERFACE", interface_name, {"admin_status": "up"}) + config_db.set_entry("VLAN_SUB_INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) + else: + config_db.set_entry("PORTCHANNEL_INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) + config_db.set_entry("PORTCHANNEL_INTERFACE", interface_name, {"NULL": "NULL"}) elif interface_name.startswith("Vlan"): config_db.set_entry("VLAN_INTERFACE", (interface_name, ip_addr), {"NULL": "NULL"}) config_db.set_entry("VLAN_INTERFACE", interface_name, {"NULL": "NULL"}) @@ -1157,11 +1165,19 @@ def remove(ctx, interface_name, ip_addr): try: ipaddress.ip_network(unicode(ip_addr), strict=False) if interface_name.startswith("Ethernet"): - config_db.set_entry("INTERFACE", (interface_name, ip_addr), None) - if_table = "INTERFACE" + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.set_entry("VLAN_SUB_INTERFACE", (interface_name, ip_addr), None) + if_table = "VLAN_SUB_INTERFACE" + else: + config_db.set_entry("INTERFACE", (interface_name, ip_addr), None) + if_table = "INTERFACE" elif interface_name.startswith("PortChannel"): - config_db.set_entry("PORTCHANNEL_INTERFACE", (interface_name, ip_addr), None) - if_table = "PORTCHANNEL_INTERFACE" + if VLAN_SUB_INTERFACE_SEPARATOR in interface_name: + config_db.set_entry("VLAN_SUB_INTERFACE", (interface_name, ip_addr), None) + if_table = "VLAN_SUB_INTERFACE" + else: + config_db.set_entry("PORTCHANNEL_INTERFACE", (interface_name, ip_addr), None) + if_table = "PORTCHANNEL_INTERFACE" elif interface_name.startswith("Vlan"): config_db.set_entry("VLAN_INTERFACE", (interface_name, ip_addr), None) if_table = "VLAN_INTERFACE"