diff options
29 files changed, 273 insertions, 160 deletions
@@ -4,6 +4,7 @@ **.log *.pyc /*.egg-info/ +.eggs/ /build/ /docs_build/ /docs_output/ diff --git a/doctor_tests/alarm.py b/doctor_tests/alarm.py index 3b1aaf3f..df49bab3 100644 --- a/doctor_tests/alarm.py +++ b/doctor_tests/alarm.py @@ -52,7 +52,7 @@ class Alarm(object): for i in range(0, self.conf.instance_count): alarm_name = self.alarm_names[i] if alarm_name in alarms: - continue; + continue vm_name = '%s%d' % (self.conf.instance_basename, i) vm_id = getattr(servers[vm_name], 'id') alarm_request = dict( diff --git a/doctor_tests/common/__init__.py b/doctor_tests/common/__init__.py index e68a3070..48893ae6 100644 --- a/doctor_tests/common/__init__.py +++ b/doctor_tests/common/__init__.py @@ -5,4 +5,4 @@ # are made available under the terms of the Apache License, Version 2.0 # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 -##############################################################################
\ No newline at end of file +############################################################################## diff --git a/doctor_tests/common/utils.py b/doctor_tests/common/utils.py index 01889d9a..1a84c824 100644 --- a/doctor_tests/common/utils.py +++ b/doctor_tests/common/utils.py @@ -77,7 +77,8 @@ class SSHClient(object): output.append(line.decode('utf-8')) if ret: if self.log: - self.log.info("*** FAILED to run command %s (%s)" % (command, ret)) + self.log.info("*** FAILED to run command %s (%s)" + % (command, ret)) raise Exception( "Unable to run \ncommand: %s\nret: %s" % (command, ret)) diff --git a/doctor_tests/consumer/base.py b/doctor_tests/consumer/base.py index 35170748..b6c4b34e 100644 --- a/doctor_tests/consumer/base.py +++ b/doctor_tests/consumer/base.py @@ -23,4 +23,4 @@ class BaseConsumer(object): @abc.abstractmethod def stop(self): - pass
\ No newline at end of file + pass diff --git a/doctor_tests/consumer/sample.py b/doctor_tests/consumer/sample.py index d76a764b..eaf5fabd 100644 --- a/doctor_tests/consumer/sample.py +++ b/doctor_tests/consumer/sample.py @@ -55,8 +55,8 @@ class ConsumerApp(Thread): @app.route('/failure', methods=['POST']) def event_posted(): self.log.info('doctor consumer notified at %s' % time.time()) - self.log.info('sample consumer received data = %s' % request.data) data = json.loads(request.data.decode('utf8')) + self.log.info('sample consumer received data = %s' % data) return 'OK' @app.route('/shutdown', methods=['POST']) diff --git a/doctor_tests/identity_auth.py b/doctor_tests/identity_auth.py index eb046986..0d429597 100644 --- a/doctor_tests/identity_auth.py +++ b/doctor_tests/identity_auth.py @@ -18,8 +18,8 @@ def get_identity_auth(username=None, password=None, project=None): password = password or os.environ['OS_PASSWORD'] user_domain_name = os.environ.get('OS_USER_DOMAIN_NAME') or 'Default' user_domain_id = os.environ.get('OS_USER_DOMAIN_ID') or 'default' - project_name = project or os.environ.get('OS_PROJECT_NAME') \ - or os.environ.get('OS_TENANT_NAME') + project_name = (project or os.environ.get('OS_PROJECT_NAME') or + os.environ.get('OS_TENANT_NAME')) project_domain_name = os.environ.get('OS_PROJECT_DOMAIN_NAME') or 'Default' project_domain_id = os.environ.get('OS_PROJECT_DOMAIN_ID') or 'default' diff --git a/doctor_tests/image.py b/doctor_tests/image.py index 2e313e12..9961b22d 100644 --- a/doctor_tests/image.py +++ b/doctor_tests/image.py @@ -28,7 +28,7 @@ OPTS = [ help='the name of image file', required=True), cfg.StrOpt('image_download_url', - default='https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img', + default='https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img', # noqa help='the url where to get the image', required=True), ] @@ -53,10 +53,12 @@ class Image(object): resp = urllib.request.urlopen(self.conf.image_download_url) with open(self.conf.image_filename, "wb") as file: file.write(resp.read()) - self.image = self.glance.images.create(name=self.conf.image_name, - disk_format=self.conf.image_format, - container_format="bare", - visibility="public") + self.image = \ + self.glance.images.create( + name=self.conf.image_name, + disk_format=self.conf.image_format, + container_format="bare", + visibility="public") self.glance.images.upload(self.image['id'], open(self.conf.image_filename, 'rb')) else: diff --git a/doctor_tests/inspector/base.py b/doctor_tests/inspector/base.py index 854f0695..a6eae451 100644 --- a/doctor_tests/inspector/base.py +++ b/doctor_tests/inspector/base.py @@ -27,4 +27,4 @@ class BaseInspector(object): @abc.abstractmethod def stop(self): - pass
\ No newline at end of file + pass diff --git a/doctor_tests/inspector/congress.py b/doctor_tests/inspector/congress.py index c89a41bd..fb747ec5 100644 --- a/doctor_tests/inspector/congress.py +++ b/doctor_tests/inspector/congress.py @@ -20,13 +20,13 @@ class CongressInspector(BaseInspector): policy = 'classification' rules = { 'host_down': - 'host_down(host) :- doctor:events(hostname=host, type="compute.host.down", status="down")', + 'host_down(host) :- doctor:events(hostname=host, type="compute.host.down", status="down")', # noqa 'active_instance_in_host': - 'active_instance_in_host(vmid, host) :- nova:servers(id=vmid, host_name=host, status="ACTIVE")', + 'active_instance_in_host(vmid, host) :- nova:servers(id=vmid, host_name=host, status="ACTIVE")', # noqa 'host_force_down': - 'execute[nova:services.force_down(host, "nova-compute", "True")] :- host_down(host)', + 'execute[nova:services.force_down(host, "nova-compute", "True")] :- host_down(host)', # noqa 'error_vm_states': - 'execute[nova:servers.reset_state(vmid, "error")] :- host_down(host), active_instance_in_host(vmid, host)' + 'execute[nova:servers.reset_state(vmid, "error")] :- host_down(host), active_instance_in_host(vmid, host)' # noqa } def __init__(self, conf, log): @@ -38,12 +38,14 @@ class CongressInspector(BaseInspector): def _init_driver_and_ds(self): datasources = \ - {ds['name']: ds for ds in self.congress.list_datasources()['results']} + {ds['name']: ds for ds in + self.congress.list_datasources()['results']} # check nova_api version nova_api_version = datasources['nova']['config'].get('api_version') if nova_api_version and nova_api_version < self.nova_api_min_version: - raise Exception('Congress Nova datasource API version < nova_api_min_version(%s)' + raise Exception('Congress Nova datasource API ' + 'version < nova_api_min_version(%s)' % self.nova_api_min_version) # create doctor datasource if it's not exist @@ -54,7 +56,8 @@ class CongressInspector(BaseInspector): # check whether doctor driver exist drivers = \ - {driver['id']: driver for driver in self.congress.list_drivers()['results']} + {driver['id']: driver for driver in + self.congress.list_drivers()['results']} if self.doctor_driver not in drivers: raise Exception('Do not support doctor driver in congress') @@ -66,7 +69,8 @@ class CongressInspector(BaseInspector): ds = self.congress.list_datasources()['results'] doctor_ds = next((item for item in ds if item['driver'] == 'doctor'), None) - congress_endpoint = self.congress.httpclient.get_endpoint(auth=self.auth) + congress_endpoint = \ + self.congress.httpclient.get_endpoint(auth=self.auth) return ('%s/v1/data-sources/%s/tables/events/rows' % (congress_endpoint, doctor_ds['id'])) diff --git a/doctor_tests/inspector/sample.py b/doctor_tests/inspector/sample.py index fe67a903..fadfd3d4 100644 --- a/doctor_tests/inspector/sample.py +++ b/doctor_tests/inspector/sample.py @@ -58,12 +58,15 @@ class SampleInspector(BaseInspector): try: host = server.__dict__.get('OS-EXT-SRV-ATTR:host') self.servers[host].append(server) - self.log.debug('get hostname=%s from server=%s' % (host, server)) + self.log.debug('get hostname=%s from server=%s' + % (host, server)) except Exception as e: - self.log.info('can not get hostname from server=%s' % server) + self.log.info('can not get hostname from server=%s, error=%s' + % (server, e)) def get_inspector_url(self): - return 'http://%s:%s/events' % (self.conf.inspector.ip, self.conf.inspector.port) + return 'http://%s:%s/events' % (self.conf.inspector.ip, + self.conf.inspector.port) def start(self): self.log.info('sample inspector start......') @@ -105,7 +108,8 @@ class SampleInspector(BaseInspector): @utils.run_async def _disable_compute_host(self, hostname): self.nova.services.force_down(hostname, 'nova-compute', True) - self.log.info('doctor mark host(%s) down at %s' % (hostname, time.time())) + self.log.info('doctor mark host(%s) down at %s' + % (hostname, time.time())) @utils.run_async def _vms_reset_state(self, state, hostname): @@ -113,7 +117,8 @@ class SampleInspector(BaseInspector): @utils.run_async def _vm_reset_state(nova, server, state): nova.servers.reset_state(server, state) - self.log.info('doctor mark vm(%s) error at %s' % (server, time.time())) + self.log.info('doctor mark vm(%s) error at %s' + % (server, time.time())) thrs = [] for nova, server in zip(self.novaclients, self.servers[hostname]): @@ -129,7 +134,8 @@ class SampleInspector(BaseInspector): @utils.run_async def _set_port_data_plane_status(port_id): self.neutron.update_port(port_id, body) - self.log.info('doctor set data plane status %s on port %s' % (status, port_id)) + self.log.info('doctor set data plane status %s on port %s' + % (status, port_id)) thrs = [] params = {'binding:host_id': hostname} @@ -153,9 +159,11 @@ class InspectorApp(Thread): @app.route('/events', methods=['PUT']) def event_posted(): - self.log.info('event posted in sample inspector at %s' % time.time()) + self.log.info('event posted in sample inspector at %s' + % time.time()) self.log.info('sample inspector = %s' % self.inspector) - self.log.info('sample inspector received data = %s' % request.data) + self.log.info('sample inspector received data = %s' + % request.data) events = json.loads(request.data.decode('utf8')) self.inspector.handle_events(events) return "OK" diff --git a/doctor_tests/installer/apex.py b/doctor_tests/installer/apex.py index 16f0376e..aaacb385 100644 --- a/doctor_tests/installer/apex.py +++ b/doctor_tests/installer/apex.py @@ -72,9 +72,11 @@ class ApexInstaller(BaseInstaller): "| sed -e 's/^.*ctlplane=//' |awk '{print $1}'" ret, controllers = self.client.ssh(command) if ret: - raise Exception('Exec command to get controller ips in Apex installer failed' - 'ret=%s, output=%s' % (ret, controllers)) - self.log.info('Get controller_ips:%s from Apex installer' % controllers) + raise Exception('Exec command to get controller ips' + 'in Apex installer failed, ret=%s, output=%s' + % (ret, controllers)) + self.log.info('Get controller_ips:%s from Apex installer' + % controllers) self.controllers = controllers def get_host_ip_from_hostname(self, hostname): @@ -82,20 +84,31 @@ class ApexInstaller(BaseInstaller): hostname_in_undercloud = hostname.split('.')[0] - command = "source stackrc; nova show %s | awk '/ ctlplane network /{print $5}'" % (hostname_in_undercloud) + command = "source stackrc; nova show %s | awk '/ ctlplane network /{print $5}'" % (hostname_in_undercloud) # noqa ret, host_ip = self.client.ssh(command) if ret: - raise Exception('Exec command to get host ip from hostname(%s) in Apex installer failed' - 'ret=%s, output=%s' % (hostname, ret, host_ip)) - self.log.info('Get host_ip:%s from host_name:%s in Apex installer' % (host_ip, hostname)) + raise Exception('Exec command to get host ip from hostname(%s)' + 'in Apex installer failed, ret=%s, output=%s' + % (hostname, ret, host_ip)) + self.log.info('Get host_ip:%s from host_name:%s in Apex installer' + % (host_ip, hostname)) return host_ip[0] def setup_stunnel(self): - self.log.info('Setup ssh stunnel in controller nodes in Apex installer......') + self.log.info('Setup ssh stunnel in controller nodes' + ' in Apex installer......') for node_ip in self.controllers: - cmd = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i %s %s@%s -R %s:localhost:%s sleep 600 > ssh_tunnel.%s.log 2>&1 < /dev/null &" \ - % (self.key_file, self.node_user_name, node_ip, - self.conf.consumer.port, self.conf.consumer.port, node_ip) + cmd = ("ssh -o UserKnownHostsFile=/dev/null" + "-o StrictHostKeyChecking=no" + "-i %s %s@%s -R %s:localhost:%s" + "sleep 600 > ssh_tunnel.%s.log" + "2>&1 < /dev/null &" + % (self.key_file, + self.node_user_name, + node_ip, + self.conf.consumer.port, + self.conf.consumer.port, + node_ip)) server = subprocess.Popen(cmd, shell=True) self.servers.append(server) server.communicate() @@ -104,7 +117,8 @@ class ApexInstaller(BaseInstaller): self.log.info('Set apply patches start......') for node_ip in self.controllers: - client = SSHClient(node_ip, self.node_user_name, key_filename=self.key_file) + client = SSHClient(node_ip, self.node_user_name, + key_filename=self.key_file) self.controller_clients.append(client) self._ceilometer_apply_patches(client, self.cm_set_script) @@ -116,13 +130,15 @@ class ApexInstaller(BaseInstaller): def _ceilometer_apply_patches(self, ssh_client, script_name): installer_dir = os.path.dirname(os.path.realpath(__file__)) - script_abs_path = '{0}/{1}/{2}'.format(installer_dir, 'common', script_name) + script_abs_path = '{0}/{1}/{2}'.format(installer_dir, + 'common', script_name) ssh_client.scp(script_abs_path, script_name) cmd = 'sudo python %s' % script_name ret, output = ssh_client.ssh(cmd) if ret: - raise Exception('Do the ceilometer command in controller node failed....' - 'ret=%s, cmd=%s, output=%s' % (ret, cmd, output)) - ssh_client.ssh('sudo systemctl restart openstack-ceilometer-notification.service') - + raise Exception('Do the ceilometer command in controller' + ' node failed, ret=%s, cmd=%s, output=%s' + % (ret, cmd, output)) + ssh_client.ssh('sudo systemctl restart ' + 'openstack-ceilometer-notification.service') diff --git a/doctor_tests/installer/base.py b/doctor_tests/installer/base.py index fa39816a..dcb5b1d8 100644 --- a/doctor_tests/installer/base.py +++ b/doctor_tests/installer/base.py @@ -9,6 +9,7 @@ import abc import six + @six.add_metaclass(abc.ABCMeta) class BaseInstaller(object): def __init__(self, conf, log): diff --git a/doctor_tests/installer/common/congress.py b/doctor_tests/installer/common/congress.py index db882de2..cc58c390 100644 --- a/doctor_tests/installer/common/congress.py +++ b/doctor_tests/installer/common/congress.py @@ -6,6 +6,8 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## + + def set_doctor_driver_conf(ssh_client, restart_cmd): cg_set_cmd = '''#!/bin/bash co_conf=/etc/congress/congress.conf @@ -23,8 +25,9 @@ fi ret, output = ssh_client.ssh(cg_set_cmd) if ret: - raise Exception('Do the congress command in controller node failed....' - 'ret=%s, cmd=%s, output=%s' % (ret, cg_set_cmd, output)) + raise Exception('Do the congress command in controller node failed...' + 'ret=%s, cmd=%s, output=%s' + % (ret, cg_set_cmd, output)) def restore_doctor_driver_conf(ssh_client, restart_cmd): @@ -43,5 +46,6 @@ fi ret, output = ssh_client.ssh(cg_restore_cmd) if ret: - raise Exception('Do the congress command in controller node failed....' - 'ret=%s, cmd=%s, output=%s' % (ret, cg_restore_cmd, output)) + raise Exception('Do the congress command in controller node failed...' + 'ret=%s, cmd=%s, output=%s' + % (ret, cg_restore_cmd, output)) diff --git a/doctor_tests/installer/common/set_ceilometer.py b/doctor_tests/installer/common/set_ceilometer.py index f5946cb2..4050aaef 100644 --- a/doctor_tests/installer/common/set_ceilometer.py +++ b/doctor_tests/installer/common/set_ceilometer.py @@ -33,7 +33,8 @@ def set_notifier_topic(): publishers.append(event_notifier_topic) config_modified = True else: - print('NOTE: event notifier is configured in ceilometer as we needed') + print('NOTE: event notifier is configured' + 'in ceilometer as we needed') if config_modified: shutil.copyfile(ep_file, ep_file_bak) diff --git a/doctor_tests/installer/common/vitrage.py b/doctor_tests/installer/common/vitrage.py index 9ea32271..30a73f5d 100644 --- a/doctor_tests/installer/common/vitrage.py +++ b/doctor_tests/installer/common/vitrage.py @@ -9,7 +9,8 @@ import os -vitrage_template_file = '/etc/vitrage/templates/vitrage_host_down_scenarios.yaml' +vitrage_template_file = \ + '/etc/vitrage/templates/vitrage_host_down_scenarios.yaml' template = """ metadata: @@ -86,13 +87,15 @@ scenarios: action_type: mark_down action_target: target: instance -""" +""" # noqa def set_vitrage_host_down_template(): if os.path.isfile(vitrage_template_file): - print('Vitrage host_down template file: %s already exists.' % vitrage_template_file) + print('Vitrage host_down template file: %s already exists.' + % vitrage_template_file) else: - print('Create Vitrage host_down template file:%s.' % vitrage_template_file) + print('Create Vitrage host_down template file:%s.' + % vitrage_template_file) with open(vitrage_template_file, 'w') as file: file.write(template) diff --git a/doctor_tests/installer/local.py b/doctor_tests/installer/local.py index 453755c2..fee14f33 100644 --- a/doctor_tests/installer/local.py +++ b/doctor_tests/installer/local.py @@ -11,7 +11,8 @@ import shutil import subprocess from doctor_tests.installer.base import BaseInstaller -from doctor_tests.installer.common.vitrage import set_vitrage_host_down_template +from doctor_tests.installer.common.vitrage import \ + set_vitrage_host_down_template from doctor_tests.common.constants import Inspector from doctor_tests.common.utils import load_json_file from doctor_tests.common.utils import write_json_file @@ -36,7 +37,8 @@ class LocalInstaller(BaseInstaller): self.restore_apply_patches() def get_ssh_key_from_installer(self): - self.log.info('Assuming SSH keys already exchanged with computer for local installer type') + self.log.info('Assuming SSH keys already exchanged with computer' + 'for local installer type') return None def get_host_ip_from_hostname(self, hostname): @@ -47,7 +49,8 @@ class LocalInstaller(BaseInstaller): stdout, stderr = server.communicate() host_ip = stdout.strip().decode("utf-8") - self.log.info('Get host_ip:%s from host_name:%s in local installer' % (host_ip, hostname)) + self.log.info('Get host_ip:%s from host_name:%s in local installer' + % (host_ip, hostname)) return host_ip def set_apply_patches(self): @@ -103,7 +106,8 @@ class LocalInstaller(BaseInstaller): def _restore_nova_policy(self): if self.policy_modified: - shutil.copyfile(self.nova_policy_file_backup, self.nova_policy_file) + shutil.copyfile(self.nova_policy_file_backup, + self.nova_policy_file) os.remove(self.nova_policy_file_backup) elif self.add_policy_file: os.remove(self.nova_policy_file) diff --git a/doctor_tests/instance.py b/doctor_tests/instance.py index 27f412e2..960e7057 100644 --- a/doctor_tests/instance.py +++ b/doctor_tests/instance.py @@ -54,14 +54,15 @@ class Instance(object): flavors = {flavor.name: flavor for flavor in self.nova.flavors.list()} flavor = flavors.get(self.conf.flavor) image = self.nova.glance.find_image(self.conf.image_name) - network = self.neutron.list_networks(name=self.conf.net_name)['networks'][0] + network = \ + self.neutron.list_networks(name=self.conf.net_name)['networks'][0] nics = {'net-id': network['id']} self.servers = \ {getattr(server, 'name'): server for server in self.nova.servers.list()} for i in range(0, self.conf.instance_count): - vm_name = "%s%d"%(self.conf.instance_basename, i) + vm_name = "%s%d" % (self.conf.instance_basename, i) self.vm_names.append(vm_name) if vm_name not in self.servers: server = self.nova.servers.create(vm_name, image, @@ -111,4 +112,3 @@ class Instance(object): count += 1 time.sleep(2) raise Exception('time out for vm launch') - diff --git a/doctor_tests/main.py b/doctor_tests/main.py index b9a34430..3f346356 100644 --- a/doctor_tests/main.py +++ b/doctor_tests/main.py @@ -95,7 +95,8 @@ class DoctorTest(object): self.setup() # wait for aodh alarms are updated in caches for event evaluator, - # sleep time should be larger than event_alarm_cache_ttl(default 60) + # sleep time should be larger than event_alarm_cache_ttl + # (default 60) time.sleep(60) # injecting host failure... @@ -110,9 +111,11 @@ class DoctorTest(object): notification_time = calculate_notification_time(LogFile) if notification_time < 1 and notification_time > 0: - LOG.info('doctor test successfully, notification_time=%s' % notification_time) + LOG.info('doctor test successfully, notification_time=%s' + % notification_time) else: - LOG.error('doctor test failed, notification_time=%s' % notification_time) + LOG.error('doctor test failed, notification_time=%s' + % notification_time) sys.exit(1) if self.conf.profiler_type: @@ -144,13 +147,15 @@ class DoctorTest(object): return Host(host_name, host_ip) def check_host_status(self, hostname, state): - service = self.nova.services.list(host=hostname, binary='nova-compute') + service = self.nova.services.list(host=hostname, + binary='nova-compute') host_state = service[0].__dict__.get('state') assert host_state == state def unset_forced_down_hosts(self): if self.down_host: - self.nova.services.force_down(self.down_host.name, 'nova-compute', False) + self.nova.services.force_down(self.down_host.name, + 'nova-compute', False) time.sleep(2) self.check_host_status(self.down_host.name, 'up') @@ -178,11 +183,16 @@ class DoctorTest(object): # TODO(yujunz) check the actual delay to verify time sync status # expected ~1s delay from $trigger to $linkdown relative_start = linkdown - os.environ['DOCTOR_PROFILER_T00'] = str(int((linkdown - relative_start)*1000)) - os.environ['DOCTOR_PROFILER_T01'] = str(int((detected - relative_start) * 1000)) - os.environ['DOCTOR_PROFILER_T03'] = str(int((vmdown - relative_start) * 1000)) - os.environ['DOCTOR_PROFILER_T04'] = str(int((hostdown - relative_start) * 1000)) - os.environ['DOCTOR_PROFILER_T09'] = str(int((notified - relative_start) * 1000)) + os.environ['DOCTOR_PROFILER_T00'] = \ + str(int((linkdown - relative_start) * 1000)) + os.environ['DOCTOR_PROFILER_T01'] = \ + str(int((detected - relative_start) * 1000)) + os.environ['DOCTOR_PROFILER_T03'] = \ + str(int((vmdown - relative_start) * 1000)) + os.environ['DOCTOR_PROFILER_T04'] = \ + str(int((hostdown - relative_start) * 1000)) + os.environ['DOCTOR_PROFILER_T09'] = \ + str(int((notified - relative_start) * 1000)) profiler_main(log=LOG) @@ -206,7 +216,8 @@ def main(): doctor_root_dir = os.path.dirname(test_dir) config_file_dir = '{0}/{1}'.format(doctor_root_dir, 'etc/') - config_files = [join(config_file_dir, f) for f in os.listdir(config_file_dir) + config_files = [join(config_file_dir, f) + for f in os.listdir(config_file_dir) if isfile(join(config_file_dir, f))] conf = config.prepare_conf(args=sys.argv[1:], diff --git a/doctor_tests/monitor/__init__.py b/doctor_tests/monitor/__init__.py index 7e30c9f8..76839720 100644 --- a/doctor_tests/monitor/__init__.py +++ b/doctor_tests/monitor/__init__.py @@ -23,6 +23,7 @@ _monitor_name_class_mapping = { 'collectd': 'doctor_tests.monitor.collectd.CollectdMonitor' } + def get_monitor(conf, inspector_url, log): monitor_class = _monitor_name_class_mapping.get(conf.monitor.type) return importutils.import_object(monitor_class, conf, diff --git a/doctor_tests/monitor/collectd.py b/doctor_tests/monitor/collectd.py index 4e9329c2..60150b12 100644 --- a/doctor_tests/monitor/collectd.py +++ b/doctor_tests/monitor/collectd.py @@ -9,7 +9,6 @@ import os import socket import getpass -import sys from doctor_tests.monitor.base import BaseMonitor @@ -22,11 +21,11 @@ class CollectdMonitor(BaseMonitor): tmp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) tmp_sock.connect(("8.8.8.8", 80)) - ## control_ip is the IP of primary interface of control node i.e. - ## eth0, eno1. It is used by collectd monitor to communicate with - ## sample inspector. - ## TODO (umar) see if mgmt IP of control is a better option. Also - ## primary interface may not be the right option + # control_ip is the IP of primary interface of control node i.e. + # eth0, eno1. It is used by collectd monitor to communicate with + # sample inspector. + # TODO (umar) see if mgmt IP of control is a better option. Also + # primary interface may not be the right option self.control_ip = tmp_sock.getsockname()[0] self.compute_user = getpass.getuser() self.interface_name = os.environ.get('INTERFACE_NAME') or '' @@ -35,18 +34,21 @@ class CollectdMonitor(BaseMonitor): self.username = os.environ.get('OS_USERNAME') self.password = os.environ.get('OS_PASSWORD') self.project_name = os.environ.get('OS_PROJECT_NAME') - self.user_domain_name = os.environ.get('OS_USER_DOMAIN_NAME') or 'default' + self.user_domain_name = \ + os.environ.get('OS_USER_DOMAIN_NAME') or 'default' self.user_domain_id = os.environ.get('OS_USER_DOMAIN_ID') - self.project_domain_name = os.environ.get('OS_PROJECT_DOMAIN_NAME') or 'default' + self.project_domain_name = \ + os.environ.get('OS_PROJECT_DOMAIN_NAME') or 'default' self.project_domain_id = os.environ.get('OS_PROJECT_DOMAIN_ID') - self.ssh_opts_cpu = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' + self.ssh_opts_cpu = \ + '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' def start(self, host): self.log.info("Collectd monitor start.........") self.compute_host = host.name self.compute_ip = host.ip f = open("%s/collectd.conf" % self.top_dir, 'w') - collectd_conf_file = """ + collectd_conf_file = """ Hostname %s FQDNLookup false Interval 1 @@ -93,16 +95,21 @@ LoadPlugin logfile SendNotification true DispatchValues false </Plugin> - """ % (self.compute_host, self.compute_user, self.control_ip, self.compute_ip, self.compute_host, self.compute_user, - self.inspector_type, self.auth_url, self.username, self.password, self.project_name, self.user_domain_name, - self.user_domain_id, self.project_domain_name, self.project_domain_id) + """ % (self.compute_host, self.compute_user, self.control_ip, + self.compute_ip, self.compute_host, self.compute_user, + self.inspector_type, self.auth_url, self.username, + self.password, self.project_name, self.user_domain_name, + self.user_domain_id, self.project_domain_name, + self.project_domain_id) f.write(collectd_conf_file) f.close() - os.system(" scp %s %s/collectd.conf %s@%s: " % (self.ssh_opts_cpu, self.top_dir, self.compute_user, self.compute_ip)) + os.system("scp %s %s/collectd.conf %s@%s: " + % (self.ssh_opts_cpu, self.top_dir, + self.compute_user, self.compute_ip)) self.log.info("after first scp") - ## @TODO (umar) Always assuming that the interface is assigned an IP if - ## interface name is not provided. See if there is a better approach + # @TODO (umar) Always assuming that the interface is assigned an IP if + # interface name is not provided. See if there is a better approach os.system(""" ssh %s %s@%s \"if [ -n \"%s\" ]; then dev=%s else @@ -115,15 +122,24 @@ LoadPlugin logfile else sudo touch \${collectd_conf}-doctor-created fi - sudo mv collectd.conf /opt/collectd/etc/collectd.conf\" """ % (self.ssh_opts_cpu, self.compute_user, self.compute_ip, self.interface_name, self.interface_name, self.compute_ip)) + sudo mv collectd.conf /opt/collectd/etc/collectd.conf\" """ + % (self.ssh_opts_cpu, self.compute_user, + self.compute_ip, self.interface_name, + self.interface_name, self.compute_ip)) self.log.info("after first ssh") - os.system(" scp %s %s/monitor/collectd_plugin.py %s@%s:collectd_plugin.py " % (self.ssh_opts_cpu, self.top_dir, self.compute_user, self.compute_ip)) + os.system("scp %s %s/monitor/collectd_plugin.py" + "%s@%s:collectd_plugin.py" + % (self.ssh_opts_cpu, self.top_dir, + self.compute_user, self.compute_ip)) self.log.info("after sec scp") - os.system(" ssh %s %s@%s \"sudo pkill collectd; sudo /opt/collectd/sbin/collectd\" " % (self.ssh_opts_cpu, self.compute_user, self.compute_ip)) + os.system("ssh %s %s@%s \"sudo pkill collectd;" + "sudo /opt/collectd/sbin/collectd\" " + % (self.ssh_opts_cpu, self.compute_user, self.compute_ip)) self.log.info("after sec ssh") def stop(self): - os.system(" ssh %s %s@%s \"sudo pkill collectd\" " % (self.ssh_opts_cpu, self.compute_user, self.compute_ip)) + os.system(" ssh %s %s@%s \"sudo pkill collectd\" " + % (self.ssh_opts_cpu, self.compute_user, self.compute_ip)) def cleanup(self): os.system(""" ssh %s %s@%s \" diff --git a/doctor_tests/monitor/collectd_plugin.py b/doctor_tests/monitor/collectd_plugin.py index 57105f33..f4341020 100644 --- a/doctor_tests/monitor/collectd_plugin.py +++ b/doctor_tests/monitor/collectd_plugin.py @@ -23,7 +23,7 @@ from congressclient.v1 import client def write_debug(str_write, write_type, compute_user): file_name = ('/home/%s/monitor.log' % compute_user) file_tmp = open(file_name, write_type) - file_tmp.write( "%s" % str_write) + file_tmp.write("%s" % str_write) file_tmp.close() @@ -84,48 +84,51 @@ class DoctorMonitorCollectd(object): collectd.info('Unknown config key "%s"' % key) def init_collectd(self): - write_debug("Compute node collectd monitor start at %s\n\n" % datetime.now().isoformat(), "w", self.compute_user) + write_debug("Compute node collectd monitor start at %s\n\n" + % datetime.now().isoformat(), "w", self.compute_user) if self.inspector_type == 'sample': self.inspector_url = ('http://%s:12345/events' % self.control_ip) elif self.inspector_type == 'congress': loader = loading.get_plugin_loader('password') - self.auth = loader.load_from_options(auth_url=self.os_auth_url, - username=self.os_username, - password=self.os_password, - project_name=self.os_project_name, - user_domain_name=self.os_user_domain_name, - user_domain_id=self.os_user_domain_id, - project_domain_name=self.os_project_domain_name, - project_domain_id=self.os_project_domain_id) - self.sess=session.Session(auth=self.auth) + self.auth = loader.load_from_options( + auth_url=self.os_auth_url, + username=self.os_username, + password=self.os_password, + project_name=self.os_project_name, + user_domain_name=self.os_user_domain_name, + user_domain_id=self.os_user_domain_id, + project_domain_name=self.os_project_domain_name, + project_domain_id=self.os_project_domain_id) + self.sess = session.Session(auth=self.auth) congress = client.Client(session=self.sess, service_type='policy') ds = congress.list_datasources()['results'] - doctor_ds = next((item for item in ds if item['driver'] == 'doctor'), - None) + doctor_ds = next( + (item for item in ds if item['driver'] == 'doctor'), None) - congress_endpoint = congress.httpclient.get_endpoint(auth=self.auth) - self.inspector_url = ('%s/v1/data-sources/%s/tables/events/rows' % - (congress_endpoint, doctor_ds['id'])) + congress_endpoint = \ + congress.httpclient.get_endpoint(auth=self.auth) + self.inspector_url = ('%s/v1/data-sources/%s/tables/events/rows' + % (congress_endpoint, doctor_ds['id'])) else: sys.exit() self.start_notifications = 1 - def notify_inspector(self): event_type = "compute.host.down" payload = [ { - 'id': ("monitor_%s_id1" % self.monitor_type), - 'time': datetime.now().isoformat(), - 'type': event_type, - 'details': { - 'hostname': self.host_name, - 'status': 'down', - 'monitor': ("monitor_%s" % self.monitor_type), - 'monitor_event_id': ("monitor_%s_event1" % self.monitor_type) - }, - }, + 'id': ("monitor_%s_id1" % self.monitor_type), + 'time': datetime.now().isoformat(), + 'type': event_type, + 'details': { + 'hostname': self.host_name, + 'status': 'down', + 'monitor': ("monitor_%s" % self.monitor_type), + 'monitor_event_id': + ("monitor_%s_event1" % self.monitor_type) + }, + }, ] data = json.dumps(payload) self.inspector_notified = 1 @@ -135,7 +138,7 @@ class DoctorMonitorCollectd(object): try: requests.post(self.inspector_url, data=data, headers=headers) except ConnectionError as err: - print err + print(err) elif self.inspector_type == 'congress': # TODO(umar) enhance for token expiry case headers = { @@ -145,22 +148,25 @@ class DoctorMonitorCollectd(object): } requests.put(self.inspector_url, data=data, headers=headers) - - def handle_notif(self, notification, data=None): - if (notification.severity == collectd.NOTIF_FAILURE or - notification.severity == collectd.NOTIF_WARNING): - if (self.start_notifications == 1 and self.inspector_notified == 0): - write_debug("Received down notification: doctor monitor detected at %s\n" % time.time(), "a", self.compute_user) + def handle_notify(self, notification, data=None): + if (notification.seerity == collectd.NOTIF_FAILURE or + notification.severity == collectd.NOTIF_WARNING): + if (self.start_notifications == 1 and + self.inspector_notified == 0): + write_debug("Received down notification:" + "doctor monitor detected at %s\n" + % time.time(), "a", self.compute_user) self.notify_inspector() elif notification.severity == collectd.NOTIF_OKAY: collectd.info("Interface status: UP again %s\n" % time.time()) else: - collectd.info("Unknown notification severity %s\n" % notification.severity) + collectd.info("Unknown notification severity %s\n" + % notification.severity) monitor = DoctorMonitorCollectd() collectd.register_config(monitor.config_func) collectd.register_init(monitor.init_collectd) -collectd.register_notification(monitor.handle_notif) +collectd.register_notification(monitor.handle_notify) diff --git a/doctor_tests/monitor/sample.py b/doctor_tests/monitor/sample.py index 4dc5e603..c207cd9f 100644 --- a/doctor_tests/monitor/sample.py +++ b/doctor_tests/monitor/sample.py @@ -51,16 +51,20 @@ class SampleMonitor(BaseMonitor): } auth_token = self.session.get_token() if \ - self.conf.inspector.type != 'sample' else None + self.conf.inspector.type != 'sample' else None headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Auth-Token': auth_token, } if self.conf.inspector.type != Inspector.VITRAGE: - requests.put(self.inspector_url, data=json.dumps([data]), headers=headers) + requests.put(self.inspector_url, + data=json.dumps([data]), + headers=headers) else: - requests.post(self.inspector_url, data=json.dumps(data), headers=headers) + requests.post(self.inspector_url, + data=json.dumps(data), + headers=headers) class Pinger(Thread): diff --git a/doctor_tests/network.py b/doctor_tests/network.py index ee153e66..0965e01f 100644 --- a/doctor_tests/network.py +++ b/doctor_tests/network.py @@ -47,7 +47,8 @@ class Network(object): self.log.info('network create end.......') self.log.info('subnet create start.......') - subnets = self.neutron.list_subnets(network_id=self.net['id'])['subnets'] + subnets = \ + self.neutron.list_subnets(network_id=self.net['id'])['subnets'] subnet_param = {'name': net_name, 'network_id': self.net['id'], 'cidr': self.conf.net_cidr, 'ip_version': 4, 'enable_dhcp': False} diff --git a/doctor_tests/profiler_poc.py b/doctor_tests/profiler_poc.py index ea36eaeb..9f1df33a 100644 --- a/doctor_tests/profiler_poc.py +++ b/doctor_tests/profiler_poc.py @@ -12,7 +12,8 @@ PoC of performance profiler for OPNFV doctor project Usage: -Export environment variables to set timestamp at each checkpoint in millisecond. +Export environment variables to set timestamp at each +checkpoint in millisecond. Valid check points are: DOCTOR_PROFILER_T{00-09} See also: https://goo.gl/98Osig @@ -53,7 +54,7 @@ link down:{T00}| | | | | | | | | evaluated event:{T07}| | fired alarm:{T08}| received alarm:{T09} -""" +""" # noqa def main(log=None): diff --git a/doctor_tests/scenario/network_failure.py b/doctor_tests/scenario/network_failure.py index b2309435..b55440ed 100644 --- a/doctor_tests/scenario/network_failure.py +++ b/doctor_tests/scenario/network_failure.py @@ -47,18 +47,24 @@ class NetworkFault(object): def get_disable_network_log(self): if self.GetLog: - self.log.info('Already get the disable_netork.log from down_host......') + self.log.info('Already get the disable_netork.log ' + 'from down_host......') return self.disable_network_log if self.host is not None: - client = SSHClient(self.host.ip, - self.installer.node_user_name, - key_filename=self.installer.get_ssh_key_from_installer(), - look_for_keys=True, - log=self.log) + client = SSHClient( + self.host.ip, + self.installer.node_user_name, + key_filename=self.installer.get_ssh_key_from_installer(), + look_for_keys=True, + log=self.log) - self.disable_network_log = '{0}/{1}'.format(self.test_dir, 'disable_network.log') - client.scp('disable_network.log', self.disable_network_log, method='get') - self.log.info('Get the disable_netork.log from down_host(host_name:%s, host_ip:%s)' + self.disable_network_log = '{0}/{1}'.format(self.test_dir, + 'disable_network.log') + client.scp('disable_network.log', + self.disable_network_log, + method='get') + self.log.info('Get the disable_netork.log from' + 'down_host(host_name:%s, host_ip:%s)' % (self.host.name, self.host.ip)) self.GetLog = True return self.disable_network_log @@ -67,11 +73,12 @@ class NetworkFault(object): file_name = '{0}/{1}'.format(self.test_dir, 'disable_network.sh') with open(file_name, 'w') as file: file.write(LINK_DOWN_SCRIPT.format(compute_ip=compute_ip)) - client = SSHClient(compute_ip, - self.installer.node_user_name, - key_filename=self.installer.get_ssh_key_from_installer(), - look_for_keys=True, - log=self.log) + client = SSHClient( + compute_ip, + self.installer.node_user_name, + key_filename=self.installer.get_ssh_key_from_installer(), + look_for_keys=True, + log=self.log) client.scp(file_name, 'disable_network.sh') command = 'bash disable_network.sh > disable_network.log 2>&1 &' client.ssh(command) diff --git a/doctor_tests/user.py b/doctor_tests/user.py index a6f58d9a..fee3e1fb 100644 --- a/doctor_tests/user.py +++ b/doctor_tests/user.py @@ -89,12 +89,13 @@ class User(object): self.conf.doctor_domain_id) self.projects[test_project.name] = test_project else: - self.log.info('project %s already created......' % self.conf.doctor_project) - self.log.info('test project %s' % str(self.projects[self.conf.doctor_project])) + self.log.info('project %s already created......' + % self.conf.doctor_project) + self.log.info('test project %s' + % str(self.projects[self.conf.doctor_project])) def _create_user(self): """create test user""" - project = self.projects.get(self.conf.doctor_project) self.users = {user.name: user for user in self.keystone.users.list( domain=self.conf.doctor_domain_id)} @@ -106,8 +107,10 @@ class User(object): domain=self.conf.doctor_domain_id) self.users[test_user.name] = test_user else: - self.log.info('user %s already created......' % self.conf.doctor_user) - self.log.info('test user %s' % str(self.users[self.conf.doctor_user])) + self.log.info('user %s already created......' + % self.conf.doctor_user) + self.log.info('test user %s' + % str(self.users[self.conf.doctor_user])) def _create_role(self): """create test role""" @@ -120,7 +123,8 @@ class User(object): self.roles[test_role.name] = test_role else: self.use_exist_role = True - self.log.info('role %s already created......' % self.conf.doctor_role) + self.log.info('role %s already created......' + % self.conf.doctor_role) self.log.info('test role %s' % str(self.roles[self.conf.doctor_role])) def _add_user_role_in_project(self, is_admin=False): @@ -182,9 +186,10 @@ class User(object): self.quota = self.nova.quotas.get(project.id, user_id=user.id) if self.conf.quota_instances > self.quota.instances: - self.nova.quotas.update(project.id, - instances=self.conf.quota_instances, - user_id=user.id) + self.nova.quotas.update( + project.id, + instances=self.conf.quota_instances, + user_id=user.id) if self.conf.quota_cores > self.quota.cores: self.nova.quotas.update(project.id, cores=self.conf.quota_cores, @@ -192,4 +197,3 @@ class User(object): self.log.info('user quota update end......') else: raise Exception('No project or role for update quota') - diff --git a/requirements.txt b/requirements.txt index 0f4e88be..9a355184 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,3 +16,4 @@ python-congressclient<2000,>=1.3.0 # Apache-2.0 python-glanceclient>=2.8.0 # Apache-2.0 python-vitrageclient>=1.2.0 # Apache-2.0 virtualenv>=13.1.0 # MIT +flake8<2.6.0,>=2.5.4 # MIT @@ -1,6 +1,6 @@ [tox] minversion = 2.3.1 -envlist = py35 +envlist = py35, pep8 skipsdist = True [testenv] @@ -30,3 +30,19 @@ passenv = PROFILER_TYPE changedir = {toxinidir}/doctor_tests commands = doctor-test + +[testenv:pep8] +changedir = {toxinidir} +commands = flake8 + +[flake8] +# E123, E125 skipped as they are invalid PEP-8. +# H106: Don’t put vim configuration in source files +# H203: Use assertIs(Not)None to check for None + +show-source = True +ignore = E123,E125 +enable-extensions=H106,H203 +builtins = _ +filename = *.py,app.wsgi +exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tests |