Merge "Adding scale up feature to prox ACL SRIOV OvS-DPDK."
[yardstick.git] / yardstick / common / utils.py
index 6c5389c..9eba896 100644 (file)
@@ -21,6 +21,7 @@ import importlib
 import ipaddress
 import logging
 import os
+import pydoc
 import random
 import re
 import signal
@@ -29,6 +30,7 @@ import subprocess
 import sys
 import time
 import threading
+import math
 
 import six
 from flask import jsonify
@@ -194,20 +196,16 @@ def parse_ini_file(path):
 
 def get_port_mac(sshclient, port):
     cmd = "ifconfig |grep HWaddr |grep %s |awk '{print $5}' " % port
-    status, stdout, stderr = sshclient.execute(cmd)
+    _, stdout, _ = sshclient.execute(cmd, raise_on_error=True)
 
-    if status:
-        raise RuntimeError(stderr)
     return stdout.rstrip()
 
 
 def get_port_ip(sshclient, port):
     cmd = "ifconfig %s |grep 'inet addr' |awk '{print $2}' " \
         "|cut -d ':' -f2 " % port
-    status, stdout, stderr = sshclient.execute(cmd)
+    _, stdout, _ = sshclient.execute(cmd, raise_on_error=True)
 
-    if status:
-        raise RuntimeError(stderr)
     return stdout.rstrip()
 
 
@@ -291,6 +289,21 @@ def mac_address_to_hex_list(mac):
     return octets
 
 
+def make_ipv4_address(ip_addr):
+    return ipaddress.IPv4Address(six.text_type(ip_addr))
+
+
+def get_ip_range_count(iprange):
+    start_range, end_range = iprange.split("-")
+    start = int(make_ipv4_address(start_range))
+    end = int(make_ipv4_address(end_range))
+    return end - start
+
+
+def get_ip_range_start(iprange):
+    return str(make_ipv4_address(iprange.split("-")[0]))
+
+
 def safe_ip_address(ip_addr):
     """ get ip address version v6 or v4 """
     try:
@@ -498,6 +511,23 @@ def read_meminfo(ssh_client):
     return output
 
 
+def setup_hugepages(ssh_client, size_kb):
+    """Setup needed number of hugepages for the size specified"""
+
+    NR_HUGEPAGES_PATH = '/proc/sys/vm/nr_hugepages'
+    meminfo = read_meminfo(ssh_client)
+    hp_size_kb = int(meminfo['Hugepagesize'])
+    hp_number = int(math.ceil(size_kb / float(hp_size_kb)))
+    ssh_client.execute(
+        'echo %s | sudo tee %s' % (hp_number, NR_HUGEPAGES_PATH))
+    hp = six.BytesIO()
+    ssh_client.get_file_obj(NR_HUGEPAGES_PATH, hp)
+    hp_number_set = int(hp.getvalue().decode('utf-8').splitlines()[0])
+    logger.info('Hugepages size (kB): %s, number claimed: %s, number set: %s',
+                hp_size_kb, hp_number, hp_number_set)
+    return hp_size_kb, hp_number, hp_number_set
+
+
 def find_relative_file(path, task_path):
     """
     Find file in one of places: in abs of path or relative to a directory path,
@@ -578,3 +608,24 @@ def send_socket_command(host, port, command):
     finally:
         sock.close()
     return ret
+
+
+def safe_cast(value, type_to_convert, default_value):
+    """Convert value to type, in case of error return default_value
+
+    :param value: value to convert
+    :param type_to_convert: type to convert, could be "type" or "string"
+    :param default_value: default value to return
+    :return: converted value or default_value
+    """
+    if isinstance(type_to_convert, type):
+        _type = type_to_convert
+    else:
+        _type = pydoc.locate(type_to_convert)
+        if not _type:
+            raise exceptions.InvalidType(type_to_convert=type_to_convert)
+
+    try:
+        return _type(value)
+    except ValueError:
+        return default_value