Merge "Replace CONST.* by getattribute/setattr for rally and tempest"
[functest.git] / functest / tests / unit / vnf / ims / test_cloudify_ims.py
1 #!/usr/bin/env python
2
3 # All rights reserved. This program and the accompanying materials
4 # are made available under the terms of the Apache License, Version 2.0
5 # which accompanies this distribution, and is available at
6 # http://www.apache.org/licenses/LICENSE-2.0
7
8 import logging
9 import unittest
10
11 import mock
12
13 from functest.opnfv_tests.vnf.ims import cloudify_ims
14
15
16 class CloudifyImsTesting(unittest.TestCase):
17
18     def setUp(self):
19         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
20                         'os.makedirs'), \
21             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
22                        'get_config', return_value='config_value'):
23             self.ims_vnf = cloudify_ims.CloudifyIms()
24         self.neutron_client = mock.Mock()
25         self.glance_client = mock.Mock()
26         self.keystone_client = mock.Mock()
27         self.nova_client = mock.Mock()
28         self.orchestrator = {'requirements': {'ram_min': 2,
29                                               'os_image': 'test_os_image'},
30                              'blueprint': {'url': 'test_url',
31                                            'branch': 'test_branch'},
32                              'inputs': {'public_domain': 'test_domain'},
33                              'object': 'test_object',
34                              'deployment_name': 'test_deployment_name'}
35         self.ims_vnf.orchestrator = self.orchestrator
36         self.ims_vnf.images = {'test_image': 'test_url'}
37         self.ims_vnf.vnf = self.orchestrator
38         self.ims_vnf.tenant_name = 'test_tenant'
39         self.ims_vnf.inputs = {'public_domain': 'test_domain'}
40         self.ims_vnf.glance_client = self.glance_client
41         self.ims_vnf.neutron_client = self.neutron_client
42         self.ims_vnf.keystone_client = self.keystone_client
43         self.ims_vnf.nova_client = self.nova_client
44         self.ims_vnf.admin_creds = 'test_creds'
45
46         self.mock_post = mock.Mock()
47         attrs = {'status_code': 201,
48                  'cookies': ""}
49         self.mock_post.configure_mock(**attrs)
50
51         self.mock_post_200 = mock.Mock()
52         attrs = {'status_code': 200,
53                  'cookies': ""}
54         self.mock_post_200.configure_mock(**attrs)
55
56     def test_deploy_orchestrator_missing_image(self):
57         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
58                         'os_utils.get_neutron_client',
59                         return_value=self.neutron_client), \
60             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
61                        'os_utils.get_glance_client',
62                        return_value=self.glance_client), \
63             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
64                        'os_utils.get_keystone_client',
65                        return_value=self.keystone_client), \
66             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
67                        'os_utils.get_nova_client',
68                        return_value=self.nova_client), \
69             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
70                        'os_utils.get_image_id',
71                        return_value=''), \
72             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
73                        'download_and_add_image_on_glance') as m, \
74                 self.assertRaises(Exception) as context:
75             self.ims_vnf.deploy_orchestrator()
76             self.assertTrue(m.called)
77             msg = "Failed to find or upload required OS "
78             msg += "image for this deployment"
79             self.assertTrue(msg in context.exception)
80
81     def test_deploy_orchestrator_extend_quota_fail(self):
82         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
83                         'os_utils.get_neutron_client',
84                         return_value=self.neutron_client), \
85             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
86                        'os_utils.get_glance_client',
87                        return_value=self.glance_client), \
88             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
89                        'os_utils.get_keystone_client',
90                        return_value=self.keystone_client), \
91             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
92                        'os_utils.get_nova_client',
93                        return_value=self.nova_client), \
94             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
95                        'os_utils.get_image_id',
96                        return_value='image_id'), \
97             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
98                        'os_utils.get_tenant_id',
99                        return_value='tenant_id'), \
100             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
101                        'os_utils.update_sg_quota',
102                        return_value=False), \
103                 self.assertRaises(Exception) as context:
104             self.ims_vnf.deploy_orchestrator()
105             msg = "Failed to update security group quota"
106             msg += " for tenant test_tenant"
107             self.assertTrue(msg in context.exception)
108
109     def _get_image_id(self, client, name):
110         if name == 'test_image':
111             return 'image_id'
112         else:
113             return ''
114
115     def test_deploy_orchestrator_missing_flavor(self):
116         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
117                         'os_utils.get_neutron_client',
118                         return_value=self.neutron_client), \
119             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
120                        'os_utils.get_glance_client',
121                        return_value=self.glance_client), \
122             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
123                        'os_utils.get_keystone_client',
124                        return_value=self.keystone_client), \
125             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
126                        'os_utils.get_nova_client',
127                        return_value=self.nova_client), \
128             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
129                        'os_utils.get_image_id',
130                        side_effect=self._get_image_id), \
131             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
132                        'os_utils.get_tenant_id',
133                        return_value='tenant_id'), \
134             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
135                        'os_utils.update_sg_quota',
136                        return_value=True), \
137             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
138                        'os_utils.get_endpoint',
139                        return_value='public_auth_url'), \
140             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
141                        'Orchestrator', return_value=mock.Mock()) as m, \
142             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
143                        'os_utils.get_or_create_flavor',
144                        return_value=(False, '')), \
145                 self.assertRaises(Exception) as context:
146             self.ims_vnf.deploy_orchestrator()
147             self.assertTrue(m.set_credentials.called)
148             msg = "Failed to find required flavorfor this deployment"
149             self.assertTrue(msg in context.exception)
150
151     def test_deploy_orchestrator_missing_os_image(self):
152         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
153                         'os_utils.get_neutron_client',
154                         return_value=self.neutron_client), \
155             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
156                        'os_utils.get_glance_client',
157                        return_value=self.glance_client), \
158             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
159                        'os_utils.get_keystone_client',
160                        return_value=self.keystone_client), \
161             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
162                        'os_utils.get_nova_client',
163                        return_value=self.nova_client), \
164             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
165                        'os_utils.get_image_id',
166                        side_effect=self._get_image_id), \
167             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
168                        'os_utils.get_tenant_id',
169                        return_value='tenant_id'), \
170             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
171                        'os_utils.update_sg_quota',
172                        return_value=True), \
173             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
174                        'os_utils.get_endpoint',
175                        return_value='public_auth_url'), \
176             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
177                        'Orchestrator', return_value=mock.Mock()) as m, \
178             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
179                        'os_utils.get_or_create_flavor',
180                        return_value=(True, 'flavor_id')), \
181                 self.assertRaises(Exception) as context:
182             self.ims_vnf.deploy_orchestrator()
183             self.assertTrue(m.set_credentials.called)
184             self.assertTrue(m.set_flavor_id.called)
185             msg = "Failed to find required OS image for cloudify manager"
186             self.assertTrue(msg in context.exception)
187
188     def test_deploy_orchestrator_get_ext_network_fail(self):
189         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
190                         'os_utils.get_neutron_client',
191                         return_value=self.neutron_client), \
192             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
193                        'os_utils.get_glance_client',
194                        return_value=self.glance_client), \
195             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
196                        'os_utils.get_keystone_client',
197                        return_value=self.keystone_client), \
198             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
199                        'os_utils.get_nova_client',
200                        return_value=self.nova_client), \
201             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
202                        'os_utils.get_image_id',
203                        return_value='image_id'), \
204             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
205                        'os_utils.get_tenant_id',
206                        return_value='tenant_id'), \
207             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
208                        'os_utils.update_sg_quota',
209                        return_value=True), \
210             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
211                        'os_utils.get_endpoint',
212                        return_value='public_auth_url'), \
213             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
214                        'Orchestrator', return_value=mock.Mock()) as m, \
215             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
216                        'os_utils.get_or_create_flavor',
217                        return_value=(True, 'flavor_id')), \
218             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
219                        'os_utils.get_external_net',
220                        return_value=''), \
221                 self.assertRaises(Exception) as context:
222             self.ims_vnf.deploy_orchestrator()
223             self.assertTrue(m.set_credentials.called)
224             self.assertTrue(m.set_flavor_id.called)
225             self.assertTrue(m.set_image_id.called)
226             msg = "Failed to get external network"
227             self.assertTrue(msg in context.exception)
228
229     def test_deploy_orchestrator_with_error(self):
230         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
231                         'os_utils.get_neutron_client',
232                         return_value=self.neutron_client), \
233             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
234                        'os_utils.get_glance_client',
235                        return_value=self.glance_client), \
236             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
237                        'os_utils.get_keystone_client',
238                        return_value=self.keystone_client), \
239             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
240                        'os_utils.get_nova_client',
241                        return_value=self.nova_client), \
242             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
243                        'os_utils.get_image_id',
244                        return_value='image_id'), \
245             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
246                        'os_utils.get_tenant_id',
247                        return_value='tenant_id'), \
248             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
249                        'os_utils.update_sg_quota',
250                        return_value=True), \
251             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
252                        'os_utils.get_endpoint',
253                        return_value='public_auth_url'), \
254             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
255                        'Orchestrator') as m, \
256             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
257                        'os_utils.get_or_create_flavor',
258                        return_value=(True, 'flavor_id')), \
259             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
260                        'os_utils.get_external_net',
261                        return_value='ext_net'), \
262             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
263                        'ft_utils.get_resolvconf_ns',
264                        return_value=True), \
265             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
266                        'ft_utils.execute_command'):
267             mock_obj = mock.Mock()
268             attrs = {'deploy_manager.return_value': 'error'}
269             mock_obj.configure_mock(**attrs)
270
271             m.return_value = mock_obj
272
273             self.assertEqual(self.ims_vnf.deploy_orchestrator(),
274                              {'status': 'FAIL', 'result': 'error'})
275
276     def test_deploy_orchestrator_default(self):
277         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
278                         'os_utils.get_neutron_client',
279                         return_value=self.neutron_client), \
280             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
281                        'os_utils.get_glance_client',
282                        return_value=self.glance_client), \
283             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
284                        'os_utils.get_keystone_client',
285                        return_value=self.keystone_client), \
286             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
287                        'os_utils.get_nova_client',
288                        return_value=self.nova_client), \
289             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
290                        'os_utils.get_image_id',
291                        return_value='image_id'), \
292             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
293                        'os_utils.get_tenant_id',
294                        return_value='tenant_id'), \
295             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
296                        'os_utils.update_sg_quota',
297                        return_value=True), \
298             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
299                        'os_utils.get_endpoint',
300                        return_value='public_auth_url'), \
301             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
302                        'Orchestrator') as m, \
303             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
304                        'os_utils.get_or_create_flavor',
305                        return_value=(True, 'flavor_id')), \
306             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
307                        'os_utils.get_external_net',
308                        return_value='ext_net'), \
309             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
310                        'ft_utils.get_resolvconf_ns',
311                        return_value=True), \
312             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
313                        'ft_utils.execute_command'):
314             mock_obj = mock.Mock()
315             attrs = {'deploy_manager.return_value': ''}
316             mock_obj.configure_mock(**attrs)
317
318             m.return_value = mock_obj
319
320             self.assertEqual(self.ims_vnf.deploy_orchestrator(),
321                              {'status': 'PASS', 'result': ''})
322
323     def test_deploy_vnf_missing_flavor(self):
324         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
325                         'Clearwater', return_value=mock.Mock()), \
326             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
327                        'os_utils.get_or_create_flavor',
328                        return_value=(False, '')), \
329                 self.assertRaises(Exception) as context:
330             self.ims_vnf.deploy_vnf()
331             msg = "Failed to find required flavor for this deployment"
332             self.assertTrue(msg in context.exception)
333
334     def test_deploy_vnf_missing_os_image(self):
335         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
336                         'Clearwater', return_value=mock.Mock()) as m, \
337             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
338                        'os_utils.get_or_create_flavor',
339                        return_value=(True, 'test_flavor')), \
340             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
341                        'os_utils.get_image_id',
342                        return_value=''), \
343                 self.assertRaises(Exception) as context:
344             self.ims_vnf.deploy_vnf()
345             msg = "Failed to find required OS image"
346             msg += " for clearwater VMs"
347             self.assertTrue(msg in context.exception)
348             self.assertTrue(m.set_flavor_id.called)
349
350     def test_deploy_vnf_missing_get_ext_net(self):
351         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
352                         'Clearwater', return_value=mock.Mock()) as m, \
353             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
354                        'os_utils.get_or_create_flavor',
355                        return_value=(True, 'test_flavor')), \
356             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
357                        'os_utils.get_image_id',
358                        return_value='image_id'), \
359             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
360                        'os_utils.get_external_net',
361                        return_value=''), \
362                 self.assertRaises(Exception) as context:
363             self.ims_vnf.deploy_vnf()
364             msg = "Failed to get external network"
365             self.assertTrue(msg in context.exception)
366             self.assertTrue(m.set_flavor_id.called)
367             self.assertTrue(m.set_image_id.called)
368
369     def test_deploy_vnf_with_error(self):
370         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
371                         'Clearwater') as m, \
372             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
373                        'os_utils.get_or_create_flavor',
374                        return_value=(True, 'test_flavor')), \
375             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
376                        'os_utils.get_image_id',
377                        return_value='image_id'), \
378             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
379                        'os_utils.get_external_net',
380                        return_value='ext_net'):
381             mock_obj = mock.Mock()
382             attrs = {'deploy_vnf.return_value': 'error'}
383             mock_obj.configure_mock(**attrs)
384
385             m.return_value = mock_obj
386
387             self.assertEqual(self.ims_vnf.deploy_vnf(),
388                              {'status': 'FAIL', 'result': 'error'})
389
390     def test_deploy_vnf_default(self):
391         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
392                         'Clearwater') as m, \
393             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
394                        'os_utils.get_or_create_flavor',
395                        return_value=(True, 'test_flavor')), \
396             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
397                        'os_utils.get_image_id',
398                        return_value='image_id'), \
399             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
400                        'os_utils.get_external_net',
401                        return_value='ext_net'):
402             mock_obj = mock.Mock()
403             attrs = {'deploy_vnf.return_value': ''}
404             mock_obj.configure_mock(**attrs)
405
406             m.return_value = mock_obj
407
408             self.assertEqual(self.ims_vnf.deploy_vnf(),
409                              {'status': 'PASS', 'result': ''})
410
411     def test_test_vnf_ip_retrieval_failure(self):
412         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
413                         'os.popen', side_effect=Exception), \
414                 self.assertRaises(Exception) as context:
415             msg = "Unable to retrieve the IP of the "
416             msg += "cloudify manager server !"
417             self.ims_vnf.test_vnf()
418             self.assertTrue(msg in context.exception)
419
420     def test_test_vnf_fail(self):
421         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
422                         'os.popen'), \
423             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
424                        'requests.get') as mock_get, \
425             mock.patch.object(self.ims_vnf, 'config_ellis'), \
426             mock.patch.object(self.ims_vnf,
427                               'run_clearwater_live_test') as clearwater_obj:
428                 clearwater_obj.return_value = ''
429
430                 mock_obj2 = mock.Mock()
431                 attrs = {'json.return_value': {'outputs':
432                                                {'dns_ip': 'test_dns_ip',
433                                                 'ellis_ip': 'test_ellis_ip'}}}
434                 mock_obj2.configure_mock(**attrs)
435                 mock_get.return_value = mock_obj2
436
437                 self.assertEqual(self.ims_vnf.test_vnf(),
438                                  {'status': 'FAIL', 'result': ''})
439
440     def test_test_vnf_pass(self):
441         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
442                         'os.popen'), \
443             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
444                        'requests.get') as mock_get, \
445             mock.patch.object(self.ims_vnf, 'config_ellis'), \
446             mock.patch.object(self.ims_vnf,
447                               'run_clearwater_live_test') as clearwater_obj:
448                 clearwater_obj.return_value = 'vims_test_result'
449
450                 mock_obj2 = mock.Mock()
451                 attrs = {'json.return_value': {'outputs':
452                                                {'dns_ip': 'test_dns_ip',
453                                                 'ellis_ip': 'test_ellis_ip'}}}
454                 mock_obj2.configure_mock(**attrs)
455                 mock_get.return_value = mock_obj2
456
457                 self.assertEqual(self.ims_vnf.test_vnf(),
458                                  {'status': 'PASS',
459                                   'result': 'vims_test_result'})
460
461     def test_download_and_add_image_on_glance_incorrect_url(self):
462         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
463                         'os.makedirs'), \
464             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
465                        'ft_utils.download_url',
466                        return_value=False):
467             resp = cloudify_ims.download_and_add_image_on_glance(self.
468                                                                  glance_client,
469                                                                  'image_name',
470                                                                  'http://url',
471                                                                  'data_dir')
472             self.assertEqual(resp, False)
473
474     def test_download_and_add_image_on_glance_image_creation_failure(self):
475         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
476                         'os.makedirs'), \
477             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
478                        'ft_utils.download_url',
479                        return_value=True), \
480             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
481                        'os_utils.create_glance_image',
482                        return_value=''):
483             resp = cloudify_ims.download_and_add_image_on_glance(self.
484                                                                  glance_client,
485                                                                  'image_name',
486                                                                  'http://url',
487                                                                  'data_dir')
488             self.assertEqual(resp, False)
489
490
491 if __name__ == "__main__":
492     logging.disable(logging.CRITICAL)
493     unittest.main(verbosity=2)