[openstack-trove] initial import (#1089213)

Pádraig Brady pbrady at fedoraproject.org
Tue Jul 8 09:50:50 UTC 2014


commit 4c961dad5f1b4ebd82dbef08b19f25bb1107ccac
Author: Pádraig Brady <P at draigBrady.com>
Date:   Tue Jul 8 10:50:14 2014 +0100

    initial import (#1089213)

 .gitignore                          |    1 +
 authtoken.diff                      |  173 ++++++++++++
 db-config.diff                      |   55 ++++
 el6-parallel-deps.diff              |   56 ++++
 guest_info                          |    2 +
 openstack-trove-api.init            |  101 +++++++
 openstack-trove-api.service         |   12 +
 openstack-trove-api.upstart         |    8 +
 openstack-trove-conductor.init      |  101 +++++++
 openstack-trove-conductor.service   |   12 +
 openstack-trove-conductor.upstart   |    8 +
 openstack-trove-guestagent.init     |  101 +++++++
 openstack-trove-guestagent.service  |   12 +
 openstack-trove-guestagent.upstart  |    8 +
 openstack-trove-taskmanager.init    |  101 +++++++
 openstack-trove-taskmanager.service |   12 +
 openstack-trove-taskmanager.upstart |    8 +
 openstack-trove.spec                |  499 +++++++++++++++++++++++++++++++++++
 sources                             |    1 +
 trove-dist.conf                     |    4 +
 trove.logrotate                     |    6 +
 version.diff                        |   27 ++
 22 files changed, 1308 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index e69de29..b388d96 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/trove-2014.1.tar.gz
diff --git a/authtoken.diff b/authtoken.diff
new file mode 100644
index 0000000..c6a41ba
--- /dev/null
+++ b/authtoken.diff
@@ -0,0 +1,173 @@
+From a7f58b07655e8f07052846ff76067f66726b0b3b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P at draigBrady.com>
+Date: Mon, 14 Apr 2014 12:26:48 +0100
+Subject: [PATCH] move [keystone_authtoken] from api-paste.ini to trove.conf
+
+---
+ etc/trove/api-paste.ini     |    8 ---
+ etc/trove/trove.conf.sample |  132 ++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 131 insertions(+), 9 deletions(-)
+
+diff --git a/etc/trove/api-paste.ini b/etc/trove/api-paste.ini
+index 96edbea..7d7597b 100644
+--- a/etc/trove/api-paste.ini
++++ b/etc/trove/api-paste.ini
+@@ -15,14 +15,6 @@ paste.filter_factory = trove.common.extensions:factory
+ 
+ [filter:authtoken]
+ paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
+-auth_host = 127.0.0.1
+-auth_port = 35357
+-auth_protocol = http
+-admin_token = be19c524ddc92109a224
+-# signing_dir is configurable, but the default behavior of the authtoken
+-# middleware should be sufficient.  It will create a temporary directory
+-# in the home directory for the user the trove process is running as.
+-#signing_dir = /var/lib/trove/keystone-signing
+ 
+ [filter:authorization]
+ paste.filter_factory = trove.common.auth:AuthorizationMiddleware.factory
+diff --git a/etc/trove/trove.conf.sample b/etc/trove/trove.conf.sample
+index d57eb37..af9589a 100644
+--- a/etc/trove/trove.conf.sample
++++ b/etc/trove/trove.conf.sample
+@@ -162,4 +162,134 @@ tcp_ports = 6379
+ tcp_ports = 7000, 7001, 9042, 9160
+ 
+ [couchbase]
+-tcp_ports = 8091, 8092, 4369, 11209-11211, 21100-21199
+\ No newline at end of file
++tcp_ports = 8091, 8092, 4369, 11209-11211, 21100-21199
++
++[keystone_authtoken]
++
++#
++# Options defined in keystoneclient.middleware.auth_token
++#
++
++# Prefix to prepend at the beginning of the path (string
++# value)
++#auth_admin_prefix=
++
++# Host providing the admin Identity API endpoint (string
++# value)
++#auth_host=127.0.0.1
++
++# Port of the admin Identity API endpoint (integer value)
++#auth_port=35357
++
++# Protocol of the admin Identity API endpoint(http or https)
++# (string value)
++#auth_protocol=https
++
++# Complete public Identity API endpoint (string value)
++#auth_uri=<None>
++
++# API version of the admin Identity API endpoint (string
++# value)
++#auth_version=<None>
++
++# Do not handle authorization requests within the middleware,
++# but delegate the authorization decision to downstream WSGI
++# components (boolean value)
++#delay_auth_decision=false
++
++# Request timeout value for communicating with Identity API
++# server. (boolean value)
++#http_connect_timeout=<None>
++
++# How many times are we trying to reconnect when communicating
++# with Identity API Server. (integer value)
++#http_request_max_retries=3
++
++# Allows to pass in the name of a fake http_handler callback
++# function used instead of httplib.HTTPConnection or
++# httplib.HTTPSConnection. Useful for unit testing where
++# network is not available. (string value)
++#http_handler=<None>
++
++# Single shared secret with the Keystone configuration used
++# for bootstrapping a Keystone installation, or otherwise
++# bypassing the normal authentication process. (string value)
++#admin_token=<None>
++
++# Keystone account username (string value)
++#admin_user=<None>
++
++# Keystone account password (string value)
++#admin_password=<None>
++
++# Keystone service account tenant name to validate user tokens
++# (string value)
++#admin_tenant_name=admin
++
++# Env key for the swift cache (string value)
++#cache=<None>
++
++# Required if Keystone server requires client certificate
++# (string value)
++#certfile=<None>
++
++# Required if Keystone server requires client certificate
++# (string value)
++#keyfile=<None>
++
++# A PEM encoded Certificate Authority to use when verifying
++# HTTPs connections. Defaults to system CAs. (string value)
++#cafile=<None>
++
++# Verify HTTPS connections. (boolean value)
++#insecure=false
++
++# Directory used to cache files related to PKI tokens (string
++# value)
++#signing_dir=<None>
++
++# If defined, the memcache server(s) to use for caching (list
++# value)
++# Deprecated group/name - [DEFAULT]/memcache_servers
++#memcached_servers=<None>
++
++# In order to prevent excessive requests and validations, the
++# middleware uses an in-memory cache for the tokens the
++# Keystone API returns. This is only valid if memcache_servers
++# is defined. Set to -1 to disable caching completely.
++# (integer value)
++#token_cache_time=300
++
++# Value only used for unit testing (integer value)
++#revocation_cache_time=1
++
++# (optional) if defined, indicate whether token data should be
++# authenticated or authenticated and encrypted. Acceptable
++# values are MAC or ENCRYPT.  If MAC, token data is
++# authenticated (with HMAC) in the cache. If ENCRYPT, token
++# data is encrypted and authenticated in the cache. If the
++# value is not one of these options or empty, auth_token will
++# raise an exception on initialization. (string value)
++#memcache_security_strategy=<None>
++
++# (optional, mandatory if memcache_security_strategy is
++# defined) this string is used for key derivation. (string
++# value)
++#memcache_secret_key=<None>
++
++# (optional) indicate whether to set the X-Service-Catalog
++# header. If False, middleware will not ask for service
++# catalog on token validation and will not set the X-Service-
++# Catalog header. (boolean value)
++#include_service_catalog=true
++
++# Used to control the use and type of token binding. Can be
++# set to: "disabled" to not check token binding. "permissive"
++# (default) to validate binding information if the bind type
++# is of a form known to the server and ignore it if not.
++# "strict" like "permissive" but if the bind type is unknown
++# the token will be rejected. "required" any form of token
++# binding is needed to be allowed. Finally the name of a
++# binding method that must be present in tokens. (string
++# value)
++#enforce_token_bind=permissive
+-- 
+1.7.7.6
+
diff --git a/db-config.diff b/db-config.diff
new file mode 100644
index 0000000..a8e9d3b
--- /dev/null
+++ b/db-config.diff
@@ -0,0 +1,55 @@
+From 2115b5d2b4d81b9de0e603ea61cdd547142ab84e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P at draigBrady.com>
+Date: Mon, 14 Apr 2014 15:15:39 +0100
+Subject: [PATCH] adjust db config
+
+remove conductor and taskmanager specific db connection config
+
+adjust default sql_connection option so that it is edited
+by the openstack-db script.
+---
+ etc/trove/trove-conductor.conf.sample   |    1 -
+ etc/trove/trove-taskmanager.conf.sample |    3 +--
+ etc/trove/trove.conf.sample             |    2 +-
+ 3 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/etc/trove/trove-conductor.conf.sample b/etc/trove/trove-conductor.conf.sample
+index 31483d0..72e84f2 100644
+--- a/etc/trove/trove-conductor.conf.sample
++++ b/etc/trove/trove-conductor.conf.sample
+@@ -3,5 +3,4 @@ verbose = True
+ debug = True
+ control_exchange = trove
+ trove_auth_url = http://0.0.0.0:5000/v2.0
+-sql_connection = mysql://root:e1a2c042c828d3566d0a@localhost/trove
+ rabbit_password = f7999d1955c5014aa32c
+diff --git a/etc/trove/trove-taskmanager.conf.sample b/etc/trove/trove-taskmanager.conf.sample
+index 2bd93f2..26d9534 100644
+--- a/etc/trove/trove-taskmanager.conf.sample
++++ b/etc/trove/trove-taskmanager.conf.sample
+@@ -14,8 +14,7 @@ rabbit_password=f7999d1955c5014aa32c
+ # SQLAlchemy connection string for the reference implementation
+ # registry server. Any valid SQLAlchemy connection string is fine.
+ # See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine
+-sql_connection = mysql://root:e1a2c042c828d3566d0a@localhost/trove
+-# sql_connection = mysql://root:root@localhost/trove
++# sql_connection = mysql://trove:trove@localhost/trove
+ 
+ # Period in seconds after which SQLAlchemy should reestablish its connection
+ # to the database.
+diff --git a/etc/trove/trove.conf.sample b/etc/trove/trove.conf.sample
+index af9589a..35cb7e5 100644
+--- a/etc/trove/trove.conf.sample
++++ b/etc/trove/trove.conf.sample
+@@ -21,7 +21,7 @@ rabbit_password=f7999d1955c5014aa32c
+ # registry server. Any valid SQLAlchemy connection string is fine.
+ # See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine
+ # sql_connection = sqlite:///trove_test.sqlite
+-sql_connection = mysql://root:e1a2c042c828d3566d0a@localhost/trove
++#sql_connection = mysql://trove:trovea@localhost/trove
+ #sql_connection = postgresql://trove:trove@localhost/trove
+ 
+ # Period in seconds after which SQLAlchemy should reestablish its connection
+-- 
+1.7.7.6
+
diff --git a/el6-parallel-deps.diff b/el6-parallel-deps.diff
new file mode 100644
index 0000000..07e1c7b
--- /dev/null
+++ b/el6-parallel-deps.diff
@@ -0,0 +1,56 @@
+From fe3a58ca923c23dee034195786cfb509b0db4ec9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P at draigBrady.com>
+Date: Fri, 25 Apr 2014 15:14:23 +0100
+Subject: [PATCH] Use updated parallel install versions of epel package
+
+Use sqlalchemy >= 0.6.3 Routes >= 1.12.3 PasteDeploy >= 1.5.0
+and depend on the parallel installable
+versions of these packages to satisfy those requirements.
+
+Delve into pkg_resources a little to get it to modify sys.path,
+so that our parallel installed egg takes precedence over the
+system default module versions.
+---
+ trove/__init__.py |   29 +++++++++++++++++++++++++++++
+ 1 files changed, 29 insertions(+), 0 deletions(-)
+
+diff --git a/trove/__init__.py b/trove/__init__.py
+index 8b9fc79..d3000e6 100644
+--- a/trove/__init__.py
++++ b/trove/__init__.py
+@@ -21,3 +21,32 @@
+    :synopsis: Platform-As-A-Service Database Cloud
+ .. moduleauthor:: Michael Basnight <mbasnight at gmail.com>
+ """
++
++import sys
++import pkg_resources
++
++# If there is a conflicting non egg module,
++# i.e. an older standard system module installed,
++# then replace it with this requirement
++def replace_dist(requirement):
++    try:
++        return pkg_resources.require(requirement)
++    except pkg_resources.VersionConflict:
++        e = sys.exc_info()[1]
++        dist=e.args[0]
++        req=e.args[1]
++        if dist.key == req.key and not dist.location.endswith('.egg'):
++            del pkg_resources.working_set.by_key[dist.key]
++            # We assume there is no need to adjust sys.path
++            # and the associated pkg_resources.working_set.entries
++            return pkg_resources.require(requirement)
++
++replace_dist("SQLALchemy >= 0.6.3")
++replace_dist("Routes >= 1.12.3")
++
++replace_dist("PasteDeploy >= 1.5.0")
++# This hack is needed because replace_dist() results in
++# the standard paste module path being at the start of __path__.
++# TODO: See can we get pkg_resources to do the right thing directly
++import paste
++paste.__path__.insert(0, paste.__path__.pop(-1))
+-- 
+1.7.7.6
+
diff --git a/guest_info b/guest_info
new file mode 100644
index 0000000..be8d748
--- /dev/null
+++ b/guest_info
@@ -0,0 +1,2 @@
+[DEFAULT]
+# guest_id = placeholder to be overwritten when VM instance created
diff --git a/openstack-trove-api.init b/openstack-trove-api.init
new file mode 100644
index 0000000..7cd398d
--- /dev/null
+++ b/openstack-trove-api.init
@@ -0,0 +1,101 @@
+#!/bin/sh
+#
+# openstack-trove-api OpenStack DBaaS API server
+#
+# chkconfig:   - 98 02
+# description: OpenStack DBaaS (code-named Trove) API server
+
+### BEGIN INIT INFO
+# Provides:
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Stop: 0 1 6
+# Short-Description: Trove API server
+# Description: OpenStack DBaaS (code-named Trove) API server
+### END INIT INFO
+
+. /etc/rc.d/init.d/functions
+
+suffix=api
+prog=openstack-trove-$suffix
+exec="/usr/bin/trove-$suffix"
+config="/etc/trove/trove.conf"
+pidfile="/var/run/trove/trove-$suffix.pid"
+
+[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
+
+lockfile=/var/lock/subsys/$prog
+
+start() {
+    [ -x $exec ] || exit 5
+    [ -f $config ] || exit 6
+    echo -n $"Starting $prog: "
+    daemon --user trove --pidfile $pidfile "$exec &>/dev/null & echo \$! > $pidfile"
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && touch $lockfile
+    return $retval
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    killproc -p $pidfile $prog
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && rm -f $lockfile
+    return $retval
+}
+
+restart() {
+    stop
+    start
+}
+
+reload() {
+    restart
+}
+
+force_reload() {
+    restart
+}
+
+rh_status() {
+    status -p $pidfile $prog
+}
+
+rh_status_q() {
+    rh_status >/dev/null 2>&1
+}
+
+
+case "$1" in
+    start)
+        rh_status_q && exit 0
+        $1
+        ;;
+    stop)
+        rh_status_q || exit 0
+        $1
+        ;;
+    restart)
+        $1
+        ;;
+    reload)
+        rh_status_q || exit 7
+        $1
+        ;;
+    force-reload)
+        force_reload
+        ;;
+    status)
+        rh_status
+        ;;
+    condrestart|try-restart)
+        rh_status_q || exit 0
+        restart
+        ;;
+    *)
+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
+        exit 2
+esac
+exit $?
diff --git a/openstack-trove-api.service b/openstack-trove-api.service
new file mode 100644
index 0000000..2f821f6
--- /dev/null
+++ b/openstack-trove-api.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=OpenStack Trove API Service
+After=syslog.target network.target
+
+[Service]
+Type=simple
+User=trove
+ExecStart=/usr/bin/trove-api
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/openstack-trove-api.upstart b/openstack-trove-api.upstart
new file mode 100644
index 0000000..3436116
--- /dev/null
+++ b/openstack-trove-api.upstart
@@ -0,0 +1,8 @@
+description "OpenStack DBaaS (code-named Trove) API server"
+
+start on stopped rc RUNLEVEL=[2345]
+stop on runlevel [S016]
+
+respawn
+
+exec su -s /bin/sh -c "exec /usr/bin/trove-api" trove
diff --git a/openstack-trove-conductor.init b/openstack-trove-conductor.init
new file mode 100644
index 0000000..de60026
--- /dev/null
+++ b/openstack-trove-conductor.init
@@ -0,0 +1,101 @@
+#!/bin/sh
+#
+# openstack-trove-conductor OpenStack DBaaS Conductor server
+#
+# chkconfig:   - 98 02
+# description: OpenStack DBaaS (code-named Trove) Conductor server
+
+### BEGIN INIT INFO
+# Provides:
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Stop: 0 1 6
+# Short-Description: Trove Conductor server
+# Description: OpenStack DBaaS (code-named Trove) Conductor server
+### END INIT INFO
+
+. /etc/rc.d/init.d/functions
+
+suffix=conductor
+prog=openstack-trove-$suffix
+exec="/usr/bin/trove-$suffix"
+config="/etc/trove/trove-$suffix.conf"
+pidfile="/var/run/trove/trove-$suffix.pid"
+
+[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
+
+lockfile=/var/lock/subsys/$prog
+
+start() {
+    [ -x $exec ] || exit 5
+    [ -f $config ] || exit 6
+    echo -n $"Starting $prog: "
+    daemon --user trove --pidfile $pidfile "$exec &>/dev/null & echo \$! > $pidfile"
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && touch $lockfile
+    return $retval
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    killproc -p $pidfile $prog
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && rm -f $lockfile
+    return $retval
+}
+
+restart() {
+    stop
+    start
+}
+
+reload() {
+    restart
+}
+
+force_reload() {
+    restart
+}
+
+rh_status() {
+    status -p $pidfile $prog
+}
+
+rh_status_q() {
+    rh_status >/dev/null 2>&1
+}
+
+
+case "$1" in
+    start)
+        rh_status_q && exit 0
+        $1
+        ;;
+    stop)
+        rh_status_q || exit 0
+        $1
+        ;;
+    restart)
+        $1
+        ;;
+    reload)
+        rh_status_q || exit 7
+        $1
+        ;;
+    force-reload)
+        force_reload
+        ;;
+    status)
+        rh_status
+        ;;
+    condrestart|try-restart)
+        rh_status_q || exit 0
+        restart
+        ;;
+    *)
+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
+        exit 2
+esac
+exit $?
diff --git a/openstack-trove-conductor.service b/openstack-trove-conductor.service
new file mode 100644
index 0000000..b5ee0dd
--- /dev/null
+++ b/openstack-trove-conductor.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=OpenStack Trove Conductor Service
+After=syslog.target network.target
+
+[Service]
+Type=simple
+User=trove
+ExecStart=/usr/bin/trove-conductor
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/openstack-trove-conductor.upstart b/openstack-trove-conductor.upstart
new file mode 100644
index 0000000..f92037f
--- /dev/null
+++ b/openstack-trove-conductor.upstart
@@ -0,0 +1,8 @@
+description "OpenStack DBaaS (code-named Trove) Conductor server"
+
+start on stopped rc RUNLEVEL=[2345]
+stop on runlevel [S016]
+
+respawn
+
+exec su -s /bin/sh -c "exec /usr/bin/trove-conductor" trove
diff --git a/openstack-trove-guestagent.init b/openstack-trove-guestagent.init
new file mode 100644
index 0000000..50a015f
--- /dev/null
+++ b/openstack-trove-guestagent.init
@@ -0,0 +1,101 @@
+#!/bin/sh
+#
+# openstack-trove-guestagent OpenStack DBaaS GuestAgent server
+#
+# chkconfig:   - 98 02
+# description: OpenStack DBaaS (code-named Trove) GuestAgent server
+
+### BEGIN INIT INFO
+# Provides:
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Stop: 0 1 6
+# Short-Description: Trove GuestAgent server
+# Description: OpenStack DBaaS (code-named Trove) GuestAgent server
+### END INIT INFO
+
+. /etc/rc.d/init.d/functions
+
+suffix=guestagent
+prog=openstack-trove-$suffix
+exec="/usr/bin/trove-$suffix"
+config="/etc/trove/trove-$suffix.conf"
+pidfile="/var/run/trove/trove-$suffix.pid"
+
+[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
+
+lockfile=/var/lock/subsys/$prog
+
+start() {
+    [ -x $exec ] || exit 5
+    [ -f $config ] || exit 6
+    echo -n $"Starting $prog: "
+    daemon --user trove --pidfile $pidfile "$exec --config-file /usr/share/trove/trove-dist.conf --config-file $config --config-file /etc/guest_info &>/dev/null & echo \$! > $pidfile"
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && touch $lockfile
+    return $retval
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    killproc -p $pidfile $prog
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && rm -f $lockfile
+    return $retval
+}
+
+restart() {
+    stop
+    start
+}
+
+reload() {
+    restart
+}
+
+force_reload() {
+    restart
+}
+
+rh_status() {
+    status -p $pidfile $prog
+}
+
+rh_status_q() {
+    rh_status >/dev/null 2>&1
+}
+
+
+case "$1" in
+    start)
+        rh_status_q && exit 0
+        $1
+        ;;
+    stop)
+        rh_status_q || exit 0
+        $1
+        ;;
+    restart)
+        $1
+        ;;
+    reload)
+        rh_status_q || exit 7
+        $1
+        ;;
+    force-reload)
+        force_reload
+        ;;
+    status)
+        rh_status
+        ;;
+    condrestart|try-restart)
+        rh_status_q || exit 0
+        restart
+        ;;
+    *)
+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
+        exit 2
+esac
+exit $?
diff --git a/openstack-trove-guestagent.service b/openstack-trove-guestagent.service
new file mode 100644
index 0000000..e47bf47
--- /dev/null
+++ b/openstack-trove-guestagent.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=OpenStack Trove guestagent Service
+After=syslog.target network.target
+
+[Service]
+Type=simple
+User=trove
+ExecStart=/usr/bin/trove-guestagent --config-file /usr/share/trove/trove-dist.conf --config-file /etc/trove/trove-guestagent.conf --config-file /etc/guest_info
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/openstack-trove-guestagent.upstart b/openstack-trove-guestagent.upstart
new file mode 100644
index 0000000..984d4d0
--- /dev/null
+++ b/openstack-trove-guestagent.upstart
@@ -0,0 +1,8 @@
+description "OpenStack DBaaS (code-named Trove) GuestAgent server"
+
+start on stopped rc RUNLEVEL=[2345]
+stop on runlevel [S016]
+
+respawn
+
+exec su -s /bin/sh -c "exec /usr/bin/trove-guestagent --config-file /usr/share/trove/trove-dist.conf --config-file /etc/trove/trove-guestagent.conf --config-file /etc/guest_info" trove
diff --git a/openstack-trove-taskmanager.init b/openstack-trove-taskmanager.init
new file mode 100644
index 0000000..2c94e9a
--- /dev/null
+++ b/openstack-trove-taskmanager.init
@@ -0,0 +1,101 @@
+#!/bin/sh
+#
+# openstack-trove-taskmanager OpenStack DBaaS TaskManager server
+#
+# chkconfig:   - 98 02
+# description: OpenStack DBaaS (code-named Trove) TaskManager server
+
+### BEGIN INIT INFO
+# Provides:
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Stop: 0 1 6
+# Short-Description: Trove TaskManager server
+# Description: OpenStack DBaaS (code-named Trove) TaskManager server
+### END INIT INFO
+
+. /etc/rc.d/init.d/functions
+
+suffix=taskmanager
+prog=openstack-trove-$suffix
+exec="/usr/bin/trove-$suffix"
+config="/etc/trove/trove-$suffix.conf"
+pidfile="/var/run/trove/trove-$suffix.pid"
+
+[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
+
+lockfile=/var/lock/subsys/$prog
+
+start() {
+    [ -x $exec ] || exit 5
+    [ -f $config ] || exit 6
+    echo -n $"Starting $prog: "
+    daemon --user trove --pidfile $pidfile "$exec &>/dev/null & echo \$! > $pidfile"
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && touch $lockfile
+    return $retval
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    killproc -p $pidfile $prog
+    retval=$?
+    echo
+    [ $retval -eq 0 ] && rm -f $lockfile
+    return $retval
+}
+
+restart() {
+    stop
+    start
+}
+
+reload() {
+    restart
+}
+
+force_reload() {
+    restart
+}
+
+rh_status() {
+    status -p $pidfile $prog
+}
+
+rh_status_q() {
+    rh_status >/dev/null 2>&1
+}
+
+
+case "$1" in
+    start)
+        rh_status_q && exit 0
+        $1
+        ;;
+    stop)
+        rh_status_q || exit 0
+        $1
+        ;;
+    restart)
+        $1
+        ;;
+    reload)
+        rh_status_q || exit 7
+        $1
+        ;;
+    force-reload)
+        force_reload
+        ;;
+    status)
+        rh_status
+        ;;
+    condrestart|try-restart)
+        rh_status_q || exit 0
+        restart
+        ;;
+    *)
+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
+        exit 2
+esac
+exit $?
diff --git a/openstack-trove-taskmanager.service b/openstack-trove-taskmanager.service
new file mode 100644
index 0000000..1aee784
--- /dev/null
+++ b/openstack-trove-taskmanager.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=OpenStack Trove taskmanager service
+After=syslog.target network.target
+
+[Service]
+Type=simple
+User=trove
+ExecStart=/usr/bin/trove-taskmanager
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/openstack-trove-taskmanager.upstart b/openstack-trove-taskmanager.upstart
new file mode 100644
index 0000000..866fea5
--- /dev/null
+++ b/openstack-trove-taskmanager.upstart
@@ -0,0 +1,8 @@
+description "OpenStack DBaaS (code-named Trove) TaskManager server"
+
+start on stopped rc RUNLEVEL=[2345]
+stop on runlevel [S016]
+
+respawn
+
+exec su -s /bin/sh -c "exec /usr/bin/trove-taskmanager" trove
diff --git a/openstack-trove.spec b/openstack-trove.spec
new file mode 100644
index 0000000..875bb88
--- /dev/null
+++ b/openstack-trove.spec
@@ -0,0 +1,499 @@
+%global with_doc 0
+%global project trove
+
+Name:             openstack-%{project}
+Version:          2014.1
+Release:          6%{?dist}
+Summary:          OpenStack DBaaS (%{project})
+
+Group:            Applications/System
+License:          ASL 2.0
+URL:              https://wiki.openstack.org/wiki/Trove
+Source0:          https://launchpad.net/%{project}/icehouse/%{version}/+download/%{project}-%{version}.tar.gz
+
+Source1:          %{project}-dist.conf
+Source2:          %{project}.logrotate
+Source3:          guest_info
+
+Source10:         %{name}-api.service
+Source11:         %{name}-taskmanager.service
+Source12:         %{name}-conductor.service
+Source13:         %{name}-guestagent.service
+
+Source20:         %{name}-api.init
+Source21:         %{name}-taskmanager.init
+Source22:         %{name}-conductor.init
+Source23:         %{name}-guestagent.init
+Source30:         %{name}-api.upstart
+Source31:         %{name}-taskmanager.upstart
+Source32:         %{name}-conductor.upstart
+Source33:         %{name}-guestagent.upstart
+
+Patch0:           version.diff
+Patch1:           authtoken.diff
+Patch2:           db-config.diff
+
+Patch100:         el6-parallel-deps.diff
+
+#
+# patches_base=2014.1
+#
+
+BuildArch:        noarch
+BuildRequires:    intltool
+%if 0%{?rhel} == 6
+BuildRequires:    python-sphinx10
+# These are required to build due to the requirements check added
+BuildRequires:    python-paste-deploy1.5
+BuildRequires:    python-routes1.12
+BuildRequires:    python-sqlalchemy0.7
+%endif
+BuildRequires:    python-sphinx
+BuildRequires:    python-setuptools
+BuildRequires:    python-pbr
+BuildRequires:    python-d2to1
+BuildRequires:    python2-devel
+
+Requires:         %{name}-api = %{version}-%{release}
+Requires:         %{name}-taskmanager = %{version}-%{release}
+Requires:         %{name}-conductor = %{version}-%{release}
+
+
+%description
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+%package common
+Summary:          Components common to all OpenStack %{project} services
+Group:            Applications/System
+
+Requires:         python-%{project} = %{version}-%{release}
+
+%if 0%{?rhel} == 6
+Requires(post):   chkconfig
+Requires(preun):  initscripts
+Requires(preun):  chkconfig
+%else
+Requires(post):   systemd
+Requires(preun):  systemd
+Requires(postun): systemd
+BuildRequires:    systemd
+%endif
+Requires(pre):    shadow-utils
+
+%description common
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains scripts, config and dependencies shared
+between all the OpenStack %{project} services.
+
+
+%package api
+Summary:          OpenStack %{project} API service
+Group:            Applications/System
+
+Requires:         %{name}-common = %{version}-%{release}
+
+%description api
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains the %{project} interface daemon.
+
+
+%package taskmanager
+Summary:          OpenStack %{project} taskmanager service
+Group:            Applications/System
+
+Requires:         %{name}-common = %{version}-%{release}
+
+%description taskmanager
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains the %{project} taskmanager service.
+
+
+%package conductor
+Summary:          OpenStack %{project} conductor service
+Group:            Applications/System
+
+Requires:         %{name}-common = %{version}-%{release}
+
+%description conductor
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains the %{project} conductor service.
+
+
+%package guestagent
+Summary:          OpenStack %{project} guest agent
+Group:            Applications/System
+%if 0%{?rhel}
+Requires:         pexpect
+%else
+Requires:         python-pexpect
+%endif
+
+Requires:         %{name}-common = %{version}-%{release}
+
+%description guestagent
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains the %{project} guest agent service
+that runs within the database VM instance.
+
+
+%package -n       python-%{project}
+Summary:          Python libraries for %{project}
+Group:            Applications/System
+
+Requires:         MySQL-python
+
+Requires:         python-qpid
+Requires:         python-kombu
+
+Requires:         python-eventlet
+Requires:         python-greenlet
+Requires:         python-iso8601
+Requires:         python-netaddr
+Requires:         python-lxml
+
+Requires:         python-webob >= 1.2
+Requires:         python-migrate
+
+%if 0%{?rhel} == 6
+Requires:         python-sqlalchemy0.7
+Requires:         python-paste-deploy1.5
+Requires:         python-routes1.12
+Requires:         python-argparse
+%else
+Requires:         python-sqlalchemy
+Requires:         python-paste-deploy
+Requires:         python-routes
+%endif
+
+Requires:         python-troveclient
+Requires:         python-novaclient
+Requires:         python-cinderclient
+Requires:         python-heatclient
+Requires:         python-swiftclient
+Requires:         python-keystoneclient >= 0.4.1
+
+Requires:         python-oslo-config >= 1:1.2.1
+Requires:         python-jsonschema
+Requires:         python-babel
+Requires:         python-jinja2
+
+Requires:         python-httplib2
+Requires:         python-passlib
+
+
+%description -n   python-%{project}
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains the %{project} python library.
+
+%if 0%{?with_doc}
+%package doc
+Summary:          Documentation for OpenStack %{project}
+Group:            Documentation
+
+
+%description      doc
+OpenStack DBaaS (codename %{project}) provisioning service.
+
+This package contains documentation files for %{project}.
+%endif
+
+%prep
+%setup -q -n %{project}-%{version}
+
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+
+%if 0%{?rhel} == 6
+%patch100 -p1
+%endif
+
+# Avoid non-executable-script rpmlint while maintaining timestamps
+find %{project} -name \*.py |
+while read source; do
+  if head -n1 "$source" | grep -F '/usr/bin/env'; then
+    touch --ref="$source" "$source".ts
+    sed -i '/\/usr\/bin\/env python/{d;q}' "$source"
+    touch --ref="$source".ts "$source"
+    rm "$source".ts
+  fi
+done
+
+sed -i 's/REDHATVERSION/%{version}/; s/REDHATRELEASE/%{release}/' %{project}/version.py
+
+# Remove the requirements file so that pbr hooks don't add it
+# to distutils requires_dist config
+rm -rf {test-,}requirements.txt
+
+%build
+%{__python} setup.py build
+
+# Programmatically update defaults in sample config
+# which is installed at /etc/trove/trove.conf
+
+#  First we ensure all values are commented in appropriate format.
+#  Since icehouse, there was an uncommented keystone_authtoken section
+#  at the end of the file which mimics but also conflicted with our
+#  distro editing that had been done for many releases.
+sed -i '/^[^#[]/{s/^/#/; s/ //g}; /^#[^ ]/s/ = /=/' etc/%{project}/%{project}.conf.sample
+
+#  TODO: Make this more robust
+#  Note it only edits the first occurance, so assumes a section ordering in sample
+#  and also doesn't support multi-valued variables like dhcpbridge_flagfile.
+while read name eq value; do
+  test "$name" && test "$value" || continue
+  sed -i "0,/^# *$name=/{s!^# *$name=.*!#$name=$value!}" etc/%{project}/%{project}.conf.sample
+done < %{SOURCE1}
+
+%install
+%{__python} setup.py install -O1 --skip-build --root %{buildroot}
+
+# docs generation requires everything to be installed first
+export PYTHONPATH="$( pwd ):$PYTHONPATH"
+
+%if 0%{?with_doc}
+pushd doc
+
+SPHINX_DEBUG=1 sphinx-build -b html source build/html
+# Fix hidden-file-or-dir warnings
+rm -fr build/html/.doctrees build/html/.buildinfo
+
+# Create dir link to avoid a sphinx-build exception
+mkdir -p build/man/.doctrees/
+ln -s .  build/man/.doctrees/man
+SPHINX_DEBUG=1 sphinx-build -b man -c source source/man build/man
+mkdir -p %{buildroot}%{_mandir}/man1
+install -p -D -m 644 build/man/*.1 %{buildroot}%{_mandir}/man1/
+
+popd
+%endif
+
+# Setup directories
+%if 0%{?rhel} != 6
+install -d -m 755 %{buildroot}%{_unitdir}
+%endif
+install -d -m 755 %{buildroot}%{_datadir}/%{project}
+install -d -m 755 %{buildroot}%{_sharedstatedir}/%{project}
+install -d -m 755 %{buildroot}%{_localstatedir}/log/%{project}
+
+# Install config files
+install -p -D -m 644 %{SOURCE1} %{buildroot}%{_datadir}/%{project}/%{project}-dist.conf
+install -p -D -m 644 etc/%{project}/api-paste.ini %{buildroot}%{_datadir}/%{project}/%{project}-dist-paste.ini
+install -d -m 755 %{buildroot}%{_sysconfdir}/%{project}
+install -p -D -m 640 etc/%{project}/%{project}.conf.sample %{buildroot}%{_sysconfdir}/%{project}/%{project}.conf
+install -p -D -m 640 etc/%{project}/trove-taskmanager.conf.sample %{buildroot}%{_sysconfdir}/%{project}/trove-taskmanager.conf
+install -p -D -m 640 etc/%{project}/trove-conductor.conf.sample %{buildroot}%{_sysconfdir}/%{project}/trove-conductor.conf
+install -p -D -m 640 etc/%{project}/trove-guestagent.conf.sample %{buildroot}%{_sysconfdir}/%{project}/trove-guestagent.conf
+install -p -D -m 640 %{SOURCE3} %{buildroot}%{_sysconfdir}/%{project}/guest_info
+
+# Install initscripts
+%if 0%{?rhel} == 6
+install -p -D -m 755 %{SOURCE20} %{buildroot}%{_initrddir}/%{name}-api
+install -p -D -m 755 %{SOURCE21} %{buildroot}%{_initrddir}/%{name}-taskmanager
+install -p -D -m 755 %{SOURCE22} %{buildroot}%{_initrddir}/%{name}-conductor
+install -p -D -m 755 %{SOURCE23} %{buildroot}%{_initrddir}/%{name}-guestagent
+install -p -m 755 %{SOURCE30} %{SOURCE31} %{SOURCE32} %{SOURCE33} %{buildroot}%{_datadir}/%{project}
+%else
+install -p -m 644 %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} %{buildroot}%{_unitdir}
+%endif
+
+# Install logrotate
+install -p -D -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
+
+# Install pid directory
+install -d -m 755 %{buildroot}%{_localstatedir}/run/%{project}
+
+# Remove unneeded in production stuff
+rm -fr %{buildroot}%{_bindir}/trove-fake-mode
+rm -fr %{buildroot}%{python_sitelib}/%{project}/tests/
+rm -fr %{buildroot}%{python_sitelib}/run_tests.*
+
+%pre common
+# Origin: http://fedoraproject.org/wiki/Packaging:UsersAndGroups#Dynamic_allocation
+USERNAME=%{project}
+GROUPNAME=$USERNAME
+HOMEDIR=%{_sharedstatedir}/$USERNAME
+getent group $GROUPNAME >/dev/null || groupadd -r $GROUPNAME
+getent passwd $USERNAME >/dev/null || \
+  useradd -r -g $GROUPNAME -G $GROUPNAME -d $HOMEDIR -s /sbin/nologin \
+    -c "$USERNAME Daemons" $USERNAME
+exit 0
+
+%if 0%{?rhel} == 6
+%post api
+/sbin/chkconfig --add %{name}-api
+%post taskmanager
+/sbin/chkconfig --add %{name}-taskmanager
+%post conductor
+/sbin/chkconfig --add %{name}-conductor
+%post guestagent
+/sbin/chkconfig --add %{name}-guestagent
+
+%preun api
+if [ $1 = 0 ] ; then
+  /sbin/service %{name}-api stop >/dev/null 2>&1
+  /sbin/chkconfig --del %{name}-api
+fi
+%preun taskmanager
+if [ $1 = 0 ] ; then
+  /sbin/service %{name}-taskmanager stop >/dev/null 2>&1
+  /sbin/chkconfig --del %{name}-taskmanager
+fi
+%preun conductor
+if [ $1 = 0 ] ; then
+  /sbin/service %{name}-conductor stop >/dev/null 2>&1
+  /sbin/chkconfig --del %{name}-conductor
+fi
+%preun guestagent
+if [ $1 = 0 ] ; then
+  /sbin/service %{name}-guestagent stop >/dev/null 2>&1
+  /sbin/chkconfig --del %{name}-guestagent
+fi
+
+%postun api
+if [ $1 -ge 1 ] ; then
+  # Package upgrade, not uninstall
+  /sbin/service %{name}-api condrestart > /dev/null 2>&1 || :
+fi
+%postun taskmanager
+if [ $1 -ge 1 ] ; then
+  # Package upgrade, not uninstall
+  /sbin/service %{name}-taskmanager condrestart > /dev/null 2>&1 || :
+fi
+%postun conductor
+if [ $1 -ge 1 ] ; then
+  # Package upgrade, not uninstall
+  /sbin/service %{name}-conductor condrestart > /dev/null 2>&1 || :
+fi
+%postun guestagent
+if [ $1 -ge 1 ] ; then
+  # Package upgrade, not uninstall
+  /sbin/service %{name}-guestagent condrestart > /dev/null 2>&1 || :
+fi
+
+%else
+
+%post api
+%systemd_post openstack-trove-api.service
+%post taskmanager
+%systemd_post openstack-trove-taskmanager.service
+%post conductor
+%systemd_post openstack-trove-conductor.service
+%post guestagent
+%systemd_post openstack-trove-guestagent.service
+
+%preun api
+%systemd_preun openstack-trove-api.service
+%preun taskmanager
+%systemd_preun openstack-trove-taskmanager.service
+%preun conductor
+%systemd_preun openstack-trove-conductor.service
+%preun guestagent
+%systemd_preun openstack-trove-guestagent.service
+
+%postun api
+%systemd_postun_with_restart openstack-trove-api.service
+%postun taskmanager
+%systemd_postun_with_restart openstack-trove-taskmanager.service
+%postun conductor
+%systemd_postun_with_restart openstack-trove-conductor.service
+%postun guestagent
+%systemd_postun_with_restart openstack-trove-guestagent.service
+%endif
+
+%files
+%doc LICENSE
+
+%files common
+%doc LICENSE
+%dir %{_sysconfdir}/%{project}
+%config(noreplace) %attr(0640, root, %{project}) %{_sysconfdir}/%{project}/%{project}.conf
+%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
+
+%dir %attr(0755, %{project}, root) %{_localstatedir}/log/%{project}
+%dir %attr(0755, %{project}, root) %{_localstatedir}/run/%{project}
+
+%{_bindir}/%{project}-manage
+%{_bindir}/trove-mgmt-taskmanager
+
+%{_datarootdir}/%{project}
+
+%defattr(-, %{project}, %{project}, -)
+%dir %{_sharedstatedir}/%{project}
+
+%files api
+%{_bindir}/%{project}-api
+%if 0%{?rhel} == 6
+%{_initrddir}/%{name}-api
+%{_datadir}/%{project}/%{name}-api.upstart
+%else
+%{_unitdir}/%{name}-api.service
+%endif
+
+%files taskmanager
+%{_bindir}/%{project}-taskmanager
+%if 0%{?rhel} == 6
+%{_initrddir}/%{name}-taskmanager
+%{_datadir}/%{project}/%{name}-taskmanager.upstart
+%else
+%{_unitdir}/%{name}-taskmanager.service
+%endif
+%config(noreplace) %attr(0640, root, %{project}) %{_sysconfdir}/%{project}/%{project}-taskmanager.conf
+
+%files conductor
+%{_bindir}/%{project}-conductor
+%if 0%{?rhel} == 6
+%{_initrddir}/%{name}-conductor
+%{_datadir}/%{project}/%{name}-conductor.upstart
+%else
+%{_unitdir}/%{name}-conductor.service
+%endif
+%config(noreplace) %attr(0640, root, %{project}) %{_sysconfdir}/%{project}/%{project}-conductor.conf
+
+%files guestagent
+%{_bindir}/%{project}-guestagent
+%if 0%{?rhel} == 6
+%{_initrddir}/%{name}-guestagent
+%{_datadir}/%{project}/%{name}-guestagent.upstart
+%else
+%{_unitdir}/%{name}-guestagent.service
+%endif
+%config(noreplace) %attr(0640, root, %{project}) %{_sysconfdir}/%{project}/%{project}-guestagent.conf
+%config(noreplace) %attr(0640, root, %{project}) %{_sysconfdir}/%{project}/guest_info
+
+%files -n python-%{project}
+%defattr(-,root,root,-)
+%doc LICENSE
+%{python_sitelib}/%{project}
+%{python_sitelib}/%{project}-%{version}*.egg-info
+
+%if 0%{?with_doc}
+%files doc
+%doc LICENSE doc/build/html
+%endif
+
+%changelog
+* Tue Jun 24 2014 Pádraig Brady <pbrady at redhat.com> - 2014.1-6
+- Use more up to date build dependencies for systemd
+
+* Mon Jun 16 2014 Pádraig Brady <pbrady at redhat.com> - 2014.1-4
+- Have guestagent reference /etc/guest_info
+- Require correct version of python-oslo-config
+
+* Wed May 21 2014 Pádraig Brady <pbrady at redhat.com> - 2014.1-3
+- Tweaks for fedora review
+
+* Sun Apr 27 2014 Pádraig Brady <pbrady at redhat.com> - 2014.1-2
+- Have guestagent reference /etc/guest-info
+
+* Fri Apr 18 2014 Pádraig Brady <pbrady at redhat.com> - 2014.1-1
+- Update to Icehouse release
+
+* Mon Apr 07 2014 Pádraig Brady <pbrady at redhat.com> - 2014.1-0.1.rc1
+- Initial release
diff --git a/sources b/sources
index e69de29..d5364d7 100644
--- a/sources
+++ b/sources
@@ -0,0 +1 @@
+b989ce300ed2c271e273fa0e13f4e426  trove-2014.1.tar.gz
diff --git a/trove-dist.conf b/trove-dist.conf
new file mode 100644
index 0000000..569f632
--- /dev/null
+++ b/trove-dist.conf
@@ -0,0 +1,4 @@
+[DEFAULT]
+log_file = /var/log/trove/trove.log
+sql_connection = mysql://trove:trove@localhost/trove
+api_paste_config = /usr/share/trove/trove-dist-paste.ini
diff --git a/trove.logrotate b/trove.logrotate
new file mode 100644
index 0000000..3279571
--- /dev/null
+++ b/trove.logrotate
@@ -0,0 +1,6 @@
+/var/log/trove/*.log {
+    rotate 14
+    size 10M
+    missingok
+    compress
+}
diff --git a/version.diff b/version.diff
new file mode 100644
index 0000000..35a614a
--- /dev/null
+++ b/version.diff
@@ -0,0 +1,27 @@
+diff --git a/trove/version.py b/trove/version.py
+index 33656d8..504905f 100644
+--- a/trove/version.py
++++ b/trove/version.py
+@@ -27,19 +27,12 @@ FINAL = False   # This becomes true at Release Candidate time
+ 
+ 
+ def canonical_version_string():
+-    return '.'.join([YEAR, COUNT])
++    return "REDHATVERSION"
+ 
+ 
+ def version_string():
+-    if FINAL:
+-        return canonical_version_string()
+-    else:
+-        return '%s-dev' % (canonical_version_string(),)
+-
+-
+-def vcs_version_string():
+-    return "%s:%s" % (version_info['branch_nick'], version_info['revision_id'])
++    return '%s-%s' % (canonical_version_string(),"REDHATRELEASE")
+ 
+ 
+ def version_string_with_vcs():
+-    return "%s-%s" % (canonical_version_string(), vcs_version_string())
++    return version_string()


More information about the scm-commits mailing list