Commit 84e59e91 authored by Giorgos Verigakis's avatar Giorgos Verigakis
Browse files

Merge branch 'master' of https://code.grnet.gr/git/synnefo into api-current

parents 854b57be 2024fc70
......@@ -7,6 +7,8 @@ web application.
Consult:
-README.develop: for information on how to setup a development environment
-README.deploy : for information on how to deploy the application
-README.ci : for information on how to setup a Jenkins-based
continuous integration system
-README.i18n : for information on application internationalization
License
......
Continuous integration with Jenkins
-----------------------------------
The following instructions will setup Jenkins to run synnefo tests with
the SQLite database. To run the tests on MySQL and/or Postgres, step 5
must be replicated. Also, the correct configuration file must be copied
(line 5 of the build script).
1. Install and start Jenkins. On Debian:
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
echo "deb http://pkg.jenkins-ci.org/debian binary/" >>/etc/apt/sources.list
sudo apt-get update
sudo apt-get install jenkins
Also install the following packages:
apt-get install python-virtualenv libcurl3-gnutls libcurl3-gnutls-dev
uuid-dev libmysqlclient-dev libpq-dev libsqlite-dev
python-dev
2. After Jenkins starts, go to
http://$HOST:8080/pluginManager/
and install the following plug-ins at
-Jenkins Cobertura Plugin
-Jenkins Email Extension Plugin
-Jenkins GIT plugin
-Jenkins SLOCCount Plug-in
-Hudson/Jenkins Violations plugin
3. Configure the Jenkins user's Git details:
su jenkins
git config --global user.email "buildbot@lists.grnet.gr"
git config --global user.name "Buildbot"
4. Make sure that all system-level dependencies specified in README.develop
are correctly installed
5. Create a new "free-style software" job and set the following values:
-Project name: synnefo
-Source Code Management: Git
-URL of repository: Jenkins Git does not support HTTPS for checking out
directly from the repository. The temporary solution
is to checkout with a cron script in a directory and
set the checkout path in this field
-Branches to build: master and perhaps others
-Git->Advanced->Local subdirectory for repo (optional): synnefo
-Git->Advanced->Prune remote branches before build: check
-Repository browser: redmineweb,
URL: https://code.grnet.gr/projects/synnefo/repository/
-Build Triggers->Poll SCM: check
Schedule: # every ten minutes
0,10,20,30,40,50 * * * *
-Build -> Add build step-> Execute shell
Command:
#!/bin/bash -ex
cd synnefo
mkdir -p reports
/usr/bin/sloccount --duplicates --wide --details api util ui logic auth > reports/sloccount.sc
cp conf/ci/manage.py .
if [ ! -e requirements.pip ]; then cp conf/ci/pip-1.2.conf requirements.pip; fi
cp conf/ci/settings.py.sqlite settings.py
python manage.py update_ve
python manage.py hudson api db logic
-Post-build Actions->Publish JUnit test result report: check
Test report XMLs: synnefo/reports/TEST-*.xml
-Post-build Actions->Publish Cobertura Coverage Report: check
Cobertura xml report pattern: synnefo/reports/coverage.xml
-Post-build Actions->Report Violations: check
pylint[XML filename pattern]: synnefo/reports/pylint.report
-Post-build Actions->Publish SLOCCount analysis results
SLOCCount reports: synnefo/reports/sloccount.sc
(also, remember to install sloccount at /usr/bin)
---------------
See also:
http://sites.google.com/site/kmmbvnr/home/django-hudson-tutorial
#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
from os import path
import shutil, sys, virtualenv, subprocess
PROJECT_ROOT = path.abspath(path.dirname(__file__))
REQUIREMENTS = path.join(PROJECT_ROOT, 'requirements.pip')
VE_ROOT = path.join(PROJECT_ROOT, '.ve')
VE_TIMESTAMP = path.join(VE_ROOT, 'timestamp')
envtime = path.exists(VE_ROOT) and path.getmtime(VE_ROOT) or 0
envreqs = path.exists(VE_TIMESTAMP) and path.getmtime(VE_TIMESTAMP) or 0
envspec = path.getmtime(REQUIREMENTS)
def go_to_ve():
# going into ve
if not sys.prefix == VE_ROOT:
if sys.platform == 'win32':
python = path.join(VE_ROOT, 'Scripts', 'python.exe')
else:
python = path.join(VE_ROOT, 'bin', 'python')
retcode = subprocess.call([python, __file__] + sys.argv[1:])
sys.exit(retcode)
update_ve = 'update_ve' in sys.argv
if update_ve or envtime < envspec or envreqs < envspec:
if update_ve:
# install ve
if envtime < envspec:
if path.exists(VE_ROOT):
shutil.rmtree(VE_ROOT)
virtualenv.logger = virtualenv.Logger(consumers=[])
virtualenv.create_environment(VE_ROOT, site_packages=True)
go_to_ve()
# check requirements
if update_ve or envreqs < envspec:
import pip
pip.main(initial_args=['install', '-r', REQUIREMENTS])
file(VE_TIMESTAMP, 'w').close()
sys.exit(0)
else:
print "VirtualEnv need to be updated"
print "Run ./manage.py update_ve"
sys.exit(1)
go_to_ve()
# run django
from django.core.management import execute_manager
try:
import settings # Assumed to be in the same directory.
import os
path = os.path.normpath(os.path.join(os.getcwd(), '..'))
sys.path.append(path)
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory")
sys.exit(1)
if __name__ == "__main__":
execute_manager(settings)
Django==1.2.4
simplejson==2.1.3
pyzmq==2.0.10.1
pycurl==7.19.0
python-dateutil==1.4.1
django-hudson
MySQL-python==1.2.3
psycopg2==2.4
# -*- coding: utf-8 -*-
# Django settings for synnefo project.
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) + '/'
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'synnefo',
'USER': 'synnefo',
'PASSWORD': 'synnefo',
'HOST': 'localhost',
'PORT': '3128',
'OPTIONS': {
'init_command': 'SET storage_engine=INNODB',
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'UTC'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = ''
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = ''
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/'
# our REST API would prefer to be explicit about trailing slashes
APPEND_SLASH = False
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'ly6)mw6a7x%n)-e#zzk4jo6f2=uqu!1o%)2-(7lo+f9yd^k^bg'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.core.context_processors.i18n',
'django.contrib.auth.context_processors.auth',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'synnefo.middleware.StripURLMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
#'synnefo.api.middleware.SynnefoAuthMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
ROOT_URLCONF = 'synnefo.urls'
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django_hudson',
# 'django.contrib.admindocs',
#'synnefo.auth',
'synnefo.api',
'synnefo.ui',
'synnefo.db',
'synnefo.ganeti',
'synnefo.logic',
)
GANETI_CLUSTER_INFO = ("62.217.120.78",5080,"synnefo","ocean!")
BACKEND_PREFIX_ID = "gousiosg-" #ganeti needs each machine to have a unique name
LANGUAGES = (
('el', u'Ελληνικά'),
('en', 'English'),
)
AUTH_PROFILE_MODULE = 'synnefo.OceanUser'
#needed for django. this is the class that implements the User system. We use this to allow users to add stuff for themselves (about, image etc)
#http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles
TIMEOUT = 10*1000
#after this time passes and the client gets no response, it raises an alert that there are network problems
POLL_LIMIT = 3600
#maximum number of seconds, needed for server and images polling
GANETI_ZMQ_PUBLISHER = "tcp://62.217.120.67:5801"
API_ROOT_URL = 'http://127.0.0.1:8000/api/'
SHIBBOLETH_HOST = "http://wayf.grnet.gr/"
SHIBBOLETH_WHITELIST = {
'localhost' : '127.0.0.1',
'testserver' : '127.0.0.1'
}
#Number of hours during which a user token is active
AUTH_TOKEN_DURATION = 24
# -*- coding: utf-8 -*-
# Django settings for synnefo project.
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) + '/'
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'synnefo',
'USER': 'synnefo',
'PASSWORD': 'synnefo',
'HOST': '127.0.0.1'
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'UTC'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = ''
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = ''
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/'
# our REST API would prefer to be explicit about trailing slashes
APPEND_SLASH = False
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'ly6)mw6a7x%n)-e#zzk4jo6f2=uqu!1o%)2-(7lo+f9yd^k^bg'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.core.context_processors.i18n',
'django.contrib.auth.context_processors.auth',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'synnefo.middleware.StripURLMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
#'synnefo.api.middleware.SynnefoAuthMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
ROOT_URLCONF = 'synnefo.urls'
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django_hudson',
# 'django.contrib.admindocs',
#'synnefo.auth',
'synnefo.api',
'synnefo.ui',
'synnefo.db',
'synnefo.ganeti',
'synnefo.logic',
)
GANETI_CLUSTER_INFO = ("62.217.120.78",5080,"synnefo","ocean!")
BACKEND_PREFIX_ID = "gousiosg-" #ganeti needs each machine to have a unique name
LANGUAGES = (
('el', u'Ελληνικά'),
('en', 'English'),
)
AUTH_PROFILE_MODULE = 'synnefo.OceanUser'
#needed for django. this is the class that implements the User system. We use this to allow users to add stuff for themselves (about, image etc)
#http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles
TIMEOUT = 10*1000
#after this time passes and the client gets no response, it raises an alert that there are network problems
POLL_LIMIT = 3600
#maximum number of seconds, needed for server and images polling
GANETI_ZMQ_PUBLISHER = "tcp://62.217.120.67:5801"
API_ROOT_URL = 'http://127.0.0.1:8000/api/'
SHIBBOLETH_HOST = "http://wayf.grnet.gr/"
SHIBBOLETH_WHITELIST = {
'localhost' : '127.0.0.1',
'testserver' : '127.0.0.1'
}
#Number of hours during which a user token is active
AUTH_TOKEN_DURATION = 24
# -*- coding: utf-8 -*-
# Django settings for synnefo project.
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) + '/'
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': PROJECT_PATH + 'synnefo.db' #WARN: This must be an absolute path
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'UTC'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = ''
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = ''
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/'
# our REST API would prefer to be explicit about trailing slashes
APPEND_SLASH = False
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'ly6)mw6a7x%n)-e#zzk4jo6f2=uqu!1o%)2-(7lo+f9yd^k^bg'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.core.context_processors.i18n',
'django.contrib.auth.context_processors.auth',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'synnefo.middleware.StripURLMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
#'synnefo.api.middleware.SynnefoAuthMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
ROOT_URLCONF = 'synnefo.urls'
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django_hudson',
# 'django.contrib.admindocs',
#'synnefo.auth',
'synnefo.api',
'synnefo.ui',
'synnefo.db',
'synnefo.ganeti',
'synnefo.logic',
)
GANETI_CLUSTER_INFO = ("62.217.120.78",5080,"synnefo","ocean!")
BACKEND_PREFIX_ID = "gousiosg-" #ganeti needs each machine to have a unique name
LANGUAGES = (
('el', u'Ελληνικά'),
('en', 'English'),
)
AUTH_PROFILE_MODULE = 'synnefo.OceanUser'
#needed for django. this is the class that implements the User system. We use this to allow users to add stuff for themselves (about, image etc)
#http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles
TIMEOUT = 10*1000
#after this time passes and the client gets no response, it raises an alert that there are network problems
POLL_LIMIT = 3600
#maximum number of seconds, needed for server and images polling
GANETI_ZMQ_PUBLISHER = "tcp://62.217.120.67:5801"
API_ROOT_URL = 'http://127.0.0.1:8000/api/'
SHIBBOLETH_HOST = "http://wayf.grnet.gr/"
SHIBBOLETH_WHITELIST = {
'localhost' : '127.0.0.1',
'testserver' : '127.0.0.1'
}
#Number of hours during which a user token is active
AUTH_TOKEN_DURATION = 24
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment