CSIT-748 vnf-agent integration
[csit.git] / resources / libraries / python / InterfaceUtil.py
index 793f908..795bb52 100644 (file)
@@ -261,8 +261,14 @@ class InterfaceUtil(object):
          :rtype: list
         """
 
-        sw_if_index = Topology.convert_interface_reference(
-            node, interface, "sw_if_index")
+        try:
+            sw_if_index = Topology.convert_interface_reference(
+                node, interface, "sw_if_index")
+        except RuntimeError:
+            if isinstance(interface, basestring):
+                sw_if_index = InterfaceUtil.get_sw_if_index(node, interface)
+            else:
+                raise
 
         with VatTerminal(node) as vat:
             response = vat.vat_terminal_exec_cmd_from_template(
@@ -342,21 +348,35 @@ class InterfaceUtil(object):
         ssh = SSH()
         ssh.connect(node)
 
-        cmd = 'lspci -vmmks {0}'.format(pci_addr)
-
-        (ret_code, stdout, _) = ssh.exec_command(cmd)
-        if int(ret_code) != 0:
-            raise RuntimeError("'{0}' failed on '{1}'"
-                               .format(cmd, node['host']))
+        for i in range(3):
+            logger.trace('Try {}: Get interface driver'.format(i))
+            cmd = 'sh -c "echo 1 > /sys/bus/pci/rescan"'
+            (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+            if int(ret_code) != 0:
+                raise RuntimeError("'{0}' failed on '{1}'"
+                                   .format(cmd, node['host']))
 
-        for line in stdout.splitlines():
-            if len(line) == 0:
-                continue
-            (name, value) = line.split("\t", 1)
-            if name == 'Driver:':
-                return value
+            cmd = 'lspci -vmmks {0}'.format(pci_addr)
+            (ret_code, stdout, _) = ssh.exec_command(cmd)
+            if int(ret_code) != 0:
+                raise RuntimeError("'{0}' failed on '{1}'"
+                                   .format(cmd, node['host']))
 
-        return None
+            for line in stdout.splitlines():
+                if len(line) == 0:
+                    continue
+                try:
+                    (name, value) = line.split("\t", 1)
+                except ValueError:
+                    if name != "Driver:":
+                        pass
+                    else:
+                        return None
+                if name == 'Driver:':
+                    return value if value else None
+        else:
+            raise RuntimeError('Get interface driver for: {0}'
+                               .format(pci_addr))
 
     @staticmethod
     def tg_set_interfaces_udev_rules(node):
@@ -429,6 +449,47 @@ class InterfaceUtil(object):
         VatJsonUtil.update_vpp_interface_data_from_json(node,
                                                         interface_dump_json)
 
+    @staticmethod
+    def update_nic_interface_names(node):
+        """Update interface names based on nic type and PCI address.
+
+        This method updates interface names in the same format as VPP does.
+
+        :param node: Node dictionary.
+        :type node: dict
+        """
+        for ifc in node['interfaces'].values():
+            if_pci = ifc['pci_address'].replace('.', ':').split(':')
+            bus = '{:x}'.format(int(if_pci[1], 16))
+            dev = '{:x}'.format(int(if_pci[2], 16))
+            fun = '{:x}'.format(int(if_pci[3], 16))
+            loc = '{bus}/{dev}/{fun}'.format(bus=bus, dev=dev, fun=fun)
+            if ifc['model'] == 'Intel-XL710':
+                ifc['name'] = 'FortyGigabitEthernet{loc}'.format(loc=loc)
+            elif ifc['model'] == 'Intel-X710':
+                ifc['name'] = 'TenGigabitEthernet{loc}'.format(loc=loc)
+            elif ifc['model'] == 'Intel-X520-DA2':
+                ifc['name'] = 'TenGigabitEthernet{loc}'.format(loc=loc)
+            elif ifc['model'] == 'Cisco-VIC-1385':
+                ifc['name'] = 'FortyGigabitEthernet{loc}'.format(loc=loc)
+            elif ifc['model'] == 'Cisco-VIC-1227':
+                ifc['name'] = 'TenGigabitEthernet{loc}'.format(loc=loc)
+            else:
+                ifc['name'] = 'UnknownEthernet{loc}'.format(loc=loc)
+
+    @staticmethod
+    def update_nic_interface_names_on_all_duts(nodes):
+        """Update interface names based on nic type and PCI address on all DUTs.
+
+        This method updates interface names in the same format as VPP does.
+
+        :param nodes: Topology nodes.
+        :type nodes: dict
+        """
+        for node in nodes.values():
+            if node['type'] == NodeType.DUT:
+                InterfaceUtil.update_nic_interface_names(node)
+
     @staticmethod
     def update_tg_interface_data_on_node(node):
         """Update interface name for TG/linux node in DICT__nodes.