From bb12dbb6466e1a53dd7a0c31eca58b04e6795eb8 Mon Sep 17 00:00:00 2001 From: Spencer Krum Date: Fri, 22 Jan 2016 14:05:38 -0800 Subject: [PATCH] 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 Change-Id: I990e96dde352fb7d01cc4b89d0f4f02de166b943 --- files/nodepool-builder.init | 162 ++++++++++++++++++++ manifests/builder.pp | 59 +++++++ manifests/init.pp | 7 + templates/nodepool-builder.default.erb | 8 + templates/nodepool-builder.logging.conf.erb | 56 +++++++ templates/nodepool.default.erb | 2 +- templates/nodepool.logging.conf.erb | 16 +- 7 files changed, 295 insertions(+), 15 deletions(-) create mode 100755 files/nodepool-builder.init create mode 100644 manifests/builder.pp create mode 100644 templates/nodepool-builder.default.erb create mode 100644 templates/nodepool-builder.logging.conf.erb diff --git a/files/nodepool-builder.init b/files/nodepool-builder.init new file mode 100755 index 0000000..29ddea0 --- /dev/null +++ b/files/nodepool-builder.init @@ -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 + +: diff --git a/manifests/builder.pp b/manifests/builder.pp new file mode 100644 index 0000000..3d1baf0 --- /dev/null +++ b/manifests/builder.pp @@ -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'], + ], + } + +} diff --git a/manifests/init.pp b/manifests/init.pp index 7084c71..b665d65 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -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, + } + } diff --git a/templates/nodepool-builder.default.erb b/templates/nodepool-builder.default.erb new file mode 100644 index 0000000..9dd7d26 --- /dev/null +++ b/templates/nodepool-builder.default.erb @@ -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" diff --git a/templates/nodepool-builder.logging.conf.erb b/templates/nodepool-builder.logging.conf.erb new file mode 100644 index 0000000..e9034ac --- /dev/null +++ b/templates/nodepool-builder.logging.conf.erb @@ -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= diff --git a/templates/nodepool.default.erb b/templates/nodepool.default.erb index 8dd69e3..58c0af4 100644 --- a/templates/nodepool.default.erb +++ b/templates/nodepool.default.erb @@ -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" diff --git a/templates/nodepool.logging.conf.erb b/templates/nodepool.logging.conf.erb index e14c553..1aebe0c 100644 --- a/templates/nodepool.logging.conf.erb +++ b/templates/nodepool.logging.conf.erb @@ -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=