Colocate a builder-worker with the service

This is an intermediate step before builders are completely broken out
into their own hosts and nodes.

As part of this work we split up the logging configs for the two daemons
which allows them to be colocated and write to different log files on
the same host.

Co-Authored-By: Clark Boylan <clark.boylan@gmail.com>
Change-Id: I990e96dde352fb7d01cc4b89d0f4f02de166b943
This commit is contained in:
Spencer Krum 2016-01-22 14:05:38 -08:00 committed by Clark Boylan
parent ec77bbc38b
commit bb12dbb646
7 changed files with 295 additions and 15 deletions

162
files/nodepool-builder.init Executable file
View File

@ -0,0 +1,162 @@
#! /bin/sh
### BEGIN INIT INFO
# Provides: nodepool-builder
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Nodepool-builder
# Description: Trunk gating system
### END INIT INFO
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Nodepool Builder Worker"
NAME=nodepool-builder
DAEMON=/usr/local/bin/nodepool-builder
PIDFILE=/var/run/$NAME/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
USER=nodepool
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
mkdir -p /var/run/$NAME
chown $USER /var/run/$NAME
ulimit -n 8192
start-stop-daemon --start --quiet --pidfile $PIDFILE -c $USER --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE -c $USER --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --signal 9 --pidfile $PIDFILE
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
rm -f /var/run/$NAME/*
return "$RETVAL"
}
#
# Function that stops the daemon/service
#
do_graceful_stop()
{
PID=`cat $PIDFILE`
kill -INT $PID
# Old nodepoold used USR1
# New nodepoold ignores it while INT is being handled
kill -USR1 $PID
# wait until really stopped
if [ -n "${PID:-}" ]; then
i=0
while kill -0 "${PID:-}" 2> /dev/null; do
if [ $i -eq '0' ]; then
echo -n " ... waiting "
else
echo -n "."
fi
i=$(($i+1))
sleep 1
done
fi
rm -f /var/run/$NAME/*
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
log_daemon_msg "Reloading $DESC" "$NAME"
do_reload
log_end_msg $?
;;
restart)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_graceful_stop
do_start
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:

59
manifests/builder.pp Normal file
View File

@ -0,0 +1,59 @@
# Copyright 2015 2015 IBM
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# == Class: nodepool::builder
#
class nodepool::builder(
$statsd_host = undef,
$image_log_document_root = '/var/log/nodepool/image',
$builder_logging_conf_template = 'nodepool/nodepool-builder.logging.conf.erb',
$environment = {},
) {
file { '/etc/init.d/nodepool-builder':
ensure => present,
mode => '0555',
owner => 'root',
group => 'root',
source => 'puppet:///modules/nodepool/nodepool-builder.init',
}
file { '/etc/default/nodepool-builder':
ensure => present,
content => template('nodepool/nodepool-builder.default.erb'),
mode => '0444',
owner => 'root',
group => 'root',
}
file { '/etc/nodepool/builder-logging.conf':
ensure => present,
mode => '0444',
owner => 'root',
group => 'root',
content => template($builder_logging_conf_template),
}
service { 'nodepool-builder':
name => 'nodepool-builder',
enable => true,
hasrestart => true,
require => [
File['/etc/init.d/nodepool-builder'],
File['/etc/default/nodepool-builder'],
File['/etc/nodepool/builder-logging.conf'],
],
}
}

View File

@ -33,6 +33,7 @@ class nodepool (
$scripts_dir = undef,
$elements_dir = undef,
$logging_conf_template = 'nodepool/nodepool.logging.conf.erb',
$builder_logging_conf_template = 'nodepool/nodepool-builder.logging.conf.erb',
$jenkins_masters = [],
) {
@ -316,4 +317,10 @@ class nodepool (
mode => '0440',
}
class { '::nodepool::builder':
statsd_host => $statsd_host,
environment => $environment,
builder_logging_conf_template => $builder_logging_conf_template,
}
}

View File

@ -0,0 +1,8 @@
<% if @statsd_host != nil && @statsd_host != "" -%>
export STATSD_HOST=<%= @statsd_host %>
export STATSD_PORT=8125
<% end -%>
<% @environment.keys.sort.each do |key| -%>
export <%= key %>='<%= @environment[key] %>'
<% end -%>
DAEMON_ARGS="-c /etc/nodepool/nodepool.yaml -l /etc/nodepool/builder-logging.conf"

View File

@ -0,0 +1,56 @@
[loggers]
keys=root,nodepool,requests,image
[handlers]
keys=console,debug,normal,image
[formatters]
keys=simple
[logger_root]
level=WARNING
handlers=console
[logger_requests]
level=WARNING
handlers=debug,normal
qualname=requests
[logger_nodepool]
level=DEBUG
handlers=debug,normal
qualname=nodepool
[logger_image]
level=INFO
handlers=image
qualname=nodepool.image.build
propagate=0
[handler_console]
level=WARNING
class=StreamHandler
formatter=simple
args=(sys.stdout,)
[handler_debug]
level=DEBUG
class=logging.handlers.TimedRotatingFileHandler
formatter=simple
args=('/var/log/nodepool/builder-debug.log', 'H', 8, 30,)
[handler_normal]
level=INFO
class=logging.handlers.TimedRotatingFileHandler
formatter=simple
args=('/var/log/nodepool/nodepool-builder.log', 'H', 8, 30,)
[handler_image]
level=INFO
class=logging.handlers.TimedRotatingFileHandler
formatter=simple
args=('<%= @image_log_document_root %>/image.log', 'H', 8, 30,)
[formatter_simple]
format=%(asctime)s %(levelname)s %(name)s: %(message)s
datefmt=

View File

@ -5,4 +5,4 @@ export STATSD_PORT=8125
<% @environment.keys.sort.each do |key| -%>
export <%= key %>='<%= @environment[key] %>'
<% end -%>
DAEMON_ARGS="-c /etc/nodepool/nodepool.yaml -l /etc/nodepool/logging.conf"
DAEMON_ARGS="--no-builder -c /etc/nodepool/nodepool.yaml -l /etc/nodepool/logging.conf"

View File

@ -1,8 +1,8 @@
[loggers]
keys=root,nodepool,requests,image
keys=root,nodepool,requests
[handlers]
keys=console,debug,normal,image
keys=console,debug,normal
[formatters]
keys=simple
@ -21,12 +21,6 @@ level=DEBUG
handlers=debug,normal
qualname=nodepool
[logger_image]
level=INFO
handlers=image
qualname=nodepool.image.build
propagate=0
[handler_console]
level=WARNING
class=StreamHandler
@ -45,12 +39,6 @@ class=logging.handlers.TimedRotatingFileHandler
formatter=simple
args=('/var/log/nodepool/nodepool.log', 'H', 8, 30,)
[handler_image]
level=INFO
class=logging.handlers.TimedRotatingFileHandler
formatter=simple
args=('<%= @image_log_document_root %>/image.log', 'H', 8, 30,)
[formatter_simple]
format=%(asctime)s %(levelname)s %(name)s: %(message)s
datefmt=