1 # Copyright (c) 2016-2017 Intel Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 from __future__ import absolute_import
19 from yardstick.network_services.nfvi.resource import ResourceProfile
20 from yardstick.network_services.nfvi import resource, collectd
23 class TestResourceProfile(unittest.TestCase):
24 VNFD = {'vnfd:vnfd-catalog':
26 [{'short-name': 'VpeVnf',
29 [{'network': '172.16.100.20',
30 'netmask': '255.255.255.0',
31 'gateway': '172.16.100.20',
33 {'network': '172.16.40.20',
34 'netmask': '255.255.255.0',
35 'gateway': '172.16.40.20',
37 'description': 'VPE approximation using DPDK',
38 'name': 'vpevnf-baremetal',
40 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
42 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
44 {'network': '0064:ff9b:0:0:0:0:9810:2814',
46 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
48 'id': 'vpevnf-baremetal',
50 [{'virtual-interface':
51 {'dst_mac': '3c:fd:fe:9e:64:38',
52 'vpci': '0000:05:00.0',
53 'local_ip': '172.16.100.19',
54 'type': 'PCI-PASSTHROUGH',
55 'netmask': '255.255.255.0',
57 'bandwidth': '10 Gbps',
58 'dst_ip': '172.16.100.20',
59 'local_mac': '3c:fd:fe:a1:2b:80'},
60 'vnfd-connection-point-ref': 'xe0',
63 {'dst_mac': '00:1e:67:d0:60:5c',
64 'vpci': '0000:05:00.1',
65 'local_ip': '172.16.40.19',
66 'type': 'PCI-PASSTHROUGH',
67 'netmask': '255.255.255.0',
69 'bandwidth': '10 Gbps',
70 'dst_ip': '172.16.40.20',
71 'local_mac': '3c:fd:fe:a1:2b:81'},
72 'vnfd-connection-point-ref': 'xe1',
74 'description': 'Vpe approximation using DPDK',
76 {'vdu-id': 'vpevnf-baremetal',
82 {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
83 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
84 {'type': 'VPORT', 'name': 'xe1'}],
85 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
88 with mock.patch("yardstick.ssh.AutoConnectSSH") as ssh:
89 self.ssh_mock = mock.Mock(autospec=ssh.SSH)
90 self.ssh_mock.execute = \
91 mock.Mock(return_value=(0, {}, ""))
92 ssh.from_node.return_value = self.ssh_mock
94 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
96 # self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
98 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
99 self.resource_profile = \
100 ResourceProfile(mgmt, port_names, [1, 2, 3])
101 self.resource_profile.connection = self.ssh_mock
103 def test___init__(self):
104 self.assertEqual(True, self.resource_profile.enable)
106 def test_check_if_sa_running(self):
107 self.assertEqual(self.resource_profile.check_if_sa_running("collectd"),
110 def test_get_cpu_data(self):
111 reskey = ["", "cpufreq", "cpufreq-0"]
113 val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
114 self.assertIsNotNone(val)
116 def test_get_cpu_data_error(self):
117 reskey = ["", "", ""]
119 val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
120 self.assertEqual(val, ('error', 'Invalid', '', ''))
122 def test__start_collectd(self):
124 self.resource_profile._start_collectd(self.ssh_mock, "/opt/nsb_bin"))
126 def test__prepare_collectd_conf(self):
128 self.resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
131 @mock.patch("yardstick.network_services.nfvi.resource.open")
132 @mock.patch("yardstick.network_services.nfvi.resource.os")
133 def test__provide_config_file(self, mock_open, mock_os):
134 loadplugin = range(5)
135 port_names = range(5)
138 "loadplugin": loadplugin,
139 "port_names": port_names,
141 self.resource_profile._provide_config_file("/opt/nsb_bin", "collectd.conf", kwargs)
142 self.ssh_mock.execute.assert_called_once()
145 @mock.patch("yardstick.network_services.nfvi.resource.open")
146 def test_initiate_systemagent(self, mock_open):
147 self.resource_profile._start_collectd = mock.Mock()
149 self.resource_profile.initiate_systemagent("/opt/nsb_bin"))
151 def test__parse_hugepages(self):
152 reskey = ["cpu", "cpuFreq"]
153 value = "timestamp:12345"
154 res = self.resource_profile.parse_hugepages(reskey, value)
155 self.assertEqual({'cpu/cpuFreq': '12345'}, res)
157 def test__parse_dpdkstat(self):
158 reskey = ["dpdk0", "0"]
160 res = self.resource_profile.parse_dpdkstat(reskey, value)
161 self.assertEqual({'dpdk0/0': '12345'}, res)
163 def test__parse_virt(self):
164 reskey = ["vm0", "cpu"]
166 res = self.resource_profile.parse_virt(reskey, value)
167 self.assertEqual({'vm0/cpu': '45'}, res)
169 def test__parse_ovs_stats(self):
170 reskey = ["ovs", "stats"]
172 res = self.resource_profile.parse_ovs_stats(reskey, value)
173 self.assertEqual({'ovs/stats': '45'}, res)
175 def test_parse_collectd_result(self):
176 res = self.resource_profile.parse_collectd_result({}, [0, 1, 2])
177 expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
178 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
181 self.assertDictEqual(res, expected_result)
183 def test_parse_collectd_result_cpu(self):
184 metric = {"nsb_stats/cpu/0/ipc": "101"}
185 self.resource_profile.get_cpu_data = mock.Mock(return_value=[1,
189 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
190 expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {},
191 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
194 self.assertDictEqual(res, expected_result)
196 def test_parse_collectd_result_memory(self):
197 metric = {"nsb_stats/memory/bw": "101"}
198 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
199 expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
200 'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '',
203 self.assertDictEqual(res, expected_result)
205 def test_parse_collectd_result_hugepage(self):
207 metric = {b"nsb_stats/hugepages/free": b"101"}
208 self.resource_profile.parse_hugepages = \
209 mock.Mock(return_value={"free": "101"})
210 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
211 expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free': '101'},
212 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
215 self.assertDictEqual(res, expected_result)
217 def test_parse_collectd_result_dpdk_virt_ovs(self):
218 metric = {b"nsb_stats/dpdkstat/tx": b"101",
219 b"nsb_stats/ovs_stats/tx": b"101",
220 b"nsb_stats/virt/virt/memory": b"101"}
221 self.resource_profile.parse_dpdkstat = \
222 mock.Mock(return_value={"tx": "101"})
223 self.resource_profile.parse_virt = \
224 mock.Mock(return_value={"memory": "101"})
225 self.resource_profile.parse_ovs_stats = \
226 mock.Mock(return_value={"tx": "101"})
227 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
228 expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {},
229 'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '',
231 'virt': {'memory': '101'}}
232 self.assertDictEqual(res, expected_result)
234 def test_amqp_process_for_nfvi_kpi(self):
235 self.resource_profile.amqp_client = \
236 mock.MagicMock(side_effect=[None, mock.MagicMock()])
237 self.resource_profile.run_collectd_amqp = \
238 mock.Mock(return_value=0)
239 res = self.resource_profile.amqp_process_for_nfvi_kpi()
240 self.assertEqual(None, res)
242 def test_amqp_collect_nfvi_kpi(self):
243 self.resource_profile.amqp_client = \
244 mock.MagicMock(side_effect=[None, mock.MagicMock()])
245 self.resource_profile.run_collectd_amqp = \
246 mock.Mock(return_value=0)
247 self.resource_profile.parse_collectd_result = mock.Mock()
248 res = self.resource_profile.amqp_collect_nfvi_kpi()
249 self.assertIsNotNone(res)
251 def test_run_collectd_amqp(self):
252 resource.AmqpConsumer = mock.Mock(autospec=collectd)
253 self.assertIsNone(self.resource_profile.run_collectd_amqp())
255 def test_start(self):
256 self.assertIsNone(self.resource_profile.start())
259 self.assertIsNone(self.resource_profile.stop())
261 if __name__ == '__main__':