1 ##############################################################################
2 # Copyright (c) 2019 ZTE Corporation and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
10 from os.path import isfile, join
13 from traceback import format_exc
15 from doctor_tests import config
16 from doctor_tests.identity_auth import get_identity_auth
17 from doctor_tests.identity_auth import get_session
18 from doctor_tests.image import Image
19 from doctor_tests.installer import get_installer
20 import doctor_tests.logger as doctor_log
21 from doctor_tests.scenario.fault_management import FaultManagement
22 from doctor_tests.os_clients import nova_client
23 from doctor_tests.scenario.maintenance import Maintenance
24 from doctor_tests.user import User
27 Logger = doctor_log.Logger('doctor')
28 LOG = Logger.getLogger()
29 LogFile = Logger.getLogFilename()
32 class DoctorTest(object):
34 def __init__(self, conf):
36 self.image = Image(self.conf, LOG)
37 self.user = User(self.conf, LOG)
38 self.installer = get_installer(self.conf, LOG)
39 auth = get_identity_auth(project=self.conf.doctor_project)
40 self.nova = nova_client(self.conf.nova_version,
41 get_session(auth=auth))
44 # prepare the cloud env
45 self.installer.setup()
46 # preparing VM image...
49 # creating test user...
52 def test_fault_management(self):
54 # Retry once if notified_time is None
57 self.fault_management = None
58 LOG.info('doctor fault management test starting.......')
59 transport_url = self.installer.get_transport_url()
60 self.fault_management = \
61 FaultManagement(self.conf, self.installer, self.user, LOG,
65 self.fault_management.setup()
67 # wait for aodh alarms are updated in caches for event
68 # evaluator,sleep time should be larger than
69 # event_alarm_cache_ttl (default 60)
70 # (tojuvone) Fraser currently needs 120
73 # injecting host failure...
74 # NOTE (umar) add INTERFACE_NAME logic to host injection
75 self.fault_management.start()
78 # verify the test results
79 # NOTE (umar) copy remote monitor.log file when
81 self.fault_management.check_host_status('down')
82 self.fault_management.check_notification_time()
85 except Exception as e:
86 LOG.error('doctor fault management test failed, '
88 if 'notified_time=None' in str(e):
90 LOG.info('doctor fault management retry')
92 LOG.error(format_exc())
95 if self.fault_management is not None:
96 self.fault_management.cleanup()
98 def _amount_compute_nodes(self):
99 services = self.nova.services.list(binary='nova-compute')
102 def test_maintenance(self):
103 cnodes = self._amount_compute_nodes()
105 # need 2 compute for redundancy and one spare to migrate
106 LOG.info('not enough compute nodes, skipping doctor '
109 elif self.conf.installer.type not in ['apex', 'fuel', 'devstack']:
110 LOG.info('not supported installer, skipping doctor '
115 LOG.info('doctor maintenance test starting.......')
116 trasport_url = self.installer.get_transport_url()
117 maintenance = Maintenance(trasport_url, self.conf, LOG)
118 maintenance.setup_maintenance(self.user)
120 # wait for aodh alarms are updated in caches for event evaluator,
121 # sleep time should be larger than event_alarm_cache_ttl
123 LOG.info('wait aodh for 120s.......')
126 session_id = maintenance.start_maintenance()
127 maintenance.wait_maintenance_complete(session_id)
129 LOG.info('doctor maintenance complete.......')
131 except Exception as e:
132 LOG.error('doctor maintenance test failed, Exception=%s' % e)
133 LOG.error(format_exc())
136 if maintenance is not None:
137 maintenance.cleanup_maintenance()
140 """run doctor tests"""
142 LOG.info('doctor test starting.......')
144 # prepare common test env
147 if self.conf.test_case == 'all':
148 self.test_fault_management()
149 self.test_maintenance()
151 function = 'test_%s' % self.conf.test_case
152 if hasattr(self, function):
153 getattr(self, function)()
155 raise Exception('Can not find function <%s> in'
156 'DoctorTest, see config manual'
158 except Exception as e:
159 LOG.error('doctor test failed, Exception=%s' % e)
160 LOG.error(format_exc())
166 self.installer.cleanup()
173 test_dir = os.path.split(os.path.realpath(__file__))[0]
174 doctor_root_dir = os.path.dirname(test_dir)
176 config_file_dir = '{0}/{1}'.format(doctor_root_dir, 'etc/')
177 config_files = [join(config_file_dir, f)
178 for f in os.listdir(config_file_dir)
179 if isfile(join(config_file_dir, f))]
181 conf = config.prepare_conf(args=sys.argv[1:],
182 config_files=config_files)
184 doctor = DoctorTest(conf)