Merge "NSB Prox LW_AFTR Test"
[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
18 import errno
19 import mock
20
21 from yardstick.network_services.nfvi.resource import ResourceProfile
22 from yardstick.network_services.nfvi import resource, collectd
23
24
25 class TestResourceProfile(unittest.TestCase):
26     VNFD = {'vnfd:vnfd-catalog':
27             {'vnfd':
28              [{'short-name': 'VpeVnf',
29                'vdu':
30                [{'routing_table':
31                  [{'network': '172.16.100.20',
32                    'netmask': '255.255.255.0',
33                    'gateway': '172.16.100.20',
34                    'if': 'xe0'},
35                   {'network': '172.16.40.20',
36                    'netmask': '255.255.255.0',
37                    'gateway': '172.16.40.20',
38                    'if': 'xe1'}],
39                  'description': 'VPE approximation using DPDK',
40                  'name': 'vpevnf-baremetal',
41                  'nd_route_tbl':
42                  [{'network': '0064:ff9b:0:0:0:0:9810:6414',
43                    'netmask': '112',
44                    'gateway': '0064:ff9b:0:0:0:0:9810:6414',
45                    'if': 'xe0'},
46                   {'network': '0064:ff9b:0:0:0:0:9810:2814',
47                    'netmask': '112',
48                    'gateway': '0064:ff9b:0:0:0:0:9810:2814',
49                    'if': 'xe1'}],
50                  'id': 'vpevnf-baremetal',
51                  'external-interface':
52                  [{'virtual-interface':
53                    {'dst_mac': '3c:fd:fe:9e:64:38',
54                     'vpci': '0000:05:00.0',
55                     'local_ip': '172.16.100.19',
56                     'type': 'PCI-PASSTHROUGH',
57                     'netmask': '255.255.255.0',
58                     'dpdk_port_num': 0,
59                     'bandwidth': '10 Gbps',
60                     'dst_ip': '172.16.100.20',
61                     'local_mac': '3c:fd:fe:a1:2b:80'},
62                    'vnfd-connection-point-ref': 'xe0',
63                    'name': 'xe0'},
64                   {'virtual-interface':
65                    {'dst_mac': '00:1e:67:d0:60:5c',
66                     'vpci': '0000:05:00.1',
67                     'local_ip': '172.16.40.19',
68                     'type': 'PCI-PASSTHROUGH',
69                     'netmask': '255.255.255.0',
70                     'dpdk_port_num': 1,
71                     'bandwidth': '10 Gbps',
72                     'dst_ip': '172.16.40.20',
73                     'local_mac': '3c:fd:fe:a1:2b:81'},
74                    'vnfd-connection-point-ref': 'xe1',
75                    'name': 'xe1'}]}],
76                'description': 'Vpe approximation using DPDK',
77                'mgmt-interface':
78                    {'vdu-id': 'vpevnf-baremetal',
79                     'host': '127.0.0.1',
80                     'password': 'r00t',
81                     'user': 'root',
82                     'ip': '127.0.0.1'},
83                'benchmark':
84                    {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
85                'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
86                                     {'type': 'VPORT', 'name': 'xe1'}],
87                'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
88
89     def setUp(self):
90         with mock.patch("yardstick.ssh.AutoConnectSSH") as ssh:
91             self.ssh_mock = mock.Mock(autospec=ssh.SSH)
92             self.ssh_mock.execute = \
93                 mock.Mock(return_value=(0, "", ""))
94             ssh.from_node.return_value = self.ssh_mock
95
96             mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
97             # interfaces = \
98             #    self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
99             port_names = \
100                 self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
101             self.resource_profile = \
102                 ResourceProfile(mgmt, port_names)
103             self.resource_profile.connection = self.ssh_mock
104
105     def test___init__(self):
106         self.assertEqual(True, self.resource_profile.enable)
107
108     def test_check_if_sa_running(self):
109         self.assertEqual(self.resource_profile.check_if_sa_running("collectd"),
110                          (0, ""))
111
112     def test_check_if_sa_running_excetion(self):
113         with mock.patch.object(self.resource_profile.connection, "execute") as mock_execute:
114             mock_execute.side_effect = OSError(errno.ECONNRESET, "error")
115             self.assertEqual(self.resource_profile.check_if_sa_running("collectd"), (1, None))
116
117     def test_get_cpu_data(self):
118         reskey = ["", "cpufreq", "cpufreq-0"]
119         value = "metric:10"
120         val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
121         self.assertIsNotNone(val)
122
123     def test_get_cpu_data_error(self):
124         reskey = ["", "", ""]
125         value = "metric:10"
126         val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
127         self.assertEqual(val, ('error', 'Invalid', '', ''))
128
129     def test__start_collectd(self):
130             self.assertIsNone(
131                 self.resource_profile._start_collectd(self.ssh_mock, "/opt/nsb_bin"))
132
133     def test__prepare_collectd_conf(self):
134             self.assertIsNone(
135                 self.resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
136
137     def test__setup_intel_pmu(self):
138         self.assertIsNone(
139             self.resource_profile._setup_intel_pmu(self.ssh_mock, "/opt/nsb_bin"))
140
141     def test__setup_ovs_stats(self):
142         self.assertIsNone(
143             self.resource_profile._setup_ovs_stats(self.ssh_mock))
144
145     @mock.patch("yardstick.network_services.nfvi.resource.open")
146     @mock.patch("yardstick.network_services.nfvi.resource.os")
147     def test__provide_config_file(self, mock_open, mock_os):
148         loadplugin = range(5)
149         port_names = range(5)
150         kwargs = {
151             "interval": '25',
152             "loadplugin": loadplugin,
153             "port_names": port_names,
154         }
155         self.resource_profile._provide_config_file("/opt/nsb_bin", "collectd.conf", kwargs)
156         self.ssh_mock.execute.assert_called_once()
157
158     @mock.patch("yardstick.network_services.nfvi.resource.open")
159     def test_initiate_systemagent(self, mock_open):
160         self.resource_profile._start_collectd = mock.Mock()
161         self.assertIsNone(
162             self.resource_profile.initiate_systemagent("/opt/nsb_bin"))
163
164     @mock.patch("yardstick.network_services.nfvi.resource.open")
165     def test_initiate_systemagent_raise(self, mock_open):
166         self.resource_profile._start_collectd = mock.Mock(side_effect=RuntimeError)
167         with self.assertRaises(RuntimeError):
168             self.resource_profile.initiate_systemagent("/opt/nsb_bin")
169
170     def test__parse_hugepages(self):
171         reskey = ["cpu", "cpuFreq"]
172         value = "timestamp:12345"
173         res = self.resource_profile.parse_hugepages(reskey, value)
174         self.assertEqual({'cpu/cpuFreq': '12345'}, res)
175
176     def test__parse_dpdkstat(self):
177         reskey = ["dpdk0", "0"]
178         value = "tx:12345"
179         res = self.resource_profile.parse_dpdkstat(reskey, value)
180         self.assertEqual({'dpdk0/0': '12345'}, res)
181
182     def test__parse_virt(self):
183         reskey = ["vm0", "cpu"]
184         value = "load:45"
185         res = self.resource_profile.parse_virt(reskey, value)
186         self.assertEqual({'vm0/cpu': '45'}, res)
187
188     def test__parse_ovs_stats(self):
189         reskey = ["ovs", "stats"]
190         value = "tx:45"
191         res = self.resource_profile.parse_ovs_stats(reskey, value)
192         self.assertEqual({'ovs/stats': '45'}, res)
193
194     def test_parse_collectd_result(self):
195         res = self.resource_profile.parse_collectd_result({})
196         expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
197                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
198                            'virt': {}}
199         self.assertDictEqual(res, expected_result)
200
201     def test_parse_collectd_result_cpu(self):
202         metric = {"nsb_stats/cpu/0/ipc": "101"}
203         self.resource_profile.get_cpu_data = mock.Mock(return_value=[1,
204                                                                      "ipc",
205                                                                      "1234",
206                                                                      ""])
207         res = self.resource_profile.parse_collectd_result(metric)
208         expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {},
209                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
210                            'virt': {}}
211         self.assertDictEqual(res, expected_result)
212
213     def test_parse_collectd_result_memory(self):
214         metric = {"nsb_stats/memory/bw": "101"}
215         res = self.resource_profile.parse_collectd_result(metric)
216         expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
217                            'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '',
218                            'virt': {}}
219         self.assertDictEqual(res, expected_result)
220
221     def test_parse_collectd_result_hugepage(self):
222         # amqp returns bytes
223         metric = {b"nsb_stats/hugepages/free": b"101"}
224         self.resource_profile.parse_hugepages = mock.Mock(return_value={"free": "101"})
225         res = self.resource_profile.parse_collectd_result(metric)
226         expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free': '101'},
227                            'memory': {}, 'ovs_stats': {}, 'timestamp': '',
228                            'virt': {}}
229         self.assertDictEqual(res, expected_result)
230
231     def test_parse_collectd_result_dpdk_virt_ovs(self):
232         metric = {b"nsb_stats/dpdkstat/tx": b"101",
233                   b"nsb_stats/ovs_stats/tx": b"101",
234                   b"nsb_stats/virt/virt/memory": b"101"}
235         self.resource_profile.parse_dpdkstat = \
236             mock.Mock(return_value={"tx": "101"})
237         self.resource_profile.parse_virt = \
238             mock.Mock(return_value={"memory": "101"})
239         self.resource_profile.parse_ovs_stats = \
240             mock.Mock(return_value={"tx": "101"})
241         res = self.resource_profile.parse_collectd_result(metric)
242         expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {},
243                            'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '',
244                            'virt': {'memory': '101'}}
245         self.assertDictEqual(res, expected_result)
246
247     def test_amqp_process_for_nfvi_kpi(self):
248         self.resource_profile.amqp_client = \
249             mock.MagicMock(side_effect=[None, mock.MagicMock()])
250         self.resource_profile.run_collectd_amqp = \
251             mock.Mock(return_value=0)
252         res = self.resource_profile.amqp_process_for_nfvi_kpi()
253         self.assertEqual(None, res)
254
255     def test_amqp_collect_nfvi_kpi(self):
256         self.resource_profile.amqp_client = \
257             mock.MagicMock(side_effect=[None, mock.MagicMock()])
258         self.resource_profile.run_collectd_amqp = \
259             mock.Mock(return_value=0)
260         self.resource_profile.parse_collectd_result = mock.Mock()
261         res = self.resource_profile.amqp_collect_nfvi_kpi()
262         self.assertIsNotNone(res)
263
264     def test_run_collectd_amqp(self):
265         resource.AmqpConsumer = mock.Mock(autospec=collectd)
266         self.assertIsNone(self.resource_profile.run_collectd_amqp())
267
268     def test_start(self):
269         self.assertIsNone(self.resource_profile.start())
270
271     def test_stop(self):
272         self.assertIsNone(self.resource_profile.stop())
273
274     def test_stop(self):
275         self.resource_profile.amqp_client = mock.MagicMock()
276         self.assertIsNone(self.resource_profile.stop())
277
278 if __name__ == '__main__':
279     unittest.main()