diff --git a/jobs/loggr-system-metrics-agent/monit b/jobs/loggr-system-metrics-agent/monit index 472a0d81..7487dc98 100644 --- a/jobs/loggr-system-metrics-agent/monit +++ b/jobs/loggr-system-metrics-agent/monit @@ -1,7 +1,15 @@ <% if p("enabled") %> +<% if p("use_bpm") %> check process loggr-system-metrics-agent with pidfile /var/vcap/sys/run/bpm/loggr-system-metrics-agent/loggr-system-metrics-agent.pid start program "/var/vcap/jobs/bpm/bin/bpm start loggr-system-metrics-agent" stop program "/var/vcap/jobs/bpm/bin/bpm stop loggr-system-metrics-agent" group vcap +<% else %> +check process system-metrics-agent + with pidfile /var/vcap/sys/run/system-metrics-agent/system-metrics-agent.pid + start program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl start" + stop program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl stop" + group vcap +<% end %> <% end %> diff --git a/jobs/loggr-system-metrics-agent/spec b/jobs/loggr-system-metrics-agent/spec index b23e64ab..47724832 100644 --- a/jobs/loggr-system-metrics-agent/spec +++ b/jobs/loggr-system-metrics-agent/spec @@ -3,6 +3,7 @@ name: loggr-system-metrics-agent templates: bpm.yml.erb: config/bpm.yml + ctl.erb: bin/ctl system_metrics_agent_ca.crt.erb: config/certs/system_metrics_agent_ca.crt system_metrics_agent.crt.erb: config/certs/system_metrics_agent.crt system_metrics_agent.key.erb: config/certs/system_metrics_agent.key @@ -40,3 +41,10 @@ properties: description: "TLS certificate for system metrics agent signed by the loggregator CA" key: description: "TLS private key for system metrics agent signed by the loggregator CA" + + use_bpm: + description: > + When true, run this job under BPM. BPM is required on Resolute Raccoon + stemcells; support for running without BPM will be removed in a future + version. + default: false diff --git a/jobs/loggr-system-metrics-agent/templates/ctl.erb b/jobs/loggr-system-metrics-agent/templates/ctl.erb new file mode 100644 index 00000000..6b231709 --- /dev/null +++ b/jobs/loggr-system-metrics-agent/templates/ctl.erb @@ -0,0 +1,68 @@ +#!/bin/bash -e +<% + deployment = spec.deployment + job = spec.job.name + index = spec.id || spec.index.to_s + ip = spec.ip +%> + +RUN_DIR=/var/vcap/sys/run/system-metrics-agent +LOG_DIR=/var/vcap/sys/log/system-metrics-agent +PIDFILE=$RUN_DIR/system-metrics-agent.pid + +mkdir -p $RUN_DIR +mkdir -p $LOG_DIR + +case $1 in + + start) + set +e + killall -15 system-metrics-agent + killall -9 system-metrics-agent + killall -2 system-metrics-agent + killall -3 system-metrics-agent + set -e + + exec >>$LOG_DIR/system-metrics-agent.stdout.log \ + 2>>$LOG_DIR/system-metrics-agent.stderr.log + + chown -R vcap:vcap $LOG_DIR + + SAMPLE_INTERVAL=<%= p('sample_interval') %> \ + METRIC_PORT=<%= p('metrics_port') %> \ + DEBUG_PORT=<%= p('debug_port') %> \ + DEPLOYMENT=<%= deployment %> \ + JOB=<%= job %> \ + INDEX=<%= index %> \ + IP=<%= ip %> \ + LIMITED_METRICS=<%= p('bosh_metrics_forwarder_metrics_only') %> \ + CA_CERT_PATH="/var/vcap/jobs/loggr-system-metrics-agent/config/certs/system_metrics_agent_ca.crt" \ + CERT_PATH="/var/vcap/jobs/loggr-system-metrics-agent/config/certs/system_metrics_agent.crt" \ + KEY_PATH="/var/vcap/jobs/loggr-system-metrics-agent/config/certs/system_metrics_agent.key" \ + chpst -u vcap:vcap /var/vcap/packages/system-metrics-agent/system-metrics-agent & + + echo $! > $PIDFILE + + ;; + + stop) + echo "$(date "+%Y/%m/%d %T") attempting to stop system-metrics-agent" >> $LOG_DIR/system-metrics-agent.stderr.log + exec 2>>$LOG_DIR/system-metrics-agent.stderr.log + + kill "$(cat $PIDFILE)" + set +e + echo "$(date "+%Y/%m/%d %T") additional killall for system-metrics-agent: errors expected" >> $LOG_DIR/system-metrics-agent.stderr.log + killall -15 system-metrics-agent + killall -9 system-metrics-agent + killall -2 system-metrics-agent + killall -3 system-metrics-agent + set -e + + ;; + + *) + echo "Usage: ctl {start|stop}" + + ;; + +esac diff --git a/spec/jobs/loggr_system_metrics_agent_spec.rb b/spec/jobs/loggr_system_metrics_agent_spec.rb index 8316bbce..1d29c31f 100644 --- a/spec/jobs/loggr_system_metrics_agent_spec.rb +++ b/spec/jobs/loggr_system_metrics_agent_spec.rb @@ -1,6 +1,12 @@ require 'bosh/template/test' require 'yaml' +def render_system_metrics_monit(properties = {}) + job_dir = File.join(File.dirname(__FILE__), '../../jobs/loggr-system-metrics-agent') + spec = YAML.safe_load(File.read(File.join(job_dir, 'spec'))) + Bosh::Template::Test::Template.new(spec, File.join(job_dir, 'monit')).render(properties) +end + describe 'loggr-system-metrics-agent' do let(:release) { Bosh::Template::Test::ReleaseDir.new(File.join(File.dirname(__FILE__), '../..')) } let(:job) { release.job('loggr-system-metrics-agent') } @@ -34,4 +40,36 @@ expect(process['env']['SAMPLE_INTERVAL']).to eq('15s') end end + + describe 'monit' do + context 'when enabled is true (default) and use_bpm is false (default)' do + let(:rendered) { render_system_metrics_monit({}) } + + it 'uses the ctl script pidfile and start/stop programs' do + expect(rendered).to include('with pidfile /var/vcap/sys/run/system-metrics-agent/system-metrics-agent.pid') + expect(rendered).to include('start program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl start"') + expect(rendered).to include('stop program "/var/vcap/jobs/loggr-system-metrics-agent/bin/ctl stop"') + expect(rendered).not_to include('/var/vcap/jobs/bpm/bin/bpm') + end + end + + context 'when enabled is true and use_bpm is true' do + let(:rendered) { render_system_metrics_monit({'use_bpm' => true}) } + + it 'uses the bpm pidfile and start/stop programs' do + expect(rendered).to include('with pidfile /var/vcap/sys/run/bpm/loggr-system-metrics-agent/loggr-system-metrics-agent.pid') + expect(rendered).to include('start program "/var/vcap/jobs/bpm/bin/bpm start loggr-system-metrics-agent"') + expect(rendered).to include('stop program "/var/vcap/jobs/bpm/bin/bpm stop loggr-system-metrics-agent"') + expect(rendered).not_to include('/bin/ctl') + end + end + + context 'when enabled is false' do + let(:rendered) { render_system_metrics_monit({'enabled' => false}) } + + it 'renders an empty monit file' do + expect(rendered.strip).to be_empty + end + end + end end