MT#19235 TT#1740 upgrade to django 1.9

* upgrade requirements
  - remove django-jenkins own patch
* split common settings on settings/common.py
* improve code quality following pylint

Change-Id: If62940f6369d23079d3113407d221461c8d02e39
changes/62/7062/1
Victor Seva 10 years ago
parent 35d2c97d58
commit 784cda3e02

@ -13,7 +13,8 @@ venv_prod: requirements/prod.txt
################################### ###################################
test: 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 deploy: venv_prod
source $(VAR_DIR)/venv_prod/bin/activate && \ source $(VAR_DIR)/venv_prod/bin/activate && \

@ -22,15 +22,14 @@ def index(request):
return render(request, 'panel/index.html', context) return render(request, 'panel/index.html', context)
def release(request, release): def release(request, _release):
projects = jbi.objects.release_projects(release, flat=False) projects = jbi.objects.release_projects(_release, flat=False)
context = {'release': release, context = {'release': _release,
'projects': projects} 'projects': projects}
return render(request, 'panel/release.html', context) return render(request, 'panel/release.html', context)
def project(request, release, project): def project(request, _release, _project):
projects = [project, ] uuids = jbi.objects.release_project_uuids_set(_release, _project)
uuids = jbi.objects.release_project_uuids_set(release, project) context = {'project': _project, 'release': _release, 'uuids': uuids}
context = {'project': project, 'release': release, 'uuids': uuids}
return render(request, 'panel/project.html', context) return render(request, 'panel/project.html', context)

@ -5,6 +5,7 @@ ignore=migrations
cache-size=500 cache-size=500
[MESSAGES CONTROL] [MESSAGES CONTROL]
# C1001 Old-style class defined
# C0111 Missing docstring # C0111 Missing docstring
# I0011 Warning locally suppressed using disable-msg # I0011 Warning locally suppressed using disable-msg
# I0012 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. # 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. # W0702 No exception's type specified Used when an except clause doesn't specify exceptions type to catch.
# R0201 Method could be a function # 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] [REPORTS]
output-format=parseable output-format=parseable

@ -12,17 +12,17 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
import re
from django.db import models from django.db import models
from django.db.models import signals from django.db.models import signals
from django.conf import settings from django.conf import settings
from repoapi import utils from repoapi import utils
import logging
import re
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
workfront_re = re.compile('TT#(\d+)') workfront_re = re.compile(r"TT#(\d+)")
commit_re = re.compile('^(\w{7}) ') commit_re = re.compile(r"^(\w{7}) ")
class JenkinsBuildInfoManager(models.Manager): class JenkinsBuildInfoManager(models.Manager):
@ -119,7 +119,7 @@ def gerrit_repo_add(instance):
param_ppa=instance.param_ppa, param_ppa=instance.param_ppa,
gerrit_change=instance.gerrit_change) gerrit_change=instance.gerrit_change)
if created: if created:
logging.info("%s created" % ppa) logging.info("%s created", ppa)
def gerrit_repo_del(instance): def gerrit_repo_del(instance):
@ -131,7 +131,7 @@ def gerrit_repo_del(instance):
ppa = gri.get(param_ppa=instance.param_ppa, ppa = gri.get(param_ppa=instance.param_ppa,
gerrit_change=instance.gerrit_change) gerrit_change=instance.gerrit_change)
ppa.delete() ppa.delete()
logger.info("removed %s" % ppa) logger.info("removed %s", ppa)
except GerritRepoInfo.DoesNotExist: except GerritRepoInfo.DoesNotExist:
pass pass
if gri.filter(param_ppa=instance.param_ppa).count() == 0: if gri.filter(param_ppa=instance.param_ppa).count() == 0:

@ -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 <http://www.gnu.org/licenses/>.
# 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"

@ -15,11 +15,12 @@
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os import os
# pylint: disable=W0401,W0614
from .common import *
BASE_DIR = os.path.dirname( BASE_DIR = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
@ -31,61 +32,12 @@ DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = []
TESTING_APPS = [
# 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',
'django_jenkins', 'django_jenkins',
'django_assets',
] ]
INSTALLED_APPS.extend(TESTING_APPS)
INSTALLED_APPS.extend(PROJECT_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 # Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases # 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 # django-jenkins
JENKINS_TASKS = ( JENKINS_TASKS = (
'django_jenkins.tasks.run_pylint', 'django_jenkins.tasks.run_pylint',
'django_jenkins.tasks.run_flake8', 'django_jenkins.tasks.run_flake8',
'django_jenkins.tasks.with_coverage',
) )
PYLINT_RCFILE = 'pylint.cfg' PYLINT_RCFILE = 'pylint.cfg'
STATICFILES_FINDERS = ( LOGGING['loggers']['repoapi']['level'] = os.getenv('DJANGO_LOG_LEVEL', 'DEBUG')
'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'),
},
},
}
JENKINS_URL = "http://localhost" JENKINS_URL = "http://localhost"
JENKINS_TOKEN = "sipwise_jenkins_ci"
GERRIT_URL = "https://gerrit.local/{}" GERRIT_URL = "https://gerrit.local/{}"
GITWEB_URL = "https://git.local/gitweb/?p={}.git;a=commit;h={}" GITWEB_URL = "https://git.local/gitweb/?p={}.git;a=commit;h={}"
WORKFRONT_CREDENTIALS = os.path.join(BASE_DIR, '.workfront.ini') WORKFRONT_CREDENTIALS = os.path.join(BASE_DIR, '.workfront.ini')

@ -15,6 +15,8 @@
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os import os
# pylint: disable=W0401,W0614
from .common import *
BASE_DIR = os.path.dirname( BASE_DIR = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@ -35,59 +37,8 @@ DEBUG = False
ALLOWED_HOSTS = ['.mgm.sipwise.com'] 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) 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 # Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
@ -98,73 +49,9 @@ DATABASES = {
} }
} }
LOGGING['loggers']['repoapi']['level'] = os.getenv('DJANGO_LOG_LEVEL', 'INFO')
# 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'),
},
},
}
JENKINS_URL = "https://jenkins.mgm.sipwise.com" JENKINS_URL = "https://jenkins.mgm.sipwise.com"
JENKINS_TOKEN = "sipwise_jenkins_ci"
GERRIT_URL = "https://gerrit.mgm.sipwise.com/{}" GERRIT_URL = "https://gerrit.mgm.sipwise.com/{}"
GITWEB_URL = "https://git.mgm.sipwise.com/gitweb/?p={}.git;a=commit;h={}" GITWEB_URL = "https://git.mgm.sipwise.com/gitweb/?p={}.git;a=commit;h={}"
WORKFRONT_CREDENTIALS = os.path.join(BASE_DIR, WORKFRONT_CREDENTIALS = os.path.join(BASE_DIR,

@ -20,24 +20,28 @@ from mock import patch
class GerritRepoInfoTestCase(TestCase): 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') @patch('repoapi.utils.jenkins_remove_ppa')
def test_creation(self, utils): def test_creation(self, utils):
JenkinsBuildInfo.objects.create( JenkinsBuildInfo.objects.create(**self.get_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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 1) self.assertEquals(gri.count(), 1)
@ -45,42 +49,9 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_creation_deletion(self, utils): def test_creation_deletion(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['gerrit_eventtype'] = "change-merged"
projectname="kamailio", JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
@ -89,21 +60,9 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_no_creation(self, utils): def test_no_creation(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['jobname'] = "kamailio-get-code"
projectname="kamailio", JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
@ -112,42 +71,9 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_creation_review(self, utils): def test_creation_review(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['buildnumber'] = 898
projectname="kamailio", JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
@ -156,42 +82,18 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_creation_multi_review(self, utils): def test_creation_multi_review(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", JenkinsBuildInfo.objects.create(**param)
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( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 1) self.assertEquals(gri.count(), 1)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param['projectname'] = "fake"
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['jobname'] = "fake-repos"
projectname="fake", param['buildnumber'] = 8
jobname="fake-repos", param['gerrit_change'] = 2
buildnumber=8, JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
@ -200,63 +102,28 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_creation_multi_review_no_del(self, utils): def test_creation_multi_review_no_del(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", JenkinsBuildInfo.objects.create(**param)
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( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 1) self.assertEquals(gri.count(), 1)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param_fake = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param_fake['projectname'] = "fake"
projectname="fake", param_fake['jobname'] = "fake-repos"
jobname="fake-repos", param_fake['buildnumber'] = 8
buildnumber=8, param_fake['gerrit_change'] = 2
result="SUCCESS", JenkinsBuildInfo.objects.create(**param_fake)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 2) self.assertEquals(gri.count(), 2)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param['gerrit_eventtype'] = "change-merged"
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['buildnumber'] = 898
projectname="kamailio", JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
@ -265,84 +132,37 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_creation_multi_review_del(self, utils): def test_creation_multi_review_del(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", JenkinsBuildInfo.objects.create(**param)
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( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 1) self.assertEquals(gri.count(), 1)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param_fake = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param_fake['projectname'] = "fake"
projectname="fake", param_fake['jobname'] = "fake-repos"
jobname="fake-repos", param_fake['buildnumber'] = 8
buildnumber=8, param_fake['gerrit_change'] = 2
result="SUCCESS", JenkinsBuildInfo.objects.create(**param_fake)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 2) self.assertEquals(gri.count(), 2)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param['gerrit_eventtype'] = "change-merged"
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['buildnumber'] = 898
projectname="kamailio", JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 1) self.assertEquals(gri.count(), 1)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param_fake['buildnumber'] = 9
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param_fake['gerrit_eventtype'] = "change-merged"
projectname="fake", JenkinsBuildInfo.objects.create(**param_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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
@ -351,43 +171,17 @@ class GerritRepoInfoTestCase(TestCase):
@patch('repoapi.utils.jenkins_remove_ppa') @patch('repoapi.utils.jenkins_remove_ppa')
def test_abandoned_review_del(self, utils): def test_abandoned_review_del(self, utils):
JenkinsBuildInfo.objects.create( param = self.get_defaults()
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", JenkinsBuildInfo.objects.create(**param)
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( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")
self.assertEquals(gri.count(), 1) self.assertEquals(gri.count(), 1)
utils.assert_not_called() utils.assert_not_called()
JenkinsBuildInfo.objects.create( param['jobname'] = "kamailio-cleanup"
tag="edc90cd9-37f3-4613-9748-ed05a32031c2", param['gerrit_eventtype'] = "change-abandoned"
projectname="kamailio", param['buildnumber'] = 898
jobname="kamailio-cleanup", JenkinsBuildInfo.objects.create(**param)
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")
gri = GerritRepoInfo.objects.filter( gri = GerritRepoInfo.objects.filter(
param_ppa="gerrit_MT10339_review2054") param_ppa="gerrit_MT10339_review2054")

@ -14,8 +14,8 @@
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
from django.test import TestCase from django.test import TestCase
from repoapi.models import JenkinsBuildInfo
from django.utils.dateparse import parse_datetime from django.utils.dateparse import parse_datetime
from repoapi.models import JenkinsBuildInfo
class JBIQueriesTestCase(TestCase): class JBIQueriesTestCase(TestCase):
@ -27,8 +27,8 @@ class JBIQueriesTestCase(TestCase):
def test_release_projects(self): def test_release_projects(self):
projects = ['fake', ] projects = ['fake', ]
p = JenkinsBuildInfo.objects.release_projects('mr3.1-fake') check = JenkinsBuildInfo.objects.release_projects('mr3.1-fake')
self.assertItemsEqual(p, projects) self.assertItemsEqual(check, projects)
def test_release_project_uuids(self): def test_release_project_uuids(self):
projects = ['fake', ] projects = ['fake', ]
@ -36,10 +36,10 @@ class JBIQueriesTestCase(TestCase):
uuids = dict() uuids = dict()
uuids_ok['fake'] = ['UUID1', 'UUID0'] uuids_ok['fake'] = ['UUID1', 'UUID0']
for p in projects: for project in projects:
uuids[p] = JenkinsBuildInfo.objects.release_project_uuids( uuids[project] = JenkinsBuildInfo.objects.release_project_uuids(
'mr3.1-fake', p) 'mr3.1-fake', project)
self.assertItemsEqual(uuids_ok[p], uuids[p]) self.assertItemsEqual(uuids_ok[project], uuids[project])
def test_jobs_by_uuid(self): def test_jobs_by_uuid(self):
jobs = JenkinsBuildInfo.objects.jobs_by_uuid( jobs = JenkinsBuildInfo.objects.jobs_by_uuid(

@ -51,7 +51,7 @@ urlpatterns = [
url(r'^', include(api_patterns)), url(r'^', include(api_patterns)),
url(r'^api-auth/', include('rest_framework.urls', url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework')), namespace='rest_framework')),
url(r'^docs/', include('rest_framework_swagger.urls')), url(r'^docs/', views.schema_view),
url(r'^panel/', include('panel.urls', url(r'^panel/', include('panel.urls',
namespace='panel')), namespace='panel')),
] ]

@ -12,33 +12,33 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
import urllib2 import urllib2
import logging import logging
import subprocess import subprocess
import sys
from django.conf import settings from django.conf import settings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def executeAndReturnOutput(command, env=None): def executeAndReturnOutput(command, env=None):
p = subprocess.Popen(command, stdout=subprocess.PIPE, proc = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env) stderr=subprocess.PIPE, env=env)
stdoutdata, stderrdata = p.communicate() stdoutdata, stderrdata = proc.communicate()
print(stdoutdata, file=sys.stdout) logger.debug("<stdout>%s</stdout>", stdoutdata)
print(stderrdata, file=sys.stderr) logger.debug("<strerr>%s</stderr>", stderrdata)
return p.returncode, stdoutdata, stderrdata return proc.returncode, stdoutdata, stderrdata
def openurl(URL): def openurl(url):
req = urllib2.Request(URL) req = urllib2.Request(url)
logger.debug("url:[%s]", url)
response = urllib2.urlopen(req) response = urllib2.urlopen(req)
if response.code is 200: if response.code is 200:
print("OK") logger.debug("OK")
return 0 return 0
else: else:
print("Error retrieving %s" % URL) logger.error("Error retrieving %s", url)
return 1 return 1
@ -47,7 +47,7 @@ def jenkins_remove_ppa(repo):
"token=%s&repository=%s" % \ "token=%s&repository=%s" % \
(settings.JENKINS_URL, settings.JENKINS_TOKEN, repo) (settings.JENKINS_URL, settings.JENKINS_TOKEN, repo)
if settings.DEBUG: if settings.DEBUG:
logger.info("I would call %s" % url) logger.info("I would call %s", url)
else: else:
openurl(url) openurl(url)
@ -60,9 +60,9 @@ def workfront_note_send(_id, message):
"--taskid=%s" % _id, "--taskid=%s" % _id,
'--message="%s"' % message '--message="%s"' % message
] ]
logger.debug("workfront-port-note command: %s" % command) logger.debug("workfront-port-note command: %s", command)
res = executeAndReturnOutput(command) res = executeAndReturnOutput(command)
if res[0] != 0: 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 False
return True return True

@ -13,23 +13,32 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>. # with this program. If not, see <http://www.gnu.org/licenses/>.
from . import serializers
from .models import JenkinsBuildInfo as jbi
from rest_framework import generics 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.response import Response
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.schemas import SchemaGenerator
from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer
import django_filters 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',)) @api_view(('GET',))
def api_root(request, format=None): def api_root(request, _format=None):
return Response({ return Response({
'jenkinsbuildinfo': reverse('jenkinsbuildinfo-list', 'jenkinsbuildinfo': reverse('jenkinsbuildinfo-list',
request=request, format=format), request=request, format=_format),
'release': reverse('release-list', 'release': reverse('release-list',
request=request, format=format), request=request, format=_format),
}) })
@ -54,50 +63,47 @@ class JenkinsBuildInfoDetail(generics.RetrieveUpdateDestroyAPIView):
class ReleaseList(APIView): class ReleaseList(APIView):
def get(self, request, format=None): def get(self, request, _format=None):
res = jbi.objects.releases(flat=False) releases = jbi.objects.releases(flat=False)
for r in res: for release in releases:
r['url'] = reverse( release['url'] = reverse(
'project-list', 'project-list',
args=[r['param_release']], args=[release['param_release']],
request=request) request=request)
return Response(res) return Response(releases)
class ProjectList(APIView): class ProjectList(APIView):
def get(self, request, release, format=None): def get(self, request, release, _format=None):
res = jbi.objects.release_projects( projects = jbi.objects.release_projects(
release, flat=False) release, flat=False)
for r in res: for project in projects:
r['url'] = reverse( project['url'] = reverse(
'projectuuid-list', 'projectuuid-list',
args=[release, r['projectname']], args=[release, project['projectname']],
request=request) request=request)
return Response(res) return Response(projects)
class ProjectUUIDList(APIView): class ProjectUUIDList(APIView):
def get(self, request, release, project, format=None): def get(self, request, release, project, _format=None):
res = jbi.objects.release_project_uuids( uuids = jbi.objects.release_project_uuids(
release, project, flat=False) release, project, flat=False)
latest = jbi.objects.latest_uuid(release, project) latest = jbi.objects.latest_uuid(release, project)
for r in res: for uuid in uuids:
r['url'] = reverse( uuid['url'] = reverse(
'uuidinfo-list', 'uuidinfo-list',
args=[release, project, r['tag']], args=[release, project, uuid['tag']],
request=request) request=request)
if r['tag'] == latest['tag']: uuid['latest'] = (uuid['tag'] == latest['tag'])
r['latest'] = True return Response(uuids)
else:
r['latest'] = False
return Response(res)
class UUIDInfoList(APIView): class UUIDInfoList(APIView):
def get(self, request, release, project, uuid, format=None): def get(self, request, release, project, uuid, _format=None):
res = list() res = list()
jbis = serializers.JenkinsBuildInfoSerializer jbis = serializers.JenkinsBuildInfoSerializer
jobs = jbi.objects.jobs_by_uuid(release, project, uuid) jobs = jbi.objects.jobs_by_uuid(release, project, uuid)
@ -109,6 +115,6 @@ class UUIDInfoList(APIView):
class LatestUUID(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) res = jbi.objects.latest_uuid(release, project)
return Response(res) return Response(res)

@ -1,4 +1,4 @@
Django==1.8 Django==1.9
django-extensions django-extensions
yuicompressor yuicompressor
django-assets django-assets

@ -1,7 +1,7 @@
-r common.txt -r common.txt
django-nose django-jenkins
git+https://github.com/linuxmaniac/django-jenkins.git@vseva/nose#egg=django-jenkins flake8
flake8==2.4.1 pep8
pylint pylint
coverage==3.7.1 coverage
mock mock

@ -5,18 +5,18 @@ FROM docker.mgm.sipwise.com/sipwise-jessie:latest
# is updated with the current date. It will force refresh of all # 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 # of the base images and things like `apt-get update` won't be using
# old cached versions when the Dockerfile is built. # 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 update
RUN apt-get install --assume-yes python2.7 python2.7-dev python-distribute python-pip git RUN apt-get install --assume-yes python2.7 python2.7-dev python-distribute python-pip git
# Get pip to download and install requirements: # Get pip to download and install requirements:
COPY dev.txt test.txt common.txt /tmp/ 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 RUN echo './t/testrunner' >>/root/.bash_history
WORKDIR /code/ WORKDIR /repoapi/
################################################################################ ################################################################################
# Instructions for usage # Instructions for usage

@ -1,4 +1,4 @@
Django==1.8 Django==1.9
django-extensions django-extensions
yuicompressor yuicompressor
django-assets django-assets

@ -1,7 +1,7 @@
-r common.txt -r common.txt
django-nose django-jenkins
git+https://github.com/linuxmaniac/django-jenkins.git@vseva/nose#egg=django-jenkins flake8
flake8==2.4.1 pep8
pylint pylint
coverage==3.7.1 coverage
mock mock

Loading…
Cancel
Save