3 # Copyright (c) 2016-2017 Intel Corporation
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # Unittest for yardstick.network_services.vnf_generic.vnf.test_base
20 from __future__ import absolute_import
23 from multiprocessing import Queue
25 from yardstick.network_services.vnf_generic.vnf.base import \
26 QueueFileWrapper, GenericVNF, GenericTrafficGen
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})"""
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})"""
38 class TestQueueFileWrapper(unittest.TestCase):
40 self.prompt = "pipeline>"
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)
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())
58 queue_file_wrapper = \
59 QueueFileWrapper(self.q_in, self.q_out, self.prompt)
60 self.assertEqual(None, queue_file_wrapper.close())
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))
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())
75 class TestGenericVNF(unittest.TestCase):
76 VNFD = {'vnfd:vnfd-catalog':
78 [{'short-name': 'VpeVnf',
81 [{'network': '152.16.100.20',
82 'netmask': '255.255.255.0',
83 'gateway': '152.16.100.20',
85 {'network': '152.16.40.20',
86 'netmask': '255.255.255.0',
87 'gateway': '152.16.40.20',
89 'description': 'VPE approximation using DPDK',
90 'name': 'vpevnf-baremetal',
92 [{'network': '0064:ff9b:0:0:0:0:9810:6414',
94 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
96 {'network': '0064:ff9b:0:0:0:0:9810:2814',
98 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
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',
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',
126 'description': 'Vpe approximation using DPDK',
128 {'vdu-id': 'vpevnf-baremetal',
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'}]}}
139 def test___init__(self):
140 generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
141 assert generic_vn_f.kpi
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)
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))
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))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
216 def test__get_kpi_definition(self):
217 vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
218 generic_vn_f = GenericVNF(vnfd)
220 generic_vn_f._get_kpi_definition(vnfd)
221 self.assertEqual(kpi, ['packets_in', 'packets_fwd', 'packets_dropped'])
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, {}, {})
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)
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)
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"
244 def test_listen_traffic(self):
245 vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
246 generic_traffic_gen = \
247 GenericTrafficGen(vnfd)
249 self.assertIsNone(generic_traffic_gen.listen_traffic(traffic_profile))
251 def test_run_traffic(self):
252 vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
253 generic_traffic_gen = \
254 GenericTrafficGen(vnfd)
256 self.assertRaises(NotImplementedError,
257 generic_traffic_gen.run_traffic, traffic_profile)
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)
265 def test_verify_traffic(self):
266 vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
267 generic_traffic_gen = \
268 GenericTrafficGen(vnfd)
270 self.assertIsNone(generic_traffic_gen.verify_traffic(traffic_profile))