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