Merge "Read user & password from yardstick.conf in Grafana configuration"
[yardstick.git] / tests / unit / network_services / nfvi / test_resource.py
1 # Copyright (c) 2016-2017 Intel Corporation
2 #
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
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 from __future__ import absolute_import
16 import unittest
17 import multiprocessing
18 import mock
19
20 from yardstick.network_services.nfvi.resource import ResourceProfile
21 from yardstick.network_services.nfvi import resource, collectd
22
23
24 class TestResourceProfile(unittest.TestCase):
25     VNFD = {'vnfd:vnfd-catalog':
26             {'vnfd':
27              [{'short-name': 'VpeVnf',
28                'vdu':
29                [{'routing_table':
30                  [{'network': '172.16.100.20',
31                    'netmask': '255.255.255.0',
32                    'gateway': '172.16.100.20',
33                    'if': 'xe0'},
34                   {'network': '172.16.40.20',
35                    'netmask': '255.255.255.0',
36                    'gateway': '172.16.40.20',
37                    'if': 'xe1'}],
38                  'description': 'VPE approximation using DPDK',
39                  'name': 'vpevnf-baremetal',
40                  'nd_route_tbl':
41                  [{'network': '0064:ff9b:0:0:0:0:9810:6414',
42                    'netmask': '112',
43                    'gateway': '0064:ff9b:0:0:0:0:9810:6414',
44                    'if': 'xe0'},
45                   {'network': '0064:ff9b:0:0:0:0:9810:2814',
46                    'netmask': '112',
47                    'gateway': '0064:ff9b:0:0:0:0:9810:2814',
48                    'if': 'xe1'}],
49                  'id': 'vpevnf-baremetal',
50                  'external-interface':
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',
57                     'dpdk_port_num': 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',
62                    'name': 'xe0'},
63                   {'virtual-interface':
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',
69                     'dpdk_port_num': 1,
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',
74                    'name': 'xe1'}]}],
75                'description': 'Vpe approximation using DPDK',
76                'mgmt-interface':
77                    {'vdu-id': 'vpevnf-baremetal',
78                     'host': '127.0.0.1',
79                     'password': 'r00t',
80                     'user': 'root',
81                     'ip': '127.0.0.1'},
82                'benchmark':
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'}]}}
87
88     def setUp(self):
89         with mock.patch("yardstick.ssh.SSH") as ssh:
90             ssh_mock = mock.Mock(autospec=ssh.SSH)
91             ssh_mock.execute = \
92                 mock.Mock(return_value=(0, {}, ""))
93             ssh.from_node.return_value = ssh_mock
94
95             mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
96             interfaces = \
97                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
98             self.resource_profile = \
99                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
100
101     def test___init__(self):
102         self.assertEqual(True, self.resource_profile.enable)
103
104     def test_check_if_sa_running(self):
105         self.assertEqual(self.resource_profile.check_if_sa_running("collectd"),
106                          [True, {}])
107
108     def test_get_cpu_data(self):
109         reskey = ["", "cpufreq", "cpufreq-0"]
110         value = "metric:10"
111         val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
112         self.assertIsNotNone(val)
113
114     def test_get_cpu_data_error(self):
115         reskey = ["", "", ""]
116         value = "metric:10"
117         val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
118         self.assertEqual(val, ('error', 'Invalid', '', ''))
119
120     def test__start_collectd(self):
121         with mock.patch("yardstick.ssh.SSH") as ssh:
122             ssh_mock = mock.Mock(autospec=ssh.SSH)
123             ssh_mock.execute = \
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']
127             interfaces = \
128                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
129             resource_profile = \
130                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
131             resource_profile._prepare_collectd_conf = mock.Mock()
132             self.assertIsNone(
133                 resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin"))
134
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)
138             ssh_mock.execute = \
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']
142             interfaces = \
143                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
144             resource_profile = \
145                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
146             resource_profile._provide_config_file = mock.Mock()
147             self.assertIsNone(
148                 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
149
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)
153             ssh_mock.execute = \
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']
157             interfaces = \
158                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
159             resource_profile = \
160                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
161             resource_profile._provide_config_file = mock.Mock()
162             self.assertIsNone(
163                 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
164
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)
168             ssh_mock.execute = \
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']
172             interfaces = \
173                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
174             resource_profile = \
175                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
176             resource_profile._provide_config_file = mock.Mock()
177             self.assertIsNone(
178                 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
179
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)
183             ssh_mock.execute = \
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']
187             interfaces = \
188                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
189             resource_profile = \
190                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
191             resource_profile._provide_config_file = mock.Mock()
192             self.assertIsNone(
193                 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
194
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)
198             ssh_mock.execute = \
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']
202             interfaces = \
203                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
204             resource_profile = \
205                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
206             resource_profile._provide_config_file = mock.Mock()
207             self.assertIsNone(
208                 resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
209
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)
216             ssh_mock.execute = \
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']
220             interfaces = \
221                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
222             resource_profile = \
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", ""])
229             self.assertIsNone(
230                 resource_profile._provide_config_file("/opt/nsb_bin",
231                                                       "collectd.cfg", {}))
232
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)
237             ssh_mock.execute = \
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']
241             interfaces = \
242                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
243             resource_profile = \
244                 ResourceProfile(mgmt, interfaces, [1, 2, 3])
245             resource_profile._start_collectd = mock.Mock()
246             self.assertIsNone(
247                 resource_profile.initiate_systemagent("/opt/nsb_bin"))
248
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)
254
255     def test__parse_dpdkstat(self):
256         reskey = ["dpdk0", "0"]
257         value = "tx:12345"
258         res = self.resource_profile.parse_dpdkstat(reskey, value)
259         self.assertEqual({'dpdk0/0': '12345'}, res)
260
261     def test__parse_virt(self):
262         reskey = ["vm0", "cpu"]
263         value = "load:45"
264         res = self.resource_profile.parse_virt(reskey, value)
265         self.assertEqual({'vm0/cpu': '45'}, res)
266
267     def test__parse_ovs_stats(self):
268         reskey = ["ovs", "stats"]
269         value = "tx:45"
270         res = self.resource_profile.parse_ovs_stats(reskey, value)
271         self.assertEqual({'ovs/stats': '45'}, res)
272
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': '',
277                            'intel_pmu': {},
278                            'virt': {}}
279         self.assertDictEqual(res, expected_result)
280
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,
284                                                                      "ipc",
285                                                                      "1234",
286                                                                      ""])
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': '',
290                            'intel_pmu': {},
291                            'virt': {}}
292         self.assertDictEqual(res, expected_result)
293
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': '',
299                            'intel_pmu': {},
300                            'virt': {}}
301         self.assertDictEqual(res, expected_result)
302
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':
309                                                                      '101'},
310                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
311                            'intel_pmu': {},
312                            'virt': {}}
313         self.assertDictEqual(res, expected_result)
314
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': '',
328                            'intel_pmu': {},
329                            'virt': {'memory': '101'}}
330         self.assertDictEqual(res, expected_result)
331
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)
339
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)
348
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())
353
354     def test_start(self):
355         self.assertIsNone(self.resource_profile.start())
356
357     def test_stop(self):
358         self.assertIsNone(self.resource_profile.stop())
359
360 if __name__ == '__main__':
361     unittest.main()