示例#1
0
    def setUp(self):
        with mock.patch("yardstick.ssh.SSH") as ssh:
            ssh_mock = mock.Mock(autospec=ssh.SSH)
            ssh_mock.execute = \
                mock.Mock(return_value=(0, {}, ""))
            ssh.from_node.return_value = ssh_mock

            mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
            interfaces = \
                self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            self.resource_profile = \
                ResourceProfile(mgmt, interfaces, [1, 2, 3])
示例#2
0
 def test_initiate_systemagent(self, mock_open):
     with mock.patch("yardstick.ssh.SSH") as ssh:
         ssh_mock = mock.Mock(autospec=ssh.SSH)
         ssh_mock.execute = \
             mock.Mock(return_value=(0, "", ""))
         ssh.from_node.return_value = ssh_mock
         mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
         interfaces = \
             self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
         resource_profile = \
             ResourceProfile(mgmt, interfaces, [1, 2, 3])
         resource_profile._start_collectd = mock.Mock()
         self.assertIsNone(
             resource_profile.initiate_systemagent("/opt/nsb_bin"))
示例#3
0
 def test__prepare_collectd_conf_sriov(self):
     with mock.patch("yardstick.ssh.SSH") as ssh:
         ssh_mock = mock.Mock(autospec=ssh.SSH)
         ssh_mock.execute = \
             mock.Mock(return_value=(0, "", ""))
         ssh.from_node.return_value = ssh_mock
         mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
         interfaces = \
             self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
         resource_profile = \
             ResourceProfile(mgmt, interfaces, [1, 2, 3])
         resource_profile._provide_config_file = mock.Mock()
         self.assertIsNone(
             resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
示例#4
0
    def setUp(self):
        with mock.patch("yardstick.ssh.AutoConnectSSH") as ssh:
            self.ssh_mock = mock.Mock(autospec=ssh.SSH)
            self.ssh_mock.execute = \
                mock.Mock(return_value=(0, "", ""))
            ssh.from_node.return_value = self.ssh_mock

            mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
            # interfaces = \
            #    self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            port_names = \
                self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            self.resource_profile = \
                ResourceProfile(mgmt, port_names)
            self.resource_profile.connection = self.ssh_mock
示例#5
0
 def test__provide_config_file(self, mock_open, mock_tempfile, mock_os):
     with mock.patch("yardstick.ssh.SSH") as ssh:
         ssh_mock = mock.Mock(autospec=ssh.SSH)
         ssh_mock.execute = \
             mock.Mock(return_value=(0, "", ""))
         ssh.from_node.return_value = ssh_mock
         mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
         interfaces = \
             self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
         resource_profile = \
             ResourceProfile(mgmt, interfaces, [1, 2, 3])
         resource_profile._prepare_collectd_conf = mock.Mock()
         resource_profile.connection = ssh_mock
         resource_profile.connection.put = \
             mock.Mock(return_value=(0, "", ""))
         mock_tempfile.mkstemp = mock.Mock(return_value=["test", ""])
         self.assertIsNone(
             resource_profile._provide_config_file("/opt/nsb_bin",
                                                   "collectd.cfg", {}))
示例#6
0
 def __init__(self, vnfs, nodes, traffic_profile, timeout=3600):
     super(Collector, self).__init__()
     self.traffic_profile = traffic_profile
     self.vnfs = vnfs
     self.nodes = nodes
     self.timeout = timeout
     self.bin_path = get_nsb_option('bin_path', '')
     self.resource_profiles = {node_name: ResourceProfile.make_from_node(node, self.timeout)
                               for node_name, node in self.nodes.items()
                               if node.get("collectd")}
示例#7
0
    def instantiate(self, scenario_cfg, context_cfg):
        vnf_cfg = scenario_cfg['vnf_options']['vpe']['cfg']

        mgmt_interface = self.vnfd["mgmt-interface"]
        self.connection = ssh.SSH.from_node(mgmt_interface)

        self.tc_file_name = '{0}.yaml'.format(scenario_cfg['tc'])

        self.setup_vnf_environment(self.connection)

        cores = self._get_cpu_sibling_list()
        self.resource = ResourceProfile(self.vnfd, cores)

        self.connection.execute("pkill vPE_vnf")
        dpdk_nic_bind = \
            provision_tool(self.connection,
                           os.path.join(self.bin_path, "dpdk_nic_bind.py"))

        interfaces = self.vnfd["vdu"][0]['external-interface']
        self.socket = \
            next((0 for v in interfaces
                  if v['virtual-interface']["vpci"][5] == "0"), 1)

        bound_pci = [v['virtual-interface']["vpci"] for v in interfaces]
        for vpci in bound_pci:
            self.connection.execute("%s --force -b igb_uio %s" %
                                    (dpdk_nic_bind, vpci))
        queue_wrapper = \
            QueueFileWrapper(self.q_in, self.q_out, "pipeline>")
        self._vnf_process = multiprocessing.Process(target=self._run_vpe,
                                                    args=(
                                                        queue_wrapper,
                                                        vnf_cfg,
                                                    ))
        self._vnf_process.start()
        buf = []
        time.sleep(WAIT_TIME)  # Give some time for config to load
        while True:
            message = ''
            while self.q_out.qsize() > 0:
                buf.append(self.q_out.get())
                message = ''.join(buf)
                if "pipeline>" in message:
                    LOG.info("VPE VNF is up and running.")
                    queue_wrapper.clear()
                    self._resource_collect_start()
                    return self._vnf_process.exitcode
                if "PANIC" in message:
                    raise RuntimeError("Error starting vPE VNF.")

            LOG.info("Waiting for VNF to start.. ")
            time.sleep(3)
            if not self._vnf_process.is_alive():
                raise RuntimeError("vPE VNF process died.")
示例#8
0
    def make_resource_profile(node, timeout):
        # node dict works as mgmt dict
        # don't need port names, there is no way we can
        # tell what port is used on the compute node
        collectd_options = node["collectd"]
        plugins = collectd_options.get("plugins", {})
        interval = collectd_options.get("interval")

        # use default cores = None to MatchAllCores
        return ResourceProfile(node,
                               plugins=plugins,
                               interval=interval,
                               timeout=timeout)
示例#9
0
    def __init__(self, vnfs, contexts_nodes, timeout=3600):
        super(Collector, self).__init__()
        self.vnfs = vnfs
        self.nodes = contexts_nodes
        self.bin_path = get_nsb_option('bin_path', '')
        self.resource_profiles = {}

        for ctx_name, nodes in contexts_nodes.items():
            for node in (node for node in nodes if node.get('collectd')):
                name = ".".join([node['name'], ctx_name])
                self.resource_profiles.update(
                    {name: ResourceProfile.make_from_node(node, timeout)}
                    )
示例#10
0
    def _setup_resources(self):
        interfaces = self.vnfd_helper.interfaces
        self.bound_pci = [v['virtual-interface']["vpci"] for v in interfaces]

        # what is this magic?  how do we know which socket is for which port?
        # what about quad-socket?
        if any(v[5] == "0" for v in self.bound_pci):
            self.socket = 0
        else:
            self.socket = 1

        cores = self._validate_cpu_cfg()
        return ResourceProfile(self.vnfd_helper.mgmt_interface,
                               interfaces=self.vnfd_helper.interfaces, cores=cores)
示例#11
0
    def _setup_resources(self):
        # what is this magic?  how do we know which socket is for which port?
        # what about quad-socket?
        if any(v[5] == "0" for v in self.bound_pci):
            self.socket = 0
        else:
            self.socket = 1

        cores = self._validate_cpu_cfg()
        # implicit ordering, presumably by DPDK port num, so pre-sort by port_num
        # this won't work because we don't have DPDK port numbers yet
        ports = sorted(self.vnfd_helper.interfaces, key=self.vnfd_helper.port_num)
        port_names = (intf["name"] for intf in ports)
        collectd_options = self.get_collectd_options()
        plugins = collectd_options.get("plugins", {})
        return ResourceProfile(self.vnfd_helper.mgmt_interface, port_names=port_names, cores=cores,
                               plugins=plugins, interval=collectd_options.get("interval"))
示例#12
0
    def _setup_resources(self):
        # what is this magic?  how do we know which socket is for which port?
        # what about quad-socket?
        if any(v[5] == "0" for v in self.bound_pci):
            self.socket = 0
        else:
            self.socket = 1

        # implicit ordering, presumably by DPDK port num, so pre-sort by port_num
        # this won't work because we don't have DPDK port numbers yet
        ports = sorted(self.vnfd_helper.interfaces, key=self.vnfd_helper.port_num)
        port_names = (intf["name"] for intf in ports)
        plugins = self.collectd_options.get("plugins", {})
        interval = self.collectd_options.get("interval")
        # we must set timeout to be the same as the VNF otherwise KPIs will die before VNF
        return ResourceProfile(self.vnfd_helper.mgmt_interface, port_names=port_names,
                               plugins=plugins, interval=interval,
                               timeout=self.scenario_helper.timeout)
示例#13
0
class TestResourceProfile(unittest.TestCase):
    VNFD = {'vnfd:vnfd-catalog':
            {'vnfd':
             [{'short-name': 'VpeVnf',
               'vdu':
               [{'routing_table':
                 [{'network': '172.16.100.20',
                   'netmask': '255.255.255.0',
                   'gateway': '172.16.100.20',
                   'if': 'xe0'},
                  {'network': '172.16.40.20',
                   'netmask': '255.255.255.0',
                   'gateway': '172.16.40.20',
                   'if': 'xe1'}],
                 'description': 'VPE approximation using DPDK',
                 'name': 'vpevnf-baremetal',
                 'nd_route_tbl':
                 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
                   'netmask': '112',
                   'gateway': '0064:ff9b:0:0:0:0:9810:6414',
                   'if': 'xe0'},
                  {'network': '0064:ff9b:0:0:0:0:9810:2814',
                   'netmask': '112',
                   'gateway': '0064:ff9b:0:0:0:0:9810:2814',
                   'if': 'xe1'}],
                 'id': 'vpevnf-baremetal',
                 'external-interface':
                 [{'virtual-interface':
                   {'dst_mac': '3c:fd:fe:9e:64:38',
                    'vpci': '0000:05:00.0',
                    'local_ip': '172.16.100.19',
                    'type': 'PCI-PASSTHROUGH',
                    'netmask': '255.255.255.0',
                    'dpdk_port_num': 0,
                    'bandwidth': '10 Gbps',
                    'dst_ip': '172.16.100.20',
                    'local_mac': '3c:fd:fe:a1:2b:80'},
                   'vnfd-connection-point-ref': 'xe0',
                   'name': 'xe0'},
                  {'virtual-interface':
                   {'dst_mac': '00:1e:67:d0:60:5c',
                    'vpci': '0000:05:00.1',
                    'local_ip': '172.16.40.19',
                    'type': 'PCI-PASSTHROUGH',
                    'netmask': '255.255.255.0',
                    'dpdk_port_num': 1,
                    'bandwidth': '10 Gbps',
                    'dst_ip': '172.16.40.20',
                    'local_mac': '3c:fd:fe:a1:2b:81'},
                   'vnfd-connection-point-ref': 'xe1',
                   'name': 'xe1'}]}],
               'description': 'Vpe approximation using DPDK',
               'mgmt-interface':
                   {'vdu-id': 'vpevnf-baremetal',
                    'host': '127.0.0.1',
                    'password': '******',
                    'user': '******',
                    'ip': '127.0.0.1'},
               'benchmark':
                   {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
               'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
                                    {'type': 'VPORT', 'name': 'xe1'}],
               'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}

    def setUp(self):
        with mock.patch("yardstick.ssh.AutoConnectSSH") as ssh:
            self.ssh_mock = mock.Mock(autospec=ssh.SSH)
            self.ssh_mock.execute = \
                mock.Mock(return_value=(0, {}, ""))
            ssh.from_node.return_value = self.ssh_mock

            mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
            # interfaces = \
            #    self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            port_names = \
                self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            self.resource_profile = \
                ResourceProfile(mgmt, port_names, [1, 2, 3])
            self.resource_profile.connection = self.ssh_mock

    def test___init__(self):
        self.assertEqual(True, self.resource_profile.enable)

    def test_check_if_sa_running(self):
        self.assertEqual(self.resource_profile.check_if_sa_running("collectd"),
                         [True, {}])

    def test_get_cpu_data(self):
        reskey = ["", "cpufreq", "cpufreq-0"]
        value = "metric:10"
        val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
        self.assertIsNotNone(val)

    def test_get_cpu_data_error(self):
        reskey = ["", "", ""]
        value = "metric:10"
        val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
        self.assertEqual(val, ('error', 'Invalid', '', ''))

    def test__start_collectd(self):
            self.assertIsNone(
                self.resource_profile._start_collectd(self.ssh_mock, "/opt/nsb_bin"))

    def test__prepare_collectd_conf(self):
            self.assertIsNone(
                self.resource_profile._prepare_collectd_conf("/opt/nsb_bin"))


    @mock.patch("yardstick.network_services.nfvi.resource.open")
    @mock.patch("yardstick.network_services.nfvi.resource.os")
    def test__provide_config_file(self, mock_open, mock_os):
        loadplugin = range(5)
        port_names = range(5)
        kwargs = {
            "interval": '25',
            "loadplugin": loadplugin,
            "port_names": port_names,
        }
        self.resource_profile._provide_config_file("/opt/nsb_bin", "collectd.conf", kwargs)
        self.ssh_mock.execute.assert_called_once()


    @mock.patch("yardstick.network_services.nfvi.resource.open")
    def test_initiate_systemagent(self, mock_open):
        self.resource_profile._start_collectd = mock.Mock()
        self.assertIsNone(
            self.resource_profile.initiate_systemagent("/opt/nsb_bin"))

    def test__parse_hugepages(self):
        reskey = ["cpu", "cpuFreq"]
        value = "timestamp:12345"
        res = self.resource_profile.parse_hugepages(reskey, value)
        self.assertEqual({'cpu/cpuFreq': '12345'}, res)

    def test__parse_dpdkstat(self):
        reskey = ["dpdk0", "0"]
        value = "tx:12345"
        res = self.resource_profile.parse_dpdkstat(reskey, value)
        self.assertEqual({'dpdk0/0': '12345'}, res)

    def test__parse_virt(self):
        reskey = ["vm0", "cpu"]
        value = "load:45"
        res = self.resource_profile.parse_virt(reskey, value)
        self.assertEqual({'vm0/cpu': '45'}, res)

    def test__parse_ovs_stats(self):
        reskey = ["ovs", "stats"]
        value = "tx:45"
        res = self.resource_profile.parse_ovs_stats(reskey, value)
        self.assertEqual({'ovs/stats': '45'}, res)

    def test_parse_collectd_result(self):
        res = self.resource_profile.parse_collectd_result({}, [0, 1, 2])
        expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
                           'memory': {}, 'ovs_stats': {}, 'timestamp': '',
                           'intel_pmu': {},
                           'virt': {}}
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_cpu(self):
        metric = {"nsb_stats/cpu/0/ipc": "101"}
        self.resource_profile.get_cpu_data = mock.Mock(return_value=[1,
                                                                     "ipc",
                                                                     "1234",
                                                                     ""])
        res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
        expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {},
                           'memory': {}, 'ovs_stats': {}, 'timestamp': '',
                           'intel_pmu': {},
                           'virt': {}}
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_memory(self):
        metric = {"nsb_stats/memory/bw": "101"}
        res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
        expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
                           'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '',
                           'intel_pmu': {},
                           'virt': {}}
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_hugepage(self):
        # amqp returns bytes
        metric = {b"nsb_stats/hugepages/free": b"101"}
        self.resource_profile.parse_hugepages = \
        mock.Mock(return_value={"free": "101"})
        res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
        expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free': '101'},
                           'memory': {}, 'ovs_stats': {}, 'timestamp': '',
                           'intel_pmu': {},
                           'virt': {}}
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_dpdk_virt_ovs(self):
        metric = {b"nsb_stats/dpdkstat/tx": b"101",
                  b"nsb_stats/ovs_stats/tx": b"101",
                  b"nsb_stats/virt/virt/memory": b"101"}
        self.resource_profile.parse_dpdkstat = \
            mock.Mock(return_value={"tx": "101"})
        self.resource_profile.parse_virt = \
            mock.Mock(return_value={"memory": "101"})
        self.resource_profile.parse_ovs_stats = \
            mock.Mock(return_value={"tx": "101"})
        res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
        expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {},
                           'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '',
                           'intel_pmu': {},
                           'virt': {'memory': '101'}}
        self.assertDictEqual(res, expected_result)

    def test_amqp_process_for_nfvi_kpi(self):
        self.resource_profile.amqp_client = \
            mock.MagicMock(side_effect=[None, mock.MagicMock()])
        self.resource_profile.run_collectd_amqp = \
            mock.Mock(return_value=0)
        res = self.resource_profile.amqp_process_for_nfvi_kpi()
        self.assertEqual(None, res)

    def test_amqp_collect_nfvi_kpi(self):
        self.resource_profile.amqp_client = \
            mock.MagicMock(side_effect=[None, mock.MagicMock()])
        self.resource_profile.run_collectd_amqp = \
            mock.Mock(return_value=0)
        self.resource_profile.parse_collectd_result = mock.Mock()
        res = self.resource_profile.amqp_collect_nfvi_kpi()
        self.assertIsNotNone(res)

    def test_run_collectd_amqp(self):
        resource.AmqpConsumer = mock.Mock(autospec=collectd)
        self.assertIsNone(self.resource_profile.run_collectd_amqp())

    def test_start(self):
        self.assertIsNone(self.resource_profile.start())

    def test_stop(self):
        self.assertIsNone(self.resource_profile.stop())
示例#14
0
class TestResourceProfile(unittest.TestCase):
    VNFD = {
        'vnfd:vnfd-catalog': {
            'vnfd': [{
                'short-name':
                'VpeVnf',
                'vdu': [{
                    'routing_table': [{
                        'network': '172.16.100.20',
                        'netmask': '255.255.255.0',
                        'gateway': '172.16.100.20',
                        'if': 'xe0'
                    }, {
                        'network': '172.16.40.20',
                        'netmask': '255.255.255.0',
                        'gateway': '172.16.40.20',
                        'if': 'xe1'
                    }],
                    'description':
                    'VPE approximation using DPDK',
                    'name':
                    'vpevnf-baremetal',
                    'nd_route_tbl': [{
                        'network': '0064:ff9b:0:0:0:0:9810:6414',
                        'netmask': '112',
                        'gateway': '0064:ff9b:0:0:0:0:9810:6414',
                        'if': 'xe0'
                    }, {
                        'network': '0064:ff9b:0:0:0:0:9810:2814',
                        'netmask': '112',
                        'gateway': '0064:ff9b:0:0:0:0:9810:2814',
                        'if': 'xe1'
                    }],
                    'id':
                    'vpevnf-baremetal',
                    'external-interface': [{
                        'virtual-interface': {
                            'dst_mac': '3c:fd:fe:9e:64:38',
                            'vpci': '0000:05:00.0',
                            'local_ip': '172.16.100.19',
                            'type': 'PCI-PASSTHROUGH',
                            'netmask': '255.255.255.0',
                            'dpdk_port_num': 0,
                            'bandwidth': '10 Gbps',
                            'dst_ip': '172.16.100.20',
                            'local_mac': '3c:fd:fe:a1:2b:80'
                        },
                        'vnfd-connection-point-ref': 'xe0',
                        'name': 'xe0'
                    }, {
                        'virtual-interface': {
                            'dst_mac': '00:1e:67:d0:60:5c',
                            'vpci': '0000:05:00.1',
                            'local_ip': '172.16.40.19',
                            'type': 'PCI-PASSTHROUGH',
                            'netmask': '255.255.255.0',
                            'dpdk_port_num': 1,
                            'bandwidth': '10 Gbps',
                            'dst_ip': '172.16.40.20',
                            'local_mac': '3c:fd:fe:a1:2b:81'
                        },
                        'vnfd-connection-point-ref': 'xe1',
                        'name': 'xe1'
                    }]
                }],
                'description':
                'Vpe approximation using DPDK',
                'mgmt-interface': {
                    'vdu-id': 'vpevnf-baremetal',
                    'host': '127.0.0.1',
                    'password': '******',
                    'user': '******',
                    'ip': '127.0.0.1'
                },
                'benchmark': {
                    'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']
                },
                'connection-point': [{
                    'type': 'VPORT',
                    'name': 'xe0'
                }, {
                    'type': 'VPORT',
                    'name': 'xe1'
                }],
                'id':
                'VpeApproxVnf',
                'name':
                'VPEVnfSsh'
            }]
        }
    }

    def setUp(self):
        with mock.patch("yardstick.ssh.AutoConnectSSH") as ssh:
            self.ssh_mock = mock.Mock(autospec=ssh.SSH)
            self.ssh_mock.execute = \
                mock.Mock(return_value=(0, "", ""))
            ssh.from_node.return_value = self.ssh_mock

            mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
            # interfaces = \
            #    self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            port_names = \
                self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
            self.resource_profile = \
                ResourceProfile(mgmt, port_names)
            self.resource_profile.connection = self.ssh_mock

    def test___init__(self):
        self.assertTrue(self.resource_profile.enable)

    def test_check_if_system_agent_running(self):
        self.assertEqual(
            self.resource_profile.check_if_system_agent_running("collectd"),
            (0, ""))

    def test_check_if_system_agent_running_excetion(self):
        with mock.patch.object(self.resource_profile.connection,
                               "execute") as mock_execute:
            mock_execute.side_effect = OSError(errno.ECONNRESET, "error")
            self.assertEqual(
                self.resource_profile.check_if_system_agent_running(
                    "collectd"), (1, None))

    def test_get_cpu_data(self):
        reskey = ["", "cpufreq", "cpufreq-0"]
        value = "metric:10"
        val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
        self.assertIsNotNone(val)

    def test_get_cpu_data_error(self):
        reskey = ["", "", ""]
        value = "metric:10"
        val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
        self.assertEqual(val, ('error', 'Invalid', '', ''))

    def test__start_collectd(self):
        ssh_mock = mock.Mock()
        ssh_mock.execute = mock.Mock(return_value=(0, "", ""))
        self.assertIsNone(
            self.resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin"))

        ssh_mock.execute = mock.Mock(side_effect=exceptions.SSHError)
        with self.assertRaises(exceptions.SSHError):
            self.resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin")

        ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
        with self.assertRaises(ResourceCommandError):
            self.resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin")

    def test__reset_rabbitmq(self):
        ssh_mock = mock.Mock()
        ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
        with self.assertRaises(exceptions.ResourceCommandError):
            self.resource_profile._reset_rabbitmq(ssh_mock)

    def test__check_rabbitmq_user(self):
        ssh_mock = mock.Mock()
        ssh_mock.execute = mock.Mock(return_value=(0, "title\nadmin\t[]", ""))
        self.assertTrue(self.resource_profile._check_rabbitmq_user(ssh_mock))

    def test__set_rabbitmq_admin_user(self):
        ssh_mock = mock.Mock()
        ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
        with self.assertRaises(exceptions.ResourceCommandError):
            self.resource_profile._set_rabbitmq_admin_user(ssh_mock)

    def test__start_rabbitmq(self):
        ssh_mock = mock.Mock()
        self.resource_profile._reset_rabbitmq = mock.Mock()
        self.resource_profile._set_rabbitmq_admin_user = mock.Mock()

        self.resource_profile._reset_mq_flag = True
        ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
        with self.assertRaises(exceptions.ResourceCommandError):
            self.resource_profile._start_rabbitmq(ssh_mock)

        self.resource_profile._reset_mq_flag = False
        self.resource_profile._check_rabbitmq_user = mock.Mock(
            return_value=False)
        ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
        with self.assertRaises(exceptions.ResourceCommandError):
            self.resource_profile._start_rabbitmq(ssh_mock)

    def test__prepare_collectd_conf(self):
        self.assertIsNone(
            self.resource_profile._prepare_collectd_conf("/opt/nsb_bin"))

    def test__setup_ovs_stats(self):
        # TODO(elfoley): This method doesn't actually return anything, the side
        # effects should be checked
        self.assertIsNone(self.resource_profile._setup_ovs_stats(
            self.ssh_mock))

    def test__provide_config_file(self, ):
        loadplugin = range(5)
        port_names = range(5)
        kwargs = {
            "interval": '25',
            "loadplugin": loadplugin,
            "port_names": port_names,
        }
        self.resource_profile._provide_config_file("/opt/nsb_bin",
                                                   "collectd.conf", kwargs)
        self.ssh_mock.execute.assert_called_once()

    def test_initiate_systemagent(self):
        self.resource_profile._start_collectd = mock.Mock()
        self.resource_profile._start_rabbitmq = mock.Mock()
        self.assertIsNone(
            self.resource_profile.initiate_systemagent("/opt/nsb_bin"))

    def test_initiate_systemagent_raise(self):
        self.resource_profile._start_rabbitmq = mock.Mock(
            side_effect=RuntimeError)
        with self.assertRaises(RuntimeError):
            self.resource_profile.initiate_systemagent("/opt/nsb_bin")

    def test__parse_hugepages(self):
        reskey = ["cpu", "cpuFreq"]
        value = "timestamp:12345"
        res = self.resource_profile.parse_hugepages(reskey, value)
        self.assertEqual({'cpu/cpuFreq': '12345'}, res)

    def test__parse_dpdkstat(self):
        reskey = ["dpdk0", "0"]
        value = "tx:12345"
        res = self.resource_profile.parse_dpdkstat(reskey, value)
        self.assertEqual({'dpdk0/0': '12345'}, res)

    def test__parse_virt(self):
        reskey = ["vm0", "cpu"]
        value = "load:45"
        res = self.resource_profile.parse_virt(reskey, value)
        self.assertEqual({'vm0/cpu': '45'}, res)

    def test__parse_ovs_stats(self):
        reskey = ["ovs", "stats"]
        value = "tx:45"
        res = self.resource_profile.parse_ovs_stats(reskey, value)
        self.assertEqual({'ovs/stats': '45'}, res)

    def test_parse_collectd_result(self):
        res = self.resource_profile.parse_collectd_result({})
        expected_result = {
            'cpu': {},
            'dpdkstat': {},
            'hugepages': {},
            'memory': {},
            'ovs_stats': {},
            'timestamp': '',
            'virt': {}
        }
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_cpu(self):
        metric = {"nsb_stats/cpu/0/ipc": "101"}
        self.resource_profile.get_cpu_data = mock.Mock(
            return_value=[1, "ipc", "1234", ""])
        res = self.resource_profile.parse_collectd_result(metric)
        expected_result = {
            'cpu': {
                1: {
                    'ipc': '1234'
                }
            },
            'dpdkstat': {},
            'hugepages': {},
            'memory': {},
            'ovs_stats': {},
            'timestamp': '',
            'virt': {}
        }
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_memory(self):
        metric = {"nsb_stats/memory/bw": "101"}
        res = self.resource_profile.parse_collectd_result(metric)
        expected_result = {
            'cpu': {},
            'dpdkstat': {},
            'hugepages': {},
            'memory': {
                'bw': '101'
            },
            'ovs_stats': {},
            'timestamp': '',
            'virt': {}
        }
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_hugepage(self):
        # amqp returns bytes
        metric = {b"nsb_stats/hugepages/free": b"101"}
        self.resource_profile.parse_hugepages = mock.Mock(
            return_value={"free": "101"})
        res = self.resource_profile.parse_collectd_result(metric)
        expected_result = {
            'cpu': {},
            'dpdkstat': {},
            'hugepages': {
                'free': '101'
            },
            'memory': {},
            'ovs_stats': {},
            'timestamp': '',
            'virt': {}
        }
        self.assertDictEqual(res, expected_result)

    def test_parse_collectd_result_dpdk_virt_ovs(self):
        metric = {
            b"nsb_stats/dpdkstat/tx": b"101",
            b"nsb_stats/ovs_stats/tx": b"101",
            b"nsb_stats/virt/virt/memory": b"101"
        }
        self.resource_profile.parse_dpdkstat = \
            mock.Mock(return_value={"tx": "101"})
        self.resource_profile.parse_virt = \
            mock.Mock(return_value={"memory": "101"})
        self.resource_profile.parse_ovs_stats = \
            mock.Mock(return_value={"tx": "101"})
        res = self.resource_profile.parse_collectd_result(metric)
        expected_result = {
            'cpu': {},
            'dpdkstat': {
                'tx': '101'
            },
            'hugepages': {},
            'memory': {},
            'ovs_stats': {
                'tx': '101'
            },
            'timestamp': '',
            'virt': {
                'memory': '101'
            }
        }
        self.assertDictEqual(res, expected_result)

    def test_amqp_process_for_nfvi_kpi(self):
        self.resource_profile.amqp_client = \
            mock.MagicMock(side_effect=[None, mock.MagicMock()])
        self.resource_profile.run_collectd_amqp = \
            mock.Mock(return_value=0)
        res = self.resource_profile.amqp_process_for_nfvi_kpi()
        self.assertIsNone(res)

    def test_amqp_collect_nfvi_kpi(self):
        self.resource_profile.amqp_client = \
            mock.MagicMock(side_effect=[None, mock.MagicMock()])
        self.resource_profile.run_collectd_amqp = \
            mock.Mock(return_value=0)
        self.resource_profile.parse_collectd_result = mock.Mock()
        res = self.resource_profile.amqp_collect_nfvi_kpi()
        self.assertIsNotNone(res)

    def test_run_collectd_amqp(self):
        resource.AmqpConsumer = mock.Mock(autospec=collectd)
        self.assertIsNone(self.resource_profile.run_collectd_amqp())

    def test_start(self):
        self.assertIsNone(self.resource_profile.start())

    def test_stop(self):
        self.assertIsNone(self.resource_profile.stop())

    def test_stop_amqp_not_running(self):
        self.resource_profile.amqp_client = mock.MagicMock()
        # TODO(efoley): Fix this incorrect test.
        # Should check that we don't try to stop amqp when it's not running
        self.assertIsNone(self.resource_profile.stop())