add collectd resource node capability
[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 mock
18
19 from yardstick.network_services.nfvi.resource import ResourceProfile
20 from yardstick.network_services.nfvi import resource, collectd
21
22
23 class TestResourceProfile(unittest.TestCase):
24     VNFD = {'vnfd:vnfd-catalog':
25             {'vnfd':
26              [{'short-name': 'VpeVnf',
27                'vdu':
28                [{'routing_table':
29                  [{'network': '172.16.100.20',
30                    'netmask': '255.255.255.0',
31                    'gateway': '172.16.100.20',
32                    'if': 'xe0'},
33                   {'network': '172.16.40.20',
34                    'netmask': '255.255.255.0',
35                    'gateway': '172.16.40.20',
36                    'if': 'xe1'}],
37                  'description': 'VPE approximation using DPDK',
38                  'name': 'vpevnf-baremetal',
39                  'nd_route_tbl':
40                  [{'network': '0064:ff9b:0:0:0:0:9810:6414',
41                    'netmask': '112',
42                    'gateway': '0064:ff9b:0:0:0:0:9810:6414',
43                    'if': 'xe0'},
44                   {'network': '0064:ff9b:0:0:0:0:9810:2814',
45                    'netmask': '112',
46                    'gateway': '0064:ff9b:0:0:0:0:9810:2814',
47                    'if': 'xe1'}],
48                  'id': 'vpevnf-baremetal',
49                  'external-interface':
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',
56                     'dpdk_port_num': 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',
61                    'name': 'xe0'},
62                   {'virtual-interface':
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',
68                     'dpdk_port_num': 1,
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',
73                    'name': 'xe1'}]}],
74                'description': 'Vpe approximation using DPDK',
75                'mgmt-interface':
76                    {'vdu-id': 'vpevnf-baremetal',
77                     'host': '127.0.0.1',
78                     'password': 'r00t',
79                     'user': 'root',
80                     'ip': '127.0.0.1'},
81                'benchmark':
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'}]}}
86
87     def setUp(self):
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
93
94             mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
95             # interfaces = \
96             #    self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
97             port_names = \
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
102
103     def test___init__(self):
104         self.assertEqual(True, self.resource_profile.enable)
105
106     def test_check_if_sa_running(self):
107         self.assertEqual(self.resource_profile.check_if_sa_running("collectd"),
108                          (True, {}))
109
110     def test_get_cpu_data(self):
111         reskey = ["", "cpufreq", "cpufreq-0"]
112         value = "metric:10"
113         val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value)
114         self.assertIsNotNone(val)
115
116     def test_get_cpu_data_error(self):
117         reskey = ["", "", ""]
118         value = "metric:10"
119         val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value)
120         self.assertEqual(val, ('error', 'Invalid', '', ''))
121
122     def test__start_collectd(self):
123             self.assertIsNone(
124                 self.resource_profile._start_collectd(self.ssh_mock, "/opt/nsb_bin"))
125
126     def test__prepare_collectd_conf(self):
127             self.assertIsNone(
128                 self.resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
129
130
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)
136         kwargs = {
137             "interval": '25',
138             "loadplugin": loadplugin,
139             "port_names": port_names,
140         }
141         self.resource_profile._provide_config_file("/opt/nsb_bin", "collectd.conf", kwargs)
142         self.ssh_mock.execute.assert_called_once()
143
144
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()
148         self.assertIsNone(
149             self.resource_profile.initiate_systemagent("/opt/nsb_bin"))
150
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)
156
157     def test__parse_dpdkstat(self):
158         reskey = ["dpdk0", "0"]
159         value = "tx:12345"
160         res = self.resource_profile.parse_dpdkstat(reskey, value)
161         self.assertEqual({'dpdk0/0': '12345'}, res)
162
163     def test__parse_virt(self):
164         reskey = ["vm0", "cpu"]
165         value = "load:45"
166         res = self.resource_profile.parse_virt(reskey, value)
167         self.assertEqual({'vm0/cpu': '45'}, res)
168
169     def test__parse_ovs_stats(self):
170         reskey = ["ovs", "stats"]
171         value = "tx:45"
172         res = self.resource_profile.parse_ovs_stats(reskey, value)
173         self.assertEqual({'ovs/stats': '45'}, res)
174
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': '',
179                            'intel_pmu': {},
180                            'virt': {}}
181         self.assertDictEqual(res, expected_result)
182
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,
186                                                                      "ipc",
187                                                                      "1234",
188                                                                      ""])
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': '',
192                            'intel_pmu': {},
193                            'virt': {}}
194         self.assertDictEqual(res, expected_result)
195
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': '',
201                            'intel_pmu': {},
202                            'virt': {}}
203         self.assertDictEqual(res, expected_result)
204
205     def test_parse_collectd_result_hugepage(self):
206         # amqp returns bytes
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': '',
213                            'intel_pmu': {},
214                            'virt': {}}
215         self.assertDictEqual(res, expected_result)
216
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': '',
230                            'intel_pmu': {},
231                            'virt': {'memory': '101'}}
232         self.assertDictEqual(res, expected_result)
233
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)
241
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)
250
251     def test_run_collectd_amqp(self):
252         resource.AmqpConsumer = mock.Mock(autospec=collectd)
253         self.assertIsNone(self.resource_profile.run_collectd_amqp())
254
255     def test_start(self):
256         self.assertIsNone(self.resource_profile.start())
257
258     def test_stop(self):
259         self.assertIsNone(self.resource_profile.stop())
260
261 if __name__ == '__main__':
262     unittest.main()