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
17 import multiprocessing
20 from yardstick.network_services.nfvi.resource import ResourceProfile
21 from yardstick.network_services.nfvi import resource, collectd
24 class TestResourceProfile(unittest.TestCase):
25 VNFD = {'vnfd:vnfd-catalog':
27 [{'short-name': 'VpeVnf',
30 [{'network': '172.16.100.20',
31 'netmask': '255.255.255.0',
32 'gateway': '172.16.100.20',
34 {'network': '172.16.40.20',
35 'netmask': '255.255.255.0',
36 'gateway': '172.16.40.20',
38 'description': 'VPE approximation using DPDK',
39 'name': 'vpevnf-baremetal',
41 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
43 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
45 {'network': '0064:ff9b:0:0:0:0:9810:2814',
47 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
49 'id': 'vpevnf-baremetal',
51 [{'virtual-interface':
52 {'dst_mac': '3c:fd:fe:9e:64:38',
53 'vpci': '0000:05:00.0',
54 'local_ip': '172.16.100.19',
55 'type': 'PCI-PASSTHROUGH',
56 'netmask': '255.255.255.0',
58 'bandwidth': '10 Gbps',
59 'dst_ip': '172.16.100.20',
60 'local_mac': '3c:fd:fe:a1:2b:80'},
61 'vnfd-connection-point-ref': 'xe0',
64 {'dst_mac': '00:1e:67:d0:60:5c',
65 'vpci': '0000:05:00.1',
66 'local_ip': '172.16.40.19',
67 'type': 'PCI-PASSTHROUGH',
68 'netmask': '255.255.255.0',
70 'bandwidth': '10 Gbps',
71 'dst_ip': '172.16.40.20',
72 'local_mac': '3c:fd:fe:a1:2b:81'},
73 'vnfd-connection-point-ref': 'xe1',
75 'description': 'Vpe approximation using DPDK',
77 {'vdu-id': 'vpevnf-baremetal',
83 {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
84 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
85 {'type': 'VPORT', 'name': 'xe1'}],
86 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
89 with mock.patch("yardstick.ssh.SSH") as ssh:
90 ssh_mock = mock.Mock(autospec=ssh.SSH)
92 mock.Mock(return_value=(0, {}, ""))
93 ssh.from_node.return_value = ssh_mock
95 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
97 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
98 self.resource_profile = \
99 ResourceProfile(mgmt, interfaces, [1, 2, 3])
101 def test___init__(self):
102 self.assertEqual(True, self.resource_profile.enable)
104 def test_check_if_sa_running(self):
105 self.assertEqual(self.resource_profile.check_if_sa_running("collectd"),
108 def test_get_cpu_data(self):
109 reskey = ["", "cpufreq", "cpufreq-0"]
111 val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
112 self.assertIsNotNone(val)
114 def test_get_cpu_data_error(self):
115 reskey = ["", "", ""]
117 val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
118 self.assertEqual(val, ('error', 'Invalid', '', ''))
120 def test__start_collectd(self):
121 with mock.patch("yardstick.ssh.SSH") as ssh:
122 ssh_mock = mock.Mock(autospec=ssh.SSH)
124 mock.Mock(return_value=(0, "", ""))
125 ssh.from_node.return_value = ssh_mock
126 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
128 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
130 ResourceProfile(mgmt, interfaces, [1, 2, 3])
131 resource_profile._prepare_collectd_conf = mock.Mock()
133 resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin"))
135 def test__prepare_collectd_conf_BM(self):
136 with mock.patch("yardstick.ssh.SSH") as ssh:
137 ssh_mock = mock.Mock(autospec=ssh.SSH)
139 mock.Mock(return_value=(0, "", ""))
140 ssh.from_node.return_value = ssh_mock
141 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
143 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
145 ResourceProfile(mgmt, interfaces, [1, 2, 3])
146 resource_profile._provide_config_file = mock.Mock()
148 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
150 def test__prepare_collectd_conf_managed_ovs_dpdk(self):
151 with mock.patch("yardstick.ssh.SSH") as ssh:
152 ssh_mock = mock.Mock(autospec=ssh.SSH)
154 mock.Mock(return_value=(0, "", ""))
155 ssh.from_node.return_value = ssh_mock
156 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
158 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
160 ResourceProfile(mgmt, interfaces, [1, 2, 3])
161 resource_profile._provide_config_file = mock.Mock()
163 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
165 def test__prepare_collectd_conf_ovs_dpdk(self):
166 with mock.patch("yardstick.ssh.SSH") as ssh:
167 ssh_mock = mock.Mock(autospec=ssh.SSH)
169 mock.Mock(return_value=(0, "", ""))
170 ssh.from_node.return_value = ssh_mock
171 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
173 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
175 ResourceProfile(mgmt, interfaces, [1, 2, 3])
176 resource_profile._provide_config_file = mock.Mock()
178 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
180 def test__prepare_collectd_conf_managed_sriov(self):
181 with mock.patch("yardstick.ssh.SSH") as ssh:
182 ssh_mock = mock.Mock(autospec=ssh.SSH)
184 mock.Mock(return_value=(0, "", ""))
185 ssh.from_node.return_value = ssh_mock
186 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
188 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
190 ResourceProfile(mgmt, interfaces, [1, 2, 3])
191 resource_profile._provide_config_file = mock.Mock()
193 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
195 def test__prepare_collectd_conf_sriov(self):
196 with mock.patch("yardstick.ssh.SSH") as ssh:
197 ssh_mock = mock.Mock(autospec=ssh.SSH)
199 mock.Mock(return_value=(0, "", ""))
200 ssh.from_node.return_value = ssh_mock
201 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
203 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
205 ResourceProfile(mgmt, interfaces, [1, 2, 3])
206 resource_profile._provide_config_file = mock.Mock()
208 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
210 @mock.patch("yardstick.network_services.nfvi.resource.open")
211 @mock.patch("yardstick.network_services.nfvi.resource.tempfile")
212 @mock.patch("yardstick.network_services.nfvi.resource.os")
213 def test__provide_config_file(self, mock_open, mock_tempfile, mock_os):
214 with mock.patch("yardstick.ssh.SSH") as ssh:
215 ssh_mock = mock.Mock(autospec=ssh.SSH)
217 mock.Mock(return_value=(0, "", ""))
218 ssh.from_node.return_value = ssh_mock
219 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
221 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
223 ResourceProfile(mgmt, interfaces, [1, 2, 3])
224 resource_profile._prepare_collectd_conf = mock.Mock()
225 resource_profile.connection = ssh_mock
226 resource_profile.connection.put = \
227 mock.Mock(return_value=(0, "", ""))
228 mock_tempfile.mkstemp = mock.Mock(return_value=["test", ""])
230 resource_profile._provide_config_file("/opt/nsb_bin",
233 @mock.patch("yardstick.network_services.nfvi.resource.open")
234 def test_initiate_systemagent(self, mock_open):
235 with mock.patch("yardstick.ssh.SSH") as ssh:
236 ssh_mock = mock.Mock(autospec=ssh.SSH)
238 mock.Mock(return_value=(0, "", ""))
239 ssh.from_node.return_value = ssh_mock
240 mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
242 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
244 ResourceProfile(mgmt, interfaces, [1, 2, 3])
245 resource_profile._start_collectd = mock.Mock()
247 resource_profile.initiate_systemagent("/opt/nsb_bin"))
249 def test__parse_hugepages(self):
250 reskey = ["cpu", "cpuFreq"]
251 value = "timestamp:12345"
252 res = self.resource_profile.parse_hugepages(reskey, value)
253 self.assertEqual({'cpu/cpuFreq': '12345'}, res)
255 def test__parse_dpdkstat(self):
256 reskey = ["dpdk0", "0"]
258 res = self.resource_profile.parse_dpdkstat(reskey, value)
259 self.assertEqual({'dpdk0/0': '12345'}, res)
261 def test__parse_virt(self):
262 reskey = ["vm0", "cpu"]
264 res = self.resource_profile.parse_virt(reskey, value)
265 self.assertEqual({'vm0/cpu': '45'}, res)
267 def test__parse_ovs_stats(self):
268 reskey = ["ovs", "stats"]
270 res = self.resource_profile.parse_ovs_stats(reskey, value)
271 self.assertEqual({'ovs/stats': '45'}, res)
273 def test_parse_collectd_result(self):
274 res = self.resource_profile.parse_collectd_result({}, [0, 1, 2])
275 expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
276 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
279 self.assertDictEqual(res, expected_result)
281 def test_parse_collectd_result_cpu(self):
282 metric = {"nsb_stats/cpu/0/ipc": "101"}
283 self.resource_profile.get_cpu_data = mock.Mock(return_value=[1,
287 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
288 expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {},
289 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
292 self.assertDictEqual(res, expected_result)
294 def test_parse_collectd_result_memory(self):
295 metric = {"nsb_stats/memory/bw": "101"}
296 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
297 expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
298 'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '',
301 self.assertDictEqual(res, expected_result)
303 def test_parse_collectd_result_hugepage(self):
304 metric = {"nsb_stats/hugepages/free": "101"}
305 self.resource_profile.parse_hugepages = \
306 mock.Mock(return_value={"free": "101"})
307 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
308 expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free':
310 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
313 self.assertDictEqual(res, expected_result)
315 def test_parse_collectd_result_dpdk_virt_ovs(self):
316 metric = {"nsb_stats/dpdkstat/tx": "101",
317 "nsb_stats/ovs_stats/tx": "101",
318 "nsb_stats/virt/virt/memory": "101"}
319 self.resource_profile.parse_dpdkstat = \
320 mock.Mock(return_value={"tx": "101"})
321 self.resource_profile.parse_virt = \
322 mock.Mock(return_value={"memory": "101"})
323 self.resource_profile.parse_ovs_stats = \
324 mock.Mock(return_value={"tx": "101"})
325 res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
326 expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {},
327 'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '',
329 'virt': {'memory': '101'}}
330 self.assertDictEqual(res, expected_result)
332 def test_amqp_process_for_nfvi_kpi(self):
333 self.resource_profile.amqp_client = \
334 mock.MagicMock(side_effect=[None, mock.MagicMock()])
335 self.resource_profile.run_collectd_amqp = \
336 mock.Mock(return_value=0)
337 res = self.resource_profile.amqp_process_for_nfvi_kpi()
338 self.assertEqual(None, res)
340 def test_amqp_collect_nfvi_kpi(self):
341 self.resource_profile.amqp_client = \
342 mock.MagicMock(side_effect=[None, mock.MagicMock()])
343 self.resource_profile.run_collectd_amqp = \
344 mock.Mock(return_value=0)
345 self.resource_profile.parse_collectd_result = mock.Mock()
346 res = self.resource_profile.amqp_collect_nfvi_kpi()
347 self.assertIsNotNone(res)
349 def test_run_collectd_amqp(self):
350 _queue = multiprocessing.Queue()
351 resource.AmqpConsumer = mock.Mock(autospec=collectd)
352 self.assertIsNone(self.resource_profile.run_collectd_amqp())
354 def test_start(self):
355 self.assertIsNone(self.resource_profile.start())
358 self.assertIsNone(self.resource_profile.stop())
360 if __name__ == '__main__':