Merge "Enable iommu support in grub"
[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 import errno
16
17 import mock
18 import unittest
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.AutoConnectSSH") as ssh:
90             self.ssh_mock = mock.Mock(autospec=ssh.SSH)
91             self.ssh_mock.execute = \
92                 mock.Mock(return_value=(0, "", ""))
93             ssh.from_node.return_value = self.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             port_names = \
99                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
100             self.resource_profile = \
101                 ResourceProfile(mgmt, port_names)
102             self.resource_profile.connection = self.ssh_mock
103
104     def test___init__(self):
105         self.assertEqual(True, self.resource_profile.enable)
106
107     def test_check_if_system_agent_running(self):
108         self.assertEqual(self.resource_profile.check_if_system_agent_running("collectd"),
109                          (0, ""))
110
111     def test_check_if_system_agent_running_excetion(self):
112         with mock.patch.object(self.resource_profile.connection, "execute") as mock_execute:
113             mock_execute.side_effect = OSError(errno.ECONNRESET, "error")
114             self.assertEqual(
115                 self.resource_profile.check_if_system_agent_running("collectd"),
116                 (1, None))
117
118     def test_get_cpu_data(self):
119         reskey = ["", "cpufreq", "cpufreq-0"]
120         value = "metric:10"
121         val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
122         self.assertIsNotNone(val)
123
124     def test_get_cpu_data_error(self):
125         reskey = ["", "", ""]
126         value = "metric:10"
127         val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
128         self.assertEqual(val, ('error', 'Invalid', '', ''))
129
130     def test__start_collectd(self):
131             self.assertIsNone(
132                 self.resource_profile._start_collectd(self.ssh_mock, "/opt/nsb_bin"))
133
134     def test__prepare_collectd_conf(self):
135             self.assertIsNone(
136                 self.resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
137
138     def test__setup_ovs_stats(self):
139         self.assertIsNone(
140             self.resource_profile._setup_ovs_stats(self.ssh_mock))
141
142     @mock.patch("yardstick.network_services.nfvi.resource.open")
143     def test__provide_config_file(self, *args):
144         loadplugin = range(5)
145         port_names = range(5)
146         kwargs = {
147             "interval": '25',
148             "loadplugin": loadplugin,
149             "port_names": port_names,
150         }
151         self.resource_profile._provide_config_file("/opt/nsb_bin", "collectd.conf", kwargs)
152         self.ssh_mock.execute.assert_called_once()
153
154     @mock.patch("yardstick.network_services.nfvi.resource.open")
155     def test_initiate_systemagent(self, *args):
156         self.resource_profile._start_collectd = mock.Mock()
157         self.assertIsNone(
158             self.resource_profile.initiate_systemagent("/opt/nsb_bin"))
159
160     @mock.patch("yardstick.network_services.nfvi.resource.open")
161     def test_initiate_systemagent_raise(self, *args):
162         self.resource_profile._start_collectd = mock.Mock(side_effect=RuntimeError)
163         with self.assertRaises(RuntimeError):
164             self.resource_profile.initiate_systemagent("/opt/nsb_bin")
165
166     def test__parse_hugepages(self):
167         reskey = ["cpu", "cpuFreq"]
168         value = "timestamp:12345"
169         res = self.resource_profile.parse_hugepages(reskey, value)
170         self.assertEqual({'cpu/cpuFreq': '12345'}, res)
171
172     def test__parse_dpdkstat(self):
173         reskey = ["dpdk0", "0"]
174         value = "tx:12345"
175         res = self.resource_profile.parse_dpdkstat(reskey, value)
176         self.assertEqual({'dpdk0/0': '12345'}, res)
177
178     def test__parse_virt(self):
179         reskey = ["vm0", "cpu"]
180         value = "load:45"
181         res = self.resource_profile.parse_virt(reskey, value)
182         self.assertEqual({'vm0/cpu': '45'}, res)
183
184     def test__parse_ovs_stats(self):
185         reskey = ["ovs", "stats"]
186         value = "tx:45"
187         res = self.resource_profile.parse_ovs_stats(reskey, value)
188         self.assertEqual({'ovs/stats': '45'}, res)
189
190     def test_parse_collectd_result(self):
191         res = self.resource_profile.parse_collectd_result({})
192         expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
193                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
194                            'virt': {}}
195         self.assertDictEqual(res, expected_result)
196
197     def test_parse_collectd_result_cpu(self):
198         metric = {"nsb_stats/cpu/0/ipc": "101"}
199         self.resource_profile.get_cpu_data = mock.Mock(return_value=[1,
200                                                                      "ipc",
201                                                                      "1234",
202                                                                      ""])
203         res = self.resource_profile.parse_collectd_result(metric)
204         expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {},
205                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
206                            'virt': {}}
207         self.assertDictEqual(res, expected_result)
208
209     def test_parse_collectd_result_memory(self):
210         metric = {"nsb_stats/memory/bw": "101"}
211         res = self.resource_profile.parse_collectd_result(metric)
212         expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
213                            'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '',
214                            'virt': {}}
215         self.assertDictEqual(res, expected_result)
216
217     def test_parse_collectd_result_hugepage(self):
218         # amqp returns bytes
219         metric = {b"nsb_stats/hugepages/free": b"101"}
220         self.resource_profile.parse_hugepages = mock.Mock(return_value={"free": "101"})
221         res = self.resource_profile.parse_collectd_result(metric)
222         expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free': '101'},
223                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
224                            'virt': {}}
225         self.assertDictEqual(res, expected_result)
226
227     def test_parse_collectd_result_dpdk_virt_ovs(self):
228         metric = {b"nsb_stats/dpdkstat/tx": b"101",
229                   b"nsb_stats/ovs_stats/tx": b"101",
230                   b"nsb_stats/virt/virt/memory": b"101"}
231         self.resource_profile.parse_dpdkstat = \
232             mock.Mock(return_value={"tx": "101"})
233         self.resource_profile.parse_virt = \
234             mock.Mock(return_value={"memory": "101"})
235         self.resource_profile.parse_ovs_stats = \
236             mock.Mock(return_value={"tx": "101"})
237         res = self.resource_profile.parse_collectd_result(metric)
238         expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {},
239                            'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '',
240                            'virt': {'memory': '101'}}
241         self.assertDictEqual(res, expected_result)
242
243     def test_amqp_process_for_nfvi_kpi(self):
244         self.resource_profile.amqp_client = \
245             mock.MagicMock(side_effect=[None, mock.MagicMock()])
246         self.resource_profile.run_collectd_amqp = \
247             mock.Mock(return_value=0)
248         res = self.resource_profile.amqp_process_for_nfvi_kpi()
249         self.assertEqual(None, res)
250
251     def test_amqp_collect_nfvi_kpi(self):
252         self.resource_profile.amqp_client = \
253             mock.MagicMock(side_effect=[None, mock.MagicMock()])
254         self.resource_profile.run_collectd_amqp = \
255             mock.Mock(return_value=0)
256         self.resource_profile.parse_collectd_result = mock.Mock()
257         res = self.resource_profile.amqp_collect_nfvi_kpi()
258         self.assertIsNotNone(res)
259
260     def test_run_collectd_amqp(self):
261         resource.AmqpConsumer = mock.Mock(autospec=collectd)
262         self.assertIsNone(self.resource_profile.run_collectd_amqp())
263
264     def test_start(self):
265         self.assertIsNone(self.resource_profile.start())
266
267     def test_stop(self):
268         self.assertIsNone(self.resource_profile.stop())
269
270     def test_stop_amqp_not_running(self):
271         self.resource_profile.amqp_client = mock.MagicMock()
272         # TODO(efoley): Fix this incorrect test.
273         # Should check that we don't try to stop amqp when it's not running
274         self.assertIsNone(self.resource_profile.stop())
275
276 if __name__ == '__main__':
277     unittest.main()