diff --git a/Makefile b/Makefile index 4c99a5bd71..f79d2405a9 100644 --- a/Makefile +++ b/Makefile @@ -244,14 +244,22 @@ socketservice: factcacher: $(PYTHON) manage.py run_fact_cache_receiver -pep8: - pep8 -r awx/ +reports: + mkdir -p $@ -pyflakes: - pyflakes awx/ +pep8: reports + @(set -o pipefail && $@ | tee reports/$@.report) -check: - flake8 +flake8: reports + @$@ --output-file=reports/$@.report + +pyflakes: reports + @(set -o pipefail && $@ | tee reports/$@.report) + +pylint: reports + @(set -o pipefail && $@ | reports/$@.report) + +check: flake8 pep8 # pyflakes pylint # Run all API unit tests. test: diff --git a/awx/plugins/callback/job_event_callback.py b/awx/plugins/callback/job_event_callback.py index 3f91c55b19..81f4a00b92 100644 --- a/awx/plugins/callback/job_event_callback.py +++ b/awx/plugins/callback/job_event_callback.py @@ -36,11 +36,8 @@ import json import logging import os import pwd -import sys -import urllib import urlparse import time -from contextlib import closing # Requests import requests diff --git a/awx/plugins/fact_caching/tower.py b/awx/plugins/fact_caching/tower.py index 5d0516b92b..eaa404e744 100755 --- a/awx/plugins/fact_caching/tower.py +++ b/awx/plugins/fact_caching/tower.py @@ -32,7 +32,6 @@ import sys import time import datetime -import json from copy import deepcopy from ansible import constants as C from ansible.cache.base import BaseCacheModule diff --git a/awx/plugins/inventory/awxrest.py b/awx/plugins/inventory/awxrest.py index 347ecb0961..2ab30dedd4 100755 --- a/awx/plugins/inventory/awxrest.py +++ b/awx/plugins/inventory/awxrest.py @@ -4,10 +4,10 @@ # This file is a utility script that is not part of the AWX or Ansible # packages. It does not import any code from either package, nor does its # license apply to Ansible or AWX. -# +# # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: -# +# # Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # @@ -61,7 +61,7 @@ class TokenAuth(requests.auth.AuthBase): return request class InventoryScript(object): - + def __init__(self, **options): self.options = options @@ -95,11 +95,11 @@ class InventoryScript(object): def run(self): try: self.base_url = self.options.get('base_url', '') or \ - os.getenv('REST_API_URL', '') + os.getenv('REST_API_URL', '') if not self.base_url: raise ValueError('No REST API URL specified') self.auth_token = self.options.get('authtoken', '') or \ - os.getenv('REST_API_TOKEN', '') + os.getenv('REST_API_TOKEN', '') parts = urlparse.urlsplit(self.base_url) if not (parts.username and parts.password) and not self.auth_token: raise ValueError('No username/password specified in REST API ' @@ -107,7 +107,7 @@ class InventoryScript(object): try: # Command line argument takes precedence over environment # variable. - self.inventory_id = int(self.options.get('inventory_id', 0) or \ + self.inventory_id = int(self.options.get('inventory_id', 0) or os.getenv('INVENTORY_ID', 0)) except ValueError: raise ValueError('Inventory ID must be an integer') diff --git a/awx/plugins/library/scan_services.py b/awx/plugins/library/scan_services.py index 920daa860c..0db0c3d4c5 100644 --- a/awx/plugins/library/scan_services.py +++ b/awx/plugins/library/scan_services.py @@ -84,7 +84,7 @@ class ServiceScanService(BaseService): else: pid = None else: - pid = None + pid = None # NOQA payload = {"name": service_name, "state": service_state, "goal": service_goal, "source": "upstart"} services.append(payload) @@ -104,7 +104,7 @@ class ServiceScanService(BaseService): service_state = "dead" elif len(line_data) == 3: service_name = line_data[0] - service_pid = None + service_pid = None # NOQA service_state = "stopped" else: continue diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 18146a9042..f1a03ba26c 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -3,9 +3,7 @@ import os import sys -import glob from datetime import timedelta -import tempfile MONGO_DB = 'system_tracking' @@ -119,13 +117,13 @@ ALLOWED_HOSTS = [] # reverse proxy. REMOTE_HOST_HEADERS = ['REMOTE_ADDR', 'REMOTE_HOST'] -TEMPLATE_CONTEXT_PROCESSORS += ( +TEMPLATE_CONTEXT_PROCESSORS += ( # NOQA 'django.core.context_processors.request', 'awx.ui.context_processors.settings', 'awx.ui.context_processors.version', ) -MIDDLEWARE_CLASSES += ( +MIDDLEWARE_CLASSES += ( # NOQA 'awx.main.middleware.HAMiddleware', 'awx.main.middleware.ActivityStreamMiddleware', 'crum.CurrentRequestUserMiddleware', @@ -247,7 +245,7 @@ EMAIL_USE_TLS = False # Use Django-Debug-Toolbar if installed. try: import debug_toolbar - INSTALLED_APPS += ('debug_toolbar',) + INSTALLED_APPS += (debug_toolbar.__name__,) except ImportError: pass @@ -259,7 +257,7 @@ DEBUG_TOOLBAR_CONFIG = { # Use Django-devserver if installed. try: import devserver - INSTALLED_APPS += ('devserver',) + INSTALLED_APPS += (devserver.__name__,) except ImportError: pass @@ -444,7 +442,7 @@ VMWARE_REGIONS_BLACKLIST = [] # Inventory variable name/values for determining whether a host is # active in vSphere. -VMWARE_ENABLED_VAR = 'vmware_powerState' +VMWARE_ENABLED_VAR = 'vmware_powerState' VMWARE_ENABLED_VALUE = 'poweredOn' # Inventory variable name containing the unique instance ID. @@ -609,7 +607,7 @@ LOGGING = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': os.path.join(LOG_ROOT, 'tower_warnings.log'), - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', }, @@ -618,7 +616,7 @@ LOGGING = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': os.path.join(LOG_ROOT, 'callback_receiver.log'), - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', }, @@ -627,7 +625,7 @@ LOGGING = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': os.path.join(LOG_ROOT, 'socketio_service.log'), - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', }, @@ -636,7 +634,7 @@ LOGGING = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': os.path.join(LOG_ROOT, 'task_system.log'), - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', }, diff --git a/awx/settings/development.py b/awx/settings/development.py index a5bbfa36ac..abc983af73 100644 --- a/awx/settings/development.py +++ b/awx/settings/development.py @@ -6,13 +6,12 @@ # Python import sys import traceback -import glob # Django Split Settings from split_settings.tools import optional, include # Load default settings. -from defaults import * +from defaults import * # NOQA MONGO_DB = 'system_tracking_dev' @@ -31,27 +30,24 @@ AWX_PROOT_ENABLED = True # Use Django-Jenkins if installed. Only run tests for awx.main app. try: import django_jenkins - INSTALLED_APPS += ('django_jenkins',) + INSTALLED_APPS += (django_jenkins.__name__,) PROJECT_APPS = ('awx.main.tests', 'awx.api.tests', 'awx.fact.tests',) except ImportError: pass if 'django_jenkins' in INSTALLED_APPS: JENKINS_TASKS = ( - 'django_jenkins.tasks.run_pylint', - 'django_jenkins.tasks.run_flake8', + # 'django_jenkins.tasks.run_pylint', + # 'django_jenkins.tasks.run_flake8', # The following are not needed when including run_flake8 # 'django_jenkins.tasks.run_pep8', # 'django_jenkins.tasks.run_pyflakes', # The following are handled by various grunt tasks and no longer required # 'django_jenkins.tasks.run_jshint', # 'django_jenkins.tasks.run_csslint', - ) + ) PEP8_RCFILE = "setup.cfg" PYLINT_RCFILE = ".pylintrc" - CSSLINT_CHECKED_FILES = glob.glob(os.path.join(BASE_DIR, 'ui/static/less/*.less')) - JSHINT_CHECKED_FILES = [os.path.join(BASE_DIR, 'ui/static/js'), - os.path.join(BASE_DIR, 'ui/static/lib/ansible'),] # Much faster than the default # https://docs.djangoproject.com/en/1.6/topics/auth/passwords/#how-django-stores-passwords diff --git a/awx/settings/development_quiet.py b/awx/settings/development_quiet.py index 282319b503..ef017f7340 100644 --- a/awx/settings/development_quiet.py +++ b/awx/settings/development_quiet.py @@ -4,10 +4,10 @@ # Development settings for AWX project, but with DEBUG disabled # Load development settings. -from defaults import * +from defaults import * # NOQA # Load development settings. -from development import * +from development import * # NOQA # Disable capturing DEBUG DEBUG = False diff --git a/awx/settings/production.py b/awx/settings/production.py index 2fa3c439fe..2552d91ce6 100644 --- a/awx/settings/production.py +++ b/awx/settings/production.py @@ -12,7 +12,7 @@ import traceback from split_settings.tools import optional, include # Load default settings. -from defaults import * +from defaults import * # NOQA DEBUG = False TEMPLATE_DEBUG = DEBUG @@ -49,7 +49,7 @@ LOGGING['handlers']['tower_warnings'] = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': '/var/log/tower/tower.log', - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', } @@ -60,7 +60,7 @@ LOGGING['handlers']['callback_receiver'] = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': '/var/log/tower/callback_receiver.log', - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', } @@ -70,7 +70,7 @@ LOGGING['handlers']['socketio_service'] = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': '/var/log/tower/socketio_service.log', - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', } @@ -80,7 +80,7 @@ LOGGING['handlers']['task_system'] = { 'class':'logging.handlers.RotatingFileHandler', 'filters': ['require_debug_false'], 'filename': '/var/log/tower/task_system.log', - 'maxBytes': 1024*1024*5, # 5 MB + 'maxBytes': 1024 * 1024 * 5, # 5 MB 'backupCount': 5, 'formatter':'simple', } diff --git a/config/wsgi.py b/config/wsgi.py index d517e2385a..9999eb08c8 100644 --- a/config/wsgi.py +++ b/config/wsgi.py @@ -1 +1 @@ -from awx.wsgi import application +from awx.wsgi import application # NOQA diff --git a/setup.cfg b/setup.cfg index bd64ca1943..64d74af131 100755 --- a/setup.cfg +++ b/setup.cfg @@ -14,8 +14,8 @@ # W391 - Blank line at end of file # W293 - Blank line contains whitespace ignore=E201,E203,E221,E225,E231,E241,E251,E261,E265,E302,E303,E501,W291,W391,W293 -exclude=awx/lib/site-packages,awx/ui,awx/api/urls.py,awx/main/migrations,awx/main/tests/data +exclude=.tox,awx/lib/site-packages,awx/plugins/inventory/ec2.py,awx/plugins/inventory/gce.py,awx/plugins/inventory/vmware.py,awx/plugins/inventory/windows_azure.py,awx/plugins/inventory/openstack.py,awx/ui,awx/api/urls.py,awx/main/migrations,awx/main/tests/data [flake8] ignore=E201,E203,E221,E225,E231,E241,E251,E261,E265,E302,E303,E501,W291,W391,W293,E731 -exclude=awx/lib/site-packages,awx/ui,awx/api/urls.py,awx/main/migrations,awx/main/tests/data,node_modules/,awx/projects/ +exclude=.tox,awx/lib/site-packages,awx/plugins/inventory/ec2.py,awx/plugins/inventory/gce.py,awx/plugins/inventory/vmware.py,awx/plugins/inventory/windows_azure.py,awx/plugins/inventory/openstack.py,awx/ui,awx/api/urls.py,awx/main/migrations,awx/main/tests/data,node_modules/,awx/projects/,tools/docker diff --git a/tools/sosreport/tower.py b/tools/sosreport/tower.py index 53dff76195..154c628a0b 100644 --- a/tools/sosreport/tower.py +++ b/tools/sosreport/tower.py @@ -4,6 +4,33 @@ import sos from distutils.version import LooseVersion +SOSREPORT_TOWER_COMMANDS = [ + "ansible --version", # ansible core version + "tower-manage --version", # tower version + "supervisorctl status", # tower process status + "pip list" # pip package list + "tree -d /var/lib/awx", # show me the dirs + "ls -ll /var/lib/awx", # check permissions + "ls -ll /etc/tower", +] + +SOSREPORT_TOWER_DIRS = [ + "/etc/tower/", + "/var/log/tower", + "/var/log/httpd", + "/var/log/apache2", + "/var/log/redis", + "/var/log/supervisor", + "/var/log/syslog", + "/var/log/udev", + "/var/log/kern*", + "/var/log/dist-upgrade", + "/var/log/installer", + "/var/log/unattended-upgrades", + "/var/log/apport.log" +] + + if LooseVersion(sos.__version__) >= LooseVersion('3.0'): from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin @@ -13,36 +40,10 @@ if LooseVersion(sos.__version__) >= LooseVersion('3.0'): def setup(self): - commands = [ - "ansible --version", # ansible core version - "awx-manage --version", # tower version - "supervisorctl status", # tower process status - "pip list" # pip package list - "tree -d /var/lib/awx", # show me the dirs - "ls -ll /var/lib/awx", # check permissions - "ls -ll /etc/tower" - ] - - dirs = [ - "/etc/tower/", - "/var/log/tower", - "/var/log/httpd", - "/var/log/apache2", - "/var/log/redis", - "/var/log/supervisor", - "/var/log/syslog", - "/var/log/udev", - "/var/log/kern*", - "/var/log/dist-upgrade", - "/var/log/installer", - "/var/log/unattended-upgrades", - "/var/log/apport.log" - ] - - for path in dirs: + for path in SOSREPORT_TOWER_DIRS: self.add_copy_spec(path) - for command in commands: + for command in SOSREPORT_TOWER_COMMANDS: self.add_cmd_output(command) else: @@ -53,35 +54,9 @@ else: def setup(self): - commands = [ - "ansible --version", # ansible core version - "awx-manage --version", # tower version - "supervisorctl status", # tower process status - "pip list" # pip package list - "tree -d /var/lib/awx", # show me the dirs - "ls -ll /var/lib/awx", # check permissions - "ls -ll /etc/tower" - ] - - dirs = [ - "/etc/tower/", - "/var/log/tower", - "/var/log/httpd", - "/var/log/apache2", - "/var/log/redis", - "/var/log/supervisor", - "/var/log/syslog", - "/var/log/udev", - "/var/log/kern*", - "/var/log/dist-upgrade", - "/var/log/installer", - "/var/log/unattended-upgrades", - "/var/log/apport.log" - ] - - for path in dirs: + for path in SOSREPORT_TOWER_DIRS: self.addCopySpec(path) - for command in commands: + for command in SOSREPORT_TOWER_COMMANDS: self.collectExtOutput(command)