Merge "Bugfix: write_json_to_file: use json.dump with files"
[yardstick.git] / tests / unit / network_services / vnf_generic / vnf / test_base.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2016-2017 Intel Corporation
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #      http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #
17
18 # Unittest for yardstick.network_services.vnf_generic.vnf.test_base
19
20 from __future__ import absolute_import
21 import unittest
22 import mock
23 from multiprocessing import Queue
24
25 from yardstick.network_services.vnf_generic.vnf.base import \
26     QueueFileWrapper, GenericVNF, GenericTrafficGen
27
28 IP_PIPELINE_CFG_FILE_TPL = """
29 arp_route_tbl = ({port0_local_ip_hex},{port0_netmask_hex},1,"""
30 """{port1_local_ip_hex}) ({port1_local_ip_hex},{port1_netmask_hex},0,"""
31 """{port0_local_ip_hex})"""
32
33 IP_PIPELINE_ND_CFG_FILE_TPL = """
34 nd_route_tbl = ({port1_dst_ip_hex6},"""
35 """{port1_dst_netmask_hex6},1,{port1_dst_ip_hex6})"""
36
37
38 class TestQueueFileWrapper(unittest.TestCase):
39     def setUp(self):
40         self.prompt = "pipeline>"
41         self.q_in = Queue()
42         self.q_out = Queue()
43
44     def test___init__(self):
45         queue_file_wrapper = \
46             QueueFileWrapper(self.q_in, self.q_out, self.prompt)
47         self.assertEqual(queue_file_wrapper.prompt, self.prompt)
48
49     def test_clear(self):
50         queue_file_wrapper = \
51             QueueFileWrapper(self.q_in, self.q_out, self.prompt)
52         queue_file_wrapper.bufsize = 5
53         queue_file_wrapper.write("pipeline>")
54         queue_file_wrapper.close()
55         self.assertIsNotNone(queue_file_wrapper.q_out.empty())
56
57     def test_close(self):
58         queue_file_wrapper = \
59             QueueFileWrapper(self.q_in, self.q_out, self.prompt)
60         self.assertEqual(None, queue_file_wrapper.close())
61
62     def test_read(self):
63         queue_file_wrapper = \
64             QueueFileWrapper(self.q_in, self.q_out, self.prompt)
65         queue_file_wrapper.q_in.put("pipeline>")
66         self.assertEqual("pipeline>", queue_file_wrapper.read(20))
67
68     def test_write(self):
69         queue_file_wrapper = \
70             QueueFileWrapper(self.q_in, self.q_out, self.prompt)
71         queue_file_wrapper.write("pipeline>")
72         self.assertIsNotNone(queue_file_wrapper.q_out.empty())
73
74
75 class TestGenericVNF(unittest.TestCase):
76     VNFD = {'vnfd:vnfd-catalog':
77             {'vnfd':
78              [{'short-name': 'VpeVnf',
79                'vdu':
80                [{'routing_table':
81                  [{'network': '152.16.100.20',
82                    'netmask': '255.255.255.0',
83                    'gateway': '152.16.100.20',
84                    'if': 'xe0'},
85                   {'network': '152.16.40.20',
86                    'netmask': '255.255.255.0',
87                    'gateway': '152.16.40.20',
88                    'if': 'xe1'}],
89                  'description': 'VPE approximation using DPDK',
90                  'name': 'vpevnf-baremetal',
91                  'nd_route_tbl':
92                  [{'network': '0064:ff9b:0:0:0:0:9810:6414',
93                    'netmask': '112',
94                    'gateway': '0064:ff9b:0:0:0:0:9810:6414',
95                    'if': 'xe0'},
96                   {'network': '0064:ff9b:0:0:0:0:9810:2814',
97                    'netmask': '112',
98                    'gateway': '0064:ff9b:0:0:0:0:9810:2814',
99                    'if': 'xe1'}],
100                  'id': 'vpevnf-baremetal',
101                  'external-interface':
102                  [{'virtual-interface':
103                    {'dst_mac': '00:00:00:00:00:03',
104                     'vpci': '0000:05:00.0',
105                     'local_ip': '152.16.100.19',
106                     'type': 'PCI-PASSTHROUGH',
107                     'netmask': '255.255.255.0',
108                     'dpdk_port_num': '0',
109                     'bandwidth': '10 Gbps',
110                     'dst_ip': '152.16.100.20',
111                     'local_mac': '00:00:00:00:00:01'},
112                    'vnfd-connection-point-ref': 'xe0',
113                    'name': 'xe0'},
114                   {'virtual-interface':
115                    {'dst_mac': '00:00:00:00:00:04',
116                     'vpci': '0000:05:00.1',
117                     'local_ip': '152.16.40.19',
118                     'type': 'PCI-PASSTHROUGH',
119                     'netmask': '255.255.255.0',
120                     'dpdk_port_num': '1',
121                     'bandwidth': '10 Gbps',
122                     'dst_ip': '152.16.40.20',
123                     'local_mac': '00:00:00:00:00:02'},
124                    'vnfd-connection-point-ref': 'xe1',
125                    'name': 'xe1'}]}],
126                'description': 'Vpe approximation using DPDK',
127                'mgmt-interface':
128                    {'vdu-id': 'vpevnf-baremetal',
129                     'host': '1.1.1.1',
130                     'password': 'r00t',
131                     'user': 'root',
132                     'ip': '1.1.1.1'},
133                'benchmark':
134                    {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
135                'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
136                                     {'type': 'VPORT', 'name': 'xe1'}],
137                'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
138
139     def test___init__(self):
140         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
141         assert generic_vn_f.kpi
142
143     def test_collect_kpi(self):
144         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
145         self.assertRaises(NotImplementedError, generic_vn_f.collect_kpi)
146
147     def test_get_ip_version(self):
148         ip_addr = "152.16.1.1"
149         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
150         self.assertEqual(4, generic_vn_f.get_ip_version(ip_addr))
151
152     @mock.patch('yardstick.network_services.vnf_generic.vnf.base.LOG')
153     def test_get_ip_version_error(self, mock_LOG):
154         ip_addr = "152.16.1.1.1"
155         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
156         self.assertRaises(ValueError, generic_vn_f.get_ip_version(ip_addr))
157
158     def test_ip_to_hex(self):
159         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
160         hex_ip = generic_vn_f._ip_to_hex("192.168.10.1")
161         self.assertEqual("C0A80A01", hex_ip)
162
163     def test_append_routes(self):
164         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
165         arp_route = generic_vn_f._append_routes(IP_PIPELINE_CFG_FILE_TPL)
166         expected = '\narp_route_tbl = (98106414,FFFFFF00,0,98106414)' \
167                    ' (98102814,FFFFFF00,1,98102814)\n,'
168         self.assertEqual(expected, arp_route)
169
170     def test_append_nd_routes(self):
171         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
172         nd_route = generic_vn_f._append_nd_routes(IP_PIPELINE_ND_CFG_FILE_TPL)
173         expected = '\nnd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,112,0,' \
174                    '0064:ff9b:0:0:0:0:9810:6414) '\
175                    '(0064:ff9b:0:0:0:0:9810:2814,112,'\
176                    '1,0064:ff9b:0:0:0:0:9810:2814)\n,'
177         self.assertEqual(expected, nd_route)
178
179     def test_get_port0localip6(self):
180         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
181         port0_v6 = generic_vn_f._get_port0localip6()
182         expected = '0064:ff9b:0:0:0:0:9810:6414'
183         self.assertEqual(expected, port0_v6)
184
185     def test_get_port1localip6(self):
186         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
187         port1_v6 = generic_vn_f._get_port1localip6()
188         expected = '0064:ff9b:0:0:0:0:9810:2814'
189         self.assertEqual(expected, port1_v6)
190
191     def test_get_port0prefixip6(self):
192         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
193         port0_v6 = generic_vn_f._get_port0prefixlen6()
194         self.assertEqual('112', port0_v6)
195
196     def test_get_port1prefixip6(self):
197         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
198         port1_v6 = generic_vn_f._get_port1prefixlen6()
199         self.assertEqual('112', port1_v6)
200
201     def test_get_port0gateway6(self):
202         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
203         port0_v6 = generic_vn_f._get_port0gateway6()
204         self.assertEqual('0064:ff9b:0:0:0:0:9810:6414', port0_v6)
205
206     def test_get_port1gateway6(self):
207         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
208         port1_v6 = generic_vn_f._get_port1gateway6()
209         self.assertEqual('0064:ff9b:0:0:0:0:9810:2814', port1_v6)
210
211     def test_get_dpdk_port_num(self):
212         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
213         port_num = generic_vn_f._get_dpdk_port_num('xe0')
214         self.assertEqual('0', port_num)
215
216     def test__get_kpi_definition(self):
217         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
218         generic_vn_f = GenericVNF(vnfd)
219         kpi = \
220             generic_vn_f._get_kpi_definition(vnfd)
221         self.assertEqual(kpi, ['packets_in', 'packets_fwd', 'packets_dropped'])
222
223     def test_instantiate(self):
224         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
225         self.assertRaises(NotImplementedError,
226                           generic_vn_f.instantiate, {}, {})
227
228     def test_scale(self):
229         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
230         self.assertRaises(NotImplementedError, generic_vn_f.scale)
231
232     def test_terminate(self):
233         generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
234         self.assertRaises(NotImplementedError, generic_vn_f.terminate)
235
236
237 class TestGenericTrafficGen(unittest.TestCase):
238     def test___init__(self):
239         vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
240         generic_traffic_gen = \
241             GenericTrafficGen(vnfd)
242         assert generic_traffic_gen.name == "tgen__1"
243
244     def test_listen_traffic(self):
245         vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
246         generic_traffic_gen = \
247             GenericTrafficGen(vnfd)
248         traffic_profile = {}
249         self.assertIsNone(generic_traffic_gen.listen_traffic(traffic_profile))
250
251     def test_run_traffic(self):
252         vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
253         generic_traffic_gen = \
254             GenericTrafficGen(vnfd)
255         traffic_profile = {}
256         self.assertRaises(NotImplementedError,
257                           generic_traffic_gen.run_traffic, traffic_profile)
258
259     def test_terminate(self):
260         vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
261         generic_traffic_gen = \
262             GenericTrafficGen(vnfd)
263         self.assertRaises(NotImplementedError, generic_traffic_gen.terminate)
264
265     def test_verify_traffic(self):
266         vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
267         generic_traffic_gen = \
268             GenericTrafficGen(vnfd)
269         traffic_profile = {}
270         self.assertIsNone(generic_traffic_gen.verify_traffic(traffic_profile))