diff --git a/Makefile b/Makefile index 7ddc303..15414f1 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,8 @@ venv_prod: requirements/prod.txt ################################### test: - ./manage.py jenkins --output-dir $(RESULTS) --settings="repoapi.settings.dev" + ./manage.py jenkins --enable-coverage --noinput --output-dir $(RESULTS) \ + --settings="repoapi.settings.dev" deploy: venv_prod source $(VAR_DIR)/venv_prod/bin/activate && \ diff --git a/panel/views.py b/panel/views.py index 7066655..409f7a8 100644 --- a/panel/views.py +++ b/panel/views.py @@ -22,15 +22,14 @@ def index(request): return render(request, 'panel/index.html', context) -def release(request, release): - projects = jbi.objects.release_projects(release, flat=False) - context = {'release': release, +def release(request, _release): + projects = jbi.objects.release_projects(_release, flat=False) + context = {'release': _release, 'projects': projects} return render(request, 'panel/release.html', context) -def project(request, release, project): - projects = [project, ] - uuids = jbi.objects.release_project_uuids_set(release, project) - context = {'project': project, 'release': release, 'uuids': uuids} +def project(request, _release, _project): + uuids = jbi.objects.release_project_uuids_set(_release, _project) + context = {'project': _project, 'release': _release, 'uuids': uuids} return render(request, 'panel/project.html', context) diff --git a/pylint.cfg b/pylint.cfg index 2d8055f..e3f5a8a 100644 --- a/pylint.cfg +++ b/pylint.cfg @@ -5,6 +5,7 @@ ignore=migrations cache-size=500 [MESSAGES CONTROL] +# C1001 Old-style class defined # C0111 Missing docstring # I0011 Warning locally suppressed using disable-msg # I0012 Warning locally suppressed using disable-msg @@ -15,7 +16,8 @@ cache-size=500 # W0613 Unused argument %r Used when a function or method argument is not used. # W0702 No exception's type specified Used when an except clause doesn't specify exceptions type to catch. # R0201 Method could be a function -disable=C0111,I0011,I0012,W0704,W0142,W0212,W0232,W0613,W0702,R0201 +# R0901 Too many ancestors +disable=C1001,C0111,I0011,I0012,W0704,W0142,W0212,W0232,W0613,W0702,R0201,R0901 [REPORTS] output-format=parseable diff --git a/repoapi/models.py b/repoapi/models.py index c464ab2..fa97008 100644 --- a/repoapi/models.py +++ b/repoapi/models.py @@ -12,17 +12,17 @@ # You should have received a copy of the GNU General Public License along # with this program. If not, see . +import logging +import re from django.db import models from django.db.models import signals from django.conf import settings from repoapi import utils -import logging -import re logger = logging.getLogger(__name__) -workfront_re = re.compile('TT#(\d+)') -commit_re = re.compile('^(\w{7}) ') +workfront_re = re.compile(r"TT#(\d+)") +commit_re = re.compile(r"^(\w{7}) ") class JenkinsBuildInfoManager(models.Manager): @@ -119,7 +119,7 @@ def gerrit_repo_add(instance): param_ppa=instance.param_ppa, gerrit_change=instance.gerrit_change) if created: - logging.info("%s created" % ppa) + logging.info("%s created", ppa) def gerrit_repo_del(instance): @@ -131,7 +131,7 @@ def gerrit_repo_del(instance): ppa = gri.get(param_ppa=instance.param_ppa, gerrit_change=instance.gerrit_change) ppa.delete() - logger.info("removed %s" % ppa) + logger.info("removed %s", ppa) except GerritRepoInfo.DoesNotExist: pass if gri.filter(param_ppa=instance.param_ppa).count() == 0: diff --git a/repoapi/settings/common.py b/repoapi/settings/common.py new file mode 100644 index 0000000..ce8aa31 --- /dev/null +++ b/repoapi/settings/common.py @@ -0,0 +1,137 @@ +# Copyright (C) 2015 The Sipwise Team - http://sipwise.com + +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. + +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +BASE_DIR = os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Application definition +# django-jenkins +PROJECT_APPS = [ + 'repoapi', + 'panel', +] + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'rest_framework_swagger', + 'django_extensions', + 'django_assets', +] + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.security.SecurityMiddleware', +) + +ROOT_URLCONF = 'repoapi.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'repoapi.wsgi.application' + +# Internationalization +# https://docs.djangoproject.com/en/1.8/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.8/howto/static-files/ + +STATIC_URL = '/static/' + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + 'django_assets.finders.AssetsFinder', +) + +STATIC_ROOT = os.path.join(BASE_DIR, 'static_media/') + +TEMPLATE_DIRS = ( + 'repoapi/templates', +) + +REST_FRAMEWORK = { + 'PAGE_SIZE': 10, + 'DEFAULT_FILTER_BACKENDS': ( + 'rest_framework.filters.DjangoFilterBackend', + ) +} + +SWAGGER_SETTINGS = { + 'api_version': '0.1', + 'info': { + 'contact': 'dev@sipwise.com', + 'description': 'repoapi, one ring to rule them all', + 'license': 'GPL 3.0', + 'title': 'RepoApi', + }, +} + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + }, + }, + 'loggers': { + 'repoapi': { + 'handlers': ['console'], + 'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), + }, + }, +} + +JENKINS_TOKEN = "sipwise_jenkins_ci" diff --git a/repoapi/settings/dev.py b/repoapi/settings/dev.py index 23d4413..93acea5 100644 --- a/repoapi/settings/dev.py +++ b/repoapi/settings/dev.py @@ -15,11 +15,12 @@ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os +# pylint: disable=W0401,W0614 +from .common import * BASE_DIR = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ @@ -31,61 +32,12 @@ DEBUG = True ALLOWED_HOSTS = [] - -# Application definition -# django-jenkins -PROJECT_APPS = [ - 'repoapi', - 'panel', -] -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'rest_framework_swagger', - 'django_nose', - 'django_extensions', +TESTING_APPS = [ 'django_jenkins', - 'django_assets', ] +INSTALLED_APPS.extend(TESTING_APPS) INSTALLED_APPS.extend(PROJECT_APPS) -MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', -) - -ROOT_URLCONF = 'repoapi.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'repoapi.wsgi.application' - - # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases @@ -96,84 +48,16 @@ DATABASES = { } } - -# Internationalization -# https://docs.djangoproject.com/en/1.8/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.8/howto/static-files/ - -STATIC_URL = '/static/' - -# django-nose -TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' - # django-jenkins JENKINS_TASKS = ( 'django_jenkins.tasks.run_pylint', 'django_jenkins.tasks.run_flake8', - 'django_jenkins.tasks.with_coverage', ) PYLINT_RCFILE = 'pylint.cfg' -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'django_assets.finders.AssetsFinder', -) - -STATIC_ROOT = os.path.join(BASE_DIR, 'static_media/') - -TEMPLATE_DIRS = ( - 'repoapi/templates', -) - -REST_FRAMEWORK = { - 'PAGE_SIZE': 10, - 'DEFAULT_FILTER_BACKENDS': ( - 'rest_framework.filters.DjangoFilterBackend', - ) -} - -SWAGGER_SETTINGS = { - 'api_version': '0.1', - 'info': { - 'contact': 'dev@sipwise.com', - 'description': 'repoapi, one ring to rule them all', - 'license': 'GPL 3.0', - 'title': 'RepoApi', - }, -} - -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'handlers': { - 'console': { - 'class': 'logging.StreamHandler', - }, - }, - 'loggers': { - 'django': { - 'handlers': ['console'], - 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'), - }, - }, -} +LOGGING['loggers']['repoapi']['level'] = os.getenv('DJANGO_LOG_LEVEL', 'DEBUG') JENKINS_URL = "http://localhost" -JENKINS_TOKEN = "sipwise_jenkins_ci" GERRIT_URL = "https://gerrit.local/{}" GITWEB_URL = "https://git.local/gitweb/?p={}.git;a=commit;h={}" WORKFRONT_CREDENTIALS = os.path.join(BASE_DIR, '.workfront.ini') diff --git a/repoapi/settings/prod.py b/repoapi/settings/prod.py index ab5ac33..921dda7 100644 --- a/repoapi/settings/prod.py +++ b/repoapi/settings/prod.py @@ -15,6 +15,8 @@ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os +# pylint: disable=W0401,W0614 +from .common import * BASE_DIR = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -35,59 +37,8 @@ DEBUG = False ALLOWED_HOSTS = ['.mgm.sipwise.com'] - -# Application definition -# django-jenkins -PROJECT_APPS = [ - 'repoapi', - 'panel', -] -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'rest_framework_swagger', - 'django_extensions', - 'django_assets', -] INSTALLED_APPS.extend(PROJECT_APPS) -MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', -) - -ROOT_URLCONF = 'repoapi.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'repoapi.wsgi.application' - - # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases @@ -98,73 +49,9 @@ DATABASES = { } } - -# Internationalization -# https://docs.djangoproject.com/en/1.8/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.8/howto/static-files/ - -STATIC_URL = '/static/' - -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'django_assets.finders.AssetsFinder', -) - -STATIC_ROOT = os.path.join(BASE_DIR, 'static_media/') - -TEMPLATE_DIRS = ( - 'repoapi/templates', -) - -REST_FRAMEWORK = { - 'PAGE_SIZE': 10, - 'DEFAULT_FILTER_BACKENDS': ( - 'rest_framework.filters.DjangoFilterBackend', - ) -} - -SWAGGER_SETTINGS = { - 'api_version': '0.1', - 'info': { - 'contact': 'dev@sipwise.com', - 'description': 'repoapi, one ring to rule them all', - 'license': 'GPL 3.0', - 'title': 'RepoApi', - }, -} - -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'handlers': { - 'console': { - 'class': 'logging.StreamHandler', - }, - }, - 'loggers': { - 'django': { - 'handlers': ['console'], - 'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), - }, - }, -} +LOGGING['loggers']['repoapi']['level'] = os.getenv('DJANGO_LOG_LEVEL', 'INFO') JENKINS_URL = "https://jenkins.mgm.sipwise.com" -JENKINS_TOKEN = "sipwise_jenkins_ci" GERRIT_URL = "https://gerrit.mgm.sipwise.com/{}" GITWEB_URL = "https://git.mgm.sipwise.com/gitweb/?p={}.git;a=commit;h={}" WORKFRONT_CREDENTIALS = os.path.join(BASE_DIR, diff --git a/repoapi/test/test_gerritinfo.py b/repoapi/test/test_gerritinfo.py index 7b19113..8f3bc20 100644 --- a/repoapi/test/test_gerritinfo.py +++ b/repoapi/test/test_gerritinfo.py @@ -20,24 +20,28 @@ from mock import patch class GerritRepoInfoTestCase(TestCase): + def get_defaults(self): + defaults = { + 'tag': "edc90cd9-37f3-4613-9748-ed05a32031c2", + 'projectname': "kamailio", + 'jobname': "kamailio-repos", + 'buildnumber': 897, + 'result': "SUCCESS", + 'job_url': "https://jenkins.mgm.sipwise.com/job/kamailio-repos/", + 'gerrit_patchset': "1", + 'gerrit_change': "2054", + 'gerrit_eventtype': "patchset-created", + 'param_tag': "none", + 'param_branch': "master", + 'param_release': "none", + 'param_distribution': "wheezy", + 'param_ppa': "gerrit_MT10339_review2054" + } + return defaults + @patch('repoapi.utils.jenkins_remove_ppa') def test_creation(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - + JenkinsBuildInfo.objects.create(**self.get_defaults()) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 1) @@ -45,42 +49,9 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_creation_deletion(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - - gri = GerritRepoInfo.objects.filter( - param_ppa="gerrit_MT10339_review2054") - self.assertEquals(gri.count(), 1) - utils.assert_not_called() - - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="change-merged", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param = self.get_defaults() + param['gerrit_eventtype'] = "change-merged" + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") @@ -89,21 +60,9 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_no_creation(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-get-code", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param = self.get_defaults() + param['jobname'] = "kamailio-get-code" + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") @@ -112,42 +71,9 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_creation_review(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - - gri = GerritRepoInfo.objects.filter( - param_ppa="gerrit_MT10339_review2054") - self.assertEquals(gri.count(), 1) - utils.assert_not_called() - - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=898, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param = self.get_defaults() + param['buildnumber'] = 898 + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") @@ -156,42 +82,18 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_creation_multi_review(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - + param = self.get_defaults() + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 1) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="fake", - jobname="fake-repos", - buildnumber=8, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/fake-repos/", - gerrit_patchset="1", - gerrit_change="2", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param['projectname'] = "fake" + param['jobname'] = "fake-repos" + param['buildnumber'] = 8 + param['gerrit_change'] = 2 + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") @@ -200,63 +102,28 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_creation_multi_review_no_del(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - + param = self.get_defaults() + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 1) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="fake", - jobname="fake-repos", - buildnumber=8, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/fake-repos/", - gerrit_patchset="1", - gerrit_change="2", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param_fake = self.get_defaults() + param_fake['projectname'] = "fake" + param_fake['jobname'] = "fake-repos" + param_fake['buildnumber'] = 8 + param_fake['gerrit_change'] = 2 + JenkinsBuildInfo.objects.create(**param_fake) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 2) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=898, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="2", - gerrit_change="2054", - gerrit_eventtype="change-merged", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param['gerrit_eventtype'] = "change-merged" + param['buildnumber'] = 898 + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") @@ -265,84 +132,37 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_creation_multi_review_del(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - + param = self.get_defaults() + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 1) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="fake", - jobname="fake-repos", - buildnumber=8, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/fake-repos/", - gerrit_patchset="1", - gerrit_change="2", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param_fake = self.get_defaults() + param_fake['projectname'] = "fake" + param_fake['jobname'] = "fake-repos" + param_fake['buildnumber'] = 8 + param_fake['gerrit_change'] = 2 + JenkinsBuildInfo.objects.create(**param_fake) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 2) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=898, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="2", - gerrit_change="2054", - gerrit_eventtype="change-merged", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param['gerrit_eventtype'] = "change-merged" + param['buildnumber'] = 898 + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 1) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="fake", - jobname="fake-repos", - buildnumber=9, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/fake-repos/", - gerrit_patchset="2", - gerrit_change="2", - gerrit_eventtype="change-merged", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param_fake['buildnumber'] = 9 + param_fake['gerrit_eventtype'] = "change-merged" + JenkinsBuildInfo.objects.create(**param_fake) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") @@ -351,43 +171,17 @@ class GerritRepoInfoTestCase(TestCase): @patch('repoapi.utils.jenkins_remove_ppa') def test_abandoned_review_del(self, utils): - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-repos", - buildnumber=897, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/kamailio-repos/", - gerrit_patchset="1", - gerrit_change="2054", - gerrit_eventtype="patchset-created", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") - + param = self.get_defaults() + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") self.assertEquals(gri.count(), 1) utils.assert_not_called() - JenkinsBuildInfo.objects.create( - tag="edc90cd9-37f3-4613-9748-ed05a32031c2", - projectname="kamailio", - jobname="kamailio-cleanup", - buildnumber=898, - result="SUCCESS", - job_url="https://jenkins.mgm.sipwise.com/job/" - "kamailio-cleanup/", - gerrit_patchset="2", - gerrit_change="2054", - gerrit_eventtype="change-abandoned", - param_tag="none", - param_branch="master", - param_release="none", - param_distribution="wheezy", - param_ppa="gerrit_MT10339_review2054") + param['jobname'] = "kamailio-cleanup" + param['gerrit_eventtype'] = "change-abandoned" + param['buildnumber'] = 898 + JenkinsBuildInfo.objects.create(**param) gri = GerritRepoInfo.objects.filter( param_ppa="gerrit_MT10339_review2054") diff --git a/repoapi/test/test_model_queries.py b/repoapi/test/test_model_queries.py index 0016247..fbc5871 100644 --- a/repoapi/test/test_model_queries.py +++ b/repoapi/test/test_model_queries.py @@ -14,8 +14,8 @@ # with this program. If not, see . from django.test import TestCase -from repoapi.models import JenkinsBuildInfo from django.utils.dateparse import parse_datetime +from repoapi.models import JenkinsBuildInfo class JBIQueriesTestCase(TestCase): @@ -27,8 +27,8 @@ class JBIQueriesTestCase(TestCase): def test_release_projects(self): projects = ['fake', ] - p = JenkinsBuildInfo.objects.release_projects('mr3.1-fake') - self.assertItemsEqual(p, projects) + check = JenkinsBuildInfo.objects.release_projects('mr3.1-fake') + self.assertItemsEqual(check, projects) def test_release_project_uuids(self): projects = ['fake', ] @@ -36,10 +36,10 @@ class JBIQueriesTestCase(TestCase): uuids = dict() uuids_ok['fake'] = ['UUID1', 'UUID0'] - for p in projects: - uuids[p] = JenkinsBuildInfo.objects.release_project_uuids( - 'mr3.1-fake', p) - self.assertItemsEqual(uuids_ok[p], uuids[p]) + for project in projects: + uuids[project] = JenkinsBuildInfo.objects.release_project_uuids( + 'mr3.1-fake', project) + self.assertItemsEqual(uuids_ok[project], uuids[project]) def test_jobs_by_uuid(self): jobs = JenkinsBuildInfo.objects.jobs_by_uuid( diff --git a/repoapi/urls.py b/repoapi/urls.py index 7016891..e2125dd 100644 --- a/repoapi/urls.py +++ b/repoapi/urls.py @@ -51,7 +51,7 @@ urlpatterns = [ url(r'^', include(api_patterns)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), - url(r'^docs/', include('rest_framework_swagger.urls')), + url(r'^docs/', views.schema_view), url(r'^panel/', include('panel.urls', namespace='panel')), ] diff --git a/repoapi/utils.py b/repoapi/utils.py index effb799..08b8612 100644 --- a/repoapi/utils.py +++ b/repoapi/utils.py @@ -12,33 +12,33 @@ # You should have received a copy of the GNU General Public License along # with this program. If not, see . -from __future__ import print_function + import urllib2 import logging import subprocess -import sys from django.conf import settings logger = logging.getLogger(__name__) def executeAndReturnOutput(command, env=None): - p = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, env=env) - stdoutdata, stderrdata = p.communicate() - print(stdoutdata, file=sys.stdout) - print(stderrdata, file=sys.stderr) - return p.returncode, stdoutdata, stderrdata + proc = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, env=env) + stdoutdata, stderrdata = proc.communicate() + logger.debug("%s", stdoutdata) + logger.debug("%s", stderrdata) + return proc.returncode, stdoutdata, stderrdata -def openurl(URL): - req = urllib2.Request(URL) +def openurl(url): + req = urllib2.Request(url) + logger.debug("url:[%s]", url) response = urllib2.urlopen(req) if response.code is 200: - print("OK") + logger.debug("OK") return 0 else: - print("Error retrieving %s" % URL) + logger.error("Error retrieving %s", url) return 1 @@ -47,7 +47,7 @@ def jenkins_remove_ppa(repo): "token=%s&repository=%s" % \ (settings.JENKINS_URL, settings.JENKINS_TOKEN, repo) if settings.DEBUG: - logger.info("I would call %s" % url) + logger.info("I would call %s", url) else: openurl(url) @@ -60,9 +60,9 @@ def workfront_note_send(_id, message): "--taskid=%s" % _id, '--message="%s"' % message ] - logger.debug("workfront-port-note command: %s" % command) + logger.debug("workfront-port-note command: %s", command) res = executeAndReturnOutput(command) if res[0] != 0: - logger.error("can't post workfront note. %s. %s" % (res[1], res[2])) + logger.error("can't post workfront note. %s. %s", res[1], res[2]) return False return True diff --git a/repoapi/views.py b/repoapi/views.py index 913d19b..8b859be 100644 --- a/repoapi/views.py +++ b/repoapi/views.py @@ -13,23 +13,32 @@ # You should have received a copy of the GNU General Public License along # with this program. If not, see . -from . import serializers -from .models import JenkinsBuildInfo as jbi from rest_framework import generics -from rest_framework.decorators import api_view +from rest_framework.decorators import api_view, renderer_classes from rest_framework.response import Response from rest_framework.reverse import reverse from rest_framework.views import APIView +from rest_framework.schemas import SchemaGenerator +from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer import django_filters +from . import serializers +from .models import JenkinsBuildInfo as jbi + + +@api_view() +@renderer_classes([OpenAPIRenderer, SwaggerUIRenderer]) +def schema_view(request): + generator = SchemaGenerator() + return Response(generator.get_schema(request=request)) @api_view(('GET',)) -def api_root(request, format=None): +def api_root(request, _format=None): return Response({ 'jenkinsbuildinfo': reverse('jenkinsbuildinfo-list', - request=request, format=format), + request=request, format=_format), 'release': reverse('release-list', - request=request, format=format), + request=request, format=_format), }) @@ -54,50 +63,47 @@ class JenkinsBuildInfoDetail(generics.RetrieveUpdateDestroyAPIView): class ReleaseList(APIView): - def get(self, request, format=None): - res = jbi.objects.releases(flat=False) - for r in res: - r['url'] = reverse( + def get(self, request, _format=None): + releases = jbi.objects.releases(flat=False) + for release in releases: + release['url'] = reverse( 'project-list', - args=[r['param_release']], + args=[release['param_release']], request=request) - return Response(res) + return Response(releases) class ProjectList(APIView): - def get(self, request, release, format=None): - res = jbi.objects.release_projects( + def get(self, request, release, _format=None): + projects = jbi.objects.release_projects( release, flat=False) - for r in res: - r['url'] = reverse( + for project in projects: + project['url'] = reverse( 'projectuuid-list', - args=[release, r['projectname']], + args=[release, project['projectname']], request=request) - return Response(res) + return Response(projects) class ProjectUUIDList(APIView): - def get(self, request, release, project, format=None): - res = jbi.objects.release_project_uuids( + def get(self, request, release, project, _format=None): + uuids = jbi.objects.release_project_uuids( release, project, flat=False) latest = jbi.objects.latest_uuid(release, project) - for r in res: - r['url'] = reverse( + for uuid in uuids: + uuid['url'] = reverse( 'uuidinfo-list', - args=[release, project, r['tag']], + args=[release, project, uuid['tag']], request=request) - if r['tag'] == latest['tag']: - r['latest'] = True - else: - r['latest'] = False - return Response(res) + uuid['latest'] = (uuid['tag'] == latest['tag']) + return Response(uuids) class UUIDInfoList(APIView): - def get(self, request, release, project, uuid, format=None): + def get(self, request, release, project, uuid, _format=None): res = list() jbis = serializers.JenkinsBuildInfoSerializer jobs = jbi.objects.jobs_by_uuid(release, project, uuid) @@ -109,6 +115,6 @@ class UUIDInfoList(APIView): class LatestUUID(APIView): - def get(self, request, release, project, format=None): + def get(self, request, release, project, _format=None): res = jbi.objects.latest_uuid(release, project) return Response(res) diff --git a/requirements/common.txt b/requirements/common.txt index 48f7d58..6ccb5ee 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -1,4 +1,4 @@ -Django==1.8 +Django==1.9 django-extensions yuicompressor django-assets diff --git a/requirements/test.txt b/requirements/test.txt index ebde66d..22850be 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,7 +1,7 @@ -r common.txt -django-nose -git+https://github.com/linuxmaniac/django-jenkins.git@vseva/nose#egg=django-jenkins -flake8==2.4.1 +django-jenkins +flake8 +pep8 pylint -coverage==3.7.1 +coverage mock diff --git a/t/Dockerfile b/t/Dockerfile index 80d3ee0..dbb5aa2 100644 --- a/t/Dockerfile +++ b/t/Dockerfile @@ -5,18 +5,18 @@ FROM docker.mgm.sipwise.com/sipwise-jessie:latest # is updated with the current date. It will force refresh of all # of the base images and things like `apt-get update` won't be using # old cached versions when the Dockerfile is built. -ENV REFRESHED_AT 2016-04-29 +ENV REFRESHED_AT 2016-07-16 RUN apt-get update RUN apt-get install --assume-yes python2.7 python2.7-dev python-distribute python-pip git # Get pip to download and install requirements: COPY dev.txt test.txt common.txt /tmp/ -RUN pip install -r /tmp/dev.txt +RUN pip install -r /tmp/test.txt RUN echo './t/testrunner' >>/root/.bash_history -WORKDIR /code/ +WORKDIR /repoapi/ ################################################################################ # Instructions for usage diff --git a/t/common.txt b/t/common.txt index 48f7d58..6ccb5ee 100644 --- a/t/common.txt +++ b/t/common.txt @@ -1,4 +1,4 @@ -Django==1.8 +Django==1.9 django-extensions yuicompressor django-assets diff --git a/t/test.txt b/t/test.txt index ebde66d..22850be 100644 --- a/t/test.txt +++ b/t/test.txt @@ -1,7 +1,7 @@ -r common.txt -django-nose -git+https://github.com/linuxmaniac/django-jenkins.git@vseva/nose#egg=django-jenkins -flake8==2.4.1 +django-jenkins +flake8 +pep8 pylint -coverage==3.7.1 +coverage mock