diff --git a/config/main.py b/config/main.py index 9fbb425e22..6b8d1a7445 100755 --- a/config/main.py +++ b/config/main.py @@ -20,6 +20,7 @@ SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen' SYSLOG_IDENTIFIER = "config" +VLAN_SUB_INTERFACE_SEPARATOR = '.' # ========================== Syslog wrappers ========================== @@ -74,16 +75,26 @@ def interface_alias_to_name(interface_alias): config_db.connect() port_dict = config_db.get_table('PORT') + vlan_id = "" + 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): @@ -93,6 +104,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) @@ -108,6 +120,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): @@ -1018,9 +1034,15 @@ 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"}) + 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 # @@ -1040,9 +1062,15 @@ 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"}) + 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 @@ -1094,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"}) @@ -1129,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"